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

标签 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 分配给任何东西来解决。

最佳答案

在您的解决方案中,您使用 (>)/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/

相关文章:

c# - 初始化多个 List<Boolean> 与多个 List<String>

c - 如何在 C 中传递 char 数组?

c# - 如何在 C# 类中实现 List<T> 属性?

Prolog:子句在源文件中不在一起

prolog - 如何验证序言文件子句数据库中是否存在规则

recursion - Prolog:以递归方式使用 =../2 (Univ)

java - 在java中覆盖列表结果类型

python - 从嵌套字典中递归删除 None 值或 None 键

c# - 将 Prolog 与 C# 集成

list - Prolog - 寻找替代词(同义词)