2017-10-25 16 views
2

私は面積を計算する次の関数を持っています。面積計算正接円周 - プロローグ

3つのパラメータを受け取ります。最初はnの場合を表し、2番目は周囲のラジオを表し、3番目の場合は結果を返します。

第1入力が1より大きい場合、それは機能しません。

この私のコード:

as(1, [X], A) :- 
    A is (sqrt(3.0) * (X*X)) - (3.14 * (X*X))/2. 
as(N, [H|_T], A) :- 
    A is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2, 
    N1 is N-1, 
    as(N1-1, T, A).  

それが動作するはずです方法の例は次のとおりです。

?- as(4, [1,1,1,1], R). 
R = 0.162050807568877130000 ; 
R = 0.162050807568877130000 ; 
R = 0.162050807568877130000 ; 
R = 0.162050807568877130000. 

あなたは私を助けることができれば、私は感謝される...

+2

述語は** **小文字で始まる必要があります。 –

+1

おそらくあなたの再帰呼び出しは、 'as(N1-1、T、A)'の代わりに 'as(N1、T、A)'になりたいでしょう。 'as/3'の第一引数の目的は何ですか?それが空になるまでリストを処理できるようです。私はあなたがそのケースでは最初の句全体を削除することができたと思います。なぜなら、リストが空になると何も一致しないからです。 –

+0

2番目の引数リストの長さに数字の重複情報がありませんか? –

答えて

3

がありますにこのバージョンではあなたのニーズに十分ではない理由はありますか?

as([H|_], A):- 
    A is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2. 
as([_|T], A) :- as(T, A). 

area(H, Area) :- 
    Area is (sqrt(3.0) * (H*H)) - (3.14 * (H*H))/2. 
as(List, Area) :- member(Ratio, List), area(Ratio, Area). 
  1. あなたはおよそN全く心配する必要がある理由私は理解していません。
  2. N[X]の両方を一致させると、冗長性が生じます。数式を繰り返す必要はありません。
  3. シングルトンエラーが多い:_Tが頭に、Tが動作しません。
  4. 再帰呼び出しにはN1-1が渡されますが、これは評価されませんが、前の式でN-1と評価されているので、ここでN1を渡すだけです。再び、私はこの点について全く見ていない。
  5. succ(N1, N)を追加または減算するのではなく、両方向で機能するので、これを使用することをお勧めします。
  6. リストトラバーサルを計算に組み合わせるのはちょっと気分が悪いです。私は一般的には、計算がデータ構造とは別のものになるように物事を分解します。これはプログラミングの普遍的な格付けです。
2

とにかく測定ごとに面積を計算したいので、ラジオ測定のリストに対応するエリアのリストを取得するのは適切ではないでしょうか?あなたの述語の構造は、あなたがそれらの行に沿って考えていたことを示しているようです。

:- use_module(library(apply)). % needed for maplist 

% a single measurement and the corresponding area 
area(X, A) :- 
    A is (sqrt(3.0) * (X*X)) - (3.14 * (X*X))/2. 

areas(Xs,As) :- 
    maplist(area,Xs,As).   % area/2 mapped to Xs results in As 

この述語を照会望ましい結果が得られますが、リストに:そして、あなたは簡単にmaplist/3を使用していることを達成できる

?- areas([1,1,5,3],As). 
As = [0.16205080756887713, 0.16205080756887713, 4.051270189221931, 1.4584572681198935]. 
関連する問題