Логическое программирование на языке Visual Prolog. Солдатова О.П - 34 стр.

UptoLike

34
domains
list=integer*
predicates
аppend (list, list, list)
clauses
append ( [], L2, L2).
append ([H|T1], L2, [H|T3 ]):- append (T1, L2, T3).
goal
append ( [1, 2, 3], [4, 5], L3).
Основное использование предиката append состоит в объединении двух
списков, что делается при помощи задания цели вида append ([1, 2, 3], [4, 5],
L3). Поиск ответа на вопрос типа: append (L1, [3, 4, 5], [1, 2, 3, 4, 5])
сводится к поиску такого списка L1=[1, 2], который при слиянии со списком
L2 = [3, 4, 5] даст список L3 = [1, 2, 3, 4, 5]. При обработки цели append (L1,
L2, [1, 2, 3, 4, 5]) ищутся такие списки
L1 и L2, что их объединение даст
список L3 = [1, 2, 3, 4, 5].
2.11.3 Определение длины списка
Число элементов в списке можно подсчитать при помощи рекурсивных
предикатов count_list1 и count_list2. Предикат count_list1 ведёт подсчёт числа
элементов в списке на прямом ходе рекурсии, начиная от головы списка, при
этом первый параметр типа byte является текущим счётчиком, а второй
-
необходим для возвращения результата при выходе из рекурсии. Предикат
count_list2 ведёт подсчёт числа элементов в списке на обратном ходе
рекурсии, начиная с последнего элемента, при этом параметр типа byte
является текущим счётчиком и результатом одновременно. Два варианта
решения задачи приводятся в примере 29.
Пример 29: определение длины списка.
domains
list=integer*
predicates
count_list1(list,byte,byte)
count_list2(list,byte)
clauses
count_list1([],N,N).
count_list1([_|T],N,M):- N1=N+1, count_list1(T,N1,M).
count_list2([],0).
count_list1([_|T],N):- count_list1(T,N1), N=N1+1.
goal
count_list1([0,-1,2,6,-9],0,N), count_list2([4,3,-8],K).