На этом шаге мы рассмотрим составные списки.
Список целых может быть объявлен просто:
integerlist=integer*
Это же справедливо и для списка действительных чисел, списка идентификаторов или списка строк. Часто бывает важно иметь внутри одного списка комбинацию элементов, принадлежащих разным типам:
[2,3,5.12,["food","goo"],"new"] % Некорректно в Прологе.
Составные списки - это списки, в которых используется более чем один тип элементов. Для работы со списками из разнотипных элементов нужны специальные декларации, потому что Пролог требует, чтобы все элементы списка принадлежали одному типу. Для создания списка, который мог бы хранить различные типы элементов, в Прологе необходимо использовать функторы, потому что домен может содержать более одного типа данных в качестве аргументов для функторов.
Пример объявления доменов для списка, который может содержать символы, целые, строки или списки:
domains % функторы l,i,c и s
llist=l(list); i(integer); с(char); s(string)
list=llist*
[2,9,["food","goo"],"new"] % Некорректно в Прологе
[i(2),i(9),1([s("food"),s("goo")]),s("new")] % Корректно.
Ниже приведен пример, показывающий объединение списков и использование объявления доменов в типичном случае работы со списками.
domains llist=l(list); i(integer); c(char); s(string) list=llist* predicates append(list,list,list) clauses append([],L,L). append([X |Ll],L2,[X |L3]):- append(Ll,L2,L3). goal append([s(likes),l([s(bill), s(mary)])], [s(bill), s(sue)],Ans), write("First list: ", Ans,"\n\n"), append( [l( [s("This") ,s("is") ,s("a") ,s("list") ] ) ,s(bee) ], [c('c')],Ans2), write("Second list: ", Ans2, '\n', '\n').
Со следующего шага мы начнем рассматривать реализацию арифметических и логических операций.