我需要从斜率列表中的某个点找到一个段列表,每个段必须长于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].
答案 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).