2012-02-23 9 views
1

こんにちは私はif文に問題があります。私はこのプロローグ内の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)). 

と私は、このチェックを持つことができますどのようにこの1

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'). 

感謝を事前に!!

+0

[あなたの前の質問](http://stackoverflow.com/questions/9030462/3-jugs-of-water-in-prolog-doesnt-work)について言及しておきます。 :) –

答えて

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'). 
+0

'jug(C1、W1)== end_jug(C1、W1)'は決して成功できません。これは基本ではなく、Prologです。 –

+0

'jug(C1、W1)\ == end_jug(C1、W1)'は*常に*成功します。 –

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 
). 

あなたはyour previous questionを述べてきたはずです。このコードは、そこの答えのコードの一部です。

あなたのコードはPrologにありますが、尋ねた点検は「基本」になっています。基本的な考え方を放棄する。 :) Prologは統一の一環として、あなたのために小切手を出します。

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

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

+0

と[以前の](http://stackoverflow.com/questions/8748867/whats-wrong-with-my-prolog-program-for-solving-the-3-jugs-of-water-puzzle)の質問もx ) – m09

+0

@Mog私は、この新しい質問は、その嫌な質問への答えからのコードを指していることを意味しています。彼は "ゲーム"を望んでいた。ああ、今そこに名前の衝突があるのがわかります。 :)編集します。 –