2016-07-07 19 views
0

多くのソリューションを返すこのコードを持っていますが、最初のリストが必要です。私はいくつかのカットで作業する必要がありますが、私はPrologを初めて使っています。私はそれを置く必要があります。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))] 
+1

これは何を期待しているのか、その代わりに何をするのでしょうか? –

+2

通常、最初の解のみが必要な場合は、述部からすべての切れ目を削除し、その代わりに述部の_call_の後に1つの切れ目を入れることができます。あるいは 'once(Goal)'を使うことができます。しかし、全体的なカットは、しばしばあなたがやっていることとそれを表現する方法を理解するための貧しい人の代用品です。 –

+0

ボリスさんありがとう!私は理解しようとするだろうが、この瞬間に私は本当にこの作業機能が必要です! – UserFromTheSpace

答えて

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

あなたがプロローグの最初の結果は、述語たい場合は、単純に(明らかに間違っている)の代わりにカットを使用して、または廃棄の

once(some_predicate(Result)) 
+0

ありがとうございます!あなたの答えは本当に私を助ける! – UserFromTheSpace

関連する問題