我正在尝试从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.
答案 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]
就足够了。