2015-02-10 11 views
0

Я не могу запустить этот код, что именно я должен сказать о списке, чтобы разрешить maplist/2 для запуска all_distinct/1?Недостаточно для экземпляра списка (all_distinct, list)

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

На самом деле, 'type_error (список, X)' был бы более полезным – false

+0

@false Вы, вероятно, следует сообщить об этом как ошибка –

+0

@Boris: Filed 2013-08-08 as i3a # 314. Но это очень волосатая ситуация, поскольку переменная обычно не связана с ошибкой типа. Да, нет экземпляра, который был бы допустимым термином, поэтому ошибка типа, похоже, имеет большой смысл, но она все еще находится на грани. – false

ответ

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.