Prolog 组合谓词
Prolog combining predicates
只是一个关于 Prolog 的小问题。假设我使用内置谓词 findall/3
获取列表并使用变量 X
作为我的输出。
我想知道如何在 last/2
等另一个谓词中使用此列表来查找此列表的最后一个元素。如果您也可以包含一个小示例,那将大有帮助。
首先,由于 Prolog 的目标是成为一种 逻辑编程 编程语言,所以没有 output 变量。
然而,假设你知道一个变量 X
在某个谓词之后是 有界的 并且你打算在调用新谓词时使用这个值,你可以使用 Prolog 的符合逻辑 "and" ,/2
。我将“and”放在引号之间,因为 and 有时不同于自然语言中对 "and" 行为方式的自然理解。
因此您可以使用谓词:
findall(A,foo(A),X),last(X,L).
首先找到foo/1
的所有出现,提取变量A
,将它们放入列表X
,最后得到[=17的last/2
元素=].
然后您可以在定义的谓词中使用它:
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.
只是一个关于 Prolog 的小问题。假设我使用内置谓词 findall/3
获取列表并使用变量 X
作为我的输出。
我想知道如何在 last/2
等另一个谓词中使用此列表来查找此列表的最后一个元素。如果您也可以包含一个小示例,那将大有帮助。
首先,由于 Prolog 的目标是成为一种 逻辑编程 编程语言,所以没有 output 变量。
然而,假设你知道一个变量 X
在某个谓词之后是 有界的 并且你打算在调用新谓词时使用这个值,你可以使用 Prolog 的符合逻辑 "and" ,/2
。我将“and”放在引号之间,因为 and 有时不同于自然语言中对 "and" 行为方式的自然理解。
因此您可以使用谓词:
findall(A,foo(A),X),last(X,L).
首先找到foo/1
的所有出现,提取变量A
,将它们放入列表X
,最后得到[=17的last/2
元素=].
然后您可以在定义的谓词中使用它:
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.