【问题标题】:PROLOG:How to exclude an optionPROLOG:如何排除一个选项
【发布时间】:2014-06-02 15:44:26
【问题描述】:

我有这段代码,它建议某种动物在这种情况下可以与其他动物共存:

suggest(X) :- bigAnimal(X),bigAnimal(Y),coexist(X,Y),write(Y),nl,fail.

这个循环直到失败。我的问题是它也打印出变量 X

如何从输出中排除它,谢谢。

【问题讨论】:

  • coexist/2 对称吗?换句话说,您是否同时拥有coexist(narty,nelmam).coexist(nelmam,narty). 事实?
  • writeln(Y)write(Y), nl 相同。

标签: prolog


【解决方案1】:

在您的程序中,您正在通过顶层 shell 混合查询并使用 write/1 执行副作用。这样一来,您很可能会错过很多 Prolog 可以为您提供的功能。

相反,坚持纯无副作用的关系,让所有的写作都由顶层完成。

因此,不要考虑suggest/1,而是考虑一个新关系,比如biganimal_compatiblewith/2

biganimal_compatiblewith(X,Y) :-
   bigAnimal(X),
   bigAnimal(Y),
   coexist(X,Y),
   dif(X,Y).     % maybe

?- biganimal_compatiblewith(X,Y).
X = melan,
Y = narty ;
X = melman,
Y = nelman ...

现在,XY 都打印在顶层。想想这种关系与原始suggest/1 相比有多大用处。你可以要求一个或另一个,甚至可以要求

?- biganimal_compatiblewith(X,X).

您还可以重用此关系,构建更复杂的关系:

?- biganimal_compatiblewith(X,Y), burgervore(Y).

这就是 Prolog 关系的本质。您可以在相当长的一段时间内避免副作用。

另外一个例子如何避免不必要的副作用:What are the pros and cons of using manual list iteration vs recursion through fail

【讨论】:

    【解决方案2】:
    suggest(X) :-
        bigAnimal(X), bigAnimal(Y), X \== Y, coexist(X,Y), write(Y), nl, fail.
    

    【讨论】:

      【解决方案3】:

      当我有这段代码时:

      bigAnimal(elephantas).
      bigAnimal(kamilopardali).
      
      coexist(elephantas,kamilopardali).
      coexist(kamilopardali,elephantas).
      /* coexist has to be symmetric */
      
      
      suggest(X) :- bigAnimal(X),bigAnimal(Y),coexist(X,Y),write(Y),nl,fail.
      

      结果如预期。

      2 ?- suggest(elephantas).
      kamilopardali
      false.
      4 ?- suggest(kamilopardali).
      elephantas
      false.
      

      您不应该以; 结束您的代码,因为这意味着OR。当我试图编译它时,我得到了一个错误。这就是为什么我必须以句号结束我的规则 (.)

      【讨论】:

        猜你喜欢
        • 2019-11-22
        • 1970-01-01
        • 1970-01-01
        • 2012-07-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-26
        相关资源
        最近更新 更多