Пролог, объединяющий предикаты
Просто небольшой вопрос о Прологе. Скажем, я использовал встроенный предикат findall/3
получить список и использовать переменную X
как мой вывод.
Мне интересно, как я мог бы затем использовать этот список в другом предикате, таком как last/2
чтобы найти последний элемент этого списка. Если бы вы могли привести небольшой пример, это очень помогло бы.
1 ответ
Прежде всего, поскольку Prolog стремится быть языком программирования логического программирования, существует такая вещь, как выходные переменные.
Тем не менее, скажем, вы знаете переменную X
ограничен после определенного предиката, и вы намерены использовать это значение при вызове нового предиката, вы можете использовать логические "и" Пролога ,/2
, Я ставлю " и " между кавычками, потому что это и иногда отличается от естественного понимания того, как "и" в естественном языке ведет себя.
Таким образом, вы можете использовать предикат:
findall(A,foo(A),X),last(X,L).
Чтобы сначала найти все случаи foo/1
, извлеки переменную A
, положить их в список X
и, наконец, получить last/2
элемент X
,
Затем вы можете, например, использовать это в определенном предикате:
last_foo(L) :-
findall(A,foo(A),X),
last(X,L).
Если вы запустите это, например, с:
foo(a).
foo(9).
foo(b).
Результаты:
?- foo(A).
A = a ;
A = 9 ;
A = b.
а также:
?- findall(A,foo(A),X).
X = [a, 9, b].
Теперь результат для получения последнего:
?- findall(A,foo(A),X),last(X,L).
X = [a, 9, b],
L = b.
или же:
?- last_foo(L).
L = b.