Prolog - 将一些元素从一个列表添加到另一个元素中

时间:2016-07-07 18:16:59

标签: prolog

我需要将列表中的一些元素附加到另一个元素中:

find_same(pt(1,1),pt(2,2),6,[slope(6,pt(3,3)),slope(6,pt(4,4)),slope(7,pt(3,2)),slope(9,pt(5,5))],NL).

结果

NL=[pt(1,1),pt(2,2),pt(3,3),pt(4,4)]

我尝试使用追加但我有一些问题,使用此代码:

find_same(_,_,_,[],_):-!.
find_same(pt(X,Y),pt(Xa,Ya),R,Slopes,Nl):-X\=a,
    append(Nla,[pt(X,Y),pt(Xa,Ya)],Nl),
    find_same(pt(a,a),pt(b,b),R,Slopes,Nla).
find_same(pt(X,Y),pt(Xa,Ya),R,[slope(R,pt(Xs,Ys))|Ss],Nl):-X=a,
     append(Nla,[pt(Xs,Ys)],Nl),
     find_same(pt(X,Y),pt(Xa,Ya),R,Ss,Nla).
find_same(_,_,R1,[slope(R2,_)|_],_):-R1\=R2,!.

因为给我很多名单。

然后我尝试使用其他代码:

find_same2(_,_,_,[],_):-!.
find_same2(pt(X,Y),pt(Xa,Ya),R,Slopes,_):-X\=a,
           find_same2(pt(a,a),pt(b,b),R,Slopes,[pt(X,Y),pt(Xa,Ya)]).
find_same2(pt(X,Y),pt(Xa,Ya),R,[slope(R,pt(Xd,Yd))|Ss],[pt(Xd,Yd)|Nl]):-
           X=a,!,
           find_same2(pt(X,Y),pt(Xa,Ya),R,Ss,Nl).
find_same2(_,_,R1,[slope(R2,_)|_],_):-R1\=R2.

但它只返回错误。

我该如何解决这个问题?谢谢

1 个答案:

答案 0 :(得分:0)

因为您不关心点的特定组成部分,您可以将每个点视为单个变量。因此,不要以pt(X, Y)为例,只需考虑它P

所以你想找到共同点:

find_common(P1, P2, N, SlopeList, Result)

如果您可以创建符合条件的SlopeList元素子列表,则可以通过预先添加两个现有点来形成Result。如果调用该子列表CommonPoints,那么您的Result将只是[P1, P2 | CommonPoints]

现在您只需要弄清楚如何确定CommonPoints。您可以使用member/2执行此操作。考虑:

member(slope(N, P), SlopeList)

对于具有元素SlopeList的{​​{1}}的每个元素,这将成功。要将它们聚集在一起,您可以使用slope(N, P)

findall/3

这些都是解决问题所需的全部内容。你只需把它们放在一起。