ЗАДАНИЕ 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)./*рекурсивный вызов предиката от оставшегося списка*/