Возможная ошибка с предикатом nth1 в Eclipse-clp? - PullRequest
1 голос
/ 21 апреля 2019

Я пишу решатель судоку в Прологе. Само судоку дается как вектор векторов:

P =
    [[1,_,_, _,_,_, _,_,_],
     [_,_,2, 7,4,_, _,_,_],
     [_,_,_, 5,_,_, _,_,4],

     [_,3,_, _,_,_, _,_,_],
     [7,5,_, _,_,_, _,_,_],
     [_,_,_, _,_,9, 6,_,_],

     [_,4,_, _,_,6, _,_,_],
     [_,_,_, _,_,_, _,7,1],
     [_,_,_, _,_,1, _,3,_]].

Я конвертирую это в матрицу со следующим кодом:

convert_to_matrix(P, Puzzle) :-
dim(Puzzle, [9, 9]),    % create square matrix
( multifor([I, J], 1, 9), % fill array 
  param(P, Puzzle) 
  do
    nth1(I, P, RowI),
    nth1(J, RowI, Elem),
    subscript(Puzzle, [I , J], Elem)
).  

Это отлично работает для первых 8 строк и столбцов, но не работает каждый раз, когда I или J равен 9. Выполнение nth1 (9, P, RowI) делает RowI совершенно новой переменной вместо 9-го вектора / строки. Выполнение nth1 (9, RowI, Elem) не возвращает 9-й элемент (для восьмой строки он должен возвращать 1, но возвращает новую переменную). Это ошибка в Eclipse-clp или я что-то упустил?

1 Ответ

2 голосов
/ 22 апреля 2019

Вы абсолютно правы, это действительно ошибка в nth1 / 3, представленная и присутствующая только в версии 7.0 # 45! Вы можете заменить свой код чем-то вроде

lol_matrix(Xss, M) :-
    length(Xss, N),
    dim(M, [N,N]),
    ( foreach(Xs,Xss), foreacharg(Row,M) do
        array_list(Row, Xs)
    ).

Однако самый простой способ - записать данные напрямую в виде матрицы (как это сделано в этом примере кода ), тогда вам вообще не понадобится преобразование:

P = []([](1,_,_, _,_,_, _,_,_),
       [](_,_,2, 7,4,_, _,_,_),
       ...
       [](_,_,_, _,_,1, _,3,_)).

Кстати, об ошибках ECLiPSe можно сообщить через eclipse-clp-bugs@lists.sf.net

...