1. Выведите список из целых чисел
Предикат имеет один аргумент – список, который необходимо вывести.
Domains
intlist = integer*
Predicates
writeList(intlist)
Clauses
writeList([]):-write(‘ ‘).
writeList([H|T]):-write(H,’ ‘), writeList(T).
Goal
writeList([3,4,1]).
Если список пустой, ничего не делаем. Иначе выводи голову списка, а затем его хвост.
При первом просмотре целевое утверждение таково writeList([3,4,1]). Оно удовлетворяет второму правилу. H становится равным 3, а T равным [4,1]. Пролог печатает 1 и вызывает рекурсивно writeList([4,1]).
Этот вызов снова удовлетворяет второму правилу. На этот раз H=4, а T=[1]. Пролог печатает 4 и вызывает рекурсивно writeList([1]).
И этот вызов подходит под второе правило. H=1, а T=[]. Пролог печатает 1 и вызывает writeList([]).
writeList([]) завершает цепочку вызовов.
2. Найдите длину списка
Предикат имеет два аргумента – список и длина.
Domains
intlist = integer*
Predicates
length(intlist, integer)
Clauses
length([], 0).
length([_|T], L):-length(T, TL), L=TL+1.
Goal
length([3,4,1,2,5], L).
Длина пустого списка – ноль, а длина непустого списка (представленного в виде объединения первого элемента и хвоста) равна длине хвоста плюс единица.
Обратите внимание, что при переходе от всего списка к его хвосту нам неважно, чему равен первый элемент списка, поэтому мы используем анонимную переменную.







