假设我有一个包含几个事实的谓词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)]
只是总结一下@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
的变量统一起来。