本文介绍了序言 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:
是的,但您必须确保使用命名变量或构造一个简单的辅助谓词来为您执行此操作:
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
.
这篇关于序言 findall/3的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!