我想在问题中定义初始状态。 我的代码是
isDigit(X) :- ( number(X),
X >= 0,
X =< 8
); ( writeln('[0-8] AND Number'),!,fail).
define_initial_state(INITIAL_STATE) :- write('Pos (1,1):'),
read(A11),
isDigit(A11),
write('Pos (1,2):'),
read(A12),
isDigit(A12),
write('Pos (1,3):'),
read(A13),
isDigit(A13),
write('Pos (2,1):'),
read(A21),
isDigit(A21),
write('Pos (2,2):'),
read(A22),
isDigit(A22),
write('Pos (2,3):'),
read(A23),
isDigit(A23),
write('Pos (3,1):'),
read(A31),
isDigit(A31),
write('Pos (3,2):'),
read(A32),
isDigit(A32),
write('Pos (3,3):'),
read(A33),
isDigit(A33),
INITIAL_STATE = state(row1(A11,A12,A13), row2(A21,A22,A23),row3(A31,A32,A33)).
start :- define_initial_state(INITIAL_STATE),
write(INITIAL_STATE).
我遇到的问题是多次打印消息 例如
1 ?- start.
Pos (1,1):4.
Pos (1,2):2.
Pos (1,3):11.
[0-8] AND Number
[0-8] AND Number
[0-8] AND Number
false.
此外,我想检查是否已经给出了一个号码,如果是,则再次询问这个号码。
答案 0 :(得分:0)
由于您为isDigit/1
谓词尝试过某些内容,我会对此有所帮助:
带有if结构的版本:
isDigit(X) :-
( number(X),
X >= 0,
X =< 8
-> true
; writeln('[0-8] AND Number'),
fail).
带有析取的版本(正如您在OP中所尝试的那样):
isDigit(X) :-
number(X),
X >= 0,
X =< 8,
!
;
writeln('[0-8] AND Number'),
fail.
您尝试的问题是,当X是数字并满足正确的要求时,您会选择一个选择点,因此谓词将会出现并打印错误消息并且无论如何都会失败。你在分离的错误部分使用了cut(正确版本就在上面!)。
现在,对于你想要检查一个号码是否已经给出的东西,请试一试,编辑你的OP,如果你在某个地方挣扎,我们会帮助。