首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何问prolog,如果只有一个逻辑答案

如何问prolog,如果只有一个逻辑答案
EN

Stack Overflow用户
提问于 2021-09-25 01:47:08
回答 1查看 72关注 0票数 1

我试图在Prolog中提出一个查询,在这个查询中,我询问是否有一个值位于x^2=25。但是,如果在知识库中,只有x^2为25的情况下,我才希望它返回yes

我的知识库里有这样的信息:

代码语言:javascript
复制
squared(5,25) 
squared((-5),25)

我希望程序返回no,因为x有两个答案,其中有x^2=25,而我只想要一个。

到目前为止我有这样的想法:

代码语言:javascript
复制
squared(x,25),squared(x,25), x=x.
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-09-25 02:27:42

您可以按以下方式使用forall/2

代码语言:javascript
复制
squared(X, 25), forall(squared(Y, 25), X = Y).

只有当squared(X, 25)的所有解决方案都具有相同的值时,此查询才会成功。

详细说明:

代码语言:javascript
复制
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可能会有所帮助)。以下内容将确保您的根只有一个:

代码语言:javascript
复制
findall(X, squared(X, 25), [_]).

让我们看一个示例X^2 = 0,它的双根值为0:

代码语言:javascript
复制
squared(0, 0).
squared(0, 0).

所以你会有:

代码语言:javascript
复制
|?- 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字母(或_)开头。

编辑:一个更优化的搜索

代码语言:javascript
复制
squared(X, 25), !, forall(squared(Y, 25), X = Y).

squared(X, 25)后的剪切确保我们只遍历所有根一次。如果forall迭代失败,则存在一个带有squared(Y, 25)Y \= XY。因此,我们不需要检查不同的X

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69322545

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档