2011-12-18 2 views
-4

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

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

Поскольку вы пытались что-то для вашего isDigit/1 предиката Я помогу об этом:

версии с, если структура:

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

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

+0

Спасибо за ваш ответ, Это работает, но это ужасно Кроме того, я не, знаю, как я могу попросить пользователя в случае ошибки при вводе попробовать другой номер. isDigit (Х): - (число (Х), Х> = 0, Х = <8 -> истинно ; WriteLn ('[0-8] и номер'), неудачу). check_if_exists (Num, List): - (member (Num, List) -> true ; writeln ('Num are already')). \t \t \t \t \t \t \t \t \t delete_one (Эль, [Эль | Tail], хвост). delete_one (Elem, [Head | Tail1], [Head | Tail2]): - \ + (Elem = Head), delete_one (Elem, Tail1, Tail2). – user494766

+0

define_initial_state (INITIAL_STATE): - L = [0,1,2,3,4,5,6,7,8], записи ('Pos (1,1):'), \t \t \t \t \t \t \t чтения (А11), \t \t \t \t \t \t \t isDigit (А11), \t \t \t \t \t \t \t \t \t delete_one (А11, L, L1), \t \t \t \t \t \t \t записи ('Pos (1,2):'), \t \t \t \t \t \t \t чтения (А12), \t \t \t \t \t \t \t isDigit (А12), \t \t \t \t \t \t \t check_if_exists (A12, L1), delete_one (A12, L1, L2), \t \t \t \t \t \t \t \t ... \t \t \t \t \t \t \t \t \t INITIAL_STATE = состояние (row1 (А11, А12, А13), row2 (А21, А22, А23), row3 (А31, А32, A33)). \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t \t старт: - define_initial_state (INITIAL_STATE), записи (INITIAL_STATE). – user494766

+0

отредактируйте свой OP, чтобы опубликовать код, пожалуйста, он не читается в комментариях ... и что ужасно о моем ответе? – m09

Смежные вопросы