我有这个代码返回了很多解决方案,但我只需要第一个列表,我认为我必须使用一些剪切,但我是Prolog的新手,我找不到我必须把它放在哪里。
list_s(_,[],_) :-
!.
list_s(P,[P|Ps],ListS) :-
list_slope(P,Ps,ListS).
list_s(pt(X,Y),[pt(A,B)|Ps],ListS) :-
angle(pt(X,Y),pt(A,B),R),
new_s(R,pt(A,B),Ns),
append(Nls,[Ns],ListS),
!,
list_s(pt(X,Y),Ps,Nls).
我试图将它放在append/3
之后,但这不起作用。
我该如何解决这个问题?
编辑:我认为问题在于追加可能我需要改变或改进这个功能。
实施例
1 ?- list_slope(pt(2,2),[pt(1,1),pt(2,9),pt(3,8),pt(4,7)],L).
L = [slope(0.3805063771123649, pt(4, 7)), slope(0.16514867741462683, pt(3, 8)), slope(0.0, pt(2, 9)), slope(0.7853981633974483, pt(1, 1))] ;
L = [_G2260, slope(0.3805063771123649, pt(4, 7)), slope(0.16514867741462683, pt(3, 8)), slope(0.0, pt(2, 9)), slope(0.7853981633974483, pt(1, 1))] ;
L = [_G2260, _G2266, slope(0.3805063771123649, pt(4, 7)), slope(0.16514867741462683, pt(3, 8)), slope(0.0, pt(2, 9)), slope(0.7853981633974483, pt(1, 1))] ;
L = [_G2260, _G2266, _G2272, slope(0.3805063771123649, pt(4, 7)), slope(0.16514867741462683, pt(3, 8)), slope(0.0, pt(2, 9)), slope(0.7853981633974483, pt(1, 1))]
答案 0 :(得分:1)
如果你只想要Prolog谓词的第一个结果,你可以简单地做
digest()
答案 1 :(得分:1)
不是使用剪切或丢弃(显然是错误的)解决方案,而是最好重写代码以避免首先出现不需要的选择点。例如,假设始终使用绑定的前两个参数调用谓词:
list_slope(Point, Points, Slopes) :-
% change argument order to exploit
% first-argument indexing
list_slope_(Points, Point, Slopes).
list_slope_([], _, []).
list_slope_([pt(A,B)| Points], pt(X,Y), [Slope| Slopes]) :-
angle(pt(X,Y), pt(A,B), Angle),
new_slope(Angle, pt(A,B), Slope),
list_slope_(Points, pt(X,Y), Slopes).
但是,与原始代码相比,这将以相反的顺序给出斜率。如果需要相反的顺序,您可以使用累加器轻松获得它:
list_slope(Point, Points, Slopes) :-
% change argument order to exploit
% first-argument indexing
list_slope_(Points, Point, [], Slopes).
list_slope_([], _, Slopes, Slopes).
list_slope_([pt(A,B)| Points], pt(X,Y), Acc, Slopes) :-
angle(pt(X,Y), pt(A,B), Angle),
new_slope(Angle, pt(A,B), Slope),
list_slope_(Points, pt(X,Y), [Slope| Acc], Slopes).