注意:接近完全初学者到逻辑编程
我需要比较两个整数列表,并确定一个是更大,更大 - 或者它们是否相等。
例如:
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赋予任何东西来解决。
答案 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).