Prolog中列表内的坐标轴分开

时间:2018-05-06 13:05:50

标签: list prolog coordinates

我们说我有一个列表,其元素包含像[(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

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.