2016-07-07 2 views
0

にリストを形成するいくつかの要素を追加します。私は、追加使用してみましたが、私いるプロローグ - 私はこのような別のリストからいくつかの要素を追加する必要があり、別の1

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. 

しかし、それだけでfalseを返します。

どうすればこの問題を解決できますか?ありがとう

答えて

0

ポイントの特定のコンポーネントが何であるか気にしないので、各ポイントを1つの変数として扱うことができます。例えばpt(X, Y)の代わりに、それをPと考えてください。

は、だから、共通点を見つけたい:あなたはあなたの基準を満たすSlopeListから要素のサブリストを作成することができた場合は、既存の2つのポイントを付加することでResultを形成することができる

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

。そのサブリストがCommonPointsと呼ばれる場合は、Result[P1, P2 | CommonPoints]になります。

これで、CommonPointsの決定方法を理解する必要があります。これを行うにはmember/2を使用できます。考えてみましょう:

member(slope(N, P), SlopeList) 

これは、要素slope(N, P)を持ってSlopeListの各要素のために成功します。それらを一緒に収集するには、あなたがfindall/3を使用することができます。

findall(P, member(slope(N, P), SlopeList), CommonPoints). 

ものは、あなたがあなたの問題を解決するために必要なすべての作品です。あなたはそれらを一緒に置く必要があります。

関連する問題