如果在prolog中声明

时间:2012-02-23 19:43:43

标签: prolog water-jug-problem

您好我的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').

提前致谢!!

2 个答案:

答案 0 :(得分: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事实)一样(我假设现在称为{{1} }})。

现在你必须通过编写katastasi谓词完成你的游戏,该谓词应该进行清理(即对所有断言的事实调用stop)。您甚至可以制作retract谓词。 :)

答案 1 :(得分: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').