2017-04-21 62 views
0

我試圖通過計算玩家和列來檢查遊戲中的偶數/奇數玩家和偶數/奇數列。在某些時候,似乎我沒有正確實例化我的變量。 這裏是我給遊戲:Prolog - 參數沒有充分實例化

playGame(Game):- 
    countPlayers(Game,TotalPlayers), 
    colSize(Game,TotalCols), 
    checkEvens(TotalPlayers,TotalCols); 
    checkOdds(TotalPlayers,TotalCols). 

我認爲問題在於沒有正確分配TotalPlayers和TotalCols。

我試着看其他問題,但問題似乎有所不同。我對序言很陌生,可能在某個地方犯了一個微不足道的錯誤。

經過一些跟蹤後,似乎錯誤是由奇數/偶數組合輸入引起的。給定兩個偶數或兩個奇數的輸入,該程序的行爲如預期。給定一個奇數和一個偶數的輸入,並打破。

完整的錯誤:

ERROR: Arguments are not sufficiently instantiated 
ERROR: In: 
ERROR: [11] 1 is _34862 mod 2 
ERROR: [10] checkOdds(_34894,_34896) 
+1

'mod'運算符要求將它的所有參數實例化。它不會在'1中解析x'是X mod 2'。你輸入了什麼查詢? – lurker

+0

我正在通過玩家和列隊。這些被收集在columnsAndPlayers謂詞中作爲TotalPlayers和TotalCols並傳入。那麼我假設這些變量沒有被實例化? – Tanner

+1

我並不是在尋找一般性描述。我的意思是,當你遇到錯誤時,你輸入的是什麼?而且,是的,你可以在你的錯誤信息中看到'Players'和'Cols'都沒有實例化(它們顯示爲匿名變量,_34894和_34896)。 – lurker

回答

2
?- X = 3, between(1, X, 2), between(1, X, 3). 
X = 3. 

?- X = 3, between(1, X, 2); between(1, X, 3). 
X = 3 ; 
ERROR: Arguments are not sufficiently instantiated 
ERROR: In: 
ERROR: [9] between(1,_7656,3) 
ERROR: [7] <user> 
ERROR: 
ERROR: Note: some frames are missing due to last-call optimization. 
ERROR: Re-run your program in debug mode (:- debug.) to get more detail. 

你能找出到底是怎麼回事?


像這樣的斷言:

foo :- a, b; c. 

是同樣的事情:

foo :- a, b. 
foo :- c. 

換句話說,a, b確實是一個不同的 「上下文」 比c

通常,您的意思是代替a, (b ; c)。這就是爲什麼;通常放在線的開始,並且你確實在它周圍使用了parens。因此,這將是要麼

( a, 
    b 
; c 
) 

a, 
( b 
; c 
) 

(這是不一樣的東西!)

這絕對是令人困惑:

a, 
b; 
c 

你沒看到「良好」的Prolog代碼是這樣寫的(說庫代碼)。

但是,真的,嘗試閱讀一本教科書或一些東西,Stackoverflow很適合弄清楚你的錯誤在哪裏,但不是真正的學習。

+0

所以在這裏,我認爲X已經在第二個範圍之外,因爲它已經執行了第一個部分。 – Tanner

+0

@Tanner查看編輯 – 2017-04-22 00:03:56

相關問題