我正在做一个项目,我遇到了需要比较两个列表的情况,如果列表中至少有一个成员在另一个列表中,则返回。非常简单,但列表可能不仅包含数字,还包含数字范围。类似的东西:[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列表的任何想法吗?
答案 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]),!.
除了结束括号外,其余部分都很好。
如果必须对输入进行排序,那么您可以使用某种合并排序,这将是非常有效和有趣的。建议你自己做这个案子。