2016-07-07 48 views
0

我需要從斜坡列表中的一個點中找到分段列表,每個分段必須長於3個點,並且具有相同的角度。Prolog - 在點列表中查找分段

每斜率從一個角度和點製成

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) 
). 

現在束縛水飽和度,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]. 
+0

在你的例子中, 'p'是從哪裏來的? – lurker

+0

@luker從一個點的列表。 爲了幫助你理解,我有一個點的列表,我需要找到所有長度大於4的段並將它插入到列表中。 但我正在一步一步來。 我的想法是找到一個點的所有斜率,找到該段,然後切換到下一個點。 – UserFromTheSpace

+0

您對'Ls'的結果具有'p',但'p'不會出現在輸入到'find_segment'的任何位置。 – lurker

回答

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). 
+0

謝謝!今天早上我用自己的方式解決了問題,並改變了代碼。但這個解決方案是高效的。 – UserFromTheSpace