【问题标题】:How to Compare two lists with values and ranges in Prolog如何在 Prolog 中将两个列表与值和范围进行比较
【发布时间】:2017-11-04 22:42:03
【问题描述】:

我正在做一个项目,我陷入了需要比较两个列表并返回如果列表中的至少一个成员在另一个列表中的情况。非常简单,但列表可能不仅包含数字,还包含数字范围。类似于:[1,3,range(5,10),25]

我认为我的主要问题是迭代列表,因为它仅在第一个列表成员与原子匹配时才返回 true。这是我的比较代码:

findin(E,[H|T]) :-
    E == H ;
    (H == range(X,Y), E \== range(Xe,Ye), between(X,Y,E)) ;
    (E == range(Xe,Ye), H \== range(X,Y), between(Xe,Ye,H)) ;
    (E == range(Xe,Ye), H == range(X,Y), (between(X,Y,Xe) ; between(Xe,Ye,X))) , 
    findin(E,T).

以及调用 findin/2 函数的代码:

find([Ha|Ta],[Hb|Tb]) :-
    findin(Ha,[Hb|Tb]),
    find(Ta,[Hb|Tb]).

我错过了什么?另外,对于从 find/2 函数迭代 A 和 B 列表有什么想法吗?

【问题讨论】:

  • = 表示统一变量,== 比较它们,在序言中他们将“range(X,Y)”称为谓词/2 而不是函数,因此它们不会返回值。
  • 首先,这个列表是排序的,还是没有?我问是因为该示例已排序。
  • 第二件事...在粘贴代码之前,检查它是否被正确复制。您在查找谓词的第二行没有“)”符号。接下来是使用标准库中使用的命名。我不会推荐它。

标签: list prolog range comparison


【解决方案1】:

所以如果输入不必在这里排序是解决方案

doubleRangeCheck(range(Xa,Ya),range(Xb,Yb)) :-
    between(Xa,Ya,Xb) ; between(Xa,Ya,Yb),!.

检查 rangeB 的一端是否在 rangeA 范围内。

numInRange(number(A),range(Xb,Yb)) :-
    between(Xb,Yb,A),!.

检查数字是否在范围内

findInX(A,[Hb|Tb]) :-
    A = Hb ;
    (doubleRangeCheck(A,Hb); doubleRangeCheck(Hb,A));
    numInRange(A,Hb);
    numInRange(Hb,A);
    findInX(A,Tb),!.

检查是否: 1. 如果两个元素相同, 2. 如果一个范围包含任何另一个范围结束,反之亦然(您检查了 2 个范围的情况), 3/4。检查 num 是否在范围内(以及 Hb 或 A 是否在范围内), 5. ...

findX([Ha|Ta],[Hb|Tb]) :-
    findInX(Ha,[Hb|Tb]);
    findX(Ta,[Hb|Tb]),!.

很好的部分,除了右括号。

如果必须对输入进行排序,那么您可以使用某种归并排序,它会更有效和更有趣。建议自己做这个案例。

【讨论】:

  • 感谢您的帮助!当范围 A 大于或小于范围 B 时,它会返回错误“预期整数,找到化合物..”,但我想我可以弄清楚该怎么做。顺便说一句,这是未排序的列表。
  • 请给我一个不工作的例子。
  • 好吧,我的错,我已经修好了。如果 arg 是带有 number/1 函数的数字,则检查 numInRange 就足够了。
  • 这正是我找到的解决方案。再次感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 1970-01-01
相关资源
最近更新 更多