检查prolog中的输入数字

时间:2011-12-18 16:55:09

标签: numbers prolog

我想在问题中定义初始状态。 我的代码是

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.

此外,我想检查是否已经给出了一个号码,如果是,则再次询问这个号码。

1 个答案:

答案 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,如果你在某个地方挣扎,我们会帮助。