我目前正在尝试计算两个列表的相应元素的绝对差异。
对于这种情况,我希望这两个列表在第一个列表的长度用完时停止添加值。
以下是一个例子:
?- 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]
。
我该如何解决这个问题?此外,如果有人可以向我解释为什么会发生这样的事情,那将非常感激。 谢谢。
答案 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).