2011-12-30 36 views
2

我在SWI-Prolog的編寫下面的代碼:SWI-Prolog的序言如何處理邏輯比較

:- dynamic state_a/1 . 
:- dynamic state_b/1 . 
:- dynamic state_c/1 . 
state_a([1,2,3,4,5,0]). 
state_b([0]). 
chop(LIST,HEAD,TAIL) :- LIST=[HEAD|TAIL]. 
move_ab :- !,state_a(X), 
      chop(X,Ha,Ba), 
      Ha>0, 
      state_b(Y), 
      chop(Y,Hb,Bb),!, 
      (Ha<Hb ; Hb =:= 0), 
      asserta(state_a(Ba)),asserta(state_b([Ha|Y])), 
      retract(state_a(X)), retract(state_b(Y)); 
      write('Wrong Move.Choose Another'). 

有2 OR(;)在我的代碼。當我第一次詢問Prolog中的move_ab時,第二個OR之前的所有條件都是真的,所以我從Prolog獲得了答案true。 但是我第二次問Prolog中的move_ab我只能得到答案false。 我不知道這會發生。在第二個OR之前的一些條件是不正確的,所以Prolog應該在第二個OR之後檢查條件並且給我寫消息錯誤的移動。選擇另一個。。 我嘗試使用()來分組條件,但我仍然得到相同的消息。 有關正在發生的事情的任何想法?順便說一句,我在序言對於新手,剛開始3天前:)

回答

1

的問題在於使用切(!/0)的以前條件都很好的測試。削減刪除選擇點。這意味着在你測試任何東西之前,選擇都會被刪除。所以如果測試失敗,一切都會失敗!

順便說一句,操縱數據庫可能不是最好的主意。爲了表示狀態,您可以使用全局變量如下:在序言給初學者

:- nb_setval(state_a, [1,2,3,4,5,0]). 
:- nb_setval(state_b, [0]). 

move_ab :- 
    nb_getval(state_a, [Ha|Ta]), 
    Ha > 0, 
    nb_getval(state_b, [Hb|Tb]), 
    (Ha < Hb ; Hb =:= 0), 
    nb_setval(state_a, Ta), 
    nb_setval(state_b, [Ha, Hb|Tb]), 
    ! 
    ; 
    write('Wrong Move.Choose Another'). 

一般的建議是遠離數據庫操作如果可能的話了,因爲經常的問題是沒有它可以解決的。雖然這可能是合理的,但全局變量將更快,更容易操作。

+0

謝謝。幫了很多:) – Babilicious 2011-12-31 10:28:11