Prolog - 从两个已经排序的列表中创建第三个排序列表

时间:2011-05-21 12:27:59

标签: sorting 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.

1 个答案:

答案 0 :(得分:3)

我认为你误解了Prolog变量的行为方式。为变量赋值(术语为“统一”)后,您无法更改它。因此,当您将[H1]的值分配给L1时(使用append以非常复杂的方式),另一个insSort无法使用它来返回结果。修复代码的方法如下:

insSort([],[],[]).
insSort([],L,L).
insSort(L,[],L).
insSort([H1 | T1],[H2 | T2],L) :- H1 =< H2,
                                  append([H1],L1,L),
                                  insSort(T1,[H2 | T2],L1),!.

insSort([H1 | T1],[H2 | T2],L) :- append([H2],L1,L),
                                  insSort(T2,[H1 | T1],L1).

这样,L将成为[H1|L1],我们知道H1的价值,我们将在一段时间内计算L1的值再次致电insSort

此外,此处无需使用append,类似L = [H1|L1]就足够了。