Почему пролог не останавливается на срезе? - PullRequest
0 голосов
/ 05 апреля 2019

Я хотел бы получить этот результат:

?- numberMatrixLines(1,[[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]],X).
X = [machinePenalty(1,[1,1,1,1,1,1,1,1]),
     machinePenalty(2 [1,1,1,1,1,1,1,1]),
     machinePenalty(3,[1,1,1,1,1,1,1,1])]

Я пробую следующий код:

numberMatrixLines(X,[],ResultMatrix):-
   writeln('should end here'),
   reverse(ResultMatrix,ResultMatrixTemp),
   initWith(ResultMatrixTemp,ResultMatrix),
   !.
numberMatrixLines(X,[H|T],ResultMatrix):-
   append_in_front(machinePenalty(X,H),ResultMatrix,ResultMatrixTemp),
   writeln(ResultMatrixTemp),
   incr(X,X1),
   numberMatrixLines(X1,T,ResultMatrixTemp).            

incr(X, X1) :-
    X1 is X+1.                

append_in_front(X,[],[X]).
append_in_front(X,L1,[X|L1]).

Результат верный, когда достигается numberMatrixLines(X,[],ResultMatrix).ОДНАКО предикат на этом не остановится и не вернет X, как и положено.

Что можно сделать, чтобы остановить его в этой строке?

1 Ответ

1 голос
/ 05 апреля 2019

Было бы прямым решением (я переместил список ввода к первому аргументу, чтобы воспользоваться преимуществами индексации первого аргумента Пролога, чтобы избежать ложных точек выбора и необходимости сокращений):

% number_matrix_lines(+list, +integer, -list)
number_matrix_lines([], _, []).
number_matrix_lines([Line| Lines], I, [machine_penalty(I,Line)| NumberLines]) :-
    J is I + 1,
    number_matrix_lines(Lines, J, NumberLines).

Пример звонка:

| ?- number_matrix_lines([[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1],[1,1,1,1,1,1,1,1]], 1, NumberLines).

NumberLines = [machine_penalty(1,[1,1,1,1,1,1,1,1]), machine_penalty(2,[1,1,1,1,1,1,1,1]), machine_penalty(3,[1,1,1,1,1,1,1,1])]
yes

P.S. Обратите внимание, что руководящие принципы кодирования Prolog рекомендуют использовать подчеркивания в именах предикатов вместо CamelCase.

...