Пролог - Аргументы недостаточно проработаны

Я пытаюсь проверить наличие четных / нечетных игроков и четных / нечетных столбцов в игре путем подсчета количества игроков и столбцов. В какой-то момент кажется, что я неправильно создаю экземпляры своих переменных. Вот как я называю игру:

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 ответ

Решение
?- 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) вместо. Вот почему ; обычно ставится в начале строки, и вы используете вокруг нее скобки. Так было бы либо

(   a,
    b
;   c
)

или же

a,
(   b
;   c
)

(что не одно и то же!)

Это определенно сбивает с толку:

a,
b;
c

Вы не видите "хорошего" кода Пролога, написанного так (например, код библиотеки).

Но на самом деле, попробуйте прочитать учебник или что-то еще, Stackru хорош для выяснения, где ваша ошибка, но не для реального обучения.

Другие вопросы по тегам