Prolog - 在点列表中查找段

时间:2016-07-07 20:45:19

标签: prolog

我需要从斜率列表中的某个点找到一个段列表,每个段必须长于3个点,并且具有相同的角度。

每个斜率都是从一个角度和一个点

slo(Angle,Pt(X,Y)).

示例:

find_segment(P,[slo(1,p1),slo(1,p2),slo(1,p3),slo(2,p4),slo(3,p5),slo(3,p6),slo(3,p7)],Ls).
Ls=[[P,p1,p2,p3],[P,p5,p6,p7]].

我已尝试使用此代码,但我认为我有一些问题(aganin)与附加,因为

find_segment(_,[],_):-!.
find_segment(_,[_],_):-!.
find_segment(_,[_,_],_):-!.
find_segment(P,[slope(R,Ps)|Ss], Lines):-
(   test(R,Ss) %condizione
-> find_same(P,Ps,R,Ss,Nline),
  append(Nls,[Nline],Lines),!,
  find_segment(P,Ss,Nls)
; find_segment(P,Ss,Lines) %else
).
test(R,[slope(A,_),slope(B,_)|_]):-R=A,B=A.
find_same(P1,P2,R,Slopes,Result):-
   Result=[P1,P2|Lp],
   findall(P, member(slope(R, P), Slopes),Lp).

有人能帮助我找到正确的目标吗?

编辑: 我尝试在代码中更改某些内容但仍无法正常工作。 我改变了函数find_segment

find_segment(_,[],_):-!.
find_segment(_,[_],_):-!.
find_segment(_,[_,_],_):-!.
find_segment(P,[slope(R,Ps)|Ss],[L1|Lines]):-
(   confronta_test(R,Ss)
-> find_same(P,Ps,R,Ss,L1),
   find_segment(P,Ss,Lines)
   ;find_segment(P,Ss,Lines)
).

现在Swi-Prolog回复我:

252 ?- find_segment(pt(1,1),[slope(6,pt(2,2)),slope(6,pt(3,3)),slope(6,pt(4,4)),slope(0,pt(6,6)),slope(0,pt(7,7)),slope(0,pt(8,8)),slope(0,pt(9,9))],L).
L = [[pt(1, 1), pt(2, 2), pt(3, 3), pt(4, 4)], _G2019, _G2022, [pt(1, 1), pt(6, 6), pt(7, 7), pt(8, 8), pt(..., ...)], [pt(1, 1), pt(7, 7), pt(8, 8), pt(..., ...)]|_G2076].

1 个答案:

答案 0 :(得分:0)

这是使用Prolog解决问题的必要条件。我宁愿用Ruby编写这个。 ;)这里的想法是:(a)将斜率列表分解为按角度值分组的子列表,然后(b)选择长度大于2的那些。

find_segments(P, Segments, Result) :-
    segment_groups(Segments, SegmentGroups),
    segments_within_groups(P, SegmentGroups, Result).

segment_groups([], []).
segment_groups([P], [[P]]).
segment_groups([slo(N, P1), slo(N, P2)|Segs], [[slo(N, P1)|PH]|PT]):-
    segment_groups([slo(N, P2)|Segs], [PH|PT]).
segment_groups([slo(N1, P1),slo(N2, P2)|Segs], [[slo(N1, P1)]|PT]):-
    N1 \== N2,
    segment_groups([slo(N2, P2)|Segs], PT).

segments_within_groups(_, [], []).
segments_within_groups(P0, [SegGroup | SegGroups], Result) :-
    length(SegGroup, NumSegs),
    (   NumSegs > 2
    ->  maplist(slope_point, SegGroup, SlopePoints),
        Result = [[P0|SlopePoints] | R]
    ;   Result = R
    ),
    segments_within_groups(P0, SegGroups, R).

slope_point(slo(_, P), P).