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就像jug通过jugsState谓词(我假设现在称为katastasi)检索(每个事实的)当前值一样。

现在你必须通过编写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 回答