Prolog评估两个列表如何相互比较

时间:2012-03-28 20:25:04

标签: list prolog

注意:接近完全初学者到逻辑编程

我需要比较两个整数列表,并确定一个是更大,更大 - 或者它们是否相等。

例如:

compare_list([1, 2, 3], [1, 2, 4], C).
C = greater,
C = greater-equal.
compare_list([1, 2, 3], [1, 2, 4], C).
C = equal.

到目前为止,我能得到的最接近的是......

compare_list([],[],_).
compare_list([X|XS],[Y|YS],C):-
  X > Y,
  compare_list(XS,YS,C),
  C = 'greater'.

compare_list([X|XS],[Y|YS],C):-
  X >= Y,
  compare_list(XS,YS,C),
  C = 'greater-equal'.

compare_list([X|XS],[Y|YS],C):-
  X == Y,
  compare_list(XS,YS,C),
  C = 'equal'.

现在显然不能按需工作,因为它总是比较每个列表的第一个元素,并查看C值是否适用于所有值。但是,我想不出一种让它按预期工作的方法。

编辑: 值越早在列表中,它就越重要。所以[2,2]> [1,3]> [1,2]

提示将不胜感激。感谢。

编辑: 通过等到最后将C赋予任何东西来解决。

4 个答案:

答案 0 :(得分:3)

在您的解决方案中,您使用(>)/2(>=)/2(==)/2。前两个将在比较之前将它们的参数作为算术表达式进行评估。由于期限顺序,(==)/2会进行比较。您将不得不决定其中一个或另一个定期订单。但你不能混合它们。

第二个意思是你还需要一些“少”的东西。

如果两个元素已经比较为(<)/2,则无需进一步比较。

此外,平等只能在事实中陈述,而不是之前。

<小时/> 考虑使用内置谓词compare/3

?- compare(R, [1, 2, 3], [1, 2, 4]).
R = (<).

?- compare(R, [1, 2, 3], [1, 2, 3]).
R = (=).

如果您编写自己的比较谓词,最好使用与结果完全相同的参数顺序和相同的术语。即<=>。期望>=成为结果并没有多大意义。毕竟,两个相同的列表将有三个不同的解决方案=<=>=

根据您的描述,如果两个列表的长度不同,我不清楚您的期望。

答案 1 :(得分:1)

你可以在第一次不信任时停止比较。如果到达(两个)列表的末尾,则表示列表是等于。

答案 2 :(得分:1)

根据您对“更大”的定义,在您发现X> Y后,无需继续递归。如果到达递归的末尾(如chac所说),你就会知道这两个列表是相同的。

要获得“更大 - 相等”,你应该检查X是否不小于Y.你可能会认为这是“如果X小于Y而不是失败”。看看negation as failure

答案 3 :(得分:0)

以下代码将检查两个列表是否相等

is_equal([],[]).
is_equal([H1|T1],[H2|T2]):- H1=:=H2,is_equal(T1,T2).