Prolog返回“ true”而不是“ yes”

时间:2019-08-13 06:00:06

标签: prolog prolog-toplevel

输入查询后,我的Prolog代码必须返回yes(或no),但返回的是“ true?”并要求我按Enter键才能获得“是”。

问题是关于俄罗斯玩偶,从外到内的玩偶顺序是卡特里娜->奥尔加->娜塔莎->伊琳娜。如果X直接位于Y内部,则DirectlyIn(X,Y)为true;如果X包含Y,则containsly应该为true。

directlyIn('irina', 'natasha').
directlyIn('natasha', 'olga').
directlyIn('olga', 'katrina').

///

contains(X, Y) :- directlyIn(Y, X).
contains(X, Y) :- directlyIn(Z, X), contains(Z, Y).

从查询?- contains(katrina, irina).中,我希望输出仅为“是”,但输出为“ true?”。直到我按Enter键,然后输出“是”。

2 个答案:

答案 0 :(得分:1)

这是由于您的程序正在回溯。请注意,每次需要Prolog解释器证明谓词contains/2时,它都可以在第一条规则或第二条规则之间进行选择,因为两者都会产生匹配项,并且会记录该事实,如果用户希望产生该结果,则可以稍后使用另一个证明。当到达证明树中的叶子时,它会输出该结果(在您的情况下,通过打印true并等待您输入是否继续搜索证明。如果按Enter,它将开始该搜索并回溯,但是它无法找到任何进一步的证明,这导致false被输出到屏幕。 您可以通过在证明树中引入切口来迫使Prolog忘记分支点:

directlyIn('irina', 'natasha').
directlyIn('natasha', 'olga').
directlyIn('olga', 'katrina').

contains(X, Y) :- directlyIn(Z, X), contains(Z, Y), !.
contains(X, Y) :- directlyIn(Y, X).

这迫使Prolog解释器“忘记”以下事实:在证明第一条规则的正文时,它还有其他选择。

答案 1 :(得分:0)

如果需要输出yesno,则可以如下生成答案。 每当输出!时,cut no都将禁止回答yes

directlyIn(irina, natasha).
directlyIn(natasha, olga).
directlyIn(olga, katrina).

contains(X, Y, yes) :- directlyIn(Y, X).
contains(X, Y, yes) :- directlyIn(Z, X), contains(Z, Y, yes), !.
contains(_, _, no).

查询contains(katrina, irina, Answer).会产生:

Answer = yes

查询contains(irina, katrina, Answer).会产生:

Answer = no