没有充分实例化maplist(all_distinct,list)

时间:2015-02-10 14:03:59

标签: prolog swi-prolog clpfd declarative-programming

我无法运行此代码,对于允许maplist/2运行all_distinct/1的列表,我究竟要说些什么呢?

Solution = [A, B, C, D, E, F, G, H, I], 
Solution ins 1..9, 
maplist(all_distinct, Solution).

我得到ERROR: Arguments are not sufficiently instantiated。我知道我对数字列表的说法不够充分,但我不知道我需要告诉它什么。我想要一个包含9个不同数字1到9的列表。

当我尝试执行时,这是一个跟踪:

   Call: (7) puzzle(_G548) ? creep
   Call: (8) _G548=[_G656, _G659, _G662, _G665, _G668, _G671, _G674, _G677|...] ? creep
   Exit: (8) [_G656, _G659, _G662, _G665, _G668, _G671, _G674, _G677|...]=[_G656, _G659, _G662, _G665, _G668, _G671, _G674, _G677|...] ? creep
   Call: (8) clpfd: ([_G656, _G659, _G662, _G665, _G668, _G671, _G674|...]ins 1..9) ? creep
   Call: (9) error:must_be(list, [_G656, _G659, _G662, _G665, _G668, _G671, _G674|...]) ? creep
   Exit: (9) error:must_be(list, [_G656, _G659, _G662, _G665, _G668, _G671, _G674|...]) ? creep
   Call: (9) clpfd:'__aux_maplist/2_fd_variable+0'([_G656, _G659, _G662, _G665, _G668, _G671, _G674|...]) ? creep
   Call: (10) clpfd:fd_variable(_G656) ? creep
   Call: (11) var(_G656) ? creep
   Exit: (11) var(_G656) ? creep
   Call: (11) true ? creep
   Exit: (11) true ? creep
   Exit: (10) clpfd:fd_variable(_G656) ? creep
   Call: (10) clpfd:'__aux_maplist/2_fd_variable+0'([_G659, _G662, _G665, _G668, _G671, _G674, _G677|...]) ? creep

看起来ins/2可能无效,然后仍然传递给maplist/2?我不知道发生了什么。

1 个答案:

答案 0 :(得分:4)

您正在做的是制作变量列表Solutions,然后Solutions ins 1..9使每个变量为1到9之间的整数。

all_distinct/1需要一个列表,而不是整数。

所以,如果你想要一个包含9个不同整数的列表:

?- Solutions = [A,B,C,D,E,F,G,H,I],
   Solutions ins 1..9,
   all_distinct(Solutions).
L = [A, B, C, D, E, F, G, H, I],
A in 1..9,
all_distinct([A, B, C, D, E, F, G, H|...]),
B in 1..9,
C in 1..9,
D in 1..9,
E in 1..9,
F in 1..9,
G in 1..9,
H in 1..9,
I in 1..9.