Prolog - 参数没有充分实例化

时间:2017-04-21 21:21:33

标签: prolog instantiation-error

我试图通过计算玩家和列来检查游戏中的偶数/奇数玩家和偶数/奇数列。在某些时候,似乎我没有正确地实例化我的变量。 以下是我如何称呼游戏:

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

我认为问题在于TotalPlayers和TotalCols未正确分配。

我试着看其他问题,但问题似乎有所不同。我是prolog的新手,可能在某个地方犯了一个小错误。

经过一些跟踪后,当输入奇数/偶数组合时,似乎会出错。给定两个偶数或两个奇数的输入,程序表现如预期。给定一个奇数和一个偶数的输入,它就会中断。

完整错误:

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

1 个答案:

答案 0 :(得分: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

你没有看到&#34;好&#34;像这样编写的Prolog代码(比如库代码)。

但实际上,尝试阅读教科书或其他内容,Stackoverflow有助于找出错误的位置,但不能用于真正的学习。