我试图在Prolog中提出一个查询,在这个查询中,我询问是否有一个值位于x^2=25。但是,如果在知识库中,只有x^2为25的情况下,我才希望它返回yes。
我的知识库里有这样的信息:
squared(5,25)
squared((-5),25)我希望程序返回no,因为x有两个答案,其中有x^2=25,而我只想要一个。
到目前为止我有这样的想法:
squared(x,25),squared(x,25), x=x.发布于 2021-09-25 02:27:42
您可以按以下方式使用forall/2:
squared(X, 25), forall(squared(Y, 25), X = Y).只有当squared(X, 25)的所有解决方案都具有相同的值时,此查询才会成功。
详细说明:
squared(X, 25), % we have a single solution, X
forall(squared(Y, 25), X = Y). % we are asserting all solutions are equal to X如果您不熟悉forall/2
如果对于所有条件的可选绑定,动作都可以被证明,那么
forall(Condition, Action)就成功了。它相当于\+ (Condition, \+ Action)。
因此,这适用于具有多重性> 1根的谓词(这可能不是您想要的,在这种情况下,findall可能会有所帮助)。以下内容将确保您的根只有一个:
findall(X, squared(X, 25), [_]).让我们看一个示例X^2 = 0,它的双根值为0:
squared(0, 0).
squared(0, 0).所以你会有:
|?- findall(X, squared(X, 0), [_]). % check for exactly one root
no
|?- squared(X, 0), forall(squared(Y, 0), X = Y). % same root with any multiplicity
X = 0 ?
yes此外,prolog中的变量以Captial字母(或_)开头。
编辑:一个更优化的搜索
squared(X, 25), !, forall(squared(Y, 25), X = Y).squared(X, 25)后的剪切确保我们只遍历所有根一次。如果forall迭代失败,则存在一个带有squared(Y, 25)和Y \= X的Y。因此,我们不需要检查不同的X。
https://stackoverflow.com/questions/69322545
复制相似问题