2016-02-28 5 views
1

Просто маленький вопрос о Прологе. Скажем, я использовал встроенный предикат findall/3 для получения списка и использовал переменную X в качестве моего вывода.Пролог, объединяющий предикаты

Мне интересно, как я мог бы использовать этот список в другом предикате, таком как last/2, чтобы найти последний элемент этого списка. Если бы вы могли включить небольшой пример, который бы очень помог.

+0

Вы должны показать, что вы уже пробовали. –

+0

Почему бы не 'listbuilder (List), last (List, Y)'? –

+0

Значит, мне нужно было бы определить только один предикат? – ZazzyCola

ответ

1

Прежде всего, поскольку Пролог стремится быть логики программирования языком программирования, есть ню такие вещи, как выхода переменных.

Тем не менее, говорит, что вы знаете, переменная 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. 
+0

Большое спасибо за объяснение – ZazzyCola