Prolog - 从两个已排序的列表创建第三个排序的列表
我正在尝试从 Prolog 中的两个已排序列表中获取第三个排序列表。 算法如下: 1.比较两个列表的头部 1.1 如果第一个小于或等于第二个,则将其插入到第三个列表中,然后将其从第一个列表中删除。 1.2 否则,将第二个列表的头部插入到第三个列表中,并将其从第二个列表中删除。 2. 重复这些步骤,直到一个列表为空。
理论上这应该可行,但我缺少一些东西。
这是我的代码:
insSort([],[],[]).
insSort([],L,L).
insSort(L,[],L).
insSort([H1 | T1],[H2 | T2],L) :- H1 =< H2,
append([H1],[],L1),
insSort(T1,[H2 | T2],L1),L=L1,!.
insSort([H1 | T1],[H2 | T2],L) :- append([H2],[],L1),
insSort(T2,[H1 | T1],L1),L=L1.
I'm trying to obtain a third sorted list from two already sorted lists in Prolog.
The algorithm is the following:
1. Compare the heads of the two lists
1.1 if the first is less or equal to the second, insert it into the third list and then remove it from the first list.
1.2 else, insert the head of the second list into the third and remove it from the second.
2. repeat these steps until one list is empty.
In theory this should work, but there's something I'm missing.
Here's my code:
insSort([],[],[]).
insSort([],L,L).
insSort(L,[],L).
insSort([H1 | T1],[H2 | T2],L) :- H1 =< H2,
append([H1],[],L1),
insSort(T1,[H2 | T2],L1),L=L1,!.
insSort([H1 | T1],[H2 | T2],L) :- append([H2],[],L1),
insSort(T2,[H1 | T1],L1),L=L1.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我认为您误解了 Prolog 变量的行为方式。为变量分配值后(术语是“统一”),您将无法更改它。因此,当您将
[H1]
的值分配给L1
(使用append
以相当复杂的方式)时,另一个insSort 不能用它来返回结果。修复代码的方法如下:
这样,
L
将变为[H1|L1]
,其中我们知道H1< 的值/code> 我们稍后将通过再次调用
insSort
来计算L1
的值。另外,这里不需要使用
append
,类似L = [H1|L1]
就足够了。I think you misunderstand how Prolog variables behave. After you assign a value to a variable (the term is “unify”), you can't ever change it. So when you assign the value of
[H1]
toL1
(in a quite complicated way usingappend
), anotherinsSort
can't use it to return the result. A way to fix your code would be like this:This way,
L
is going to be[H1|L1]
, where we know the value ofH1
and we're going to compute the value ofL1
in a while by callinginsSort
again.Also, there is no need to use
append
here, something likeL = [H1|L1]
would suffice.