SWI Prolog Prolog如何处理逻辑比较

SWI Prolog Prolog如何处理逻辑比较,prolog,comparison,logical-operators,Prolog,Comparison,Logical Operators,我在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,

我在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').
:-动态a/1。
:-动态_b/1。
:-动态_c/1。
状态a([1,2,3,4,5,0])。
state_b([0])。
印章(列表,头,尾):-LIST=[头|尾]。
移动_ab:-!,州a(X),
印章(X,Ha,Ba),
Ha>0,
州(Y),
印章(Y、Hb、Bb),!,

(Ha问题在于在正确测试条件之前使用cut(
!/0
。cut会删除选择点。这里的意思是,在你测试任何东西之前就删除了选择。因此,如果测试失败,一切都会失败

顺便说一句,操作数据库可能不是最好的主意。要表示状态,可以使用全局变量,如下所示:

:- 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').
:-nb_setval(州[1,2,3,4,5,0])。
:-nb_setval(state_b[0])。
移动_ab:-
nb_getval(州[Ha | Ta]),
Ha>0,
nb_getval(州b[Hb|Tb]),
(Ha
给prolog初学者的一般建议是,如果可能的话,远离数据库操作,因为没有它问题通常是可以解决的。这里虽然可以证明这一点,但全局变量将更快、更容易操作