1

私はこの事実を持っています:

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) を使用してみましたが、成功しませんでした:(

問題はルールの書き方にあると思います。

前もって感謝します!!!

4

2 に答える 2

1

タイプミス: モルフェマ / 形態素.

しかし、より深い問題は変数です。J否定が試行された時点でJは、インスタンス化されていない変数です。後で初めて、期待する値が得られます。

したがって、2 つの目標を交換して\+ください。

\+手段:現時点では証明できない。したがって、Prolog プログラムがどのように実行されるかが少し明らかになります。


あなたのプログラムには別の問題があります: I is Start+11 つ左に移動する可能性があります。このようにして、morpheme(r,I)はグラウンド ゴールになります。より速く実行される可能性があります。

于 2012-10-30T22:56:14.713 に答える
0

ありがとうございます!これで問題は解決しました。変更されたコードは次のとおりです。

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)).
于 2012-10-31T16:42:39.813 に答える