使用Prolog按标准从列表中删除元素

时间:2015-07-27 20:52:35

标签: prolog

我有一个列表L=[pt(0,0), pt(1,0), ecc..] 我有一个谓词giveMeAngleBetween2Points/3,它给出了2点之间的角度。 现在我需要一个谓词deleteSameAnglePoints/2,如:

deleteSameAnglePoints(L, MinimumPoint)

其中MinimumPoint是我个人标准的List L的点,现在我需要获取我的列表L并通过调用谓词giveMeAngleBetween2Points(MinimumPoint,Point,Result)删除与MinimumPoint具有相同角度的所有点,但是拿走最后一个。

示例:

L = [(0,0), (0,1), (0,2), (0,5), (3,4), (5,6), (5,8), (8,9), (10,9)]

现在,如果(0,0), (0,1), (0,2), (0,5)与调用谓词giveMeAngleBetween2Points(MinimumPoint, Point)之后具有相同的角度,那么也是如此 (5,6), (5,8)在它们之间具有相同的角度,并且(8,9), (10,9)在它们之间具有相同的角度,我的结果应该是:

L = [(0,5), (3,4), (5,8), (10,9)].

1 个答案:

答案 0 :(得分:0)

可能是

deleteSameAnglePoints([], []).
deleteSameAnglePoints([P|Ps], R) :-
    (  member(T, Ps), sameAngle(P, T)
    -> R = Q
    ;  R = [P|Q]
    ),
    deleteSameAnglePoints(Ps, Q).

已定义服务谓词sameAngle / 2 - 通过您的样本定义为

sameAngle([(0,0), (0,1), (0,2), (0,5)]).
sameAngle([(5,6), (5,8)]).
sameAngle([(8,9), (10,9)]).

sameAngle(A1,A2) :- sameAngle(L), memberchk(A1,L), memberchk(A2,L).