2011-02-05 5 views
2

私は、iprod(List1, List2, Result)が同じ長さの2つのリストを取り、それぞれが整数を含むように、プロローグに述語を作成することになっています。結果は、2つのベクトルの内積です。2つのベクトルの計算積

たとえば、List1 = [1,2,3],List2 = [4,5,6]の場合、結果は1*4 + 2*5 + 3*6になります。また、私は組み込まれているdotproduct関数を使うべきではありません。これまで

マイコード:ビジュアルプロローグで

iprod([],[], 0). 
iprod([H1|List1], [H2|List2], Result is H1 * H2) :- iprod(List1, List2, Result). 
+1

そこで質問は何ですか?あなたは私のためにこの宿題をしますか? –

+0

で、宿題に関する助言を求めるガイドラインについては、[宿題に関する質問と回答方法](http://meta.stackexchange.com/questions/10811/how-to-ask-and-answer-homework)を参照してください。 -questions) – outis

+0

私はこれを言い換えることができます。上記は問題の質問です。私はResult =((0は2 * 4)が1 * 3である)ポイントに達する。結果が実際の数値にならないのはなぜですか?代わりに私にすべての計算を与えてくれますか? – Victor

答えて

2

32

domains 
    ilist=integer* 

predicates 
    iprod(ilist, ilist, integer, integer) 

clauses 
    iprod([], _, R, R).  
    iprod([X|Xs], [Y|Ys], A, R):- 
    M = X * Y, 
    Rnew = A + M, 
    iprod(XS, Ys, Rnew, R). 


goal 
    iprod([1,2,3],[4,5,6], 0, R). 

結果。申し訳ありませんが、他のPrologの実装はすぐに利用できません。 SWI-Prologの使い方

+0

これは良いアプローチですが、少し変更するだけでISO Prolog: iprod([]、[]、R、R)に変えることができます。 iprod([X | Xs]、[Y | Ys]、A、R): - 新しい(X * Y)+ A、 iprod(Xs、Ys、Anew、R)です。 iprod(Xvct、Yvct、DotP): - iprod(Xvct、Yvct、0、DotP)。 おそらく、** iprod/3 **から** iprod/4 **への拡張についての言葉は、新しいPrologプログラマーにとって役に立ちますか? – hardmath

1

 
?- use_module(library(lambda)). 
true. 

?- maplist(\X^Y^Z^(Z=X*Y),[1,2,3],[4,5,6],Dots). 
Dots = [1*4, 2*5, 3*6]. 

?- maplist(\X^Y^Z^(Z is X*Y),[1,2,3],[4,5,6],Dots). 
Dots = [4, 10, 18]. 
+1

あなたは2つのリストのエントリーごとのプロダクトを作りました。 2つのベクトルのドット積(ここでは等しい長さのリストで表されます)は、生成した積の合計である単一のスカラー(数値)です。 – hardmath

+3

真実ですが、OPの難しさは構文統一対算術評価の理解にあります。 – false

関連する問題