1

こんにちは、if文に問題があります。私はこれを持っています

final(C1-W1,C2-W2,C3-W3):- 
    retractall(end_jug), 
    asserta( end_jug(C1,W1) ),
    asserta( end_jug(C2,W2) ),
    asserta( end_jug(C3,W3) ).

そしてこれ

katastasi(L) :- 
    findall(X-W, jug(X,W), L0), sort(L0,L).

どうすればこのチェックができますか????:

    if(jug(C1,W1) == end_jug(C1,W1) && jug(C2,W2) == end_jug(C2,W2) && jug(C3,W3) == end_jug(C3,W3)) write('Congrats').

前もって感謝します!!

4

2 に答える 2

2

このような:

is_final_state :- 
  katastasi(S), writeln(S),
  S=[C1-W1,C2-W2,C3-W3],
  (  end_jug(C1,W1),
     end_jug(C2,W2),
     end_jug(C3,W3)
  -> writeln('Congrats!')
  ;  W1+W2+W3 < 6
  -> writeln('WARNING: not enough water left!'),
     fail
  ).

あなたはあなたの前の質問に言及するべきでした。このコードは、そこにある答えのコードの一部です。

あなたのコードはPrologにありますが、あなたが尋ねたチェックは「基本」にありました。基本的な考え方を手放します。:)統合の一環として、Prologがチェックを行います。

上記のコードの値は、ユーザーがゲームの開始時6に呼び出すことによって指定する最終的な値に従って、実際に計算する必要があります。final(各ファクトの)最終値は、(各ファクトの)現在の値が述語(現在は呼ばれていると思います)によって取得されるend_jugのと同じように取得できます。jugjugsStatekatastasi

次に、述語を記述してゲームを完了する必要があります。stop述語は、クリーンアップを実行する必要があります(つまりretract、アサートされたすべてのファクトを呼び出します)。undo述語を作成することもできます。:)

于 2012-02-23T20:00:41.940 に答える
0

,新しい述語の下で結合された条件を書くだけです:

win(C1, W1, C2, W2, C3, W3):-
    jug(C1,W1) \== end_jug(C1,W1),
    jug(C2,W2) \== end_jug(C2,W2),
    jug(C3,W3) \== end_jug(C3,W3).

次に、必要に応じてこの述語を使用します。

finish(C1, W1, C2, W2, C3, W3):-
    win(C1, W1, C2, W2, C3, W3),
    write('Congrats').

または全体としてそれを書いてください:

finish(C1, W1, C2, W2, C3, W3):-
    jug(C1,W1) \== end_jug(C1,W1),
    jug(C2,W2) \== end_jug(C2,W2),
    jug(C3,W3) \== end_jug(C3,W3),
    write('Congrats').
于 2012-02-23T19:49:23.007 に答える