9

私はそれについて本で読んだことがありますが、それはまったく説明されていませんでした。私もプログラムでそれを見たことがありません。Prolog構文の一部ですか?何のために?使っていますか?

4

3 に答える 3

8

含意を表します。右側は、左側が true の場合にのみ実行されます。したがって、このコードがある場合は、

implication(X) :-
  (X = a ->
    write('Argument a received.'), nl
  ; X = b ->
    write('Argument b received.'), nl
  ;
    write('Received unknown argument.'), nl
  ).

次に、引数に応じてさまざまなものを書き込みます。

?- implication(a).
Argument a received.
true.

?- implication(b).
Argument b received.
true.

?- implication(c).
Received unknown argument.
true.

(ドキュメントへのリンク。)

于 2009-11-21T15:00:47.523 に答える
3

これはカットのローカルバージョンです。たとえば、SWIマニュアルの制御に関するセクションを参照してください。

これは主に、if-then-else by(condition-> true-branch; false-branch)を実装するために使用されます。条件が成功すると、真のブランチから条件または偽のブランチに戻るバックトラックはありませんが、if-then-elseからのバックトラックは引き続き可能です。

?- member(X,[1,2,3]), (X=1 -> Y=a ; X=2 -> Y=b ; Y=c).
X = 1,
Y = a ;
X = 2,
Y = b ;
X = 3,
Y = c.

?- member(X,[1,2,3]), (X=1, !, Y=a ; X=2 -> Y=b ; Y=c).
X = 1,
Y = a.

したがって、ローカルカットと呼ばれます。

于 2009-11-21T19:30:34.827 に答える
1

もっと冗長なことを書くことで、使用を避けることができます。Stephan の述語を書き直すと、次のようになります。

implication(X) :-
  (
    X = a,
    write('Argument a received.'), nl
  ; 
    X = b,
    write('Argument b received.'), nl
  ;
    X \= a,
    X \= b,
    write('Received unknown argument.'), nl
  ).

(ええ、使用に問題はないと思いますが、上司が何らかの理由でそれについて偏執的だったので、常に上記のアプローチを使用していました。)

どちらのバージョンでも、カバーする予定のすべてのケースをカバーしていることに注意する必要があります。特に、ブランチが多数ある場合は注意が必要です。

ETA: これが Stephan のものと完全に同等かどうかはわかりませんimplication(X)。しかし、私は今チェックする Prolog インタープリターを持っていません。

于 2009-11-22T05:17:07.090 に答える