Задание 4.7
Используйте базу данных из задания 1.6 лабораторной работы 1. Добавьте факты для каждого животного X
животное(X).
Для исключения повторения названия животных на запросы
"Кто живет хотя бы (ровно) в двух средах обитания?"
можно использовать надрез
цель(X):- животное(X),[!живет(X,Y),живет(X,Z),Y\=Z!].
СПИСКИ
ЦЕЛЬ: Знакомство с понятием списка и операциями над списками.
Список
- это упорядоченная последовательность элементов. Элементами списка могут быть любые термы Пролога. Удобной формой записи списков является так называемое списочное обозначение. В данном обозначении каждый элемент списка отделяется от соседнего запятой, а весь набор элементов заключается в квадратные скобки, например, [a,b,c,d].
Фактически список - это структура с функтором ‘ '/2 (точка с арностью 2). Согласно этому определению, список состоит из первого элемента и хвоста, который представляет собой список из остальных элементов.
Пустой список - это список, не содержащий ни одного элемента, он обозначается [].
Примеры.
N | элементы списка | запись со скобками | запись с функтором ‘ ’ |
a | [a] | ‘ ’(a, [] ) | |
a b c | [a,b,c] | ‘ ’(a, ‘ ’(b, ‘ ’(c,[]))) | |
[a] | [[a]] | ‘ ’(‘ ’(a,[]),[]) | |
[] | [[]] | ‘ ’ ([],[]) | |
[a] [b,c] | [[a],[b,c]] | ‘ ’(‘ ’(a,[]), ‘ ’(b, ‘ ’(c,[]))) |
Список унифицируется с другим списком, если попарно унифицируются их элементы.
Список может делиться на "голову" и "хвост" с помощью операции отделения головы, которая обозначается вертикальной чертой (|), т.е. [Голова|Хвост]. Голова - фиксированное количество элементов. Хвост - список из оставшихся элементов списка. Чаще всего используется голова, состоящая из одного элемента.
В виде дерева список [X|Y] изображается следующим образом:
Примеры сопоставления списков со списком [Голова|Хвост]
N | Список | Голова | Хвост |
[a] | a | [] | |
[a,b,c] | a | [b,c] | |
[[a]] | [a] | [] | |
[] | не сопоставляется | не сопоставляется | |
[a|[c,d]] | a | [c,d] |
Список [1,2|[3,4]] равен списку [1,2,3,4]. При сопоставлении со списком [X,Y|Z] получим X=1, Y = 2 и Z = [3,4].
В SWI/PROLOG имеется особый вид списков - символьные списки. Символьный список - это фактически последовательность целых чисел, соответствующих ASCII-коду символов. Символьные списки заключаются в двойные кавычки. Следующие три списка являются сопоставимыми:
"abc" [ 97, 98, 99 ] '.'( 97,'.'(98,'.'(99),[])))
ПРОГРАММА 1 Разделение списка на голову и хвост.
write_list([]).
write_list([H|T]):- /* разделение списка на голову и хвост, */
write(H), nl, /* печать головы, пропуск строки */
write_list(T)./*рекурсивный вызов предиката от оставшегося списка*/