2011-01-02 8 views
0
sum([],0). 
sum([H|T],S) :- sum(T,X),S is X+H. 

mean([],0). 
mean(L,M) :- sum(L,S),length(L,L1),M is S/L1. 
:-arithmetic_function(mean/1). 
when i try 
?- mean([1,2,3,4],X). 

それは私がPrologで私の算術関数を定義しますか?

?- X is mean ([1,2,3,4]. 

を使用したいが、それはリストで、算術関数を使用する方法を

Type error: ERROR: '.'/2: Type error: `[]' expected, found `[2, 3, 4]' ("x" must hold one character) 

でrepies今

X= 2.5 
Yes 

で応答しますか?

+0

ここでは廃止予定のSWI固有の機能を使用しています – false

答えて

2

それは正しい軌道に乗っているように、あなたのコードが見えますが、残念ながら数字の任意の長さのリストは、このようなmean/1にごパラメータとしてarithmetic_function sと定義された関数にパラメータ(引数)としてを使用することはできないようです。

この文脈では、in SWI-Prolog, ./2 is itself considered to be an arithmetic typeという問題に関連して問題が発生しています。

説明:

考慮する:

?- X is 1 + 2 * 3. 
X = 7. 

を算術演算子*+よりも優先されているので、これは実際には:

?- X is (1 + (2 * 3)). 
X = 7. 

さらに、+*バイナリ中置あります演算子、ca Nさもなければように書くこと:ここで、SWI-Prologのは、式ツリー「インサイドアウト」を、評価実際には

?- X is '+'(1, '*'(2, 3)). 
X = 7. 

*まず、次いで+式に結果を適用します。これを念頭に置いて、今あなたの例を考えてみます。

?- X is mean([1,2,3,4]). 

何SWI-Prologのは、実際に解釈することは実際にあります。

?- X is mean('.'(1,[2,3,4])). 

'.'/2は算術型であるため、SWI-Prologのは、最初にこの式を評価(上の例では*のように)、タイプチェックは必要なパターン.(+Int,[])ではないことを示します。つまり、整数を含む長さ1のリストです(上のリンクのドキュメントを参照してください)。 [][2,3,4]と等しくないので、報告するタイプエラーが発生します。

また、次しようと考えるかもしれない:何SWI-Prologのは、実際に解釈することは実際には

?- X is mean([1]). 

:これはタイプのパターン.(+Int,[])の有効なインスタンスである一方で、

?- X is mean('.'(1,[])). 

今、この算術型のセマンティクスとして、と評価されて*と多くの点で同じと評価された)が1となる。値1は、の実装の最初の入力引数にバインドされます。それ以外の場合は、入力リストになります。

関連する問題