2011-05-21 225 views
1

我想从Prolog中的两个已排序列表中获取第三个排序列表。 该算法如下: 1.比较两个列表的头部 1.1如果第一个小于或等于第二个,则将其插入到第三个列表中,然后将其从第一个列表中删除。 1.2 else,将第二个列表的头插入第三个列表中,并将其从第二个列表中移除。 2.重复这些步骤,直到一个列表为空。Prolog - 从两个已排序的列表中创建第三个排序列表

从理论上讲,这应该可以工作,但有一些我错过了。

这里是我的代码:

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

您使用当前代码得到的结果是什么? – Osiris76 2011-05-21 12:41:14

+0

@Osiris,我得到的结果是'false'。 – svick 2011-05-21 12:51:42

+0

你知道吗,如何获得'真实'? – 32cupo 2016-05-22 17:40:53

回答

2

我想你误会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]就足够了。

+0

我确实了解变量在Prolog中的行为。我想要做的是类似于一个阶乘程序(将结果放入一个新变量中,然后使用该变量递归地调用该过程),但我想我需要多一点练习。您的解决方案完美运作太感谢了。 – conectionist 2011-05-21 18:41:23