【问题标题】:Not in Swi-Prolog 6.2不在 Swi-Prolog 6.2 中
【发布时间】:2012-10-30 22:48:43
【问题描述】:

我有这个事实:

morpheme(a,82).
morpheme(r,83).

我有这个规则:

foo(er,Start) :-
    morpheme(a,Start), morpheme(r,I), I is Start+1,
    not(morfema(_,J)), J is I+1.

当我询问时:

foo(er,82).

我得到的是“假”(错误答案)而不是“真”(正确答案)。

在查询中,我试图说:“如果在起始位置“Start”中有语素 AR,并且在更高位置(高于 Start+1)没有更多语素,则触发规则“ .

我尝试使用 \+ 和 cut-fail (http://stackoverflow.com/questions/3850563/writing-prolog-statement-with-not-operator) 但没有成功:(

我认为问题出在我编写规则的方式上。

提前致谢!!!

【问题讨论】:

    标签: prolog


    【解决方案1】:

    错字:morfema / 语素。

    但更深层次的问题是变量J:在尝试否定的时间点,J 是一个未实例化的变量。只有之后,它才会得到你期望的值。

    所以交换两个目标 - 最好使用 \+ 代替 not!

    \+ 表示:目前无法证明。因此,它揭示了一些 Prolog 程序的执行方式。


    您的程序中还有另一个问题:您可以将I is Start+1 向左移动一位。通过这种方式,morpheme(r,I) 将成为地面目标。它可能会执行得更快。

    【讨论】:

      【解决方案2】:

      谢谢假!这解决了问题。修改后的代码如下:

      morpheme(a,82).
      morpheme(r,83).
      
      not(X) :- \+ X.
      
      foo(er,Start) :-
          morpheme(a,Start), I is Start+1, morpheme(r,I),
          J is I+1, not(morpheme(_,J)).
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-01-16
        • 1970-01-01
        • 2012-04-02
        • 1970-01-01
        • 1970-01-01
        • 2011-11-11
        相关资源
        最近更新 更多