首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog-如何与OR操作符结合使用?

Prolog-如何与OR操作符结合使用?
EN

Stack Overflow用户
提问于 2014-02-14 09:17:10
回答 2查看 147关注 0票数 2

我写了一个小程序:

代码语言:javascript
复制
married(guy1, fem1).
married(guy2, fem2).

married_to(X,Y):-!, married(X,Y); married(Y,X).

指纹:

代码语言:javascript
复制
X = guy1,
Y = fem1 ;
X = guy2,
Y = fem2.

我的目的是打印已婚夫妇,但每一次。上面的规则适用于我,但我不明白为什么!这是怎么回事?

有什么区别吗:married_to(X,Y):- married(X,Y); married(Y,X).

这些指纹:

代码语言:javascript
复制
X = guy1,
Y = fem1 ;
X = guy2,
Y = fem2 ;
X = fem1,
Y = guy1 ;
X = fem2,
Y = guy2.
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-02-15 15:52:27

假设您有等效的定义married_to(X,Y):- true, !, married(X,Y) ; married(Y,X).。如果true失败了,那么我们就会跳到另一种选择,但由于它不会失败,我们将坚定地站在(分离的)后续分支上。

你的代码是

代码语言:javascript
复制
married_to(X,Y):- ( !, married(X,Y) ) ; ( married(Y,X) ).

而不是

代码语言:javascript
复制
married_to(X,Y):- !, (  married(X,Y)  ;   married(Y,X) ).

它实际上相当于

代码语言:javascript
复制
married_to(X,Y):- !, married(X,Y). 
married_to(X,Y):-    married(Y,X).

也许有了这种感觉,对这里发生的事情有一种“感觉”就更容易了。显然,谓词的第二个子句被切断了。)我们致力于第一条,第二条根本没有工作的机会。

票数 1
EN

Stack Overflow用户

发布于 2014-02-14 09:36:27

裁剪在断开时将执行提交给第一个分支。因此,你的规则:

代码语言:javascript
复制
married_to(X,Y):-!, married(X,Y); married(Y,X).

在业务上与:

代码语言:javascript
复制
married_to(X,Y):-!, married(X,Y).

并且,考虑到married_to /2谓词没有其他子句,相当于:

代码语言:javascript
复制
married_to(X,Y):- married(X,Y).
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21775220

复制
相关文章

相似问题

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