输入查询后,我的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键,然后输出“是”。
答案 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)
如果需要输出yes
或no
,则可以如下生成答案。
每当输出!
时,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