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

Prolog返回“true”而不是“yes”,prolog,prolog-toplevel,Prolog,Prolog Toplevel,输入查询后,我的Prolog代码需要返回yes或no,但是否返回true?并要求我按enter键以获得“是” 问题是关于俄罗斯娃娃,娃娃从外到内的顺序是卡特里娜->奥尔加->娜塔莎->伊丽娜。DirectlyInX,如果X直接在Y内,则Y为真;如果X包含Y,则contains应为真 directlyIn('irina', 'natasha'). directlyIn('natasha', 'olga'). directlyIn('olga', 'katrina'). /// contains

输入查询后,我的Prolog代码需要返回yes或no,但是否返回true?并要求我按enter键以获得“是”

问题是关于俄罗斯娃娃,娃娃从外到内的顺序是卡特里娜->奥尔加->娜塔莎->伊丽娜。DirectlyInX,如果X直接在Y内,则Y为真;如果X包含Y,则contains应为真

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

///

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

从询问中?-伊琳娜,伊琳娜。我希望输出结果是肯定的,但是它输出的是真的吗?直到我按enter键,然后它输出yes。

这是因为您的程序正在回溯。请注意,每次需要Prolog解释器证明谓词包含/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解释器在证明第一条规则的主体时“忘记”它有其他选择的事实。

如果需要输出是或否,则可以生成如下答案。 伤口!用于在输出“是”时禁止回答“否”

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).
查询containskatrina,irina,回答。收益率:

查询Sirina,卡特里娜,回答。收益率:


@里斯·邓肯——这回答了你的问题吗?
Answer = yes
Answer = no