2011-12-18 70 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謂語東西,我會幫助有關:

版本使用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是一個數字並滿足正確的要求時,讓您選擇一個點,所以謂詞會去那裏打印錯誤消息並且無論如何失敗。你使用了分割的錯誤部分(正確的版本就在上面!)。

現在,要檢查一些已經被賦予的東西,請給它一個嘗試,編輯您的OP,如果你奮鬥的地方,我們會幫助你。

+0

謝謝您的回答, 它的工作原理,但它是可怕的 另外,我不;知道我怎能要求用戶輸入錯誤的情況下 嘗試另一個號碼。 ISDIGIT(X): - (數(X), X> = 0, X = <8 - >真 ; writeln( '[0-8]和號碼'), 失敗)。 check_if_exists(Num,List): - (member(Num,List) - > true ; writeln('Num exist already'))。 \t \t \t \t \t \t \t \t \t delete_one(ELEM,[ELEM |尾],尾)。 delete_one(ELEM,[杆頭| Tail1],[頭| Tail2]): - \ +(ELEM =頭), delete_one(ELEM,Tail1,Tail2)。 – user494766 2011-12-18 17:53:40

+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讀取(A11), \t \t \t \t \t \t \t ISDIGIT(A11), \t \t \t \t \t \t \t \t \t delete_one(A11,L,L1), \t \t \t \t \t \t \t寫(的POS(1,2):'), \t \t \t \t \t \t \t讀取(A12), \t \t \t \t \t \t \t ISDIGIT(A12),\t \t \t \t (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(A11,A12,A13),ROW2(A21,A22,A23),ROW3(A31,A32, 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 2011-12-18 17:55:21

+0

編輯您的OP請發佈代碼,在評論中無法閱讀......以及我的回答有什麼可怕的? – m09 2011-12-18 17:55:39