注意:逻辑编程几乎完全是初学者
我需要比较两个整数列表,并确定其中一个是否更大、大于等于,或者它们都相等。
例如:
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 分配给任何东西来解决。
最佳答案
在您的解决方案中,您使用 (>)/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 = (=).
如果您编写自己的比较谓词,最好使用完全相同的参数顺序和相同的术语作为结果。即<
, =
,和>
。期望>=
没有多大意义。成为一个结果。毕竟,两个相同的列表将具有三个不同的解决方案 =<
, =
, >=
.
根据您的描述,如果两个列表的长度不同,我不清楚您的期望是什么。
关于list - Prolog 评估两个列表如何相互比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9915126/