このディレクトリの索引
# 1.
# um1toN(n)と呼び出すと(nは正の整数)、戻り値として 1 から n までの
# が返ってくる関数sum1toNを作成せよ。(関数の部分のみ書くこと。)

# 2.
# の半径をキーボードから入力し、円周の長さと面積を求めて表示する プログラムを次のように作成した。
# 周の長さと面積を求める部分は関数 circleを使用している。この関数を書け。
# 周率は#defineで定義している PAI を使ってよい。
# 
# #include 
# #define PAI 3.14159
# 関数circleのプロトタイプ宣言  (省略)  
# int main(void ){
#     double r, enshu, menseki;
#     printf("半径を入力 >>");
#     scanf("%lf", &r);
#     circle(r, &enshu, &menseki);
#     printf("円周 = %f 面積 = %f\n"
#                 , enshu, menseki);
#     return 0;
# }
#                                      
# │                             │     
# │    関数 circle           │     
# │                             │     
# 3.
# 大きさ8のint型配列aに初期値として
#       1 2 3 4 5 6 7 8
#  を設定する。これを
#       0 0 1 2 3 4 5 6
#  のように要素を右に2つシフトして a[0],a[1]には 0 を入れ、
#  その後配列の各要素を
#       a[0]=0     
#       a[1]=0     
#       a[2]=1     
#       a[3]=2     
#       a[4]=3     
#       a[5]=4     
#       a[6]=5     
#       a[7]=6     
#  
#  のように表示するプログラムを書け。
# 
# 4.
# 文字列(最大80文字)をキーボードから読み込み、
#  その文字列中で文字コードが最大の文字とその文字コードを
#  
#    文字コード最大はY <89>
#  
#  (Yが最大の文字、89がその文字コードを意味する。)
#  のように表示するプログラムを次のように作成した。空欄を埋めてプログラム
#  を完成せよ。変数は宣言している分で足りるはずであるが、必要ならば追加してもよい。
#  
#  #include 
# 
#  
# int main(void ){
#      char ch[81], max;
#      int i;
#      gets(ch);
#      ┌──────────────┐  
#     │              │  
#      │              │  
#      │              │  
#      └──────────────┘      
#      return 0;
#   }
# 

% (1)

'sum1toN(n)と呼び出すと(nは正の整数)、戻り値として 1 から n までの
が返ってくる関数sum1toNを作成せよ。(関数の部分のみ書くこと。)'(N,X) :-
sum1toN(N,X).

sum1toN(1,1) :- !.
sum1toN(N,X) :-
'第一引数を減らしながら加算の構造を積み上げ、1になったらその構造を使って加算して行く'(N,X).

'第一引数を減らしながら加算の構造を積み上げ、1になったらその構造を使って加算して行く'(N,X) :-
succ(M,N),
sum1toN(M,Y),
X is N + Y.

% (2)

pi(3.14159).

circle(_半径,_円周,_面積) :-
pi(PI),
_円周 is 2 * _半径 * PI,
_面積 is _半径 ^ 2 * PI.

% (3)

'大きさ8のint型配列aに初期値として
     1 2 3 4 5 6 7 8
を設定する。これを
     0 0 1 2 3 4 5 6
のように要素を右に2つシフトして a[0],a[1]には 0 を入れ、
その後配列の各要素を
     a[0]=0     
     a[1]=0     
     a[2]=1     
     a[3]=2     
     a[4]=3     
     a[5]=4     
     a[6]=5     
     a[7]=6     

のように表示するプログラムを書け。' :-
右にシフト(2,[1,2,3,4,5,6,7,8],_シフトされたならび),
表示(1,_シフトされたならび).

表示(_,[]) :- !.
表示(N,L) :-
'Nを増やしながら、そのNより1少ない数を表示し続ける'(N,L).

'Nを増やしながら、そのNより1少ない数を表示し続ける'(N,[M|R]) :-
succ(M,N),
write('a[%t]=%t',[N,M]),
succ(N,N2),
表示(N2,R).


右にシフト(0,X,X) :- !.
右にシフト(N,L,X) :-
第一引数文右にシフトして行く(N,L,X).

第一引数文右にシフトして行く(N,L,X) :-
append(Y,[_],[0|L]),
succ(M,N),,
右にシフト(M,Y,X).
  
% (4)

最大の文字コード(_文字列,_最大の文字コード) :-
atom_codes(_文字列,[C|R]),
最大の文字コード(R,C,_最大の文字コード).

最大の文字コード([],X,X) :- !.
最大の文字コード(L,_現在の最大コード,_最大の文字コード) :-


'Cが現在の最大コードより大きければ現在の最大コードを更新して行く。大きくなければ現在の最大コードはそのままにする。'(L,_現在の最大コード,_最大の文字コード).([C|R],_現在の最大コード,_最大の文字コード) :-
'Cが現在の最大コードより大きければ現在の最大コードを更新して行く。'([C|R],_現在の最大コード,_最大の文字コード).
'Cが現在の最大コードより大きければ現在の最大コードを更新して行く'([C|R],_現在の最大コード,_最大の文字コード) :-
'大きくなければ現在の最大コードはそのままにする。'([C|R],_現在の最大コード,_最大の文字コード).

'Cが現在の最大コードより大きければ現在の最大コードを更新して行く。'([C|R],_現在の最大コード,_最大の文字コード) :-
C =< _現在の最大コード,
現在の最大コードを更新して行く。'([C|R],,_現在の最大コード,_最大の文字コード),!.

'Cが現在最大コードより大きければ'(C,_現在の最大コード) :-
C > _現在の最大コード.

現在の最大コードを更新して行く。'([C|R],,_現在の最大コード,_最大の文字コード),!.


'大きくなければ現在の最大コードはそのままにする。'([C|R],_現在の最大コード,_最大の文字コード) :-
大きくなければ(C,_現在の最大コード),
'現在の最大コードはそのままにする。'([C|R],_現在の最大コード,_最大の文字コード).

大きくなければ(C,_現在の最大コード) :-
\+(C > _現在の最大コード).

'現在の最大コードはそのままにする。'([_|R],_現在の最大コード,_最大の文字コード) :-
最大の文字コード(R,_現在の最大コード,_最大の文字コード),!.