
список соответствий добавляется пара из первых двух аргументов, а из списка
свободных чисел удаляется назначенное число
Заметим, что при вызове предиката getpair
1-ый,
3-ий и 4-ый аргументы должны
быть связанными, а остальные - свободными.
Запишем правила для предиката getpair.
Сначала рассмотрим случай, когда данный символ уже имеет соответствие. В
этом случае в списке, заданном
3-им
аргументом, должна быть пара, содержащая наш
символ Второй элемент этой пары содержит число, которое надо вернуть через 2-ой
аргумент
Для описания этого случая нам потребуется 2 правила Первое описывает случай,
когда наш символ содержится в голове списка соответствий При этом согласование
предиката необходимо прекратить, иначе в последующих правилах нашему символу
могут быть назначены новые (дополнительные) числа, что недопустимо
getpair
(S,
С,
[pr(S,A)
|Soot],Fre,
[pr(S,A)
|Soot],Fre)
:-!,A=»C.
Если наш символ не содержится в голове списка соответствий, он может
содержаться в его хвосте, поэтому необходимо рекурсивно перебрать все элементы
этого списка Обратите внимание, что голова списка соответствий не теряется, а
переносится в 5-ый аргумент
getpair
(S,С,
[A|Soot],
Fre,
[A|SootN],FreeN)
:-
getpair(S,С,Soot,Fre,SootN,FreeN).
Если наш символ не найден в списке соответствий, т е 3-ий аргумент является
пустым списком, то необходимо создать новое соответствие, используя числа из списка
свободных (4-ый аргумент) При этом необходимо перебрать все возможные варианты
В приведенных ниже двух правилах используется та же идея, что и в предикате member
из пункта 6 2
getpair(S,С,
[],
[С
IFreeN],
[pr(S,C)],FreeN)
.
getpair(S,С,[],[A|Fre],SootN,[A|FreeN]):-
getpair(S,C,[],Fre,SootN,FreeN).
8.4.4
Предикат
sumlist
для решения ребуса
При сложении чисел «столбиком» может возникать перенос единицы из младшего
разряда, который нам необходимо учитывать. По окончании сложения значение
переноса должно быть равным нулю Кроме того, слагаемые и сумма могут быть
неодинаковой длины, и это мы тоже должны учесть.
Предикат, который будет выполнять сложение списков символов и строить
список соответствий, назовем sumlist.
138