このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/815
#  [1] 授業単元:プログラミング  
#  [2] 問題文(含コード&リンク):  
#  1.ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの内積a・bと外戚a*bを求める関数を  
#  それぞれ作成しなさい。また,ベクトルに値を代入する関数と,  
#  ベクトルを表示する関数も作成すること。  
#  ベクトルの値はscanfでその都度入力するようにする。  
#  実行例には,次の値を含め複数示すこと。  
#  a=(2,3,1)^T b=(4,2,3)^T  
#  ※ 配列のサイズなど、定数は必ず#defineを利用すること.  
#  ※ 表示や入力を目的とする関数以外では、関数の中で標準入力や標準出力への入出力は行わな  
#  いこと.  
#  ※ ポインタなどの手法は用いないこと.  
#   

'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの内積a・b' :-
        'ベクトルa=(a1,a2,a3)^Tの入力'(_a),
        'ベクトルa=(b1,b2,b3)^Tの入力'(_b),
        'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの内積a・b'(_a,_b,_内積),
        'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの内積a・bを出力する'(_a,_b,_内積).

'ベクトルa=(a1,a2,a3)^Tの入力'(_a) :-
        write('3成分ベクトルaを入力します。\n'),
        '3成分ベクトルの入力'(_a).

'ベクトルa=(b1,b2,b3)^Tの入力'(_b) :-
        write('3成分ベクトルbを入力します。\n'),
        '3成分ベクトルの入力'(_b).

'3成分ベクトルの入力'(_ベクトル) :-
        length(_ベクトル,3),
        findall([V],(
                    member(_,_ベクトル),
                    数を得る(数,V)),
                _ベクトル).

'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの内積a・b'(_a,_b,_内積) :-
        ベクトルの内積(_a,_b,_内積).

ベクトルの内積([],[],0) :- !.
ベクトルの内積([[A]|R1],[[B]|R2],X) :-
        ベクトルの内積(R1,R2,Y),
        X is Y + A * B.

'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの内積a・bを出力する'(_a,_b,_内積) :-
        _a=[[_a1],[_a2],[_a3]],
        _b=[[_b1],[_b2],[_b3]],
        writef('ベクトルa=(%t,%t,%t)^Tとb=(%t,%t,%t)^Tの内積a・bは %t です\n',[_a1,_a2,_a3,_b1,_b2,_b3,_内積]).


'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの外積a*bを求める' :-
        'ベクトルa=(a1,a2,a3)^Tの入力'(_a),
        'ベクトルa=(b1,b2,b3)^Tの入力'(_b),
        'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの外積a・b'(_a,_b,_外積),
        'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの外積a・bを出力する'(_a,_b,_外積).

'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの外積a*bを求める'(_a,_b,_c) :-
        _a = [[_a1],[_a2],[_a3]],
        _b = [[_b1],[_b2],[_b3]],
        '3成分ベクトルの外積'([[_a1],[_a2],[_a3],[_a1]],[[_b1],[_b2],[_b3],[_b1]],_c).

'3成分ベクトルの外積'([_],[_],[]) :- !.
'3成分ベクトルの外積'([[A],[B]|R1],[[D],[E]|R2],[[V]|R3]) :-
        V is A*E-D*B,
        '3成分ベクトルの外積'([[B]|R1],[[E]|R2],R3).

'ベクトルa=(a1,a2,a3)^Tとb=(b1,b2,b3)^Tの外積a*bを出力する'(_a,_b,_外積) :-
        _a=[[_a1],[_a2],[_a3]],
        _b=[[_b1],[_b2],[_b3]],
        writef('ベクトルa=(%t,%t,%t)^Tとb=(%t,%t,%t)^Tの外積a*bは %t です\n',[_a1,_a2,_a3,_b1,_b2,_b3,_外積]).

'3成分ベクトルの入力'(_3成分のベクトル) :-
        write('3成分ベクトルを入力します\n'),
        数を得る('ベクトル-1',_ベクトル_1),
        数を得る('ベクトル-2',_ベクトル_2),
        数を得る('ベクトル-3',_ベクトル_3),
        _3成分のベクトル = [[_ベクトル_1],[_ベクトル_2],[_ベクトル_3]].