2011-12-30 1 views
2

Я написал следующий код в SWI-Пролог: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 ИЛИ (;) в моем коде. Когда я спрашиваю move_ab в Prolog в первый раз, все условия до второго OR истинны, поэтому я получаю ответ true от Prolog. Но второй раз, когда я спрашиваю move_ab в Prolog, я получаю только ответ false. Я не знаю, как это может произойти. Некоторые из условий, предшествующих второму OR, неверны, поэтому Prolog должен проверить состояние после второго OR и написать мне сообщение Неправильное перемещение. Выберите другое.. Я попытался использовать() для группировки условий, но я все равно получаю то же сообщение. Любая идея о том, что происходит? Кстати я Newb в Прологе, только началось 2 дня назад :)

ответ

1

Проблема заключается в использовании разреза (!/0) перед условия надлежащим образом проверены. Вырезать удаляет точки выбора. Здесь это означает, что выбор удаляется, прежде чем вы даже проверите что-нибудь. Поэтому, если тесты терпят неудачу, все не удается!

BTW, манипулирование базой данных, возможно, не самая лучшая идея. Для представления состояния, вы можете использовать глобальные переменные следующим образом:

:- 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