このディレクトリの索引

%  項を副目標として、選択項を収集しその合計を取る。

findsum(_選択項,_項,_合計値) :-
findall(_選択項,_項,_値ならび),
加算(_値ならび,_合計値),!.

加算([L1|R1],L2) :-
list(L1),
転置([L1|R1],L3),
転置されたならびの加算(L3,L2),!.
加算(L1,X) :-
sum_list(L1,X).

転置されたならびの加算([],[]).
転置されたならびの加算([L1|R1],[S|R2]) :-
sum_list(L1,S),
転置されたならびの加算(R1,R2).

転置([],[],[]) :- !.
転置([[A|R1]|R2],[R1|R3],[A|R4]) :-
転置(R2,R3,R4).

転置([[]|_],[]) :- !.
転置(L,[L1|R2]) :-
転置(L,L2,L1),
転置(L2,R2).

'文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :-
get_line(_文字列),
findsum([A,B,C],(
sub_atom(_文字列,_,1,_,_文字),
文字種判定(_文字,A,B,C)),[_英字の数,_数字の数,_その他の文字の数]),
writef('英字の数は %t,数字の数は %t,その他の文字の数は %t\n',[_英字の数,_数字の数,_その他の文字の数]).

文字種判定(_文字,1,0,0) :-
英字(_文字),!.
文字種判定(_文字,0,1,0) :-
数字(_文字),!.
文字種判定(_文字,0,0,1).

英字(A) :-
A @>='A',A @=< 'Z';
A @>='a',A @=< 'z'.

数字(A) :-
A @>= '0',
A @=< '9'.


%  転置/2