添加两个长度不同的列表时如何消除内存变量?

时间:2018-02-19 08:54:44

标签: prolog

我目前正在尝试计算两个列表的相应元素的绝对差异。

对于这种情况,我希望这两个列表在第一个列表的长度用完时停止添加值。

以下是一个例子:

?- absDiff([1,3,5,6],[3,5,2,1,2,5],L).
L=[2,2,3,5]. 

我一直在尝试多个案例,但到目前为止,我已经提出了:

absDiff([],[],[]).
absDiff([],[_|_],[_|_]).
absDiff([_|_],[],[_|_]).
absDiff([H|T],[H1|T1],[X|L]):-X is abs(H-H1),absDiff(T,T1,L).

运行时收到的返回值:

?- absDiff([1,3,5,6],[3,5,2,1,2,5],L).

是:

L = [2, 2, 3, 5, _1334|_1336]

我想删除值/变量_1334|_1336,因此输出只是[2, 2, 3, 5]

我该如何解决这个问题?此外,如果有人可以向我解释为什么会发生这样的事情,那将非常感激。 谢谢。

1 个答案:

答案 0 :(得分:0)

试试这个:

absDiff([],L,L).    % if first list is empty, result is second list
absDiff(L,[],L).    % if second list is empty, result is first list
absDiff([H|T],[H1|T1],[X|L]):-X is abs(H-H1),absDiff(T,T1,L).

如果一个列表为空,您甚至不必尝试将其他列表统一到任何内容,只需 即可输出。

absDiff([],[_|_],[_|_]).没有将第二个列表与结果绑定,它只是说如果第一个列表为空而第二个有头和尾,无论它们是什么,那么第三个也应该有头和尾,但可以是任何

请注意,通过这样做,您甚至不再需要absDiff([],[],[]).,因为它已包含在其他两个条款中。

修改

道歉,我阅读你的代码比阅读你的解释更多,所以我假设你想要追加剩下的最长名单。
因此,如果你想切换它,你所要做的就是:

absDiff([],_,[]).    % if first list is empty, result is empty
absDiff(_,[],[]).    % if second list is empty, result is empty
absDiff([H|T],[H1|T1],[X|L]):-X is abs(H-H1),absDiff(T,T1,L).