Проверьте входные номера в прологе - PullRequest
0 голосов
/ 18 декабря 2011

Я хотел бы определить начальное состояние в задаче. Мой код

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 голосов
/ 18 декабря 2011

Поскольку вы попробовали что-то для своего предиката 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 - это число и соответствует правильным требованиям, поэтому предикат отправится туда и напечатает сообщение об ошибке и в любом случае завершится ошибкой. Вы использовали разрез в неправильной части дизъюнкции (правильная версия чуть выше!).

Теперь, если вы хотите проверить, был ли уже задан номер, попробуйте, отредактируйте свой ОП, и, если вы где-то боретесь, мы поможем.

...