如何使此函数返回坐标而不是空列表

时间:2019-05-04 16:08:34

标签: prolog

当两个输入列表中的位置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 = []。

这里的代码有什么问题?

1 个答案:

答案 0 :(得分:0)

您的代码有很多问题。我懒得为您调试它:-(

您根本不需要append/3append/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).

一旦有了索引,就可以从中配对。