本文介绍了Prolog findall/3的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
假设我有一个包含多个事实的谓词 pred.
Say I have a predicate pred containing several facts.
pred(a, b, c).
pred(a, d, f).
pred(x, y, z).
我可以使用 findall/3 来获取所有可以进行模式匹配的事实列表吗?
Can I use findall/3 to get a list of all facts which can be pattern matched?
例如,如果我有
pred(a, _, _)
我想获得
[pred(a, b, c), pred(a, d, f)]
推荐答案
简单总结一下@mbratch在评论区说的话:
Just summing up what @mbratch said in the comment section:
是的,但您必须确保使用 named 变量或构造一个简单的辅助谓词来为您执行此操作:
Yes, but you have to make sure that you either use named variables or construct a simple helper predicate that does that for you:
命名变量:
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
的变量统一起来.
And thus doesn't unify the Variables of Template
with those of Goal
.
这篇关于Prolog findall/3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!