我们说我有一个列表,其元素包含像[(4,4), (3,4), (2,4), (1,4)]
这样的点的坐标,我想检查某个点是否低于或高于某个行或列
所以例如函数
get_list_below_line([(4,4), (3,4), (2,4), (1,4)], 3, ResultList).
将输出:
ResultList = [(2,4), (1,4)]
我的问题是如何隔离给定坐标上的X/Y
轴,以便我可以与线值进行算术比较?由于每个列表元素的格式为(Line,Column)
,如何从该点内部仅获取Line
值?
例如,使用Head|Tails
获取给定的完整坐标(2,4)
,我怎么能单独获得2
?
答案 0 :(得分:2)
在SWI-Prolog(和其他人)中,你可以在库(yall)中使用“更高阶”谓词:
get_list_below_line(List, XMax, Below) :-
include({XMax}/[(X, _)] >> (X < XMax), List, Below).
或者,'好老式'
get_list_below_line(List, XMax, Below) :-
findall((X, Y), (member((X, Y), List), X < XMax), Below).
这两种方法都应用模式匹配来从一对坐标中获取X元素。顺便说一句,元组(即一对)只是复合的逗号(即(,)/2
)作为函子。使用它们来构造大块的SW几乎没有什么好处。
答案 1 :(得分:0)
一个递归谓词,其中一个案例为X < XMax
,其中(X,Y)
点是Result
的一部分,另一个案例是X >= XMax
,其中不是:
get_list_below_line([], _, []).
get_list_below_line([(X,Y)|Points], XMax, [(X,Y)|Result]) :-
X < XMax,
get_list_below_line(Points, XMax, Result).
get_list_below_line([(X,Y)|Points], XMax, Result) :-
X >= XMax,
get_list_below_line(Points, XMax, Result).
测试:
?- get_list_below_line([(4,4), (3,4), (2,4), (1,4)], 3, ResultList).
ResultList = [(2, 4), (1, 4)] ;
false.