如何在Prolog中将两个列表与值和范围进行比较

时间:2017-11-04 22:42:03

标签: list prolog range comparison

我正在做一个项目,我遇到了需要比较两个列表的情况,如果列表中至少有一个成员在另一个列表中,则返回。非常简单,但列表可能不仅包含数字,还包含数字范围。类似的东西:[1,3,范围(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列表的任何想法吗?

1 个答案:

答案 0 :(得分:0)

因此,如果输入不必在此处进行排序,那么解决方案

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]),!.

除了结束括号外,其余部分都很好。

如果必须对输入进行排序,那么您可以使用某种合并排序,这将是非常有效和有趣的。建议你自己做这个案子。