1

假设我有一个谓词 pred 包含几个事实。

pred(a, b, c).
pred(a, d, f).
pred(x, y, z).

我可以使用 findall/3 来获取可以进行模式匹配的所有事实的列表吗?

例如,如果我有

pred(a, _, _) 我想获得

[pred(a, b, c), pred(a, d, f)]

4

1 回答 1

1

只是总结一下@mbratch 在评论部分所说的话:

是的,但是您必须确保使用命名变量或构造一个简单的辅助谓词来为您执行此操作:

命名变量:

findall(pred(a,X,Y),pred(a,X,Y),List).

辅助谓词:

special_findall(X,List):-findall(X,X,List).

?-special_findall(pred(a,_,_),List).
List = [pred(a, b, c), pred(a, d, f)].

请注意,这不起作用

findall(pred(a,_,_),pred(a,_,_),List).

因为它相当于

 findall(pred(a,A,B),pred(a,C,D),List).

因此没有将 的变量Template与的变量统一起来Goal

于 2014-02-04T13:38:08.677 回答