Prolog 错误:pro-log中的单例变量[x],如何解决?

Prolog 错误:pro-log中的单例变量[x],如何解决?,prolog,river-crossing-puzzle,Prolog,River Crossing Puzzle,这是一个传教士-食人族程序,在第3行(x),第0行(x)发现了错误 %:mandc(状态(3,3,左),[状态(3,3,左)],路径? mandc(state(0,0,right),z,[])。 mandc(当前状态,已访问,[Move | RestOfMoves]):- newstate(当前状态,下一状态), 非(成员(下一状态,已访问)), 移动(当前状态、下一状态、移动), mandc(NextState,[NextState | visted],RestOfMoves)。 %make_

这是一个传教士-食人族程序,在第3行(x),第0行(x)发现了错误

%:mandc(状态(3,3,左),[状态(3,3,左)],路径?
mandc(state(0,0,right),z,[])。
mandc(当前状态,已访问,[Move | RestOfMoves]):-
newstate(当前状态,下一状态),
非(成员(下一状态,已访问)),
移动(当前状态、下一状态、移动),
mandc(NextState,[NextState | visted],RestOfMoves)。
%make_move(State1,State2,move)构建让你移动的移动(-,,-)
%从州1到州2。
移动(状态(M1,C1,左),状态(M2,C2,右),移动(M,C,右):-
M是M1-M2,
C是C1-C2。
使移动(状态(M1,C1,右),状态(M2,C2,左),移动(M,C,左)):-M是M2-M1,
C是C2-C1。
%如果船能载X个传教士和食人族,那么携带(X,Y)是正确的。
进位(2,0)。
进位(1,0)。
携带(1,1)。
进位(0,1)。
进位(0,2)。
%如果传教士有X是安全的,那么合法的(X,Y)是正确的
%传教士和食人族一起在河岸上(左或右)。
法律(X,X)。
**法律(3,X)。
合法(0,X)**
%新闻状态(状态1、状态2)
新闻状态(状态(M1,C1,左),状态(M2,C2,右):-
进位(M,C),
M=

有人能说解决它吗?如果你有其他的传教士食人计划,那就给我

问题在于所讨论的两个事实都只有一个变量X的外观(因此,它们是“单例”)。如果您不需要表示两个(或更多)东西需要匹配,而只需要表示它可以是任何东西,请使用下划线。虽然这不应该是一个错误,而是一个警告。

在运行时发生此错误?-[prolog4]|。错误:未定义的过程:(?-)/1错误:?-是Prolog提示符。如何解决?能否为合法移动提供其他选项?
%        : mandc(state(3,3,left), [state(3,3,left)], Path)?
mandc(state(0, 0, right), _, []).
mandc(CurrentState, Visited, [Move | RestOfMoves]) :-
newstate(CurrentState, NextState),
not(member(NextState, Visited)),
make_move(CurrentState, NextState, Move),
mandc(NextState, [NextState | Visited], RestOfMoves).
% make_move(State1, State2, Move) builds the move(-,-,-) that gets you
% from State1 to State2.
make_move(state(M1, C1, left), state(M2, C2, right), move(M, C, right)) :-
        M is M1 - M2,
        C is C1 - C2.
make_move(state(M1, C1, right), state(M2, C2, left), move(M, C, left)) :-        M is M2 - M1,
        C is C2 - C1.
% carry(X,Y) is true if the boat can carry X missionaries and Y cannibals.
carry(2, 0).
carry(1, 0).
carry(1, 1).
carry(0, 1).
carry(0, 2).
% legal(X, Y) is true if it is safe for the missionaries to have X
% missionaries and Y cannibals together on a river bank (left or right).
legal(X, X).
**legal(3,X).
legal(0,X).**
% newstate(State1, State2)
newstate(state(M1, C1, left), state(M2, C2, right)) :-
carry(M, C),
        M =< M1,
        C =< C1,
        M2 is M1 - M,
        C2 is C1 - C,
legal(M2, C2).
newstate(state(M1, C1, right), state(M2, C2, left)) :-
carry(M, C),
        M2 is M1 + M,
        C2 is C1 + C,
        M2 =< 3,
        C2 =< 3,
legal(M2, C2).