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

UptoLike

37
данное правило заканчивается неуспешно, то неуспешно заканчивается и
третье правило, следовательно, удовлетворяетсячетвертое правило и 3
вставляется в выходной список слева от 9: insert (3, [9], [3, 9]).
Далее происходит возврат к предикату insert_sort, который принимает
следующий вид: insert_sort ([3, 9], [3, 9]).
На следующем шаге рекурсии из стека извлекается 7 и по третьему
правилу вызывается предикат asc_order в виде asc_order (7, 3):- 7>3. Так
как
данное правило заканчивается успешно, то элемент 3 убирается в стек и
insert вызвается рекурсивно еще раз, но уже с хвостом списка [9]: insert (7,
[9], _). Так как правило asc_order (7, 9):- 7>9 заканчивается неуспешно, то
выполняется четвертое правило, происходит возврат на предыдущие шаги
рекурсии сначала insert, затем insert_sort.
В результате 7 помещается в выходной список между элементами 3
и
9: insert (7, [3, 9], [3, 7, 9]).
При возврате еще на один шаг рекурсии из стека извлекается 4 и по
третьему правилу вызывается предикат asc_order в виде asc_order (4, 3):-
4>3. Так как данное правило заканчивается успешно, то элемент 3 убирается
в стек и insert вызвается рекурсивно еще раз, но уже с хвостом списка [7,
9]: insert (4, [7, 9], _). Так как правило asc_order (4, 7):- 4>7 заканчивается
неуспешно,
то выполняется четвертое правило, происходит возврат на
предыдущие шаги рекурсии сначала insert, затем insert_sort.
В результате 4 помещается в выходной список между элементами 3 и
7:
insert (4, [3, 7, 9], [3, 4, 7, 9]).
insert_sort [4, 7, 3, 9], [3, 4, 7, 9]).
2.11.6 Компоновка данных в список
Иногда при программировании определенных задач возникает
необходимость собрать данные из фактов БД в список для последующей их
обработки. Пролог содержит
встроенный предикат findall, который позволяет
выполнить данную операцию. Описание предиката findall выглядит
следующим образом:
Findall (Var_, Predicate_, List_), где Var_ обозначает имя для терма
предиката Predicate_, в соответствии с типом которого формируются
элементы списка List_.
Пример 33: использование предиката findall.
domains
d=integer
predicates
decimal (d)
write_decimal
clauses
decimal (0)