Prolog 我无法将列表列表转换为单个列表

Prolog 我无法将列表列表转换为单个列表,prolog,Prolog,我正在写一个使用递归计算列表中数字之间距离的解决方案,但一直在努力获得预期的输出。 我试图将一个列表放到一个列表中,但尝试使用flatte和append/2是行不通的。我已经试了几个小时了,一直在兜圈子,有人能告诉我我做错了什么吗 :- use_module(library(clpfd)). difference([],_,[]). differwnce([L|Ls],X,[DST|Ds]) :- DST #= abs(X - L), difference(Ls,X,Ds). d

我正在写一个使用递归计算列表中数字之间距离的解决方案,但一直在努力获得预期的输出。 我试图将一个列表放到一个列表中,但尝试使用flatte和append/2是行不通的。我已经试了几个小时了,一直在兜圈子,有人能告诉我我做错了什么吗

:- use_module(library(clpfd)).

difference([],_,[]).
differwnce([L|Ls],X,[DST|Ds]) :-
   DST #= abs(X - L),
   difference(Ls,X,Ds).

differences[],[]).
differences([L|Ls], [DST|Tail]) :-
   difference(Ls,X,DST),
   differences(Ls, Tail).
以下是预期的输入和输出:-

?- differences([1,2,4,9],Ds).
Ds = [1,3,8,2,7,5].
电流输出:

Ds = [[1,3,8],[2,7],[5],[]].
您可以将distance/3谓词转换为distance/4谓词,该谓词返回后续元素的列表尾部,有效地使用开放列表:

电话示例:

?- triangle([1,2,4,9], Ds).
Ds = [1, 3, 8, 2, 7, 5].

为了更好地理解这个解决方案,考虑以下查询的结果:

?- distances([2,4,9], 1, Ds, Tail).
Ds = [1, 3, 8| Tail].
此解决方案比在最后调用append/2或flatte/3等谓词更有效

注意:如果您仍然需要距离/3谓词在其他地方使用,您可以轻松定义它:

distances(Bs, B, Ds) :-
    distances(Bs, B, Ds, []).

为什么不这样使用库谓词呢


请在问题中包含您的代码,这样我们就可以看到您尝试了什么。对不起,我是一个在Stackoverflow上发布问题的新手,对格式有点困惑。现在应该起床了。谢谢。回滚您删除的代码,因为它是特定于问题的。您的代码在示例中使用了约束,因此使答案更加具体。通过删除阅读本文的代码初学者可能会认为约束是必需的,而约束不是必需的。这是否回答了您的问题?对不起,这让我更困惑了。我是swi prolog的初学者,请问有更简单的解决方案吗?Hi false,您的意思是设置另一个谓词来手动转换列表吗?像append/2通常那样?你能告诉我为什么append/2在我的情况下不起作用吗?非常感谢保罗,我会试试这个。我唯一的问题是我被限制使用距离/3谓词。不过,我也可以按照你的建议再做一次?或者有没有其他方法可以保持距离/3?@AntMan您可以使用距离/4轻松定义距离/3:distancesBs,B,Ds:-distancesBs,B,Ds,[]。。对你来说行吗?太好了,保罗,谢谢!这让我困了这么多小时。在三角递归调用之后的很长一段时间里,我一直在尝试使用appends和DST,但它就是不能将其放入单独的列表中。你知道为什么吗?这是不合逻辑的lol,因为append/2应该获取列表列表并连接成一个列表list@AntMan请注意,我的答案比任何调用append或flatte谓词的解决方案都更有效。这很好。昨天,我还尝试了不同的方法来制作另一个列表,并手动将元素放入其中,持续数小时,但结果就是不起作用。尽管如此,我仍在努力理解它是如何工作的。。额外的尾巴会带走通话中剩下的东西?我有点困惑,但很高兴你能理解works@repeat我无法让它与我的代码一起工作,我不知道为什么。这是我最初的问题。它不喜欢在append中使用Ds,尽管我假设它是一个列表append/2:作为一个快速修复,在recursive子句中不是。它需要在递归谓词中,或者至少调用递归谓词中的另一个谓词进行追加。不过我也不能这样做。我想我需要学习更多关于prolog基础知识的知识,以理解为什么不这样使用库谓词append/2?因为append/2会产生许多不必要的错误,比如在difA,B,append[[A | | | | | |,[B | |]。它可能会默默地失败
?- distances([2,4,9], 1, Ds, Tail).
Ds = [1, 3, 8| Tail].
distances(Bs, B, Ds) :-
    distances(Bs, B, Ds, []).
?- append([[1,3,8],[2,7],[5],[]], Xs).
Xs = [1,3,8,2,7,5].