このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1250204272/436
#  [1] 授業単元: C言語 
#  [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9949.txt
# 1. double x[3],y[3](成分はscanf)の内積を求めるプログラム
# 2. 数列an={1,2,4,8,16,・・・}(n=1,2,・・・,20)を求めて表示するプログラム
# 3. 「正数を入力してください」と表示し、入力した数字nが素数かどうかを
# 判断するプログラム

内積([],[],0).
内積([A|R1],[B|R2],X) :-
        内積(R1,R2,Y),
        C is A * B,
        X is Y + C.

'数列an={1,2,4,8,16,・・・}(n=1,2,・・・,20)を求めて表示する'(Max,X) :-
        findsum(Y,(
                    between(1,Max,N),
                    Y is 2 ^ N)),
                X).

素数かどうか判断する :-
        write('正数を入力してください : '),
        repeat,
        get_line(Line),
        atom_to_term(Line,N,_),
        integer(N),
        N > 0,
        素数である(N),!.

素数である(N) :-
        N2 is N // 2,
        for(2,M,N2),
        0 is N mod M,
        !,
        fail.
素数である(_).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% *** user: findsum / 3 ***
findsum(_選択項,_項,_合計値) :-
        findall(_選択項,_項,_値ならび),
        '加算'(_値ならび,_合計値),!.

% *** user: 加算 / 2 ***
加算(trunc(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A is trunc(B)),SL),!.
加算(四捨五入(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 四捨五入(B)),SL),!.
加算(切捨て(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 切捨て(B)),SL),!.
加算(切り上げ(L),SL) :-
        加算(L,SL2),
        findall(A,(member(B,SL2) , A は 切り上げ(B)),SL),!.
加算([],L) :-
        var(L),
        L = 0.0e+00,!.
加算([],L) :-
        \+(var(L)),
        加算の変数に零をおく(L),!.
加算([L|R],SL) :-
        ならび(L),
        行列の転置([L|R],L1),
        加算_2(L1,SL),!.
加算(X,S) :-
        加算_1(X,0.0e+00,S).

% *** user: 加算の変数に零をおく / 1 ***
加算の変数に零をおく([]) :- !.
加算の変数に零をおく([A|R]) :-
        変数(A),
        A = 0.0e+00,
        加算の変数に零をおく(R),!.

% *** user: 加算_1 / 3 ***
加算_1([],S,S) :- !.
加算_1([A|R],Y,S) :-
        ならび(A),
        ならび(Y),
        !,
        ならび加算(A,Y,Z),
        加算_1(R,Z,S),!.
加算_1([A|R],Y,S) :-
        atom(A),
        atom_number(A,I),
        integer(I),
        Z is I + Y,
        加算_1(R,Z,S),!.
加算_1([A|R],Y,S) :-
        atom(A),
        atom_number(A,F),
        real(F),
        Z is F + Y,
        加算_1(R,Z,S),!.
加算_1([A|R],Y,S) :-
        atom(A),
        加算_1(R,Y,S),!.
加算_1([A|R],Y,S) :-
        A1 は A,
        Z is A1 + Y,
        加算_1(R,Z,S).
加算_1(A,Y,S) :-
        とからりすと(A,L),
        !,
        加算_1(L,Y,S).

% *** user: 加算_2 / 2 ***
加算_2([],[]) :- !.
加算_2([L|R],[S|R2]) :-
        加算(L,S),
        加算_2(R,R2).

% *** user: 行列の転置 / 3 ***
行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :-
        行列の転置(R1,R2,R3).

% *** user: 行列の転置 / 2 ***
行列の転置([[]|_],[]) :- !.
行列の転置(L,[B|R1]) :-
        行列の転置(L,B,R2),
        行列の転置(R2,R1),!.