【问题标题】:Prolog returning "true" instead of "yes"Prolog 返回“true”而不是“yes”
【发布时间】:2019-08-13 06:00:06
【问题描述】:

输入查询后,我的 Prolog 代码需要返回是(或否),而是返回“true ?”并要求我按 Enter 键获得“是”。

问题是关于俄罗斯娃娃,娃娃从外到内的顺序是katrina->olga->natasha->irina。如果 X 直接在 Y 内部,则 DirectlyIn(X,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).

从查询?- contains(katrina, irina). 我预计输出只是“是”,但它输出的是“真?”直到我按回车,然后它输出“是”。

【问题讨论】:

    标签: prolog prolog-toplevel


    【解决方案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 解释器在证明第一条规则的主体时“忘记”它还有其他选择可供选择的事实。

    【讨论】:

      【解决方案2】:

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

      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
      

      【讨论】:

      • @Rhys Duncan - 这回答了你的问题吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-08
      • 2011-04-09
      • 2020-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-23
      相关资源
      最近更新 更多