当两个输入列表中的位置X不同时,我希望函数返回列表中的对(1,X),但它会不断向我返回一个空列表。
propaga_posicoes_aux([], [], _, Pos, Pos).
propaga_posicoes_aux([X|Fila], [Y|N_Fila], (F1, F2), Pos, N_Pos):-
F3 is F2 + 1,
(((\+(compara_listas([X], [Y])),
(append(N_Pos, [(F1, F2)] , N_Pos_aux))),
propaga_posicoes_aux(Fila, N_Fila, (F1, F3), N_Pos_aux, N_Pos_aux));
propaga_posicoes_aux(Fila, N_Fila, (F1, F3), Pos, Pos)).
以下是我在控制台上运行该功能的痕迹:
[debug] ?- propaga_posicoes_aux([1,1,1], [2,2,1], (1,1), [], N_P).
T Call: (8) propaga_posicoes_aux([1, 1, 1], [2, 2, 1], (1, 1), [], _722)
T Redo: (8) propaga_posicoes_aux([1, 1, 1], [2, 2, 1], (1, 1), [], _722)
T Call: (9) propaga_posicoes_aux([1, 1], [2, 1], (1, 2), [(1, 1)], [(1, 1)])
T Redo: (9) propaga_posicoes_aux([1, 1], [2, 1], (1, 2), [(1, 1)], [(1, 1)])
T Call: (10) propaga_posicoes_aux([1], [1], (1, 3), [(1, 1), (1, 2)], [(1, 1), (1, 2)])
T Call: (11) propaga_posicoes_aux([], [], (1, 4), [(1, 1), (1, 2)], [(1, 1), (1, 2)])
T Exit: (11) propaga_posicoes_aux([], [], (1, 4), [(1, 1), (1, 2)], [(1, 1), (1, 2)])
T Exit: (10) propaga_posicoes_aux([1], [1], (1, 3), [(1, 1), (1, 2)], [(1, 1), (1, 2)])
T Exit: (9) propaga_posicoes_aux([1, 1], [2, 1], (1, 2), [(1, 1)], [(1, 1)])
T Exit: (8) propaga_posicoes_aux([1, 1, 1], [2, 2, 1], (1, 1), [], [])
N_P = [] .
如您所见,当我希望输出为[(1,1),(1,2)]时,输出为N_P = []。
这里的代码有什么问题?
答案 0 :(得分:0)
您的代码有很多问题。我懒得为您调试它:-(
您根本不需要append/3
。 append/3
非常有用,但只有在有用时才有用。如果没有用,那就没用了。
请勿将(a, b)
用于配对。真傻使用a-b
。
如果第一个元素始终相同,为什么还要使用一对?
如果第一个参数和第二个参数是相同长度的列表,而第三个参数是索引列表(从1开始),则该谓词成功,其中第一个参数和第二个参数的对应元素不同。
dif_ns(Xs, Ys, Ns) :-
dif_ns(Xs, Ys, 1, Ns).
dif_ns([], [], _, []).
dif_ns([X|Xs], [Y|Ys], N, [N|Ns]) :-
dif(X, Y),
succ(N, N1),
dif_ns(Xs, Ys, N1, Ns).
dif_ns([X|Xs], [X|Ys], N, Ns) :-
succ(N, N1),
dif_ns(Xs, Ys, N1, Ns).
辅助谓词的第二和第三子句之间有一些代码重复,并且有不必要的选择点。您可以get fancy and use library(reif)。
:- use_module(reif).
dif_ns(Xs, Ys, Ns) :-
dif_ns(Xs, Ys, 1, Ns).
dif_ns([], [], _, []).
dif_ns([X|Xs], [Y|Ys], N, Ns) :-
succ(N, N1),
if_(X = Y, Ns = Ns0, Ns = [N|Ns0]),
dif_ns(Xs, Ys, N1, Ns0).
一旦有了索引,就可以从中配对。