Пролог, объединяющий предикаты

Просто небольшой вопрос о Прологе. Скажем, я использовал встроенный предикат 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.
Другие вопросы по тегам