このディレクトリの索引

% 以下のサイトは # # SWI-Prolog用 sub_atom/5 の遅延評価版述語 副文字列/5 # # 第一引数の_文字列が変数であってもすぐにはエラーとならない # 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列),!. 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- freeze(_文字列,sub_atom(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列)). '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ), 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ). '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ) :- '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ), 共に0である(_選択開始位置0起源,_残り長さ). '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ) :- integer(_選択開始位置0起源), integer(_残り長さ). 共に0である(0,0). 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ) :- var(_文字列), _文字列 = _副文字列, freeze(_文字列,atom_length(_文字列,_選択長さ)). % 以下のサイトは 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). % 以下のサイトは 'a-zを50回繰り返し、その文字列のn番目のnが素数かつその数値文字列の中に3を含まないものは、大文字に変換する'(_目標文字列) :- '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(_小文字ならび,_大文字ならび), 'エラトステネスの篩の変形'(_大文字ならび,Lx), 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列). 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(_小文字ならび,Lx), atom_chars(_目標文字列,Lx). 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(L1,L2) :- '小文字のa-zを50回繰り返したならびと'(L1), '大文字のA-Zを50回繰り返したならび'(L2). '小文字のa-zを50回繰り返したならびと'(L1) :- findall(A,( between(1,50,_), sub_atom(abcdefghijklmnopqrstuvwxyz,_,1,_,A)),L1). '大文字のA-Zを50回繰り返したならび'(L2) :- findall(A,( between(1,50,_), sub_atom('ABCDEFGHIJKLMNOPQRSTRVWXYZ',_,1,_,A)),L2). 素数でその数値文字列に3を含まない時大文字で挿入する(_大文字ならび,L) :- findall(N,between(2,1300,N),_篩候補), length(L,1300), '素数でその数値文字列に3を含まない時大文字で挿入する'(_篩候補,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'([],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'([A|R1],_大文字ならび,L) :- '数字列に3を含まない時は大文字を素数の位置に挿入'(A,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(A,R1,R2,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(R2,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'(_,[],[],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'(N,[A|R1],R,_大文字ならび,L) :- 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L) :- 0 is A mod N, '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R,_大文字ならび,L),!. 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],[A|R2],_大文字ならび,L) :- '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R2,_大文字ならび,L). '数字列に3を含まない時は大文字を素数の位置に挿入'(N,_大文字ならび,L) :- 数字列に3を含まない時は(N,_大文字ならび), 大文字を素数の位置に挿入(N,_大文字ならび,L),!. '数字列に3を含まない時は大文字を素数の位置に挿入'(_,_,L). 数字列に3を含まない時は(N,_大文字ならび) :- number_chars(N,Chars), \+(member('3',Chars)). 大文字を素数の位置に挿入(N,_大文字ならび,L) :- nth1(N,_大文字ならび,A), nth1(N,L,A). % 以下のサイトは 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nがmになる直前の変数nの値を求めよ # '1+2+3+....+nが_mになる直前の変数_nの値を求めよ'(_m,_n) :- once((nth1(_n,_,_),((_n + 2) * (_n + 1)) / 2 >= _m)). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(_行,( '10行ある', '10要素の行のすべての要素に1を代入'(_行)),LL). '10行ある' :- between(1,10,_). '10要素の行のすべての要素に1を代入'(_行) :- '10要素の行の'(_行), すべての要素に1を代入(_行). '10要素の行の'(_行) :- length(_行,10). すべての要素に1を代入([]). すべての要素に1を代入([1|R]) :- すべての要素に1を代入(R). 'その内容を表示しなさい。'(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- forall(行を表示文字列に変換する(LL,_表示文字列),writef('%w\n',[_表示文字列])). 行を表示文字列に変換する(LL,_表示文字列) :- member(_行,LL), atomic_list_concat(_行,' ',_表示文字列). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), 対角要素だけ1を代入しほかは全て0を代入(_n,L)),LL). 対角要素だけ1を代入しほかは全て0を代入(_n,L) :- 対角要素だけ1を代入し(_n,L), 他の全ての変数要素は0に(L). 対角要素だけ1を代入し(_n,L) :- length(L,10), reverse(L,RL), 対角要素だけ1を代入し(_n,RL,L). 対角要素だけ1を代入し(_n,RL,L) :- nth1(_n,L,1), nth1(_n,RL,1). 他の全ての変数要素は0に(L) :- findall(N,( member(N,L), 変数要素は0に(N)),L). 変数要素は0に(0) :- !. 変数要素は0に(N). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 '荷物の重みと値段はともに、1から100までの乱数で与えることとする。 void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている ファイル名のファイルを開き、そこにデータを記録する。'(_ファイル名,N) :- ファイル名のファイルを開き(_ファイル名), 'そこにデータを記録する。'(N), ファイルを閉じる. ファイル名のファイルを開き(_ファイル名) :- tell(_ファイル名). 'そこにデータを記録する。'(N) :- writef('%w\n',[N]), forall((between(1,N,_),X is random(100) + 1),writef('%w\n',[X])), forall((between(1,N,_),Y is random(100) + 1),writef('%w\n',[Y])). ファイルを閉じる :- told. ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :- データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび), findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび) :- データファイルから読み出す(_ファイル名,N,_整数ならび), 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび). データファイルから読み出す(_ファイル名,N,L1) :- see(_ファイル名), get_integer(N), get_integers(L1), seen. 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび) :- length(_重さならび,N), length(_価格ならび,N), append(_重さならび,_価格ならび,_整数ならび). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_集合,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合), 集合の合計価格(_集合,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合) :- '集合の重量合計は'(_集合,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_集合,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_集合), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). get_integers(L) :- findall(I,(repeat,get_line(Line),(Line=end_of_file,!,fail;read_term_from_atom(Line,I,[]))),L),!. 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). get_integer(N) :- get_line(Line), read_term_from_atom(Line,N,[]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが'(_n,_合計), '1000になる直前の変数nの値'(_合計,_n),!. '1+2+3+....+nが'(_n,_合計) :- nth1(_n,_,_), '1+2+3+....+n'(_n,_合計). '1+2+3+....+n'(_n,_合計) :- findall(_整数,between(1,_n,_整数),_1からnまでの整数ならび), sum_list(_1からnまでの整数ならび,_合計). '1000になる直前の変数nの値'(_合計,_n) :- _合計 + _n + 1 >= 1000. % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- once((nth1(_n,_,_),((_n + 2) * (_n + 1)) / 2 >= 1000)). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- between(1,1000,_n), findall(M,between(1,_n,M),L), sum_list(L,Sum), Sum + _n + 1 >= 1000. % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([],[],_n),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L,Ls_1,_n) :- 加算するとならび要素が1000を超える(L,Ls_1,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L1,Ls_1,_n) :- append([_|L1],Ls_1,Ls_2), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([_|L1],Ls_2,_n). 加算するとならび要素が1000を超える(L,Ls_1,_n) :- append([_|L],Ls_1,Lx), length(Lx,X), X >= 1000, length(L,_n). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- length(Ln,1000), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([],Ln,[],L), length(L,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L,Ln,Ls_1,L) :- 加算するとならび要素が1000を超える(L,Ln,Ls_1),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L1,Ln,Ls_1,L) :- append([_|L1],Ls_1,Ls_2), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([_|L1],Ln,Ls_2,L). 加算するとならび要素が1000を超える(L,Ln,Ls_1) :- append([_|L],Ls_1,Lx), append(Ln,_,Lx). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(0,0,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n,S,_n) :- 'Sに_nを加えたら1000以上になる場合_nが解'(_n,S,_n),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(N_1,S,_n) :- '1000になる直前までN_1を1ずつ増分しSに加算する'(N_1,S,_n). 'Sに_nを加えたら1000以上になる場合_nが解'(_n,S,_n) :- 1000 =< S + _n + 1. '1000になる直前までN_1を1ずつ増分しSに加算する'(N_1,S_1,_n) :- N_2 is N_1 + 1, S_2 is S_1 + N_2, '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(N_2,S_2,_n). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/754 # # [1] プログラミング # [2] 1+2+3+....+nがzになる直前の変数nの値を求めよ # '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,_n) :- '1+2+3+....+nがzになる直前の変数nの値を求めよ'(0,0,_n),!. '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,_n,S,_n) :- _z =< S + _n + 1,!. '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,N_1,S_1,_n) :- N_2 is N_1 + 1, S_2 is S_1 + N_2, '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,N_2,S_2,_n). % % S_2 is S_1 + N_2, % % の N_2 が( N_1 ではなく)大事なところであるが、 % それがまったく表れていない。 % 好ましいプログラムとはいえない。 % % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー) :- 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー). 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(N,L1,L2,R) :- 'L1の要素数はN個以上'(N,L1,L2,R),!. 先頭からN個(_,L,L,[]). 'L1の要素数はN個以上'(N,L1,L2,R) :- length(L2,N), append(L2,R,L1). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2). 変数だけ値を詰める([],_). 変数だけ値を詰める([A|R],V) :- 変数だけ値を詰める(A,R,V). 変数だけ値を詰める(A,R,V) :- '_1が変数の場合は_2になる'(A,V), 変数だけ値を詰める(R,V). '_1が変数の場合は_2になる'(V,V) :- !. '_1が変数の場合は_2になる'(_,_). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #812 # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '整数 a をキーボードから入力し,a が素数かどうか判断する' :- '整数 a をキーボードから入力し'(_a), 'a が素数かどうか判断する'(_a,_素数かどうかの判断), writef('%t は %t\n',[_a,_素数かどうかの判断]). '整数 a をキーボードから入力し'(_a) :- 整数を得る('整数 a',_a). 'a が素数かどうか判断する'(_a,素数である) :- _除数になりうる最大値 is _a // 2, 'a が素数かどうか判断する'(2,_除数になりうる最大値,_a),!. 'a が素数かどうか判断する'(_,素数ではない). 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_) :- _除数 > _除数になりうる最大値. 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り除数を1ずつ加算して行って判断する'(_除数,_除数になりうる最大値,_a) :- 'a が除数で割り切れない限り'(_a,_除数), 除数を1ずつ加算して(_除数,_次の除数), 'a が素数かどうか判断する'(_次の除数,_除数になりうる最大値,_a). 'a が除数で割り切れない限り'(_a,_除数) :- \+(0 is _a mod _除数). 除数を1ずつ加算して(_除数,_次の除数) :- succ(_除数,_次の除数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(Instream,_催促文ならび,_整数を含む条件,_整数ならび) :- list(_催促文ならび), findall(_整数,( member(_催促文,_催促文ならび), 整数を得る(Instream,_催促文,_整数を含む条件,_整数)), _整数ならび),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 整数を得る'(Line,_整数を含む条件,_整数),!. 整数を得る(Instream,_催促文,_整数を含む条件,_整数) :- 整数を得る(Instream,_催促文,_整数を含む条件,_整数). '診断: 整数を得る'(end_of_file,_整数を含む条件,end_of_file) :- !. '診断: 整数を得る'('',_,_) :- !,fail. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- atom_to_term(Line,_整数,_), integer(_整数), '診断: 整数を含む条件'(_整数,_整数を含む条件),!. '診断: 整数を得る'(Line,_整数を含む条件,_整数) :- \+((atom_to_term(Line,_整数,_),integer(_整数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]), fail. '診断: 整数を得る'(end_of_file,end_of_file) :- !. '診断: 整数を得る'('',_) :- !,fail. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- call(_整数を含む条件),!. '診断: 整数を含む条件'(_整数,_整数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_整数,_整数を含む条件]), fail. 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(_催促文,_整数) :- 整数を得る(user_input,_催促文,true,_整数). 整数を得る(_整数) :- 整数を得る(user_input,'',true,_整数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). n個の整数を得る(_n,_催促文,_整数ならび) :- length(_整数ならび,_n), findall(_整数,( 部分ならび(_整数ならび,_,_,_何番目,_,_,_,L3), writef('[%t/%t]番目の',[_何番目,_n]), 整数を得る(_催促文,_整数)), _整数ならび). 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). list([_|_]) :- !. list([]. % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび), 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび,_文字ならび), 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列). 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび) :- length(_文字ならび,_桁), number_chars(_整数,_数字ならび), append(_頭部零文字ならび,_数字ならび,_文字ならび). 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび) :- findall('0',( member(_要素,_頭部零文字ならび),var(_要素)),_頭部零文字ならび). 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_文字ならび). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz), '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数でないときは、'(_FizzBuzz), 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz). '_FizzBuzzが変数でないときは、Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz). '_FizzBuzzが変数でないときは、'(_FizzBuzz) :- \+(var(_FizzBuzz)). 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 'Fizz,Buzz,FizzBuzzの何れか、'(_FizzBuzz). 'Fizz,Buzz,FizzBuzzの何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 自然数でなくてはならない(_FizzBuzz). 'Fizz,Buzz,FizzBuzzの何れか、'(_FizzBuzz) :- member(_FizzBuzz,['Fizz','Buzz','FizzBuzz']). 自然数でなくてはならない(_FizzBuzz) :- integer(_FizzBuzz), _FizzBuzz > 0. '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz) :- var(_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数), ('_FizzBuzzが整数のときは_数 > _FizzBuzzの場合打ち切る'(_数,_FizzBuzz),!,fail; '_FizzBuzzを得る'(_数,_FizzBuzz)). '_数を生成し'(_数) :- nth1(_数,_,_). '_FizzBuzzが整数のときは_数 > _FizzBuzzの場合打ち切る'(_数,_FizzBuzz) :- integer(_FizzBuzz), _数 > _FizzBuzz. '_FizzBuzzを得る'(_数,'Fizz') :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,'Buzz') :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,'FizzBuzz') :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- '_数は3で割り切れて、'(_数), '5では割り切れない'(_数). '_数は3で割り切れて、'(_数) :- 0 is _数 mod 3. '5では割り切れない'(_数) :- \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- '_数は5で割り切れて、'(_数), '3では割り切れない'(_数). '_数は5で割り切れて、'(_数) :- 0 is _数 mod 5. '3では割り切れない'(_数) :- \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_数) :- '_数が3でも割り切れない'(_数), '_数が5でも割り切れない'(_数). '_数が3でも割り切れない'(_数) :- \+(0 is _数 mod 3). '_数が5でも割り切れない'(_数) :- \+(0 is _数 mod 5). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz), '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz). '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数でないときは、'(_FizzBuzz), '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz). '_FizzBuzzが変数でないときは、"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz). '_FizzBuzzが変数でないときは、'(_FizzBuzz) :- \+(var(_FizzBuzz)). '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- '"Fizz","Buzz","FizzBuzz"の何れか、'(_FizzBuzz). '"Fizz","Buzz","FizzBuzz"の何れか、或いは自然数でなくてはならない'(_FizzBuzz) :- 自然数でなくてはならない(_FizzBuzz). '"Fizz","Buzz","FizzBuzz"の何れか、'(_FizzBuzz) :- member(_FizzBuzz,["Fizz","Buzz","FizzBuzz"]). 自然数でなくてはならない(_FizzBuzz) :- integer(_FizzBuzz), _FizzBuzz > 0. '_FizzBuzzが変数のときはこの条件検査の対象外である'(_FizzBuzz) :- var(_FizzBuzz). '_数を生成し_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数を生成し'(_数,_FizzBuzz), '_FizzBuzzを得る'(_数,_FizzBuzz). '_数を生成し'(_数,_FizzBuzz) :- nth1(_数,_,_). '_FizzBuzzを得る'(_数,"Fizz") :- '_数は3で割り切れて、5では割り切れない'(_数). '_FizzBuzzを得る'(_数,"Buzz") :- '_数は5で割り切れて、3では割り切れない'(_数). '_FizzBuzzを得る'(_数,"FizzBuzz") :- '_数は3でも5でも割り切れる'(_数). '_FizzBuzzを得る'(_数,_FizzBuzz) :- '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_FizzBuzz). '_数は3で割り切れて、5では割り切れない'(_数) :- '_数は3で割り切れて、'(_数), '5では割り切れない'(_数). '_数は3で割り切れて、'(_数) :- 0 is _数 mod 3. '5では割り切れない'(_数) :- \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- '_数は5で割り切れて、'(_数), '3では割り切れない'(_数). '_数は5で割り切れて、'(_数) :- 0 is _数 mod 5. '3では割り切れない'(_数) :- \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3でも5でも割り切れないときは_FizzBuzzには_数を返す'(_数,_数) :- '_数が3でも割り切れない'(_数), '_数が5でも割り切れない'(_数). '_数が3でも割り切れない'(_数) :- \+(0 is _数 mod 3). '_数が5でも割り切れない'(_数) :- \+(0 is _数 mod 5). % 以下のサイトは パターンで変数ならびを埋める(_変数ならび,_パターン) :- 停止条件は_変数ならびの長さが_パターンの長さに等しいか小さくなった時(_変数ならび,_パターン),!. パターンで変数ならびを埋める(_変数ならび,_パターン) :- パターンで順に単一化して行く(_変数ならび,_パターン). パターンで順に単一化して行く(_変数ならび_1,_パターン) :- copy_term(_パターン,_複写パターン), append(_複写パターン,_変数ならび_2,_変数ならび_1), パターンで変数ならびを埋める(_変数ならび_2,_パターン). 停止条件は_変数ならびの長さが_パターンの長さに等しいか小さくなった時(_変数ならび,_パターン) :- copy_term(_パターン,_複写パターン), append(_変数ならび,_,_複写パターン). % 以下のサイトは 成績(尾崎,前期,国語,30). 成績(尾崎,前期,社会,40). 成績(山崎,前期,国語,20). 成績(山崎,前期,社会,50). 成績(尾崎,後期,国語,50). 成績(山崎,後期,国語,40). 集約合計を得る(_目標,_集約対象項,_集約鍵ならび,_集約値) :- 鍵となる値ならび(_集約鍵ならび,_目標,_鍵となる値ならび), 集約する鍵値毎に合計を得る(_目標,_集約対象項,_鍵となる値ならび,_集約鍵ならび,_集約値). 集約する鍵値毎に合計を得る(_目標,_集約対象項,_鍵となる値ならび,_集約鍵ならび,_集約値) :- member(_集約鍵ならび,_鍵となる値ならび), 対象項の合計をとる(_集約対象項,_目標,_集約値). 対象項の合計をとる(_対象項,_目標,_合計) :- findall(_対象項,_目標,L), 合計をとる(L,_合計). 鍵となる値ならび(_集約鍵ならび,_目標,_鍵となる値ならび) :- term_variables(_目標,_全ての変数ならび), setof(_集約鍵ならび,_全ての変数ならび ^ _目標,_鍵となる値ならび). % 実行例 合計をとる(L,_合計) :- 'Lが数値ならび場合、sum_listで合計を得る'(L,_合計). 合計をとる(L,_合計ならび) :- 'Lの要素がならびの場合、ならび要素ごとの合計ならびを得る'(L,_合計ならび). 'Lが数値ならび場合、sum_listで合計を得る'([],0). 'Lが数値ならび場合、sum_listで合計を得る'([A|R],_合計) :- number(A), sum_list([A|R],_合計). 'Lの要素がならびの場合、ならび要素ごとの合計ならびを得る'(L,_合計ならび) :- 'Lの要素がならびの場合'(L), ならび要素ごとの合計ならびを得る(L,_合計ならび). 'Lの要素がならびの場合'(L) :- L = [L1|R], is_list(L1). ならび要素ごとの合計ならびを得る(LL,_合計ならび) :- 転置(LL,LL2), '転置されたLL2の各要素をsum_listしたならびを得る'(LL2,_合計ならび). '転置されたLL2の各要素をsum_listしたならびを得る'(LL2,_合計ならび) :- findall(_合計,( member(L,LL2), sum_list(L,_合計)),_合計ならび). 転置([],[],[]):- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]):- 転置(R2,R3,R4). 転置([[]|_],[]):- !. 転置(L,[L1|R2]):- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # assertz/retractや大域変数を使わない自作findall。 # 現在目標はユーザ定義述語の単項のみ。 # 連言、選言、組込述語は不可。連言、選言、決定性の組込述語は # これから手を入れれば解決できるが、非決定性の組込述語は永久に無理。 % % このコード間違っていました。n番目のclause選択にfailすることが % あり得て、その場合このコードだと、即終了してしまいます。 項の収集(_収集項,_副目標,_収集項ならび) :- 副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- predicate_property(_頭部,number_of_clauses(_節数)), 副目標の実行結果を収集する(1,_節数,_頭部,_収集項,_収集項ならび). 副目標の実行結果を収集する(_n番目,_節数,_,_,[]) :- _n番目 > _節数,!. 副目標の実行結果を収集する(_n番目,_節数,_頭部,_収集項,[_収集項_n|R]) :- succ(_n番目,_次の), 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R). 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n),!, 副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- 副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目のclauseの実行(_n番目,_頭部_n). n番目のclauseの実行(_n番目,_頭部_n) :- n番目のclauseを得る(_n番目,_頭部_n,_本体_n), call(_本体_n). n番目のclauseを得る(_n番目,_頭部,_本体) :- nth_clause(_頭部,_n番目,Reference), clause(_頭部,_本体,Reference). % 以下のサイトは # assertz/retractや大域変数を使わず、単位節の引数情報をリストに収集する。 # 単位節情報の収集(_収集項,_副目標,_収集項ならび) :- 単位節副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 単位節副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- predicate_property(_頭部,number_of_clauses(_節数)), 単位節副目標の実行結果を収集する(1,_節数,_頭部,_収集項,_収集項ならび). 単位節副目標の実行結果を収集する(_n番目,_節数,_,_,[]) :- _n番目 > _節数,!. 単位節副目標の実行結果を収集する(_n番目,_節数,_頭部,_収集項,L) :- succ(_n番目,_次の), 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,L). 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,[_収集項_n|R]) :- '頭部、収集項を保存した上で、n番目の単位節clauseを実行する'(_n番目,_頭部,_収集項,_収集項_n),!, 単位節副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- 単位節副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目の単位節clauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目の単位節clauseを得る(_n番目,_頭部_n). n番目の単位節clauseを得る(_n番目,_頭部_n) :- nth_clause(_頭部_n,_n番目,Reference), clause(_頭部_n,true,Reference). % 以下のサイトは # assertz/retractや大域変数を使わない自作findall。 # 現在目標はユーザ定義述語の単項のみ。 # 連言、選言、組込述語は不可。連言、選言、決定性の組込述語は # これから手を入れれば解決できるが、非決定性の組込述語は永久に無理。 % % このコード間違っていました。n番目のclause選択にfailすることが % あり得て、その場合このコードだと、即終了してしまいます。 単位節の収集(_収集項,_副目標,_収集項ならび) :- 副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- 副目標の実行結果を収集する(1,_頭部,_収集項,_収集項ならび). 副目標の実行結果を収集する(_n番目,_頭部,_収集項,[_収集項_n|R]) :- 副目標の実行結果を再帰的に収集する(_n番目,_頭部,_収集項,_収集項_n,R). 副目標の実行結果を収集する(_,_,_,[]). 副目標の実行結果を再帰的に収集する(_n番目,_頭部,_収集項,_収集項_n,R) :- '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番面,_頭部,_収集項,_収集項_n), succ(_n番目,_次の), 副目標の実行結果を収集する(_次の,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目のclauseの実行(_n番目,_頭部_n). n番目のclauseの実行(_n番目,_頭部_n) :- n番目のclauseを得る(_n番目,_頭部_n,_本体_n), call(_本体_n). n番目のclauseを得る(_n番目,_頭部,_本体) :- nth_clause(_頭部,_n番目,Reference), clause(_頭部,_本体,Reference). % 以下のサイトは 親(為義). 親(頼朝). 親(範頼). 子(頼朝). 子(範頼). 子(公暁). 親子テーブル候補(_親子テーブル候補) :- 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合である親と子の直積上の(_属性集合_親_と_属性集合_子の直積), 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補). 属性集合である親と子の直積上の(_親と子の直積) :- 属性集合_親(_属性集合_親), 属性集合_子(_属性集合_子), 直積([_属性集合_親,_属性集合_子],_親と子の直積). 属性集合_親(_属性集合_親) :- setof(_親,親(_親),_属性集合_親). 属性集合_子(_属性集合_子) :- setof(_子,子(_子),_属性集合_子). 直積(_集合ならび,_直積集合) :- member項の生成(_集合ならび,_member項,_要素変数ならび), findall(_要素変数ならび,_member項,_直積集合). member項の生成([_集合],member(_要素変数,_集合),[_要素変数]). member項の生成([_集合|R1],(member(_要素変数,_集合),U),[_要素変数|R2]) :- member項の生成(R1,U,R2). 冪集合(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合). 部分集合(_,[]). 部分集合(A,B) :- length(A,C), between(1,C,D), 組合せ(A,D,B) . 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補) :- 冪集合(_属性集合_親_と_属性集合_子の直積,_冪集合), member(_親子テーブル候補,_冪集合). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall('「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数),assertz(成績(_科目,_点数))). '「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める(_合計) :- findall(_点数,成績(_,_点数),_点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_平均) :- '3科目の合計を求める(_合計), _平均 is _合計 / 3. % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall('「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数),assertz(成績(_科目,_点数))). '「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める(_合計) :- findall(_点数,成績(_,_点数),_点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_平均) :- '3科目の合計を求める(_合計), _平均 is _合計 / 3. % 以下のサイトは 着脱(0,Y,Y). 着脱(s(X),Y,s(Z)) :- 着脱(X,Y,Z). 重ね着(X,Y,Z) :- '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'X,YがatomでZのみ変数の場合'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'X,ZがatomでYのみ変数の場合'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'Y,ZがatomでXのみ変数の場合'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'X,Yが変数でZのみatomの場合'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'X,Y,Zすべて変数の場合'(X,Y,Z). 'X,Yが変数でZのみatomの場合'(X,Y,Z) :- 'X,Yが変数でZのみatom'(X,Y,Z), 装い(S3,Z), 着脱(S1,S2,S3), 装い(S1,X), 装い(S2,Y). 'X,Yが変数でZのみatom'(X,Y,Z) :- var(X), var(Y), atom(Z). 'X,YがatomでZのみ変数の場合'(X,Y,Z) :- 'X,YがatomでZのみ変数'(X,Y,Z), 装い(S1,X), 装い(S2,Y), 着脱(S1,S2,S3), 装い(S3,Z). 'X,YがatomでZのみ変数'(X,Y,Z) :- atom(X), atom(Y), var(Z). 'X,ZがatomでYのみ変数の場合'(X,Y,Z) :- 'X,ZがatomでYのみ変数'(X,Y,Z), 装い(S1,X), 装い(S3,Z), 着脱(S1,S2,S3), 装い(S2,Y). 'X,ZがatomでYのみ変数'(X,Y,Z) :- atom(X), atom(Z), var(Y). 'Y,ZがatomでXのみ変数の場合'(X,Y,Z) :- 'Y,ZがatomでXのみ変数'(X,Y,Z), 装い(S2,Y), 装い(S3,Z), 着脱(S1,S2,S3), 装い(S1,X). 'Y,ZがatomでXのみ変数'(X,Y,Z) :- var(X), atom(Y), atom(Z). 'X,Y,Zすべて変数の場合'(X,Y,Z) :- 'X,Y,Zすべて変数'(X,Y,Z), 装い(S1,X), 装い(S2,Y), 装い(S3,Z), 着脱(S1,S2,S3). 'X,Y,Zすべて変数'(X,Y,Z) :- var(X), var(Y), var(Z). 装い(0,グットキラメキ). 装い(s(S),Y) :- 装い(S,Z), 次の(Z,Y). 次の(グットキラメキ,リュウスパーション) :- !. 次の(リュウスパーション,マチカネハチロー) :- !. 次の(マチカネハチロー,コーヨー) :- !. 次の(コーヨー,サルノキング) :- !. 次の(サルノキング,ケンロクオー) :- !. 次の(ケンロクオー,ニューキミノナハ) :- !. 次の(ニューキミノナハ,ロングホーク) :- !. 次の(ロングホーク,カネツセーキ) :- !. 次の(カネツセーキ,オンワードベル) :- !. 次の(オンワードベル,コンチネンタル) :- !. 次の(コンチネンタル,ランリョウオー) :- !. 次の(ランリョウオー,グットキラメキ) :- !. % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差). 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|_等差数列],_公差) :- '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差). 等差数列とは公差確定問題である([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差). 等差数列とは公差確定問題である([A|_等差数列],_公差) :- '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差). '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差) :- 変数である(V), 等差数列(_等差数列,_公差), _等差数列 = [_後続の等差数列の先頭要素|_], V is _後続の等差数列の先頭要素 - _公差. 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は(A,_公差), 後続ならびは順に解決できる([A,B|_等差数列],_公差). 先頭要素と公差が変数でない時は(A,_公差) :- 変数ではない(A), 変数ではない(_公差). 後続ならびは順に解決できる([A,B|_等差数列],_公差) :- B is A + _公差, 等差数列([B|_等差数列],_公差). '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差) :- 公差が変数でAは変数でない時は(A,_公差), 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残り等差数列,_公差), 等差数列部分を確定していく(A,_次の変数でない要素,_変数ならび,_残り等差数列,_公差). 公差が変数でAは変数でない時は(A,_公差) :- 変数である(_公差), 変数ではない(A). 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,A,[],[],_公差) :- '等差数列が全て変数の時は変数は全てAとなり公差は0'(A,_等差数列,_公差),!. 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残りならび,_公差) :- 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび), 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差). 等差数列が全て変数の時は変数は全てAとなり公差は0(A,_等差数列,0) :- 等差数列が全て変数の時は(_等差数列), 変数は全てAとなり(A,_等差数列). 等差数列が全て変数の時は(_等差数列) :- forall(member(V,_等差数列),var(V)). 変数は全てAとなり(_等差数列,A) :- findall(A,member(_,_等差数列),_等差数列). 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび) :- append(_変数ならび,[_次の変数でない要素|_残りならび],_等差数列), 要素は全て変数である(_変数ならび), 変数ではない(_次の変数でない要素). 要素は全て変数である(_変数ならび) :- forall(member(_変数,_変数ならび),変数である(_変数)). 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差) :- length([_|_変数ならび],_分割数), _公差 is (_次の変数でない要素 - A) / _分割数. 等差数列部分を確定していく(A,B,L1,R2,_公差) :- 等差数列([A|L1],_公差), 等差数列([B|R2],_公差). 変数である(_変数) :- var(_変数). 変数ではない(_変数ではない項) :- \+(var(_変数ではない項)). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差),!. 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|R],_公差) :- var(V), 等差数列(R,_公差), R = [B|_], V is B - _公差,!. 等差数列とは公差確定問題である([A,B|R],_公差) :- 変数ではない(A), 変数ではない(_公差), B is A + _公差, 等差数列([B|R],_公差). 等差数列とは公差確定問題である([A|R],_公差) :- var(_公差), 変数ではない(A), append(L1,[B|R2],R), forall(member(V,L1),var(V)), 変数ではない(B), length([_|L1],N), _公差 is (B - A) / N,!, 等差数列([A|L1],_公差), 等差数列([B|R2],_公差),!. 変数ではない(A) :- \+(var(A)). % 以下のサイトは # # 匿名変数リストを使った割り算 # 匿名変数リストを使った割り算(L1,L2,_商,_剰余) :- 匿名変数リストを使った割り算(L1,L2,[],_商,_剰余). 匿名変数リストを使った割り算(_剰余,L2,_商,_商,_剰余) :- \+((append(L2,R,L2_R),_剰余 = L2_R)). 匿名変数リストを使った割り算(L1,L2,L3,_商,_剰余) :- append(L2,R,L2_R), L1 = L2_R, 匿名変数リストを使った割り算(R,L2,[_|L3],_商,_剰余). % 以下のサイトは 整数除算(_実,_法,_商,_剰余) :- 整数(_実), 整数除算(_実,_法,true,_商,_剰余). 整数除算(_実,_法,_商,_剰余) :- 変数(_実), 整数(_法), 法として合同(_法,_実,_商,_剰余). 法として合同(_n,_nを法として合同,_m,_剰余) :- 整数(_n), nth0(_m,_,_), succ(_n_1,_n), between(0,_n_1,_剰余), _nを法として合同 is _m * _n + _剰余. 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実と法'(_実,_法,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実と商と剰余、変数は法'(_実,_法,_制約,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '整数は実、変数は法と商'(_実,_法,_商,_剰余). 整数除算(_実,_法,_制約,_商,_剰余) :- '変数は実'(_実,_法,_制約,_商,_剰余). 法として合同(_n,_nを法として合同,_制約,_m,_剰余) :- 'm乃ち商と剰余を生成'(_n,_m,_剰余), _nを法として合同 is _m * _n + _剰余, (\+(_制約),!,fail;true). 'm乃ち商と剰余を生成'(_n,_m,_剰余) :- 整数(_n), nth0(_m,_,_), succ(_n_1,_n), between(0,_n_1,_剰余). 整数は実と法(_実,_法,_商,_剰余) :- 整数は実と法(_実,_法), _商 is _実 // _法, _剰余 is _実 mod _法. 整数は実と法(_実,_法) :- 整数(_実), 整数(_法). '整数は実と商と剰余、変数は法'(_実,_法,_制約,_商,_剰余) :- '整数は実と商と剰余、変数は法'(_実,_法,_商,_剰余), _法 is (_実 - _剰余) // _商, _剰余 is _実 mod _法, _制約. '整数は実と商と剰余、変数は法'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 整数(_商), 整数(_剰余). '整数は実と商、変数は法と剰余'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 整数(_商), 変数(_剰余), succ(_商_1,_商), between(0,_商_1,_剰余). '整数は実,変数は法と商'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 変数(_商), between(1,_実,_法), 整数除算(_実,_法,_制約,_商,_剰余). '変数は実'(_実,_法,_制約,_商,_剰余) :- 変数(_実), 法として合同(_法,_実,_制約,_商,_剰余). '整数は実、変数は法と商'(_実,_法,_商,_剰余) :- 整数(_実), 変数(_法), 変数(_商), between(1,_実,_法), _商 is _実 // _法, _剰余 is _実 mod _法. 整数(_整数) :- integer(_整数). 変数(_変数) :- var(_変数). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 # 与えられた文字列を三等分にして出力しなさい # きれいに三等分できない場合は四等分にしなさい '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '与えられた文字列を三等分にして出力しなさい。'(_文字列),!. '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- 'きれいに三等分できない場合は四等分にしなさい。'(_文字列). '与えられた文字列を三等分にして出力しなさい。'(_文字列) :- sub_atom(_文字列,N,N,N,S1,S2,S3,_,_,_), writef('%t,%t,%t\n',[S1,S2,S3]). 'きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3), 'さらにS2を二等分して'(S2,S2_1,S2_2), 全体が四等分されたら出力する(S1,S2_1,S2_2,S3). '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3) :- sub_atom(_文字列,N,M,N,S1,S2,S3,_,_,_), M is N * 2. 'さらにS2を二等分して'(S2,S2_1,S2_2) :- sub_atom(S2,N_1,N_1,0,S2_1,S2_2,_,_,_,_). 全体が四等分されたら出力する(S1,S2_1,S2_2,S3) :- writef('%t,%t,%t,%t\n',[S1,S2_1,S2_2,S3]). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3) :- atom(A), 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3), 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL). 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3) :- 'S1を得る'(A,S,S1), 'S2を得る'(A,S,L,S2), 'S3を得る'(A,S,L,R,S3). 'S1を得る'(A,S,S1) :- sub_atom(A,0,S,_,S1). 'S2を得る'(A,S,L,S2) :- sub_atom(A,S,L,_,S2). 'S3を得る'(A,S,L,R,S3) :- N is S + L, sub_atom(A,N,R,0,S3). 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- var(A), 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL), 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R), 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R) :- length(HL,S), length(XL,L), length(TL,R). 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- atomic_list_concat([S1,S2,S3],A), sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL). % 以下のサイトは 変数を含むならびの変数を埋める([],[]) :- !. 変数を含むならびの変数を埋める([_要素|_埋める要素ならび],[_要素|_変数を含むならび]) :- 変数を含むならびの変数を順に埋める(_埋める要素ならび,_変数を含むならび). 変数を含むならびの変数を順に埋める(_埋める要素ならび,[_|_変数を含むならび]) :- 変数を含むならびの変数を順に埋める(_埋める要素ならび,_変数を含むならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/206 # お題:文字列中の数字が一文字以上連続する部分を右ローテイトする。 # 例 # "2014-10-03 00:17:21" -> "21-2014-10 03:00:17" # "1 2 3 4" -> "4 1 2 3" # "a0=0;a1=1;a2=2;a3=3" -> "a3=0;a0=1;a1=2;a2=3" # # '文字列中の数字が一文字以上連続する部分を右ローテイトする。'(_文字列,_数字が一文字以上連続する部分を右ローテイトした文字列) :- atom_chars(_文字列,_文字ならび), '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび), atomic_list_concat(_数字列部分が右ローテイトしたならび,_数字が一文字以上連続する部分を右ローテイトした文字列). '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび) :- '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(_文字ならび,_数字列ならび,_数字列部分が右ローテイトしたならび), 右ローテイトしてから変数部分を埋める(_数字列ならび,_数字列部分が右ローテイトしたならび). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'([],[],[]). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,[_数字列|R2],[_|R3]) :- 先頭からの数字ならびを数字列に変換(L1,_数字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,R2,[_文字列|R3]) :- 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3), 先頭からの数字ならびを数字列に変換(L1,_数字列,R1) :- 先頭からの数字ならびを(L1,_数字ならび,R1), 数字列に変換(_数字ならび,_数字列). 先頭からの数字ならびを(L1,_数字ならび,R1) :- append(_数字ならび,R1,L1), 要素の全てが数字(_数字ならび), 'R1の最初の要素があればそれは数字ではない'(R1). 'R1の最初の要素があればそれは数字ではない'(R1) :- \+((R1 = [_文字|_],member(_文字,['0','1','2','3','4','5','6','7','8','9'])). 要素の全てが数字(_数字ならび) :- forall(member(_数字,_数字ならび),member(_数字,['0','1','2','3','4','5','6','7','8','9'])). 数字列に変換(_数字ならび,_数字列) :- atom_chars(_数字列,_数字ならび). 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1) :- append(_文字ならび,R1,L1), 要素の全てが数字ではない(_文字ならび), 'R1の最初の要素があればそれは数字以外の文字ではない'(R1). 要素の全てが数字ではない(_文字ならび) :- forall(member(_文字,_文字ならび),\+(member(_文字,['0','1','2','3','4','5','6','7','8','9']))). 'R1の最初の要素があればそれは数字以外の文字ではない'(R1) :- \+((R1 = [A|_],\+(member(A,['0','1','2','3','4','5','6','7','8','9'])))). 右ローテイトしてから変数を埋める([],L2) :- !. 右ローテイトしてから変数を埋める(L1,L2) :- 右ローテイトしてから(L1,L3), 変数を埋める(L3,L2). 右ローテイトしてから([A|R],L3) :- append(R,[A],L3). 変数を埋める([],[]) :- !. 変数を埋める([_数字列|R1],[_数字列|R2]) :- 変数を埋める(R1,R2). 変数を埋める(R1,[_文字列|R2]) :- 変数を埋める(R1,R2). % 以下のサイトは 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数),!. 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 標準入力から整数を得る(_催促文言,_検査述語,_整数). 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て(_催促文言,_整数), 検査述語を実行する(_検査述語). 催促文言を表示して標準入力から整数を得て(_催促文言,_整数) :- 催促文言を表示して(_催促文言), 標準入力から整数を得る(_整数). 催促文言を表示して(_催促文言) :- 催促文言の編集(_催促文言,_編集された催促文言), writef('%tを入力してください : ',[_編集された催促文言]). 催促文言の編集(表示しない,'') :- !. 催促文言の編集(_催促文言,_編集された催促文言) :- atom_concat(_催促文言,'を入力して下さい : ',_編集された催促文言). 検査述語を実行する(_検査述語) :- _検査述語. 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- 入力文字列から整数が得られる(_文字列,_整数),!. 整数入力検査(_文字列,_) :- 入力文字列から整数が得られない(_文字列,_). 入力文字列から整数が得られる(_文字列,_整数) :- catch(read_term_from_atom(_文字列,_整数,[valiables(_入力された変数),valiable_names(_入力された変数名)]),E,fail), integer(_整数). 入力文字列から整数が得られない(_文字列,_) :- writef('入力された文字列 %t からは整数が得られません。再入力をお願いします: \n',[_文字列]), fail. 標準入力から文字列を得る(_文字列) :- findall(_文字,( 標準入力から一文字を得る(_文字), (入力終了文字(_文字),!,fail;true)),Chars), atom_chars(_文字列,Chars). 標準入力から一文字を得る(_文字) :- get_char(_文字). 標準入力から一文字を得る(_文字) :- 標準入力から一文字を得る(_文字). 入力終了文字('\n'). 入力終了文字(end_of_file). % 以下のサイトは # 問題文 # (21:13 追記) |A|=|B|=1のケースがテスト中に一つ含まれていましたので、リジャッジを行います。なお、このケースでNOを出力するプログラムに影響はありません。 # # 文字列 A の文字をちょうど 3 回スワップすることにより、文字列 B に変換できるとき、二つの文字列 A, B を、仲良し文字列と呼ぶことにします。 # # スワップとは、文字列に含まれる 2 つの文字を、入れ替えることを指します。 例えば、abcという文字列であれば、aとcを入れ替えて、cbaのように変換することが出来ます。 # # aaのような文字列に対し、 1 文字目のaと、 2 文字目のaを入れ替えることは許されていますが、同じ場所の文字を指定することはできません。 # # 文字列 A, B が与えられるので、仲良し文字列になっているかどうかを判定しなさい。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # A # B # 1 行目には、文字列 A(2≦|A|≦1000) が与えられる。 # 2 行目には、文字列 B(|B|=|A|) が与えられる。 # A, B 共に、小文字アルファベットのみで構成されていることが保障されている。 # 出力 # 与えられた 2 つの文字列が、仲良し文字列であればYES、そうでなければNOを出力せよ。 出力の末尾には改行をいれること。 # # 入力例1 # abcdef # fedcba # 出力例1 # YES # まず、文字列 A のabcdefのaとfをスワップし、fbcdeaとします。 # # 次に、bとeをスワップし、fecdbaとします。 # # 最後に、cとdをスワップし、fedcbaとすると、文字列 B と一致します。 # # よって、この 2 つの文字列は、仲良し文字列となるため、YESと出力します。 # # 入力例2 # abababab # babababa # 出力例2 # NO # 使っている文字数が同じでも、 3 回のスワップでは同じ文字列にできないパターンも存在します。 # # 入力例3 # nt # nt # 出力例3 # NO # スワップの仕方が 1 通りしかなく、 3 回のスワップを繰り返すと、tnになってしまいます。 よって、同じ 2 つの文字列ですが、仲良し文字列ではありません。 # # 入力例4 # pqqq # pqqq # 出力例4 # YES # まず、 1 番目の文字と 2 番目の文字を入れ替え、qpqqとします。 次に、 3 番目の文字と 4 番目の文字を入れ替え、qpqqとします。この際、同じ文字を選んでいますが、場所が違うので問題ありません。 最後に、1番目の文字と、2番目の文字を入れ替え、pqqqとします。 # # 入力例5 # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvxyzw # abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz # 出力例5 # YES # 長い文字列が与えらえれることがあることにも注意してください。 # # 入力例6 # abcdef # ghijkl # 出力例6 # NO '文字列 A(2≦|A|≦100))、B(|B|=|A|) が与えられるので、仲良し文字列になっているかどうかを判定しなさい。' :- '文字列 A(2≦|A|≦100)'(_A), '文字列 B(|B|=|A|)'(_A,_B), 文字列と仲良し文字列(_A,_B). '文字列 A(2≦|A|≦100)'(_A) :- 行入力(_A), '(2≦|A|≦100)'(_A). 行入力(_行) :- read_line_to_codes(_Codes), atom_codes(_行,_Codes). '(2≦|A|≦100)'(_A) :- atom_length(_A,_長さ), between(2,100,_長さ). '文字列 B(|B|=|A|)'(_A,_B) :- 行入力(_B), '(|B|=|A|)'(_A,_B). '(|B|=|A|)'(_A,_B) :- atom_length(_A,_長さ), atom_length(_B,_長さ). 文字列と仲良し文字列(_文字列,_仲良し文字列) :- atom_chars(_文字列,L1), 文字列中の文字の三回スワップ(L1,[],L2), atom_chars(_仲良し文字列,L2). 文字列中の文字の三回スワップ(X,[_,_,_,_,_,_],X). 文字列中の文字の三回スワップ(L1,_履歴,X) :- スワップ(L1,_履歴,_nth0_1,_nth0_2,L2), 文字列中の文字の三回スワップ(L2,[_nth0_1,_nth0_2|_履歴],X). スワップ(L1,_履歴,_何番目_1,_何番目_2,L2) :- 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,A,B), 交換する(L1,_何番目_1,_何番目_2,A,B,L2). 交換する候補を得る(L1,_履歴,_何番目_1,_何番目_2,_交換要素_1,_交換要素_2) :- 'まだ交換していない位置の要素を取り出す'(_何番目_1,L1,_履歴,_交換要素_1), 'まだ交換していない位置の要素を取り出す'(_何番目_2,L1,[_何番目_1|_履歴],_交換要素_2). 'まだ交換していない位置の要素を取り出す'(_何番目,L,_履歴,_交換要素) :- nth1(_何番目,L,_交換要素), \+(member(_何番目,_履歴)). 交換する(L1,_何番目_1,_何番目_2,A,B,L2) :- 'L2を生成する'(L1,L2), '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2), 変数として残った要素を埋める(L1,L2). 'L2を生成する'(L1,L2) :- length(L1,Len), length(L2,Len). '交換する値をL2に埋める'(_何番目_1,_何番目_2,A,B,L2) :- nth1(_何番目_1,L2,B), nth1(_何番目_2,L2,A). 変数として残った要素を埋める([],[]). 変数として残った要素を埋める([A|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2),!. 変数として残った要素を埋める([_|R1],[A|R2]) :- 変数として残った要素を埋める(R1,R2). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。' :- forall(科目の点数を入力する(_科目,_点数),assertz(成績(_科目,_点数))). 科目の点数を入力する(_科目,_点数) :- 科目と催促文を得る(_科目,_催促文), 整数を得る(_催促文,integer(_点数),_点数). 科目と催促文を得る(_科目,_催促文) :- member(_科目,[国語,社会,理科]), swritef(_催促文,'%tの点数=',[_科目]). '3科目の合計を求める。'(_合計) :- findsum(_点数,成績(_,_点数),_合計). '3科目の平均を求める。'(_平均) :- findavg(_点数,成績(_,_点数),_平均). findsum(A,_目標,_合計) :- findall(A,_目標,_解ならび), sum_list(_解ならび,_合計). findavg(A,_目標,_相和平均) :- findall(A,_目標,_解ならび), 相和平均(_解ならび,_相和平均). 相和平均([_標本|R],_相和平均) :- length([_標本|R],_標本数), sum_list([_標本|R],_合計), _相和平均 is _合計 / _標本数. 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは # [1] 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 # その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 # 複数のクラスを定義して作成すること。 # 例 1+2+3‐4+5+6+78+9=100 # ' 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 複数のクラスを定義して作成すること。 例 1+2+3‐4+5+6+78+9=100 '(_式) :- '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式). '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式) :- '数字の間に+や‐といった算術記号を入れて'([_1,_2,_3,_4,_5,_6,_7,_8]), atomic_list_concat([1,_1,2,_2,3,_3,4,_4,5,_5,6,_6,7,_7,8,_8,9],S), read_term_from_atom(S,_式,[]), 100 is _式. '数字の間に+や‐といった算術記号を入れて'([]). '数字の間に+や‐といった算術記号を入れて'([A|R]) :- member(A,[+,-,'']), '数字の間に+や‐といった算術記号を入れて'(R). % 以下のサイトは # [1] 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 # その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 # 複数のクラスを定義して作成すること。 # 例 1+2+3‐4+5+6+78+9=100 # ' 小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解くプログラムを作成しなさい。プログラムはint型の変数を用い、 複数のクラスを定義して作成すること。 例 1+2+3‐4+5+6+78+9=100 '(_式) :- '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式). '小町算(1から9まで順序よく並んでいる数字の間に+や‐といった算術記号を入れて式をつくり、 その答えが100になるものを見つける)を解く'(_式) :- L = [+,-,''], member(_1,L), member(_2,L), member(_3,L), member(_4,L), member(_5,L), member(_6,L), member(_7,L), member(_8,L), atomic_list_concat([1,_1,2,_2,3,_3,4,_4,5,_5,6,_6,7,_7,8,_8,9],S), read_term_from_atom(S,_式,[]), 100 is _式. % 以下のサイトは # # append/4からappend/nまでを一気に定義してしまう、 'append/4から/nの定義'/1 。 # append/nの定義、 'append/nの定義'/1 。 # 'append/4からappend/nの定義'(_n) :- between(4,_n,M), 'abolish_append/n'(M), 'append/nの定義'(M), _n = M. 'append/nの定義'(_n) :- 'L2からLnまで'(_n,_L2_Ln), 'L2からLn_1まで'(_n,_L2_Ln_1), 'L1からLnまで'(_n,_L1_Ln), 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln). 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln) :- 'append/nの第一節の定義'(_n,_L2_Ln), 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln). 'append/nの第一節の定義'(_n,_L2_Ln) :- format(atom(S1),'append([],~w) :-~n append(~p).~n',[_L2_Ln,_L2_Ln]), read_term_from_atom(S1,Clause_1,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_1). 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln) :- format(atom(S2),'append([U|L1],~w,[U|L~p]) :-~n append(~w).\n',[_L2_Ln_1,_n,_L1_Ln]), read_term_from_atom(S2,Clause_2,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_2). 'L2からLnまで'(_n,_L2_Ln) :- findall(A,( between(2,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln). 'L2からLn_1まで'(_n,_L2_Ln_1) :- _m is _n - 1, findall(A,( between(2,_m,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln_1). 'L1からLnまで'(_n,_L1_Ln) :- findall(A,( between(1,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L1_Ln). 'abolish_append/n'(_n) :- abolish(append,_n). % 以下のサイトは subsumes(_項1,_項2) :- '_項_2が_項_1を包含する'(_項1,_項2). '_項_2が_項_1を包含する'(_項_1,_項_2) :- '_項_1と_項_2が共に変数の場合は_項_1と_項_2の単一化を試みる'(_項_1,_項_2). '_項_2が_項_1を包含する'(_項_1,_項_2) :- '_項_1が変数、_項_2が変数でない場合は_項_1と_項_2の単一化を試みる'(_項_1,_項_2). '_項_2が_項_1を包含する'(_項_1,_項_2) :- '_項_1が変数でなくて、_項_2が変数の場合は偽となる'(_項_1,_項_2). '_項_2が_項_1を包含する'(_項_1,_項_2) :- '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2). '_項_1と_項_2が共に変数の場合は_項_1と_項_2の単一化を試みる'(_項_1,_項_2) :- var(_項_1), var(_項_2), _項_1 = _項_2. '_項_1が変数、_項_2が変数でない場合は_項_1と_項_2の単一化を試みる'(_項_1,_項_2) :- var(_項_1), \+(var(_項_2)), _項_1 = _項_2. '_項_1が変数でなくて、_項_2が変数の場合は偽となる'(_項_1,_項_2) :- \+(var(_項_1)), var(_項_2). '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2) :- '_項_1と_項_2が共に変数でない'(_項_1,_項_2), functor(_項_1,_関数,_引数の数), functor(_項_2,_関数,_引数の数), '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2,0,_引数の数). '_項_1と_項_2が共に変数でない'(_項_1,_項_2) :- \+(var(_項_1)), \+(var(_項_2)). '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_,_,N,N) :- !. '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2,N,_引数の数) :- N_2 is N + 1, arg(N_2,_項_1,_引数_1), arg(N_2,_項_2,_引数_2), '_項_2が_項_1を包含する'(_引数_1,_引数_2), '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2,N_2,_引数の数). % 以下のサイトは subsumes(_項1,_項2) :- '_項_2が_項_1を包含する'(_項1,_項2). '_項_2が_項_1を包含する'(_項_1,_項_2) :- '_項_1と_項_2が共に変数の場合は'(_項_1,_項_2),!,_項_1 = _項_2. '_項_2が_項_1を包含する'(_項_1,_項_2) :- '_項_1が変数、_項_2が変数でない場合は'(_項_1,_項_2),!,_項_1 = _項_2. '_項_2が_項_1を包含する'(_項_1,_項_2) :- '_項_1が変数でなくて、_項_2が変数の場合は'(_項_1,_項_2),!,偽となる. '_項_2が_項_1を包含する'(_項_1,_項_2) :- '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2). '_項_1と_項_2が共に変数の場合は'(_項_1,_項_2) :- var(_項_1), var(_項_2). '_項_1が変数、_項_2が変数でない場合は'(_項_1,_項_2) :- var(_項_1), \+(var(_項_2)). '_項_1が変数でなくて、_項_2が変数の場合は'(_項_1,_項_2) :- \+(var(_項_1)), var(_項_2). 偽となる :- fail. '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2) :- '_項_1と_項_2が共に変数でない'(_項_1,_項_2), functor(_項_1,_関数,_引数の数), functor(_項_2,_関数,_引数の数), '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2,0,_引数の数). '_項_1と_項_2が共に変数でない'(_項_1,_項_2) :- \+(var(_項_1)), \+(var(_項_2)). '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_,_,N,N) :- !. '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2,N,_引数の数) :- N_2 is N + 1, arg(N_2,_項_1,_引数_1), arg(N_2,_項_2,_引数_2), '_項_2が_項_1を包含する'(_引数_1,_引数_2), '_項_1と_項_2が共に変数でない場合は全引数の包含関係が真ならば真となる'(_項_1,_項_2,N_2,_引数の数). % 以下のサイトは ground(_項) :- 項の構造内に変数を含まない(_項). 項の構造内に変数を含まない(_項) :- \+(var(_項)), functor(_項,_,_引数の数), 全ての引数の構造内に変数を含まない(_項,0,_引数の数). 全ての引数の構造内に変数を含まない(_,N,N) :- !. 全ての引数の構造内に変数を含まない(_項,N,_引数の数) :- N_2 is N + 1, arg(N_2,_項,_引数), 項の構造内に変数を含まない(_引数), 全ての引数の構造内に変数を含まない(_項,N_2,_引数の数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ground(_項) :- 項の構造内に変数を含まない(_項). 項の構造内に変数を含まない(_項) :- var(_項),!,fail. 項の構造内に変数を含まない(_項) :- _項 =.. [_|_引数ならび], 全ての引数の項に変数を含まない(_引数ならび). 全ての引数の項に変数を含まない([]). 全ての引数の項に変数を含まない([_項|R]) :- 項の構造内に変数を含まない(_項), 全ての引数の項に変数を含まない(R). % 以下のサイトは 色(赤). 色(青). 色(緑). 色(黄). 区画(a). 区画(b). 区画(c). 区画(d). 隣接(a,b). 隣接(b,d). 隣接(a,c). 隣接(c,d). 塗り絵(_区画の定義順に対応した区画色変数ならび) :- 色組合せならび(_色組合せならび), 区画変数組合せ(_区画の定義順に対応した区画色変数ならび,_区画変数組合せならび), 色合わせ(_色組合せならび,_区画変数組合せならび). 色組合せならび(_色組合せならび) :- findall(_色,色(_色),_色ならび), findall([_色_1,_色_2],( 色を双方向に順列で取る(_色_1,_色_2)), _色組合せならび). 色を順列で双方向に取る(_色_1,_色_2) :- 順列(_色ならび,2,[A,B]), 双方向に取る(A,B,_色_1,_色_2). 双方向に取る(A,B,A,B). 双方向に取る(A,B,B,A). 色合わせ(L1,L2) :- select([A,B],L2,R2), member([A,B],L1), 色合わせ(L1,R2). 区画変数組合せ(_区画変数ならび,_区画変数組合せならび) :- 区画名ならびと区画変数ならびを得る(_区画名ならび,_区画変数ならび), findall([_区画変数_1,_区画変数_2],( 順列(_区画名ならび,2,[_区画名_1,_区画名_2]), 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2)), _区画変数組合せならび). 区画名ならびと区画変数ならびを得る(_区画名ならび,_区画変数ならび) :- findall(_区画名,区画(_区画名),_区画名ならび), length(_区画名ならび,_要素数), length(_区画変数ならび,_要素数),!. 区画変数に変換(_区画変数ならび,_区画名_1,_区画名_2,_区画変数_1,_区画変数_2) :- nth1(_nth1,_区画名ならび,_区画名_1), nth1(_nth2,_区画名ならび,_区画名_2), nth1(_nth1,_区画変数ならび,_区画変数_1_1), nth1(_nth2,_区画変数ならび,_区画変数_2_1), 双方向にに変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1,_区画変数_2). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1_1,_区画変数_2_1). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_2_1,_区画変数_1_1). % 以下のサイトは 色(赤). 色(青). 色(緑). 色(黄). 区画(a). 区画(b). 区画(c). 区画(d). 隣接(a,b). 隣接(b,d). 隣接(a,c). 隣接(c,d). 区画変数([_1,_2,_3,_4]). 塗り絵(_区画変数ならび) :- 色組合せならび(_色組合せならび), 区画変数組合せ(_区画変数組合せ), 色合わせ(_色組合せならび,_区画変数組合せ). 色組合せならび(_色組合せならび) :- findall(_色,色(_色),_色ならび), findall([_色_1,_色_2],( 色を双方向に順列で取る(_色_1,_色_2)), _色組合せならび). 色を順列で双方向に取る(_色_1,_色_2) :- 順列(_色ならび,2,[A,B]), 双方向に取る(A,B,_色_1,_色_2). 双方向に取る(A,B,A,B). 双方向に取る(A,B,B,A). 色合わせ(_,[]). 色合わせ(L1,L2) :- select([A,B],L2,R2), member([A,B],L1), 色合わせ(L1,R2). 区画変数組合せ(_区画変数ならび,_区画変数組合せならび) :- findall(_区画名,区画(_区画名),_区画名ならび), findall([_区画変数_1,_区画変数_2],( 順列(_区画名ならび,2,[_区画名_1,_区画名_2]), 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2)), _区画変数組合せならび). 区画変数に変換(_区画名_1,_区画名_2,_区画変数_1,_区画変数_2) :- nth1(_nth1,_区画名ならび,_区画名_1), nth1(_nth2,_区画名ならび,_区画名_2), nth1(_nth1,_区画変数ならび,_区画変数_1_1), nth1(_nth2,_区画変数ならび,_区画変数_2_1), 双方向にに変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1,_区画変数_2). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_1_1,_区画変数_2_1). 双方向に変換(_区画変数_1_1,_区画変数_2_1,_区画変数_2_1,_区画変数_1_1). % 以下のサイトは 覆面算(kadokawa+dwango+kada=kandouii,N1+N2+N3=N4,_文字と数字の対応) :- 覆面(kadokawa+dwango+kada=kandouii,L0_1,L0_2,L0_3,L1,L2,L3,L4), 覆面算(L0_3,L0_2), 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4), 文字と数字の対応(L0_1,L0_2,_文字と数字の対応). 覆面(A_1+A_2+A_3=A_4,L0_1,L0_2,L0_3,L1,L2,L3,L4) :- 文字出現順の決定([A_1,A_2,A_3,A_4],L0_1), findall(N,between(1,9,_),L0_2), L0_3 = ['1','2','3','4','5','6','7','8','9','0'], 覆面文字と変数の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4). 文字出現順の決定(L,L0_1) :- atomic_list_concat(L,A), atom_chars(A,Chars), 唯一の文字ならびを得る(Chars,L0_1). 要素に重複のない文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 数式の対応付け(L0_1,L0_2,A_1,A_2,A_3,A_4,L1,L2,L3,L4) :- 数式の対応付け(L0_1,L0_2,A_1,L1), 数式の対応付け(L0_1,L0_2,A_2,L2), 数式の対応付け(L0_1,L0_2,A_3,L3), 数式の対応付け(L0_1,L0_2,A_4,L4). 覆面文字と変数の対応付け(L0_1,L0_2,_覆面文字列,_変数ならび) :- atom_chars(_覆面文字列,_覆面文字ならび), findall(V,( nth1(_nth1,_覆面文字ならび,_文字), nth1(_nth1,L0_1,_文字), nth1(_nth1,L0_2,V)), _変数ならび). 覆面算計算(L1,L2,L3,L4,N1,N2,N3,N4) :- number_chars(N1,L1), number_chars(N2,L2), number_chars(N3,L3), number_chars(N4,L4), N1 + N2 + N3 =:= N4. 覆面算(_,[]). 覆面算(L,[A|R2]) :- select(A,L,R), 覆面算(R,R2). 文字と数字の対応(L0_1,L0_2,_文字と数字の対応) :- findall(A=B,( nth1(_nth1,L0_1,A), nth1(_nth1,L0_2,B)), _文字と数字の対応). 唯一の文字ならびを得る([],[]). 唯一の文字ならびを得る([A|R1],[A|R2]) :- \+(member(A,R1)), 唯一の文字ならびを得る(R1,R2). 唯一の文字ならびを得る([A|R1],R2) :- member(A,R1), 唯一の文字ならびを得る(R1,R2). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1392388003/31 # [1] プログラミング言語 入門 # [2] 変数を入力して、入力された値と以下の条件を満たした値を表示する # # 1 : 6の倍数なら2で割った値 # 2 : 3の倍数なら二乗した値 # 3: 2の倍数なら2で割った値 # 4: 上記以外の倍数は、二乗した値から元の値を引いた値 # ☆ 複数の条件が合致した場合は大きい倍数の条件のみとする # ☆ 自作で関数を1つは作成する # # なにとぞよろしくお願いします。 # # '変数を入力して、入力された値と以下の条件を満たした値を表示する 1 : 6の倍数なら2で割った値 2 : 3の倍数なら二乗した値 3: 2の倍数なら2で割った値 4: 上記以外の倍数は、二乗した値から元の値を引いた値 ☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(_入力された値) :- findall([_倍数,_条件を満たした値候補],'変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,_倍数,_条件を満たした値候補),LL), '☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(LL,_条件を満した値), 表示する(_入力された値,_条件を満たした値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,6,_6の倍数なら2で割った値) :- '1 : 6の倍数なら2で割った値'(_入力された値,_6の倍数なら2で割った値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,3,_3の倍数なら二乗した値) :- 2 : 3の倍数なら二乗した値'(_入力された値,_3の倍数なら二乗した値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,2,_2の倍数なら2で割った値) :- '3: 2の倍数なら2で割った値'(_入力された値,_2の倍数なら2で割った値). '変数を入力して、入力された値と以下の条件を満たした値を'(_入力された値,_倍数,_二乗した値から元の値を引いた値) :- '4: 上記以外の倍数は、二乗した値から元の値を引いた値'(_入力された値,_倍数,_二乗した値から元の値を引いた値). '1 : 6の倍数なら2で割った値'(_入力された値,_2で割った値) :- '6の倍数なら'(_入力された値), '2で割った値'(_入力された値,_2で割った値). '6の倍数なら'(_入力された値) :- 0 is _入力された値 mod 6. '2で割った値'(_入力された値,_2で割った値) :- _2で割った値 is _入力された値 // 2. '2 : 3の倍数なら二乗した値'(_入力された値,_二乗した値) :- '3の倍数なら'(_入力された値), 二乗した値(_入力された値,_二乗した値). '3の倍数なら'(_入力された値) :- 0 is _入力された値 mod 3. 二乗した値(_入力された値,_二乗した値) :- _二乗した値 is _入力された値 ^ 2. '3: 2の倍数なら2で割った値'(_入力された値,_2で割った値) :- '2の倍数なら'(_入力された値), '2で割った数'(_入力された値,_2で割った値). '2の倍数なら'(_入力された値) :- 0 is _入力された値 mod 2. '2で割った値'(_入力された値,_2で割った値) :- _2で割った値 is _入力された値 // 2. '4: 上記以外の倍数は、二乗した値から元の値を引いた値'(_入力された値,_倍数,_二乗した値から元の値を引いた値) :- '上記以外の倍数は、'(_入力された値,_倍数), 二乗した値から元の値を引いた値(_入力された値,_二乗した値から元の値を引いた値). '上記以外の倍数は、'(_入力された値,_倍数) :- between(1,_入力された値,_倍数), \+(0 is _倍数 mod 6), \+(0 is _倍数 mod 3), \+(0 is _倍数 mod 2), 0 is _入力された値 mod _倍数. 二乗した値から元の値を引いた値'(_入力された値,_二乗した値から元の値を引いた値) :- _二乗した値から元の値を引いた値 is _入力された値 ^ 2 - _入力された値. '☆ 複数の条件が合致した場合は大きい倍数の条件のみとする'(LL,_条件を満たした値) :- 最大値(LL,[_最も大きい倍数,_条件を満たした値]). 表示する(_入力された値,_条件を満たした値) :- writef('入力された値=%t,条件を満たした値=%t\n',[_入力された値,_条件を満たした値]). 最大値([A|R],_最大値) :- 最大値([A|R],A,_最大値),!. 最大値([],_最大値,_最大値). 最大値([A|R],B,_最大値) :- A @> B, 最大値(R,A,_最大値). 最大値([A|R],B,_最大値) :- A @=< B, 最大値(R,B,_最大値). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/775 # お題:文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。 # 半径は文字間隔が離れすぎず近すぎない程度になるよう適当に選ぶ。 # # '文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。'(_文字列) :- atom_chars(_文字列,_文字ならび), 文字盤を用意する(_文字ならび,_文字盤), 文字盤に円形に文字を書き込む(_文字ならび,_文字盤), 文字を表示する(_文字盤). 文字盤を用意する(_文字ならび,_文字盤) :- length(_文字ならび,_文字数), '_文字数+1の文字盤を作る'(_文字数,_文字盤). '_文字数+1の文字盤を作る'(_文字数,_文字盤) :- _文字数_1 is _文字数 + 1, length(_文字盤,_文字数_1), findall(L,( length(L,_文字数_1)), _文字盤). 円形に文字を書き込む(_文字ならび,_文字盤) :- length(_文字ならび,_文字ならびの要素数), _半径 is _文字ならびの要素数 // 2, 点に文字を書き込む(0,_文字ならび,_文字ならびの要素数,_半径,_文字盤). 点に文字を書き込む(_,[],_,_,_文字盤) :- !. 点に文字を書き込む(_n,[_文字|R],_分割数,_半径,_文字盤) :- '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y), '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤), _n_2 is _n + 1, 点に文字を書き込む(_n_2,R,_分割数,_半径,_文字盤). '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y) :- _x is truncate(sin((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5), _y is truncate(cos((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5). '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤) :- nth1(_y,_文字盤,L), nth1(_x,L,_文字),!. 文字を表示する([]) :- !. 文字を表示する([L|R]) :- forall(member(A,L),変数は空白に埋めて文字を出力する(A)), write('\n'), 文字を表示する(R). 変数は空白に埋めて文字を出力する(A) :- var(A), write(' '),!. 変数は空白に埋めて文字を出力する(A) :- write(A). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712 # 以前どこかで見かけた問題だけど # 「デジタル式の時計をアナログ式に変換する」 # 入出力サンプル # http://ime.nu/codepad.org/XcWCtEF5 # 目盛りをo、短針をX、長針をxで表す # 重なったときはXで表す # ただし短針は最も近い目盛りを指すようにする # # # X # o o # # o o # # o o # # o o # # o o # o # # (0時0分) # 時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11, [[' ',' ',' ',' ',' ',' ',' ',' ',' ',_0,' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',_11,' ',' ',' ',' ',' ',' ',' ',' ',' ',_1,' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',_10,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_2,' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [_9,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_3], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',_8,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_4,' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',_7,' ',' ',' ',' ',' ',' ',' ',' ',' ',_5,' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',_6,' ',' ',' ',' ',' ',' ',' ',' ',' ']]). 'デジタル式の時計をアナログ式に変換する。 目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :- 時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_時計板), '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11), 時計板の表示(_時計板). '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11) :- '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]), '長針はxで表す。 重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]), 変数として残っている所にoを埋める([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]),!. '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分 < 30, nth0(_時,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X'). '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分 >= 30, _時_2 is (_時 + 1) mod 12, nth0(_時_2,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X'). '長針はxで表す。 重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分_1 is truncate((_分 / 12) + 0.5), 分を埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). 分をxで埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- nth0(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'x'),!. 分をxで埋める(_,_). 変数として残っている所にoを埋める([]). 変数として残っている所にoを埋める([o|R]) :- 変数として残っている所にoを埋める(R),!. 変数として残っている所にoを埋める([_|R]) :- 変数として残っている所にoを埋める(R). 時計板の表示(_時計板) :- forall(member(_行,_時計板),行を表示する(_行)). 行を表示する(_行) :- atomic_list_concat(_行,_表示行), writef('%t\n',[表示行]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712 # 以前どこかで見かけた問題だけど # 「デジタル式の時計をアナログ式に変換する」 # 入出力サンプル # http://ime.nu/codepad.org/XcWCtEF5 # 目盛りをo、短針をX、長針をxで表す # 重なったときはXで表す # ただし短針は最も近い目盛りを指すようにする # # # X # o o # # o o # # o o # # o o # # o o # o # # (0時0分) # 時計板([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11], [[' ',_0,' '], [' ',_11,' ',_1,' '], [' '], [' ',_10,' ',_2,' '], [' '], [_9,' ',_3], [' '], [' ',_8,' ',_4,' '], [' '], [' ',_7,' ',_5,' '], [' ',_6,' ']]). 'デジタル式の時計をアナログ式に変換する。 目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :- 時計板(_0から_11までの変数ならび,_時計板), '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび), 時計板の表示(_時計板). '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび), '長針はxで表す。 重なったときはXで表す。'(_分,_0から_11までの変数ならび), 変数として残っている所にoを埋める(_0から_11までの変数ならび). '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,_0から_11までの変数ならび),!. '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '30分から59分までは短針は次の時に移動する'(_時,_分,_0から_11までの変数ならび). '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,_0から_11までの変数ならび) :- _分 < 30, nth0(_時,_0から_11までの変数ならび,'X'). '30分から59分までは短針は次の時に移動する'(_時,_分,_0から_11までの変数ならび) :- _分 >= 30, _時_2 is (_時 + 1) mod 12, nth0(_時_2,_0から_11までの変数ならび,'X'). '長針はxで表す。 重なったときはXで表す。'(_分,_0から_11までの変数ならび) :- _分_1 is truncate((_分 / 12) + 0.5), 分を埋める(_分_1,_0から_11までの変数ならび). 分をxで埋める(_分_1,_0から_11までの変数ならび) :- nth0(_分_1,_0から_11までの変数ならび,'x'),!. 分をxで埋める(_,_). 変数として残っている所にoを埋める([]). 変数として残っている所にoを埋める([o|R]) :- 変数として残っている所にoを埋める(R),!. 変数として残っている所にoを埋める([_|R]) :- 変数として残っている所にoを埋める(R). 時計板の表示(_時計板) :- forall(member(_行,_時計板),行を表示する(_行)). 行を表示する(_行) :- atomic_list_concat(_行,_表示行), writef('%t\n',[表示行]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/667 # Cゲンガーの逆襲! # スレにコントリビュートするために問題作ったよ!! # 64ビット変数の基数62のハッシュを作ってみよう。 # あぁ、別に64ビットじゃなくてもいいや。とにかく基数62のハッシュを作ってみよう。 # これを知っていると、例えばURLの字数短縮したりとかまぁチョイチョイ使い道がある。 # 数学苦手だからこの程度しかできなくてごめんね。 # ちなみに62なのは、数字と、アルファベットの大文字小文字を全部足すと62になるから。 # 64のほうがキリがいいよね。 '64ビット変数の基数62のハッシュを作ってみよう。'(_64ビット整数) :- atom_chars('0123456789abcdefghijkomnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',_変換符号ならび), 基数62のハッシュを作る(_64ビット整数,_変換符号ならび,[],_ハッシュ値), writef('%t -> %t\n',[_64ビット整数,_ハッシュ値]),!. 基数62のハッシュを作る(0,_,L,_ハッシュ値) :- atomic_list_concat(L,_ハッシュ値),!. 基数62のハッシュを作る(_実,_変換符号ならび,L,_ハッシュ値) :- 基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号), 基数62のハッシュを作る(_商,_変換符号ならび,[_変換された符号|L],_ハッシュ値). 基数62のハッシュ符号化(_実,_変換符号ならび,_商,_変換された符号) :- _剰余 is _実 mod 62, _商 is _実 // 62, nth0(_剰余,_変換符号ならび,_変換された符号). % 以下のサイトは # お題: 任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 # 期待した自然数になる式を全て列挙するコードを作成しなさい。 # ただし、式中の乗除算は加減算より先に計算するものとする。 # また数の並びは変更出来ず、括弧は使わないものとする。 # # 例: 1 5 3 6 : 10 # # 1 * 5 / 3 * 6 # 1 + 5 * 3 - 6 # # 1 5 3 6 7 : 10 # -> # 1 + 5 + 3 - 6 + 7 '任意の数の自然数を与えた時、それらの自然数を四則演算した結果が、 期待した自然数になる式を全て列挙するコードを作成しなさい。 ただし、式中の乗除算は加減算より先に計算するものとする。 また数の並びは変更出来ず、括弧は使わないものとする。'(_自然数ならび,_期待した自然数,_式) :- findall(X,( append(_,[_自然数|R],_自然数ならび), 自然数と変数を交互に(_自然数,R,X)), _自然数の間に変数が挿入されたならび), 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび), 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式). 自然数と変数を交互に(_自然数,[],_自然数) :- !. 自然数と変数を交互に(_自然数,_,_自然数). 自然数と変数を交互に(_自然数,_,_). 変数に演算子を当て嵌める(_自然数の間に変数が挿入されたならび) :- 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび), 変数に演算子を当て嵌める(_変数ならび). 変数のみ取り出して(_自然数の間に変数が挿入されたならび,_変数ならび) :- findall(_変数,( member(_変数,_自然数の間に変数が挿入されたならび), var(_変数)), _変数ならび). 変数に演算子を当て嵌める([]). 変数に演算子を当て嵌める([_変数|R]) :- member(_演算子,[+,-,*,//]), 変数に演算子を当て嵌める(R). 式を計算する(_自然数の間に変数が挿入されたならび,_期待した自然数,_式) :- 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列), 文字列から式を生成する(_式文字列,_式), _期待した自然数 is _式,!. 一旦文字列に変換して(_自然数の間に変数が挿入されたならび,_式文字列) :- atomic_list_concat(_自然数の間に変数が挿入されたならび,_式文字列). 文字列から式を生成する(_式文字列,_式) :- read_term_from_atom(_式文字列,_式,[]). % 以下のサイトは 加算の覆面演算行列([S,E,N,D,M,O,R,E,M,O,N,E,Y],[[0,S,E,N,D],[0,M,O,R,E],[M,O,N,E,Y]]). 加算の覆面算(_覆面ならび) :- 覆面に数字を当てはめる(_覆面ならび,[1,2,3,4,5,6,7,8,9,0]), 転置した覆面演算を反転したもの(_覆面ならび,LL), 加算(0,LL). 加算(_,[]). 加算(O,[L|R]) :- append(L0,[S],L2), list_sum(L0,S0), S is S0 mod 10, S2 is S0 // 10, 加算(S2,R). 覆面に数字を当てはめる([],_). 覆面に数字を当てはめる([_変数|R1],_数字ならび) :- 変数の場合は数字ならびから一つ数字を選択する(_変数,R1,_数字ならび). 覆面に数字を当てはめる([A|R1],_数字ならび) :- 既に定数の場合は読み飛ばす(A,R1,_数字ならび). 変数の場合は数字ならびから一つ数字を選択する(_変数,R1,_数字ならび,_残り数字ならび) :- var(_変数), select(_変数,_数字ならび,_残り数字ならび), 覆面に数字を当てはめる(R1,_残り数字ならび). 既に定数の場合は読み飛ばす(A,R1,_数字ならび) :- \+(var(A)), 覆面に数字を当てはめる(R1,_数字ならび). 転置した覆面演算を反転したもの(_覆面ならび,LL) :- 加算の覆面演算行列(_覆面ならび,LL1), 転置(LL1,LL2), reverse(LL2,LL). % 以下のサイトは 'SEND + MORE = MONEY'(S,E,N,D,M,O,R,E,M,O,N,E,Y) :- 覆面に数字を当てはめる([S,E,N,D,M,O,R,Y],[1,2,3,4,5,6,7,8,9,0]), 演算は整合する(S,E,N,D,M,O,R,Y). 演算は整合する(S,E,N,D,M,O,R,Y) :- 繰り上がり足し算(D,E,0,_繰り上がり_1,Y), 繰り上がり足し算(N,R,_繰り上がり_1,_繰り上がり_2,E), 繰り上がり足し算(E,O,_繰り上がり_2,_繰り上がり_3,N), 繰り上がり足し算(S,M,_繰り上がり_3,M,O). 覆面に数字を当てはめる([],_). 覆面に数字を当てはめる([V|R1],_数字ならび) :- 'Vが変数の場合は新たな数字を整数の場合はそれを利用'(V,_数字ならび,_残り数字ならび), 覆面に数字を当てはめる(R1,_残り数字ならび). 'Vが変数の場合は新たな数字を整数の場合はそれを利用'(V,_数字ならび,_数字ならび) :- 'Vが整数の場合はそれを利用'(V). 'Vが変数の場合は新たな数字を整数の場合はそれを利用'(V,_数字ならび,_残り数字ならび) :- 'Vが変数の場合は新たな数字を'(V,_数字ならび,_残り数字ならび). 'Vが整数の場合はそれを利用'(V) :- integer(V). 'Vが変数の場合は新たな数字を'(V,_数字ならび,_残り数字ならび) :- var(V), select(V,_数字ならび,_残り数字ならび). 繰り上がり足し算(A,B,C,E,F) :- D is A + B + C, E is D // 10, F is D mod 10. % 以下のサイトは # # SWI-Prolog用 sub_atom/5 の遅延評価版述語 副文字列/5 # # 第一引数の_文字列が変数であってもすぐにはエラーとならない # 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列),!. 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- freeze(_文字列,sub_atom(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列)). '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ), 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ). '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ) :- '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ), 共に0である(_選択開始位置0起源,_残り長さ). '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ) :- integer(_選択開始位置0起源), integer(_残り長さ). 共に0である(0,0). 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ) :- var(_文字列), _文字列 = _副文字列, freeze(_文字列,atom_length(_文字列,_選択長さ)). % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(_,[],[],[]) :- !. 先頭からN個(0,L,[],L) :- !. 先頭からN個(N,[A|R1],[A|R2],R) :- M is N - 1, 先頭からN個(M,R1,R2,R). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2),!. 変数だけ値を詰める([],_). 変数だけ値を詰める([V|R],V) :- 変数だけ値を詰める(R,V),!. 変数だけ値を詰める([_|R],V) :- 変数だけ値を詰める(R,V). 変数だけ要素位置番号を詰める([],_). 変数だけ要素位置番号を詰める([N|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2),!. 変数だけ要素位置番号を詰める([_|R],N) :- N_2 is N + 1, 変数だけ要素位置番号を詰める(R,N_2). % 以下のサイトは # # 【東電問題】汚染水を保存するためのタンクを毎日1個作るとします。 # タンクは10日後には必ず壊れ作り直すとします。 # タンク作製作業量はどのように変移するでしょうか? # なお、汚染水の移動作業、タンク点検作業などは考える必要はありません。 :- dynamic(タンク/3). '【東電問題】汚染水を保存するためのタンクを毎日1個作るとします。 タンクは10日後には必ず壊れ作り直すとします。 タンク作製作業量はどのように変移するでしょうか? なお、汚染水の移動作業、タンク点検作業などは考える必要はありません。'(_何日目,_作業量) :- 'タンク作製作業量はどのように変移するでしょうか?'(_何日目,_作業量). 'タンク作製作業量はどのように変移するでしょうか?'(_何日目,_作業量) :- タンク作製作業量はどのように変移([_],_何日目,_作業量). タンク作製作業量はどのように変移(_日の変数ならび,_何日目,_作業量) :- length(_日の変数ならび,_何日目), '汚染水を保存するためのタンクを毎日1個作るとします。', findall(_,'タンクは10日後には必ず壊れ作り直すとします。',_作り直した個数の変数ならび), length([_|_作り直した個数の変数ならび],_作業量). タンク作製作業量はどのように変移(_日の変数ならび,_何日目,_作業量) :- 一日経ちました(_日の変数ならび,_何日目,_作業量). 一日経ちました(_,_,_) :- retract(タンク(_状態,_経た日数,_内容)), assertz(タンク(_状態,[_|_経た日数],_内容)), fail. 一日経ちました(_日の変数ならび,_何日目,_作業量) :- タンク作製作業量はどのように変移([_|_日の変数ならび],_何日目,_作業量). '汚染水を保存するためのタンクを毎日1個作るとします。' :- assertz(タンク(使えます,[],_汚染水)). 'タンクは10日後には必ず壊れ作り直すとします。' :- 'タンクは10日後には必ず壊れ', '作り直すとします。'. 'タンクは10日後には必ず壊れ' :- retract(タンク(使えます,[_,_,_,_,_,_,_,_,_,_],_汚染水)), assertz(タンク(壊れました,[_,_,_,_,_,_,_,_,_,_],_汚染水)). '作り直すとします。' :- assertz(タンク(使えます,[],[])). % 以下のサイトは # # 直積 # 直積(_集合ならび,_直積集合) :- member項の生成(_集合ならび,_member項,_要素変数ならび), findall(_要素変数ならび,_member項,_直積集合). member項の生成([_集合],member(_要素変数,_集合),[_要素変数]). member項の生成([_集合|R1],(member(_要素変数,_集合),U),[_要素変数|R2]) :- member項の生成(R1,U,R2). % 以下のサイトは # # (p) http://cp1.nintendo.co.jp/2012 任天堂サイトの問題ですが # # $ python SimpleBarsTest.py # test_loop (__main__.testSimpleBars) ... ok # test_simple_rule (__main__.testSimpleBars) ... ok # # ---------------------------------------------------------------------- # Ran 2 tests in 0.000s # # OK # # テストコードまでOKなんですが、 # answerを出したのですが違っているようなんです。 # この問題を解いた方がいましたら少し教えてもらえませんでしょうか。 'iTピラミッド' :- 'iTピラミッド'(1,12,[i,'T']), 'iTピラミッド'(12,1,['T',i]). 'iTピラミッド'(1,6,[i,'T']). 'iTピラミッド'(_開始段数,_段数,_記号並び順) :- for(_開始段数,N,_段数), ピラミッドの段を生成(N,_記号並び順,L), 最初の3文字分を末尾に移動して段文字列とする(L,_段文字列), writef('%t\n',[_段文字列]), N = _段数. ピラミッドの段を生成(N,_記号並び順,L) :- 段の記号部分を生成(_記号並び順,L2), length(L,25), append(L1,L2,L1,L), all(L1,' '). 段の記号部分を生成(_記号並び順,L2) :- _length is (N - 1) * 2 + 1, length(L2,_length), '記号並び順に変数を埋める'(_記号並び順,L2). '記号並び順に変数を埋める'(_,[]). '記号並び順に変数を埋める'([A|R1],[A|R2]) :- append(R1,[A],L1), '記号並び順に変数を埋める'(L1,R2). 最初の3文字分を末尾に移動して段文字列とする([_1,_2,_3|R],_段文字列) :- append(R,[_1,_2,_3],_求める記号ならび), atomic_list_concat(_求める記号ならび,_段文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([],_). all([V|R],V) :- all(R,V). for(S,N,E) :- for_2(S,N,E). for(S,N,E) :- for_1(S,N,E). for_1(S,_,E) :- S < E,!,fail. for_1(S,N,E) :- N is S. for_1(S,N,E) :- S1 is S - 1, for_1(S1,N,E). for_2(S,_,E) :- S > E,!,fail. for_2(S,N,E) :- N is S. for_2(S,N,E) :- S1 is S + 1, for_2(S1,N,E). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/772 # # 今朝急に友人から依頼されたのですが、javaしか経験したことがなく、C++なんて今まで触れたことすらないのでどなたかお助け下さい。 # 一応ウィンドウ画面については作れたのですが・・・。 # # [1] 授業単元: 課題 # [2] 問題文: # 1:数値a,b を入力し,a+b,a−b,a*b,a/b を計算するプログラムを作成して # ください。 #   注:数値は小数点以下を含むものとし,変数の型宣言をDouble としてください。 # # :- op(450,xfy,'+'). :- op(450,xfy,'−'). :- op(450,xfy,'*'). :- op(450,xfy,'/'). '数値a,b を入力し,a+b,a−b,a*b,a/b を計算するプログラムを作成してください。 注:数値は小数点以下を含むものとし,変数の型宣言をDouble としてください。' :- '数値a,b を入力し'(_数値a,_数値b), 'a+b,a−b,a*b,a/b を計算する'(_数値a,_数値b). '数値a,b を入力し'(_数値a,_数値b) :- 数を入力する(数値a,_数値a), 数を入力する(数値b,_数値b). 'a+b,a−b,a*b,a/b を計算する'(_数値a,_数値b) :- 'a+b,a−b,a*b,a/bの計算式を得る'(_数値a,_数値b,R,_式文字列), 計算して表示する(_式文字列,_数値a,_数値b), R = []. 'a+b,a−b,a*b,a/bの計算式を得る'(_数値a,_数値b,R,_式文字列) :- split('a+b,a−b,a*b,a/b',[,],L), append(_,[_式文字列|R],L). 計算して表示する(_式文字列,_数値a,_数値b) :- atom_to_term(_式文字列,_式,_), 計算する(_式,_数値a,_数値b,_計算結果), 表示する(_式文字列,_計算結果). 計算する(_ + _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a + _数値b. 計算する(_ − _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a - _数値b. 計算する(_ * _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a * _数値b. 計算する(_ / _,_数値a,_数値b,_計算結果) :- _計算結果 is _数値a / _数値b. 表示する(_式文字列,_計算結果) :- writef('%t = %t\n',[_式文字列,_計算結果]). % 以下のサイトは 項の中に変数を含まない(_項) :- '項が変数の時は偽、atomicの時は真である'(_項),!. 項の中に変数を含まない(_項) :- '項が複合項の時は全ての引数について「項の中に変数を含まない」ことを検査する'(_項). '項が変数の時は偽、atomicの時は真である'(_項) :- '項が変数の時は偽、'(_項). '項が変数の時は偽、atomicの時は真である'(_項) :- '項がatomicの時は真である'(_項). '項が変数の時は偽、'(_項) :- var(_項),!, fail. '項がatomicの時は真である'(_項) :- atomic(_項). '項が複合項の時は全ての引数について「項の中に変数を含まない」ことを検査する'(_項) :- forall(項が複合項の時は全ての引数について(_項,_引数),項の中に変数を含まない(_引数)). 項が複合項の時は全ての引数について(_項,_引数) :- functor(_項,_関数名,_引数の数), between(1,_引数の数,_n番目), arg(_n番目,_項,_引数). % 以下のサイトは 項の中に変数を含まない(_項) :- var(_項),!,fail. 項の中に変数を含まない(_項) :- atom(_項),!. 項の中に変数を含まない(_項) :- forall((functor(_項,_関数名,_引数の数), between(1,_引数の数,_n番目), arg(_n番目,_項,_引数)), 項の中に変数を含まない(_引数)). % 以下のサイトは # # @ft4613_ac # if(n段上れる)step_1(N-n,S) みたいな再帰がかけない # 階段を上がる(_n段上がる,_階段,_既に登った階段,_現在の段,_残りの階段) :- length(_駆け上がり段数ならび,_n段上がる), length(_階段,_階段の段数), length([_最初の段|_残り段数の変数ならび],_階段の段数), 階段を上がる(_駆け上がり段数ならび,_残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段). 階段を上がる(_,_残りの階段,_階段,_既に登った段,_現在の段,_残りの階段) :- append(_既に登った階段,[_現在の段|_残りの階段],_階段). 階段を上がる(_駆け上がり段数ならび,_残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段) :- append(_駆け上がり段数ならび,_駆け上がった後の残り段数の変数ならび,_残り段数の変数ならび), 階段を上がる(_駆け上がり段数ならび,_駆け上がった後の残り段数の変数ならび,_階段,_既に登った階段,_現在の段,_残りの階段). % % ?- 階段を上がる(3,[0,1,2,3,4,5,6,7],_既に登った階段,_現在の段,_残りの階段). % % _既に登った階段 = [], % _現在の段 = 0, % _残りの階段 = [1,2,3,4,5,6,7]; % _既に登った階段 = [0,1,2], % _現在の段 = 3, % _残りの階段 = [4,5,6,7]; % _既に登った階段 = [0,1,2,3,4,5], % _現在の段 = 6, % _残りの階段 = [7]; % no. % ?- % % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(_行,( '10行ある', '10要素の行のすべての要素に1を代入'(_行)),LL). '10行ある' :- between(1,10,_). '10要素の行のすべての要素に1を代入'(_行) :- '10要素の行の'(_行), すべての要素に1を代入(_行). '10要素の行の'(_行) :- length(_行,10). すべての要素に1を代入([]). すべての要素に1を代入([1|R]) :- すべての要素に1を代入(R). 'その内容を表示しなさい。'(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- forall(行を表示文字列に変換する(LL,_表示文字列),writef('%w\n',[_表示文字列])). 行を表示文字列に変換する(LL,_表示文字列) :- member(_行,LL), atomic_list_concat(_行,' ',_表示文字列). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), 対角要素だけ1を代入しほかは全て0を代入(_n,L)),LL). 対角要素だけ1を代入しほかは全て0を代入(_n,L) :- 対角要素だけ1を代入し(_n,L), 他の全ての変数要素は0に(L). 対角要素だけ1を代入し(_n,L) :- length(L,10), reverse(L,RL), 対角要素だけ1を代入し(_n,RL,L). 対角要素だけ1を代入し(_n,RL,L) :- nth1(_n,L,1), nth1(_n,RL,1). 他の全ての変数要素は0に(L) :- findall(N,( member(N,L), 変数要素は0に(N)),L). 変数要素は0に(0) :- !. 変数要素は0に(N). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- findall(_ランダムでユニークな文字,~( ランダムでユニークな文字(_n,_ランダムでユニークな文字)), _ランダムでユニークなn文字数の文字リスト). atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークな文字(_n,_ランダムでユニークな文字) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークな文字_1(Ln,_選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_1([_|Ln],_選択可能文字リスト,_ランダムでユニークな文字) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_文字_1,_選択文字を抜き取った選択可能文字リスト), ランダムでユニークな文字_2([_|Ln],_文字_1,_選択文字を抜き取った選択可能文字リスト,_ランダムでユニークな文字). ランダムでユニークな文字_2([_|Ln],_文字,_,_文字). ランダムでユニークな文字_2([_|Ln],_,_選択文字を抜き取った選択可能文字リスト,_文字) :- ランダムでユニークな文字(Ln,_選択文字を抜き取った選択可能文字リスト,_文字). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 選択可能文字リスト( ['0','1','2','3','4','5','6','7','8','9', 'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_ランダムでユニークなn文字数の文字列) :- length(Ln,_n), 選択可能文字リスト(_選択可能文字リスト), ランダムでユニークなn要素の文字リストを作る(Ln,_選択可能文字リスト,_ランダムでユニークなn文字数の文字リスト), atom_chars(_ランダムでユニークなn文字数の文字列,_ランダムでユニークなn文字数の文字リスト). ランダムでユニークなn要素の文字リストを作る([],_,[]). ランダムでユニークなn要素の文字リストを作る([_|Ln],_選択可能文字リスト,[_選択値|R]) :- リストからランダムに値を抜き取る(_選択可能文字リスト,_選択値,_選択値を抜き取った選択可能文字リスト), ランダムでユニークなn要素の文字リストを作る(Ln,_選択値を抜き取った選択可能文字リスト,R). リストからランダムに値を抜き取る(_リスト,_値,_値を抜き取ったリスト) :- 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト), リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト). 乱数値をリストの抜き取り位置とする(_リスト,_乱数値,_乱数値を要素数とした変数リスト) :- length(_リスト,_要素数), _乱数値 is random(_要素数), length(_乱数値を要素数とした変数リスト,_乱数値). リストから値を抜き取る(_リスト,_乱数値を要素数とした変数リスト,_値,_値を抜き取ったリスト) :- append(_乱数値を要素数とした変数リスト,[_値|_残りリスト],_リスト), append(_乱数値を要素数とした変数リスト,_残りリスト,_値を抜き取ったリスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1358572977/ # # (問3) 与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) が、 # これを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ、その結果を出力する # (プログラム3) を作成した。たとえば、 (プログラム3) を実行して変数 N に 202 を入力すると、 # 202 は 3 進数表示が 21111 であるから「一致しない」と出力される。また、変数 N に 203 を # 入力すると、 203 は 3 進数表示が 21112 であるから「一致する」と出力される。 '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) が、 これを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ、その結果を出力する'(N) :- '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) がこれを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ'(_Nの3進数表示,_結果), 結果を出力する(_結果). '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) がこれを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ'(N,一致する) :- '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) がこれを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ'(N,[],L,L),!. '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) がこれを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ'(_,一致しない). '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) がこれを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ'(0,L,L,[]) :- !. '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) がこれを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ'(N,L1,L,[M|R3]) :- M is N mod 3, N_1 is N // 3, '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) がこれを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ'(N_1,[M|L1],R3). 結果を出力する(_結果) :- writef('%t\n',[_結果]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1358572977/ # # (問3) 与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) が、 # これを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ、その結果を出力する # (プログラム3) を作成した。たとえば、 (プログラム3) を実行して変数 N に 202 を入力すると、 # 202 は 3 進数表示が 21111 であるから「一致しない」と出力される。また、変数 N に 203 を # 入力すると、 203 は 3 進数表示が 21112 であるから「一致する」と出力される。 '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) が、 これを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ、その結果を出力する'(N) :- '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) が'(N,[],_Nの3進数表示), 'これを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と一致するかどうかを調べ'(_Nの3進数表示,_結果), 結果を出力する(_結果). '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) が'(0,L,L) :- !. '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) が'(N,L1,L) :- M is N mod 3, N_1 is N // 3, '与えられた自然数 N の 3 進数表示 a(p-1)a(p-2)...a(2)a(1)a(0) が'(N_1,[M|L1],L). 'これを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と'(L,一致する) :- reverse(L,L),!. 'これを逆に並べた数字の列 a(0)a(1)a(2)...a(p-2)a(p-1) と'(L,一致しない) :- \+(reverse(L,L)). 結果を表示する(_結果) :- writef('%t\n',[_結果]). % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1357748713/477 # [1] 授業単元:c++ # [2] 問題文(含コード&リンク):不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 # 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。また、該当者が居ない場合はその旨を表示するようにしてください。 # [3] 環境 #  [3.1] OS: windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C++ # [4] 期限: 2013/2/1 # [5] その他の制限: 入出力の方法、変数、四則演算、分岐、繰り返し、関数、文字の出入力、文字列、構造体、ファイル処理の範囲内でお願い致します。 '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力してデータファイル内の情報を検索するプログラムを作成してください。 検索の結果として、該当者が居る場合画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示するようにしてください。' :- '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点), '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(_検索結果,_ローマ字名,_漢字名,_番号,_得点). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_検索結果,_入力されたローマ字名,_漢字名,_番号,_得点) :- ローマ字名を入力して(_入力されたローマ字名), '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,_検索結果,_漢字名,_番号,_得点). ローマ字名を入力して(_ローマ字名) :- write('検索するローマ字名を入力してください : '), get_line(_ローマ字名). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_入力されたローマ字名,該当者が居る,_漢字名,_番号,_得点) :- get_split_lines('seiseki.txt',[' ',','],LL), member([_入力されたローマ字名,_漢字名,_番号,_得点],LL). '不特定多数名分のローマ字名、漢字名、番号、得点が記入されたデータファイル(seiseki.txt)から、 ローマ字名を入力して、データファイル内の情報を検索する'(_,該当者が居ない,_,_,_). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居る,_ローマ字名,_漢字名,_番号,_得点) :- '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点), 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点). '検索の結果として、該当者が居る場合、画面にその情報(ローマ字名、漢字名、番号、得点)を表示し、 なおかつその情報が記載された新しいファイル(kekka.txt)が生成されるようにしてください。 また、該当者が居ない場合はその旨を表示する'(該当者が居ない,_,_,_,_) :- write('該当者はいません\n'). '画面にその情報(ローマ字名、漢字名、番号、得点)を表示し'(_ローマ字名,_漢字名,_番号,_得点) :- writef('%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]). 'なおかつその情報が記載された新しいファイル(kekka.txt)が生成される'(_ローマ字名,_漢字名,_番号,_得点) :- '新しいファイル(kekka.txt)が生成される'(Outstream), writef(Outstream,'%t %t %t %t\n',[_ローマ字名,_漢字名,_番号,_得点]), close(Outstream). '新しいファイル(kekka.txt)が生成される'(Outstream) :- open('kekka.txt',write,Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/74 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&amp;リンク): # http://ime.nu/ideone.com/V4h6ti # #include # #include # # int main(){ # char filename[FILENAME_MAX]; # char buffer; # FILE*fp; # # strcpy(filename,"/dev/stdin"); # if((fp = fopen(filename,"r")) == NULL){ # printf("ファイル%sが見つかりません。\n",filename); # return(-1); # } # # while((buffer = fgetc(fp))!=EOF){ # printf("%c",buffer); # } # fclose(fp); # } # # 1. 上記のプログラムをfgetsを使ったプログラムに書きかえなさい. # fgets の書式はfgets(結果を格納する変数(配列変数なのでポインタ), 読み込むバイト数, ファイルポインタ)である. # # 2. 上記のプログラムをファイル名を「コマンドラインの引数」で指定するプログラムに変更しなさい. # # 上記のプログラムに相当するPrologプログラム(_ファイル名) :- ファイルを開きstreamを確保する(_ファイル名,_Instream), ファイルを表示する(Instream), 'stream解放しファイルを閉じる'(Instream). ファイルを開きstreamを確保する(_ファイル名,_Instream) :- catch(open(_ファイル名,read,Instream),_,'ファイルが見つかりません。'(_ファイル名)). ファイルを表示する(Instream) :- at_end_stream(Instream),!. ファイルを表示する(Instream) :- get_char(Instream,Char), write(Char), ファイルを表示する(Instream). 'stream解放しファイルを閉じる'(Instream) :- close(Instream). 'ファイルが見つかりません。'(_ファイル名) :- write('ファイル%tが見つかりません。\n',[_ファイル名]), fail. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'strcpy(filename,"/dev/stdin"); if((fp = fopen(filename,"r")) == NULL){ printf("ファイル%sが見つかりません。\n",filename); return(-1); }'(_fp) :- ファイルを開きstreamを確保する('/dev/stdin',_fp). 'while((buffer = fgetc(fp))!=EOF){ printf("%c",buffer);'(_fp) :- ファイルを表示する(_fp). 'fclose(fp);'(_fp) :- 'stream解放しファイルを閉じる'(_fp). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/79 # # [1] 授業単元: システム開発 # [2] 問題文(含コード&amp;リンク): # 以下のヒントを元に、生徒の成績を管理するプログラムを作りなさい # http://ime.nu/codepad.org/vevYc04f # http://ime.nu/codepad.org/rCOCOccX # # /* seiseki.c 成績処理システム */ # #include /* 標準入出力 */ # #include /* 標準ライブラリー */ # #include /* 数学的関数 */ # #include /* 文字列関数 */ # #define SEN "--------------------\n" /* マクロ定義 */ # #define KEISEN "=====================\n" # # /* サブルーチンの宣言 */ # void data_write(void); /* データの書き込み */ # void data_read(void); /* データの読み込み */ # void data_disp(void); /* 成績一覧表の表示 */ # void data_kensk(void); /* 検索処理 */ # void the_end(void); /* プログラムの終了処理 */ # # /* 変数, 構造体の宣言 */ # struct seiseki{ # char simei[20]; /* 氏名 */ # int bango, kokugo, eigo, suugaku; /* 番号, 国語, 英語, 数学 */ # }; # struct seiseki a[100]; /* 登録数は100名まで */ # int n, i, goukei; /* 変数の定義 */ # double heikin, std; # # main() # { # int k; /* switch-case用の処理番号 */ # do{ /* 繰り返し処理do-while */ # /* 初期メニュー画面 */ # printf("\n"); # printf("☆☆ 成績処理メニュー ☆☆\n"); # printf(SEN); # printf("データの書き込み・・・・・・・・・【1】\n"); # printf("データの読み込み・・・・・・・・・【2】\n"); # printf("成績一覧表・・・・・・・・・・・・【3】\n"); # printf("検索処理・・・・・・・・・・・・・【4】\n"); # printf("終わり・・・・・・・・・・・・・・【9】\n"); # printf(SEN); # printf("処理番号を入力してください:"); # scanf("%d",&k); # printf("\n"); # # /* 関数の呼び出し */ # switch(k){ # case 1:data_write();break; # case 2:data_read();break; # case 3:data_disp();break; # case 4:data_kensk();break; # case 9:the_end();break; # default:printf("該当番号なし\n");break; # } # }while(k < 10); # } # # /* 成績一覧表の作成 */ # void data_disp(void) # { # int goukei_k=0, goukei_e=0, goukei_s=0; # double heikin_k=0.0, heikin_e=0.0, heikin_s=0.0; # double std_k=0.0, std_e=0.0, std_s=0.0; # # printf("☆☆☆ 成績一覧表 ☆☆☆\n"); # printf(KEISEN); # printf("番号 名前 国語 英語 数学 合計 平均\n"); # for(i=0;i < n;i++){ # printf("%5d %-10s %5d %5d %5d", a[i].bango, a[i].simei, a[i].kokugo, a[i].eigo, a[i].suugaku); # /* 3科目の合計計算 */ # goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); # printf("%5d",goukei); # /* キャスト:3科目の平均計算 */ # heikin=(double)goukei/3; # printf("%6.1f\n",heikin); # } # printf("\n"); # # /* 各科目の合計計算 */ # for(i=0;i < n;i++){ # goukei_k+=a[i].kokugo; # goukei_e+=a[i].eigo; # goukei_s+=a[i].suugaku; # } # # /* 各科目の平均計算 */ # heikin_k=(double)goukei_k/n; # heikin_e=(double)goukei_e/n; # heikin_s=(double)goukei_s/n; # # /* 偏差の二乗和の計算 */ # for(i=0;i < n;i++){ # std_k+=pow((a[i].kokugo-heikin_k),2); # std_e+=pow((a[i].eigo-heikin_e),2); # std_s+=pow((a[i].suugaku-heikin_s),2); # } # # /* 標準偏差の計算 */ # std_k=sqrt(std_k/n); # std_e=sqrt(std_e/n); # std_s=sqrt(std_s/n); '繰り返し処理do-while'(P) :- 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P). 初期メニュー画面(_k) :- '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k). 関数の呼び出し(_k) :- '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k). '3科目の合計計算'(_i,_a,_goukei) :- '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei). 'キャスト:3科目の平均計算'(_goukei,_heikin) :- '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin). 各科目の合計計算(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の平均計算((_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s). 偏差の二乗和の計算(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 標準偏差の計算(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'do{ /* 繰り返し処理do-while */ }while(k < 10);'(P) :- between(1,10,N), call(P), N = 10. '/* 初期メニュー画面 */ printf("\n"); printf("☆☆ 成績処理メニュー ☆☆\n"); printf(SEN); printf("データの書き込み・・・・・・・・・【1】\n"); printf("データの読み込み・・・・・・・・・【2】\n"); printf("成績一覧表・・・・・・・・・・・・【3】\n"); printf("検索処理・・・・・・・・・・・・・【4】\n"); printf("終わり・・・・・・・・・・・・・・【9】\n"); printf(SEN); printf("処理番号を入力してください:"); scanf("%d",&k); printf("\n");'(_k) :- write('\n'), writef('☆☆ 成績処理メニュー ☆☆\n'), write('%t',['--------------------\n']), write('データの書き込み・・・・・・・・・【1】\n'), write('データの読み込み・・・・・・・・・【2】\n'), write('成績一覧表・・・・・・・・・・・・【3】\n'), write('検索処理・・・・・・・・・・・・・【4】\n'), write('終わり・・・・・・・・・・・・・・【9】\n'), write('--------------------\n'), write('処理番号を入力してください:'), 整数を得る(_k), write('\n'). '/* 関数の呼び出し */ switch(k){ case 1:data_write();break; case 2:data_read();break; case 3:data_disp();break; case 4:data_kensk();break; case 9:the_end();break; default:printf("該当番号なし\n");break; }'(_k) :- '_kの値によって述語を呼び出す'(_k). '_kの値によって述語を呼び出す'(1) :- data_write. '_kの値によって述語を呼び出す'(2) :- data_read. '_kの値によって述語を呼び出す'(3) :- data_disp. '_kの値によって述語を呼び出す'(4) :- data_kensk. '_kの値によって述語を呼び出す'(9) :- the_end. '/* 3科目の合計計算 */ goukei=(a[i].kokugo +a[i].eigo +a[i].suugaku); printf("%5d",goukei);'(_i,_a,_goukei) :- nth0(_i,_a,[_kokugo,_eigo,_suugaku]), _goukei is _kokugo + _eigo + _suugaku, writef('%t',[_goukei]). '/* キャスト:3科目の平均計算 */ heikin=(double)goukei/3; printf("%6.1f\n",heikin);'(_goukei,_heikin) :- _heikin is _goukei / 3, format('~1f\n',[_heikin]). '/* 各科目の合計計算 */ for(i=0;i < n;i++){ goukei_k+=a[i].kokugo; goukei_e+=a[i].eigo; goukei_s+=a[i].suugaku; }'(_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- 各科目の合計計算(0,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k_1,_goukei_e_1,_goukei_s_1,_goukie_k,_goukei_e,_goukei_s) :- _n_1 < _n, nth1(_nth1,_a,[_kokugo,_eigo,_suugaku]), _goukei_k_2 is _goukei_k_1 + _kokugo, _goukei_e_2 is _goukei_e_1 + _eigo, _goukei_s_2 is _goukei_s_1 + _suugaku, _n_2 is _n_1 + 1, 各科目の合計計算(_n_2,_n,_a,_goukie_k_2,_goukei_e_2,_goukei_s_2,_goukie_k,_goukei_e,_goukei_s). 各科目の合計計算(_n_1,_n,_a,_goukie_k,_goukei_e,_goukei_s,_goukie_k,_goukei_e,_goukei_s) :- _n_1 >= _n. '/* 各科目の平均計算 */ heikin_k=(double)goukei_k/n; heikin_e=(double)goukei_e/n; heikin_s=(double)goukei_s/n;'(_n,_goukei_k,_gouke_e,_goukei_s,_heikin_k_1,_heikin_e_1,_heikin_s_1,_heikin_k,_heikin_e,_heikin_s) :- _heikin_k is _heikin_k_1 + _goukei_k / _n, _heikin_e is _heikin_e_1 + _goukei_e / _n, _heikin_s is _heikin_s_1 + _goukei_s / _n. '/* 偏差の二乗和の計算 */ for(i=0;i < n;i++){ std_k+=pow((a[i].kokugo-heikin_k),2); std_e+=pow((a[i].eigo-heikin_e),2); std_s+=pow((a[i].suugaku-heikin_s),2); }'(_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- 偏差の二乗和の計算(0,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _i_1 < _n, 偏差の二乗を加える(_i_1,_n,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2), _i_2 is _i_1 + 1, 偏差の二乗和の計算(_i_2,_n,_a,_std_k_2,_std_e_2,_std_s_2,_std_k,_std_e,_std_s). 偏差の二乗和の計算(_i_1,_n,_a,_std_k,_std_e,_std_s,_std_k,_std_e,_std_s) :- _i_1 >= _n. 偏差の二乗を加える(_i_1,_a,_std_k_1,_std_e_1,std_s_1,_std_k_2,_std_e_2,std_s_2) :- nth1(_i_1,_a,[_kokugo_heikin_k,_eigo_heikin_e,_suugaku_heikin_s]), _std_k_2 is _std_k_1 + _kokugo_heikin_k ^ 2, _std_e_2 is _std_e_1 + _eigo_heikin_e ^ 2, _std_s_2 is _std_s_1 + _suugaku_heikin_s ^ 2. '/* 標準偏差の計算 */ std_k=sqrt(std_k/n); std_e=sqrt(std_e/n); std_s=sqrt(std_s/n);'(_n,_std_k_1,_std_e_1,_std_s_1,_std_k,_std_e,_std_s) :- _std_k is sqrt(_std_k_1) / _n, _std_e is sqrt(_std_e_1) / _n, _std_s is sqrt(_std_s_1) / _n. % 以下のサイトは # # 単位節から選択された引数リストの組合せ # # 単位節から選択された引数リストの順列 # 単位節組合せ(_単位節項,_射影項ならび,_条件,_組合せ数,X) :- 単位節からならびへの射影(_単位節項,_射影項ならび,_条件,LL), 組合せ(LL,_組合せ数,X). 単位節順列(_単位節項,_射影項ならび,_条件,_組合せ数,X) :- 単位節からならびへの射影(_単位節項,_射影項ならび,_条件,LL), 順列(LL,_組合せ数,X). 単位節からならびへの射影(_単位節項,_射影項ならび,_条件,LL) :- list(_射影項ならび), _単位節項=..[_|_引数ならび], findall(_射影項ならび,( call((_単位節項,_条件))), LL). 単位節からならびへの射影(_単位節項,_射影項,_条件,LL) :- \+(list(_射影項)), _単位節項=..[_|_引数ならび], findall(_射影項,( call((_単位節項,_条件))), LL). % % 単位節組合せ/4と単位節順列/4は高階述語である。 % 高階述語を使用する場合、引数変数の扱いに注意する必要がある。 % % 射影項ならび、乃ちリストである場合はその要素は必ず単位節項の引数に含まれる必要がある。 % リストでなく単体で射影項が指定された場合も同様である。 % 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R3]) :- N > 1, M is N - 1, 組合せ(R1,M,R3). 組合せ([_|R1],N,L) :- N > 1, 組合せ(R1,N,L). 順列(Y,0,_,[]). 順列(Y,N,EL,[A|X]) :- \+(member(A,EL)), del(Z = Y - A), M is N - 1, 順列(Z,M,EL,X) . 順列(Y,N,EL,[_|X]) :- member(A,EL), 順列(Z,M,EL,X). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- N > 0, del(A,Y,Z), M is N - 1, 順列(Z,M,X). del(A,[A|X],X). del(A,[B|X],[B|Y]) :- del(A,X,Y). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/54 # # [1] プログラミング実習 # [2] 課題14-1 http://ime.nu/www.dotup.org/uploda/www.dotup.org3832133.jpg # 課題 14-2 http://ime.nu/www.dotup.org/uploda/www.dotup.org3832135.jpg #  14-2の画像はreturn 0; } も追加です #   参考課題 http://ime.nu/www.dotup.org/uploda/www.dotup.org3832147.jpg #          http://ime.nu/www.dotup.org/uploda/www.dotup.org3832150.jpg #          http://ime.nu/www.dotup.org/uploda/www.dotup.org3832153.jpg #          http://ime.nu/www.dotup.org/uploda/www.dotup.org3832159.jpg #   レベル3問題 http://ime.nu/www.dotup.org/uploda/www.dotup.org3832161.jpg #  [3.1] OS Windows #  [3.2] リナックスのイーマックスです #  [3.3] 言語 C # [4] 1/17 # [5] その他の制限:問題文の指示に従って解いてください 青いバックの結果が実行結果 # なのでそれになるようお願いします。すべて上からとった写真なので実行結果だけが # 違う写真にあることもあります。 # # よろしくお願いします # # お願いします # # 課題 14-1 # main関数においてキーボードから入力した2つの数を それぞれ変数a,bに格納(代入、記憶)し、 # その値をユーザ関数sisokuに渡して、和、差、積、商を計算し、その結果をmain関数に戻して表示するプログラムを作成せよ。 # ただし、和、差、積、商の計算結果を格納する変数にはグローバル変数を使用すること。 # このプログラムの動作例を下記に示す。 # 変数aの値を入力 # 5.0 # 変数bの値を入力 # 2.0 # a=5.000000, b=2.000000 # 和:7.000000, 差:3.000000, 積:10.000000, 商:2.500000 # # (注) 上記の表示のうち、最初の「5.0」「2.0」の値はキーボードから入力される。 :- dynamic(数/2). 数(a,_). 数(b,_). 数(和,_). 数(差,_). 数(積,_). 数(商,_). 'main関数においてキーボードから入力した2つの数を それぞれ変数a,bに格納(代入、記憶)し、 その値をユーザ関数sisokuに渡して、和、差、積、商を計算し、その結果をmain関数に戻して表示するプログラムを作成せよ。 ただし、和、差、積、商の計算結果を格納する変数にはグローバル変数を使用すること。' :- 'main関数においてキーボードから入力した2つの数を それぞれ変数a,bに格納(代入、記憶)し', 'その値をユーザ関数sisokuに渡して、和、差、積、商を計算し、'(a,b,和,差,積,商), 表示する(a,b,和,差,積,商). 'main関数においてキーボードから入力した2つの数を それぞれ変数a,bに格納(代入、記憶)し' :- キーボードから入力した2つの数を(_a,_b), retract(数(a,_)), asserta(数(a,_a)), retract(数(b,_)), assertz(数(b,_b)). キーボードから入力した2つの数を(_a,_b) :- 数を得る(変数aの値,true,_a), 数を得る(変数bの値,true,_b),!. 'その値をユーザ関数sisokuに渡して、和、差、積、商を計算し、その結果をmain関数に戻して'(_ラベル_a,_ラベル_b,_ラベル_和,_ラベル_差,_ラベル_積,_ラベル_商) :- 和(_ラベル_a,_ラベル_b,_ラベル_和), 差(_ラベル_a,_ラベル_b,_ラベル_差), 積(_ラベル_a,_ラベル_b,_ラベル_積), 商(_ラベル_a,_ラベル_b,_ラベル_商). 和(_ラベル_a,_ラベル_b,_ラベル_和) :- 数(_ラベル_a,_a), 数(_ラベル_b,_b), _和 is _a + _b, retract(数(_ラベル_和,_)), asserta(数(_ラベル_和,_和)). 差(_ラベル_a,_ラベル_b,_ラベル_差) :- 数(_ラベル_a,_a), 数(_ラベル_b,_b), _差 is _a - _b, retract(数(_ラベル_差,_)), asserta(数(_ラベル_差,_差)). 積(_ラベル_a,_ラベル_b,_ラベル_積) :- 数(_ラベル_a,_a), 数(_ラベル_b,_b), _積 is _a * _b, retract(数(_ラベル_積,_)), asserta(数(_ラベル_積,_積)). 商(_ラベル_a,_ラベル_b,_ラベル_積) :- 数(_ラベル_a,_a), 数(_ラベル_b,_b), _商 is _a / _b, retract(数(_ラベル_商,_)), asserta(数(_ラベル_商,_商)). 表示する(_ラベル_和,_ラベル_差,_ラベル_積,_ラベル_商) :- findall(_数,( member(_ラベル,[_ラベル_和,_ラベル_差,_ラベル_積,_ラベル_商]), 数(_ラベル,_数)), [_和,_差,_積,_商]), writef('%t,:%t, %t:%t, %t:%t, %t:%t\n',[_ラベル_和,_和,_ラベル_差,_差,_ラベル_積,_積,_ラベル商,_商]). % % 副作用に徹した述語定義の例 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/48 # # [1] 授業単元:関数ポインタ # [2] 問題文(含コード&amp;リンク):http://codepad.org/O3eDo7F3 # # 以下のプログラムは2つの整数を入力させ,各種処理を選び, # 計算した結果をファイルへ出力するものであるが,作成途中である. # 下記に従い,プログラムを完成させよ. # ・各処理を行う場合は関数ポインタ引数とするをprocess()用いる. # ・加算:tasu(),除算(商):waru(),除算(剰余):amari(), #  最大公約数:yakusu(),最小公倍数:baisu()を用いる. # ・除算は商と剰余を求める. # ・最大公約数は2つの整数で共通の約数のうち最大のもの, #  最小公倍数は2つの整数で共通の倍数のうち最小のものである. # ・結果は「14 ÷ 5 = 2 余り 4」や「6 と 4 の最小公倍数は 12」のように #  計算式等も含めkekka.txtへ出力する. # # #include< stdio.h > # #include< stdlib.h > # # int process(ここを書く); # int tasu(ここを書く); # int waru(ここを書く); # int amari(ここを書く); # int yakusu(ここを書く); # int baisu(ここを書く); # # int main() # { # FILE *fp; //結果を出力するファイルのファイルポインタ # # int a, b; // 入力する2つ整数 # int op; // 選択された処理を示す変数 # int result1, result2; // 演算結果を格納する変数 # # fp = fopen("kekka.txt","w"); // ファイルを開く # if(fp == NULL) # { # printf("ファイルオープンエラー \n"); # exit(1); # } # # printf("1つめの整数を入力してください:"); # scanf("%d", &a); # printf("2つめの整数を入力してください:"); # scanf("%d", &b); # printf("1:加算,2:除算,3:最大公約数,4:最小公倍数\n"); # do { # printf("演算の番号を入力してください:"); # scanf("%d", &op); # } while(op<1 || op>4); # # ここを書く # # fclose(fp); // ファイルを閉じる # return 0; # } # # int process(ここを書く) # { # ここを書く # } # # int tasu(ここを書く) # { # ここを書く # } # # int waru(ここを書く) # { # ここを書く # } # # int amari(ここを書く) # { # ここを書く # } # # int yakusu(ここを書く) # { # ここを書く # } # # int baisu(ここを書く) # { # ここを書く # } '2つの整数を入力させ,各種処理を選び, 計算した結果をファイルへ出力するものである. 下記に従い,プログラムを完成させよ. ・各処理を行う場合は関数ポインタ引数とするをprocess()用いる ・加算:tasu(),除算(商):waru(),除算(剰余):amari()  最大公約数:yakusu(),最小公倍数:baisu()を用いる. ・除算は商と剰余を求める. ・最大公約数は2つの整数で共通の約数のうち最大のもの,  最小公倍数は2つの整数で共通の倍数のうち最小のものである. ・結果は「14 ÷ 5 = 2 余り 4」や「6 と 4 の最小公倍数は 12」のように  計算式等も含めkekka.txtへ出力する.' :- open('kekka.txt',write,Outstream), 二つの整数と演算番号を得る(_一つ目の整数,_二つ目の整数), 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号), \+(between(1,4,_演算番号)), close(Outstream). 二つの整数と演算番号を得る(_一つ目の整数,_二つ目の整数,_演算番号) :- 整数を得る('1つめの整数を入力してください',true,_一つ目の整数), 整数を得る('2つめの整数を入力してください',true,_二つ目の整数), 整数を得る('演算子番号を入力してください\n1:加算,2:除算,3:最大公約数,4:最小公倍数',between(1,4,_演算番号),_演算番号). 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号) :- 整数を得る('演算番号を入力してください\n1:加算,2:除算,3:最大公約数,4:最小公倍数',true,_演算番号), 演算処理(_演算番号,_一つ目の整数,_二つ目の整数,_結果文字列), writef(Outstream,'%t\n',[_結果文字列]). 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号) :- 演算処理と結果を表示する(Outstream,_一つ目の整数,_二つ目の整数,_演算番号). 演算処理(1,_一つ目の整数,_二つ目の整数,_結果文字列) :- _結果 is _一つ目の整数 + _二つ目の整数, swritef(_結果文字列,'%t + %t = %t',[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(2,_一つ目の整数,_二つ目の整数,_結果文字列) :- _商 is _一つ目の整数 // _二つ目の整数, _剰余 is _一つ目の整数 mod _二つ目の整数, swritef(_結果文字列,'%t %% %t = %t 余り %t',[_一つ目の整数,_二つ目の整数,_商,_剰余]). 演算処理(最大公約数,_一つ目の整数,_二つ目の整数,_結果文字列) :- 最大公約数(_一つ目の整数,_二つ目の整数,_結果), swritef(_結果文字列,'%t と %t の最大公約数は %t,[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(4,_一つ目の整数,_二つ目の整数,_結果文字列) :- 最小公倍数(_一つ目の整数,_二つ目の整数,_結果), swritef(_結果文字列,'%t と %t の最小公倍数は %t,[_一つ目の整数,_二つ目の整数,_結果]). 演算処理(N,_,_,'終了します') :- \+(between(1,4,N)). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,Y), X is M * N // Y. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/950 # # [1] プログラミング1 # [2] 現在のインターネットを実現しているTCP/IP通信プロトコルでは主にIPv4 #   を用いており、コンピュータを一意に識別するために32ビットのIPアドレスを #   用いている。これを踏まえ、IPアドレスの4つの数字を入力させ、これらを32ビットの #   データ型であるunsigned int型の変数にIPアドレスを示す2進数の数値として保存せよ。 #   保存したIPアドレスがunsigned intの整数値として解釈するといくつとなるか表示する #   プログラムを作成せよ。 # 'IPアドレスの4つの数字を入力させ、これらを32ビットのデータ型であるunsigned int型の変数にIPアドレスを示す2進数の数値として保存せよ。' :- 'IPアドレスの4つの数字を入力させ、'(_数字_1,_数字_2,_数字_3,_数字_4), 'これらを32ビットのデータ型であるunsigned int型の変数にIPアドレスを示す2進数の数値として保存せよ。'(_数字_1,_数字_2,_数字_3,_数字_4). 'IPアドレスの4つの数字を入力させ、'(_数字_1,_数字_2,_数字_3,_数字_4) :- 整数を得る('255以下の整数',(_数字_1 >= 0,_数字_1 =< 255),_数字_1), 整数を得る('255以下の整数',(_数字_2 >= 0,_数字_2 =< 255),_数字_2), 整数を得る('255以下の整数',(_数字_3 >= 0,_数字_3 =< 255),_数字_3), 整数を得る('255以下の整数',(_数字_4 >= 0,_数字_4 =< 255),_数字_4),!. 'IPアドレスの4つの数字を入力させ、'(_数字_1,_数字_2,_数字_3,_数字_4) :- 'IPアドレスの4つの数字を入力させ、'(_数字_1,_数字_2,_数字_3,_数字_4). 'これらを32ビットのデータ型であるunsigned int型の変数にIPアドレスを示す2進数の数値として保存せよ。'(_数字_1,_数字_2,_数字_3,_数字_4) :- N is _数字_1 * 4096 + _数字_2 * 256 + _数字_3 * 16 + _数字_4, 整数を2進数ならびに変換(N,_2進数ならび), asserta('IPアドレス2進数ならび'(_2進数ならび)). 整数を2進数ならびに変換(0,L,L) :- !. 整数を2進数ならびに変換(N,L1,L) :- M is N mod 2, N_2 is N // 2, 整数を2進数ならびに変換(N_2,[M|L1],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/354 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク):http://ime.nu/ideone.com/rtu1Iv # 上記のプログラムを参考に,構造体personの変数aとbを入れ替える関数を作り, # mainから呼び出しなさい。 # :- dynamic(person/2). prolog :- 'c言語のmain()に当たるものがprolog/0である'. 'c言語のmain()に当たるものがprolog/0である' :- main. main :- 構造体personの変数aとbを入れ替える, person(X,Y), writef('%t\n',[person(X,Y)]). 構造体personの変数aとbを入れ替える :- retract(person(_a,_b)), asserta(person(_b,_a)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/313 # # SET型について質問です。 # # 'りんご', 'みかん', 'ばなな', 'めろん' # # のようなfruitという名のフィールドがあった時、 # 'りんご' と 'ばなな' 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか? # # WHERE `fruit` & 5 # # このようにしたら、 'りんご' または 'ばなな' のいずれかを持つデータが取得されてしまいます。 # # # MySQL5を使用しています。 # どなたかご教授お願いしますm(_ _)m # # 'りんご, みかん, ばなな, めろん のようなfruitという名のフィールドがあった時、 りんご と ばなな 両方が含まれているデータを取得したいのですが、どのようにしたら良いでしょうか?'(_fruit) :- テーブル検索の副目標を得る(テーブル1,[fruit],_テーブル定義,_副目標,_値ならび,[_fruit]), _副目標, 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit). テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). 'fruitという名のフィールドがあった時、りんご と ばなな 両方が含まれているデータを取得したい'(_fruit) :- sub_atom(_fruit,_,_,_,りんご), sub_atom(_fruit,_,_,_,ばなな). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/318 # # MySQL5.1 # # table1 # id,hoge1,hoge2 # # idが2,4,6の中で、hoge1が1,3,5のidを取得したい。 # # SELECT `id` FROM `table1` WHERE (`id` IN (2,4,6)) AND (`hoge1` IN (1,3,5)); # # このsqlでidが2,4,6の3件からの検索なりますか? # もっといいsqlありますか? # # 'table1 id,hoge1,hoge2 idが2,4,6の中で、hoge1が1,3,5のidを取得したい。'(_id) :- テーブル検索の副目標を得る(table1,[id,hoge1],_,_副目標,_,[_id,_hoge1]), member(_id,[2,4,6]), member(_hoge1,[1,3,5]), _副目標. テーブル検索の副目標を得る(_テーブル名,_鍵名ならび,_テーブル定義,_副目標,_値ならび,_鍵の変数ならび) :- テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび). 副目標に鍵を設定する(_テーブル定義,_鍵名ならび,_値ならび,_鍵の変数ならび),!. テーブル定義の取得(_テーブル名,_テーブル定義,_副目標,_値ならび) :- findall([_位置,_属性名],( テーブル定義(_テーブル名,_位置,_属性名)), _テーブル定義), length(_テーブル定義,Len), length(_値ならび,Len), _副目標 =.. [_テーブル名|_値ならび]. 副目標に鍵を設定する(_,[],_,[]). 副目標に鍵を設定する(_テーブル定義,[_鍵名|R2],_値ならび,[_鍵の変数|R4]) :- member([_鍵の位置,_鍵名],_テーブル定義), nth1(_鍵の位置,_値ならび,_鍵の変数), 副目標に鍵を設定する(_テーブル定義,R2,_値ならび,R4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- findall(_,( 文字列を逆順に(_文字列,_文字), write(_文字)), _), write('\n'). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- findall(_文字,( 文字列を逆順に(_文字列,_文字)), _逆順文字ならび), atomic_list_concat(_逆順文字ならび,_逆順文字列), writef('%t\n',[_逆順文字列]). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 文字列を逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 文字列を逆順に出力する(_文字列) :- 文字列を逆順に(_文字列,_文字), write(_文字), fail. 文字列を逆順に出力する(_) :- write('\n'). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,1,_,0,_残り文字列), 文字列を逆順に(_残り文字列,_文字). 文字列を逆順に(_文字列,_文字) :- sub_atom(_文字列,0,1,_,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する('') :- write('\n'). 逆順に出力する(_入力した文字列) :- sub_atom(_入力した文字列,0,1,_,_文字), sub_atom(_入力した文字列,1,_,0,_残り文字列), 逆順に出力する(_残り文字列), write(_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する(_入力した文字列) :- 逆順に(_入力した文字列,_逆順文字ならぴ), 出力する(_逆順文字ならび). 逆順に(_入力した文字列,_逆順文字ならぴ) :- atom_chars(_入力した文字列,_文字ならび), reverse(_文字ならび,_逆順文字ならぴ). 出力する([]) :- write('\n'). 出力する([_文字|_残りならび]) :- wrire(_文字), 出力する(_残りならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/849 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/oMN19ueH # # # /* # 入力した文字列を逆順に出力するプログラムを作成せよ # ただし文字列の入力および逆順に出力する処理はユーザ関数として作成する。 # また、main巻子は以下の記述とする。また、プログラム中で外部変数を用いてはならない # # #define LENGTH 100 # int main(void) # { # char string[LENGTH]; # stringput(string); # rprint(string); # putchar('\n'); # # return 0; # } # # 実行例: # input string ... abcde # # edcba # # ヒント: # プロトタイプ宣言は # void strinput(char *) # void rprint(char *) とする. # # それぞれの関数は # void strinput(char *pt) # { #   fgetsを使って入力する. # } # void rprint(char *pt) # { #   整数型の変数cntを定義する. #   cntを0から増やしながら*(pt+cnt)で¥0を見つける. #   cntを減らしながら*(pt+cnt)で出力する. # } # とする. # # */ 入力した文字列を逆順に出力する :- 入力した文字列を(_入力した文字列), 逆順に出力する(_入力した文字列). 入力した文字列を(_入力した文字列) :- get_line(_入力した文字列). 逆順に出力する(_入力した文字列) :- atom_chars(_入力した文字列,_文字ならび), reverse(_文字ならび,_逆順文字ならぴ), atom_chars(_逆順文字列,_逆順文字ならび), writef('%t\n',[_逆順文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/754 # # [1] プログラミング # [2] 1+2+3+....+nがzになる直前の変数nの値を求めよ # '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,_n) :- '1+2+3+....+nがzになる直前の変数nの値を求めよ'(0,0,_n),!. '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,_n,S,_n) :- _z =< S + _n + 1,!. '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,N_1,S_1,_n) :- N_2 is N_1 + 1, S_2 is S_1 + N_2, '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,N_2,S_2,_n). % % S_2 is S_1 + N_2, % % の N_2 が( N_1 ではなく)大事なところであるが、 % それがまったく表れていない。 % 好ましいプログラムとはいえない。 % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/754 # # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(0,0,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n,S,_n) :- 1000 =< S + _n + 1,!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(N_1,S_1,_n) :- N_2 is N_1 + 1, S_2 is S_1 + N_2, '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(N_2,S_2,_n). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/212 # # 質問です。 # 開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離は # ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point))) # で計算できます。 # それで、 # ・select で距離を計算するときは round() するけど # ・order by でソートする時は round() なしで(つまりfloatのまま)ソートする # ということをしたいです。 # SQLはこんな感じになるんですけど、 # select round(ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point)))) as distance # from geo_data # order by ST_Distance(ST_GeographyFromText(ST_AsText(start_point)), ST_GeographyFromText(ST_AsText(end_point))) # これだと距離の計算が二重に行われてしまい、無駄です。 # これを、距離の計算を二重に行わずに意図した通りのSQLを発行することはできますか。 # よろしくお願いします。 # 環境:PostgreSQL 9.1 # テーブル定義(geo,1,id). テーブル定義(geo,2,start_point). テーブル定義(geo,3,end_point). '開始地点を表すカラム start_point と終了地点を表すカラム end_point があり、その距離を小さい順に取り出す(距離を四捨五入)'(_start_point,_end_point,_distance) :- テーブル述語を得る(geo,[start_point,end_point],[_start_point,_end_point],P), 四捨五入しない距離で整列(P,_start_point,_end_point,L2), member([_distance_1,_start_point,_end_point],L2), 四捨五入(_distance_1,_distance). テーブル述語を得る(_テーブル名,_カラムならび,_カラム変数ならび,_テーブル述語) :- findall(_,( テーブル定義(テーブル名,_,_)), L, カラム変数ならびを得る(_テーブル名,_カラムならび,_カラム変数ならび,L), _テーブル述語 =.. [_テーブル名|L]. カラム変数ならびを得る(_テーブル名,_カラムならび,[],L) :- !. カラム変数ならびを得る(_テーブル名,[_カラム|R1],[_カラム変数|R2],L) :- テーブル定義(_テーブル名,Nth,_カラム), nth1(Nth,L,_カラム変数), カラム変数ならびを得る(_テーブル名,R1,R2,L). 四捨五入しない距離で整列(P,_start_point,_end_point,L2) :- findall([_distance,_start_point,_end_point],( _テーブル述語, _distance is _end_point - _start_point), L1), 整列(L1,L2). 四捨五入(A,B) :- B is round(A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/545 # # # [1] ポインタ # [2] 2つの変数データを交換するプログラムをつくれ。ただしデータ交換部分を2つのポインタ変数を仮引数をもつ関数とすること。 # [3]Linux、gcc、C #   # [4] 11/4 am1:00まで # [5] なし # # おねがいします # # '2つの変数データを交換する'(A,B,B,A). '2つの変数データを交換する'(A,B,X,Y) :- '2つの変数データを交換する'(B,A,X,Y). % 以下のサイトは # # 値の決まらない6×6ビンゴの表を作成する # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- findall(_6要素の変数リスト,( between(1,6,_), length(_6要素の変数リスト,6)), _ビンゴの表). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- length(_ビンゴの表,6), '値の決まらない6×6ビンゴの表'(_ビンゴの表). '値の決まらない6×6ビンゴの表'([]). '値の決まらない6×6ビンゴの表'([_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), '値の決まらない6×6ビンゴの表'(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). %%%%%%%%%%%%%%%% length/2 を使用しないと %%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- '6要素の変数リストを生成する'(6,_6要素の変数リスト), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). '6要素の変数リストを生成する'(0,[]). '6要素の変数リストを生成する'(N,[_|R]) :- N_1 is N - 1, '6要素の変数リストを生成する'(N_1,[_|R]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは # # 値の決まらない6×6ビンゴの表を作成する # %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- findall(_6要素の変数リスト,( between(1,6,_), length(_6要素の変数リスト,6)), _ビンゴの表). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- length(_ビンゴの表,6), '値の決まらない6×6ビンゴの表'(_ビンゴの表). '値の決まらない6×6ビンゴの表'([]). '値の決まらない6×6ビンゴの表'([_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), '値の決まらない6×6ビンゴの表'(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- length(_6要素の変数リスト,6), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). %%%%%%%%%%%%%%%% length/2 を使用しないと %%%%%%%%%%%%%%%%%%%%% '値の決まらない6×6ビンゴの表を作成する'(_ビンゴの表) :- '値の決まらない6×6ビンゴの表を作成する'(6,_ビンゴの表). '値の決まらない6×6ビンゴの表を作成する'(0,[]) :- !. '値の決まらない6×6ビンゴの表を作成する'(N,[_6要素の変数リスト|R]) :- '6要素の変数リストを生成する'(6,_6要素の変数リスト), N_1 is N - 1, '値の決まらない6×6ビンゴの表を作成する'(N_1,R). '6要素の変数リストを生成する'(0,[]). '6要素の変数リストを生成する'(N,[_|R]) :- N_1 is N - 1, '6要素の変数リストを生成する'(N_1,[_|R]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/366 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):キーボードから球の半径rを実数入力し(doubleで変数宣言)、半径rの円周、表面積、体積を計算、表示(出力は%15.5f)するプログラムを作成する。 # 'キーボードから球の半径を実数入力し、半径rの円の円周、球の表面積、球の体積を計算、表示(出力は%15.5f)する' :- 'キーボードから球の半径rを実数入力し'(_半径r), '半径rの円の円周、球の表面積、球の体積を計算'(_半径r,_円の円周,_球の表面積,_球の体積), '表示(出力は%15.5f)する'(_半径r,_円の円周,_球の表面積,_球の体積). 'キーボードから球の半径rを実数入力し'(_半径r) :- 実数を得る('球の半径r',_半径r). '半径rの円周、球の表面積、球の体積を計算'(_半径r,_円の円周,_球の表面積,_球の体積) :- 円周を計算(_半径r,_円の円周), 球の円周を計算(_半径r,_球の表面積), 球の体積を計算(_半径r,_球の体積). 円周を計算(_球の半径r,_球の円周) :- _球の円周 is 2 * pi * _球の半径r. 球の表面積を計算(_球の半径r,_球の表面積) :- _球の表面積 is 4 * pi * _球の半径r. 球の体積を計算(_球の半径r,_球の体積) :- _球の体積 is ( 4 * pi * (_球の半径r * _球の半径r * _球の半径r)) / 3. '表示(出力は%15.5f)する'(_球の半径r,_円周,_球の表面積,_球の体積) :- writef('半径 %t の円周は ',[_球の半径r]), format('~5, 表面積は ~5, 体積は ~5 です。\n',[_円周,_球の表面積,_球の体積]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/325 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/m1ElsrJZ #include # # int main(void) # { # int x[5] = {30, 25, 33, 15, 22}; # int *p; # int i; # p = x; # printf("*P = %d\n", *p); # for(i = 0; i < 5; i++) # { # printf("*(p+%d) = %d\n", i, *(p + i)); # } # return 0; # } # 上記のプログラムをx[5] = {54, 56, 64, 42, 58};として初期化し # 最大値を出力するプログラムをポインタ変数を用いて作成せよ。 # 'x[5] = {54, 56, 64, 42, 58};として初期化し最大値を出力する' :- 'x[5] = {54, 56, 64, 42, 58};として初期化し'(_x), 最大値を(_x,_最大値), 出力する(_最大値). 'x[5] = {54, 56, 64, 42, 58};として初期化し'(_x) :- _x = [54,56,64,42,58]. 最大値を([A|R],_最大値) :- 最大値を(R,A,_最大値). 最大値を([],_最大値,_最大値). 最大値を([A|R],_最大値_1,_最大値) :- A >= _最大値_1, 最大値を(R,_最大値_2,_最大値),!. 最大値を([_|R],_最大値_1,_最大値) :- 最大値を(R,_最大値_1,_最大値),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/323 # # [1]ポインタと文字列 # [2]文字列128文字以下を読み込み、その長さを表示するプログラムを作成せよ。文字列のそうさにはポインタ変数をつかう。文字列操作関数は使用できない。 # [3]Linux、gcc、C # [4]来週まで # # # お願いします # # '文字列128文字以下を読み込み、その長さを表示する' :- 文字列128文字以下を読み込みその長さを(_その長さ), 表示する(_その長さ). 文字列128文字以下を読み込みその長さを(_その長さ) :- rawmode, get_char(_文字), 文字列128文字以下を読み込み(0,_文字,_その長さ), norawmode. 文字列128文字以下を読み込み(_その長さ,end_of_file,_その長さ) :- !. 文字列128文字以下を読み込み(128,_,128) :- !. 文字列128文字以下を読み込み(M_1,_文字_1,_その長さ) :- get_char(_文字_2), M_2 is M_1 + 1, 文字列128文字以下を読み込み(M_2,_文字_2,_その長さ). 表示する(_その長さ) :- writef('入力された文字列長は %t です。\n',[_その長さ]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/899 # # 1.C言語 変数・型・条件文 # 2.問題3個 # ・キーボードから実数を1つ入力し10倍した数の整数部だけをint 型の変数に代入して表示す # るプログラムを作成せよ。 # ・キーボードから実数を1つ入力し10倍した数の一の位を表示するプログラムを作成せよ。 # ・平面上の点の座標(2つの実数) をキーボードから入力し、その点が原点を中心とする半径1の # 円の中にある場合には中、 外にある場合には外と表示するプログラムを作成せよ。 # 3.Linux gcc C言語 # 4.本日中 # よろしくお願いします。 # # '平面上の点の座標(2つの実数) をキーボードから入力し、その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する' :- 実数を得る(実数,_x), 実数を得る(実数,_y), 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_x,_y). 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_x,_y) :- _その点の原点からの距離 is sqrt(_x * _x + _y * _y), 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_その点の原点からの距離). 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_その点の原点からの距離) :- _その点の原点からの距離 =< 1.0, writef('%t\n',[中]). 'その点が原点を中心とする半径1の円の中にある場合には中、 外にある場合には外と表示する'(_その点の原点からの距離) :- _その点の原点からの距離 < 1.0, writef('%t\n',[外]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/899 # # 1.C言語 変数・型・条件文 # 2.問題3個 # ・キーボードから実数を1つ入力し10倍した数の整数部だけをint 型の変数に代入して表示す # るプログラムを作成せよ。 # ・キーボードから実数を1つ入力し10倍した数の一の位を表示するプログラムを作成せよ。 # ・平面上の点の座標(2つの実数) をキーボードから入力し、その点が原点を中心とする半径1の # 円の中にある場合には中、 外にある場合には外と表示するプログラムを作成せよ。 # 3.Linux gcc C言語 # 4.本日中 # よろしくお願いします。 # # 'キーボードから実数を1つ入力し10倍した数の一の位を表示する' :- 実数を得る(実数,_実数), _10倍した数の一の位 is truncate(float_integer_part(_実数 * 10)) mod 10, writef('%t\n',[_10倍した数の一の位]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/899 # # 1.C言語 変数・型・条件文 # 2.問題3個 # ・キーボードから実数を1つ入力し10倍した数の整数部だけをint 型の変数に代入して表示す # るプログラムを作成せよ。 # ・キーボードから実数を1つ入力し10倍した数の一の位を表示するプログラムを作成せよ。 # ・平面上の点の座標(2つの実数) をキーボードから入力し、その点が原点を中心とする半径1の # 円の中にある場合には中、 外にある場合には外と表示するプログラムを作成せよ。 # 3.Linux gcc C言語 # 4.本日中 # よろしくお願いします。 # # 'キーボードから実数を1つ入力し10倍した数の整数部だけをint 型の変数に代入して表示する' :- 実数を得る(実数,_実数), _10倍した数の整数部だけ is truncate(float_integer_part(_実数 * 10)), writef('%t\n',[_10倍した数の整数部だけ]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 4. # 2次元平面上の3つの座標 p1、p2、 p3 を頂点とする # 3角形を考え、構造体 triangle を以下のように定義する。 # struct triangle { # double p1[2]; double p2[2]; double p3[2]; # }; # # 構造体 triangle に対して、以下の関数を作成せよ。 適当な構造体 triangle の変数を # いくつか作成して、この関数が正しく動作することを確認するプログラムを作成せよ。 # # int congruence (structure triangle *a, structure triangle *b) # # 三角形 a と三角形 b が合同かどうかを判定する、 # 合同なら 1 を合同でないなら 0 を返す # # */ # # /* # # 5.構造体Tri は三角形に対応するものであり、3 つの辺の長さ(a,b,c) とその三角形の面積(area) を # メンバーとしてして持つ。 # struct Tri { # int a; # int b; # int c; # double area # }; # # 構造体Tri の変数をランダムにn 個作成して、三角形の面積が大きい順に表示するプログラムを作成 # する。ただしn はプログラムの引数として与える。また構造体Tri の変数をランダムに作成する際 # に、a とb には3 以上30 以下の整数をランダムに入れ、c にはa とb の値から、3 辺a, b, c から三 # 角形ができるようにランダムに正の整数を入れる。 # # [実行結果] # > ./a.out 1000 # 1 番目に大きい三角形は3 辺が( 30, 29, 41 ) で面積は434.741302 # 2 番目に大きい三角形は3 辺が( 29, 29, 43 ) で面積は418.422260 # 3 番目に大きい三角形は3 辺が( 30, 27, 37 ) で面積は399.749922 # ... # 998 番目に大きい三角形は3 辺が( 4, 3, 3 ) で面積は4.472136 # 999 番目に大きい三角形は3 辺が( 3, 3, 3 ) で面積は3.897114 # 1000 番目に大きい三角形は3 辺が( 3, 3, 1 ) で面積は1.479020 # # */ '三角形の面積が大きい順に表示する'(_n) :- 三角形をn個生成する(_n,_n個の三角形ならび), 大きい順に表示する(_n個の三角形ならび). 三角形をn個生成する(_n,_n個の三角形ならび) :- findall([_a,_b,_c],( between(1,_n,_), 三辺の長さを生成する(_a,_b,_c)), _n個の三角形ならび). 三辺の長さを生成する(_a,_b,_c) :- _a is random(100) + 1, _b is random(100) + 1, _c is random(100) + 1. 大きい順に表示する(_n個の三角形ならび) :- 三角形の面積と相対位置のならびを作る(0,_n個の三角形ならび,_面積と相対位置のならび), 大きい順に(_面積と相対位置のならび,_大きい順に整列した面積と相対位置のならび), 表示する(0,_大きい順に整列した面積と相対位置のならび,_n個の三角形ならび). 三角形の面積と相対位置のならびを作る(_,[],[]). 三角形の面積と相対位置のならびを作る(N_1,[[_a,_b,_c]|R1],[[_三角形の面積,N_2]|R2]) :- N_2 is N + 1, ヘロンの公式(_a,_b,_c,_三角形の面積), 三角形の面積と相対位置のならびを作る(0,R1,R2). ヘロンの公式(_a,_b,_c,_三角形の面積) :- _周囲の半分 is (_a + _b + _c) / 2, _三角形の面積 is sqrt(_周囲の半分 * (_周囲の半分 - _a) * (_周囲の半分 - _b) * (_周囲の半分 - _c)). 大きい順に([],[]). 大きい順に([_軸要素|L1],L2) :- 大きい順に分割する(_軸要素,L1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび), 大きい順に(_軸要素に等しいか大きい要素ならび,_大きい順に整列した軸要素に等しいか大きい要素ならび), 大きい順に(_軸要素より小さい要素ならび,_大きい順に整列した軸要素より小さい要素ならび), append(_大きい順に整列した軸要素に等しいか大きい要素ならび,[_軸要素|_大きい順に整列した軸要素より小さい],L2). 大きい順に分割する(_,[],[],[])). 大きい順に分割する(_軸要素,[_要素|R1],[_要素|_軸要素に等しいか大きい要素ならび],_軸要素より小さい要素ならび) :- _要素 @>= _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 大きい順に分割する(_軸要素,[_要素|R1],_軸要素に等しいか大きい要素ならび,[_要素|_軸要素より小さい要素ならび]) :- _要素 @< _軸要素, 大きい順に分割する(_軸要素,R1,_軸要素に等しいか大きい要素ならび,_軸要素より小さい要素ならび). 表示する(_,[],_). 表示する(_順位_0,[[_面積,_相対番号]|R1],_n個の三角形ならび) :- _順位 is _順位_0 + 1, nth1(_相対番号,_n個の三角形ならび,[_a,_b,_c]), writef('%t 番目に大きい三角形は3 辺が( %t, %t, %t ) で面積は%t\n',[_順位,_a,_b,_c,_面積]), 表示する(_順位,R1,_n個の三角形ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/844 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/codepad.org/DXRUGC3J # http://ime.nu/codepad.org/e9CIf3Iy # # /* # # 4. # 2次元平面上の3つの座標 p1、p2、 p3 を頂点とする # 3角形を考え、構造体 triangle を以下のように定義する。 # struct triangle { # double p1[2]; double p2[2]; double p3[2]; # }; # # 構造体 triangle に対して、以下の関数を作成せよ。 適当な構造体 triangle の変数を # いくつか作成して、この関数が正しく動作することを確認するプログラムを作成せよ。 # # int congruence (structure triangle *a, structure triangle *b) # # 三角形 a と三角形 b が合同かどうかを判定する、 # 合同なら 1 を合同でないなら 0 を返す # # */ '三角形 a と三角形 b が合同かどうかを判定する、合同なら 1 を合同でないなら 0 を返す'(_p1_a,_p2_a,_p3_a,_p1_b,_p2_b,_p3_b,1) :- 三角形の三辺を得る(_p1_a,_p2_a,_p3_a,L1), 三角形の三辺を得る(_p1_b,_p2_b,_p3_b,L2), 'L1とL2の三辺がそれぞれ等しい'(L1,L2),!. '三角形 a と三角形 b が合同かどうかを判定する、合同なら 1 を合同でないなら 0 を返す'(_,_,_,_,_,_,0). 三角形の三辺を得る((_x1,_y1),(_x2,_y2),(_x3,_y3),[_辺1,_辺2,_辺3]) :- _辺1 is sqrt((_x2 - _x1) * (_x2 - _x1) + (_y2 - _y1) * (_y2 - _y1)), _辺2 is sqrt((_x3 - _x2) * (_x3 - _x2) + (_y3 - _y2) * (_y3 - _y2)), _辺3 is sqrt((_x1 - _x3) * (_x1 - _x3) + (_y1 - _y3) * (_y1 - _y3)). 'L1とL2の三辺がそれぞれ等しい'([],[]). 'L1とL2の三辺がそれぞれ等しい'([A|R1],L2) :- select(A,L1,R1), select(A,L2,R2), 'L1とL2の三辺がそれぞれ等しい'(R1,R2). % 以下のサイトは # # 等差数列の再帰的定義 # 等差数列(_等差数列) :- 等差数列(_等差数列,_公差),!. 等差数列([_],_公差). 等差数列([A,B|R],_公差) :- '先頭の変数でない二要素の差が公差であり後続もこの公差の等差数列である時、等差数列である'([A,B|R],_公差),!. 等差数列([A,B|R],_公差) :- 'A,Bどちらかが変数の時は、後続が等差数列であるならば公差からAを決定して構わない'(A,B,R,_公差). '先頭の変数でない二要素の差が公差であり後続もこの公差の等差数列である時、等差数列である'([A,B|R],_公差) :- \+(var(A)), \+(var(B)), _公差 is B - A, 等差数列([B|R],_公差). 'A,Bどちらかが変数の時は、後続が等差数列であるならば公差からAを決定して構わない'(A,B,R,_公差) :- 'A,Bどちらかが変数の時は、'(A,B), '後続が等差数列であるならば公差からAを決定して構わない'(B,R,_公差,A),!. 'A,Bどちらかが変数の時は、'(A,B) :- var(A),!. 'A,Bどちらかが変数の時は、'(A,B) :- var(B). '後続が等差数列であるならば公差からAを決定して構わない'(B,R,_公差,A) :- 等差数列([B|R],_公差), A is B - _公差,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/466 # # # [1] 授業単元:C言語 # [2] 問題文:プレイフェア暗号の作成 #       参考:http://ime.nu/www.tamagaki.com/math/PlayfairCipher.html # # #  プレイフェア暗号(Playfair cipher) # # プレイフェア暗号はイギリス人サー・チャールズ・ホイートストン(Sir Charles Wheatstone)により開発されライアン・プレイフェア(Lyon Playfair)が普及させました。プレイフェア暗号を用いて暗号化するとき、まずキーワードまたはキーフレーズをあらかじめ決めておきます。仮にキーワードをPlayfairとします。次にこのキーワードをアルファベットが重複することなく下の5×5の表に入れていきます。 # # ここで残りのセルに余ったアルファベットを挿入していくわけですが、アルファベットは26文字あって5×5では一字余ります。そこで I と J は同じセルに入れるとあらかじめ決めておきます。そこで新たに作られた表が下のようになります。 # # 準備ができたところで、次のメッセージを暗号化してみましょう。 # # メッセージ Abandon hope, all ye who enter here. # # このメッセージをまず二文字ずつ区切っていきます。 # # Ab-an-do-nh-op-ea-ll-ye-wh-oe-nt-er-he-re # # ここで7番目に ll と同じ文字が重複しているので間に x を入れます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-e # # そうすると最後に e が一つ余ります。ここにもやはり x を入れておきます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # まず最初の二文字 ab を暗号化してみましょう。ab は先ほど作った表では同じ列にあります。このときは ab の列のすぐ下の文字で置き換えます。 # # つまり ab は BH に変わります。ただし一番下の文字例えば w は一番上の文字 A に変換されます。 # # 同様に同じ行に入る二文字も出てきたとします。例えば ap などは右隣の文字に置き換えます。 # # つまり ap は YL になるわけですね。この場合も一番右の文字例えば f は一番左の文字 p に変換されます。 # # 最後に行も列も違う二文字が出てきた場合は次のようにします。例えば an を考えます。下の表のように a n それぞれの行および列を塗り分け、その交点となる文字を見ます。この場合、P と Q になります。 # # そこで a は、a h と同じ行の P に、n は、n と同じ行の Q に変換します。つまり、 # # do → RT # # nh → QE # # op → NL # # となるわけです。このルールに従って、先ほどのメッセージを暗号化すると、 # # 平文  Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # 暗号文 BH PQ RT QE NL HP YV AF HU GQ NU NM BG GI KU # # これでプレイフェア暗号による暗号化が終了したわけです。 # # この暗号はイギリスがボーア戦争(ブール戦争 BoreWar)で使用したといわれています。 プレイフェア暗号表の作成(_鍵文,_暗号表) :- 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字以外の変数ならび), 'Jを除いたA-Zならびを切る'(_Jを除いたA_Zならび), 変数を埋める(_Jを除いたA_Zならび,Chars,_鍵文字以外の変数ならび), 'N個組'(5,_25要素のならび,_暗号表). 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字ならび,_鍵文字以外の変数ならび) :- length(_25要素ならび,25), atom_chars(_鍵文,_鍵文字ならび), append(_鍵文字ならび,_鍵文字以外の変数ならび,_25要素ならび). 'A-Zならびを切る'(_Jを除いたA_Zならび) :- _切る回数 is random(113) + 1, トランプを切るようにならびを切る(_切る回数,25,['A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_Jを除いたA_Zならび). 変数を埋める(_,_,[]). 変数を埋める(L_1,Chars,[V|R]) :- select(V,L_1,L_R), \+(member(V,Chars)), 変数を埋める(L_R,Chars,R). プレイフェア暗号による暗号化(_平文,_暗号文) :- メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび), atomic_list_concat(_暗号文字ならび,_暗号文). メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび) :- atom_chars(_平文,Chars), すべての文字を大文字に変換(Chars,_大文字の文字ならび), メッセージをまず二文字ずつ区切っていきます(_大文字の文字ならび,_二文字ずつに区切られたならび). メッセージをまず二文字ずつ区切っていきます([],[]). メッセージをまず二文字ずつ区切っていきます(['J'|R1],[['J','J']|R2]) :- メッセージをまず二文字ずつ区切っていきます(R1,R2). メッセージをまず二文字ずつ区切っていきます([A],[[A,'X']]). メッセージをまず二文字ずつ区切っていきます([A,A|R1],[[A,'X']|R2]) :- メッセージをまず二文字ずつ区切っていきます([A|R1],R2). メッセージをまず二文字ずつ区切っていきます([A,B|R1],[[A,B]|R2]) :- \+(A=B), メッセージをまず二文字ずつ区切っていきます(R1,R2). プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび) :- 暗号表(_暗号表), 転置(_暗号表,_転置された暗号表), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号表,_転置された暗号表,_暗号文字ならび). プレイフェア暗号化([],_,_,[]). プレイフェア暗号化([['J','J']|R1],_暗号表,_転置された暗号表,['J'|R2]) :- プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). プレイフェア暗号化([[A,B]|R1],_暗号表,_転置された暗号表,[C,D|R2]) :- 暗号に変換(A,B,_暗号表,C,D), プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_転置された暗号表), 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_暗号表), 'A,Bが暗号表の同一行にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- 暗号コードは矩形を仮想した時の他の二角(A,B,_暗号表,C,D). 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D) :- member(A,L), member(B,L), 'A,Bの次の要素'(L,A,C), 'A,Bの次の要素'(L,B,D). 'A,Bの次の要素'(L,X,Y) :- append([Y|_],[X],L). 'A,Bの次の要素'(L,X,Y) :- append(_,[X,Y|_],L). 暗号コードは矩形を仮想した時の他の二角(A,B,_表,C,D) :- 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B), nth1(_列_B,L_1,C), nth1(_列_A,L_2,D). 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B) :- nth1(_行_A,_表,L_1), nth1(_列_A,L_1,A), nth1(_行_B,_表,L_2), nth1(_列_B,L_2,B). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/463 # # 休み中の課題なのですが、わからないので教えて頂きたいです。 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/vb7pZ # # 飲食店の6月分の帳簿データbook-6.datがテキストで書かれてあり、中身を見てみると #  左端から、日付 支出(1)/収入(0) 商品名 単価 数量 #  20120601 1 meat 125 10000 #  20120602 1 rice 2000 10 #  20120603 0 uriage 500 100 #  20120603 1 beer 140 24 # となっているものとする。  ただし、支出は1、収入は0とする。 # このようなデータを読み取って残高を計算するプログラムを作りたい。以下のプログラムをコンパイルが通り、 # 目的の動作をするように直接書き込んで補いなさい。(どこを補うべきかも考えること) # ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、 # 入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。 '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って残高を計算する。ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_残高表,_残高) :- '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(LL), '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金), 繰越金を付加して残高を計算する(LL,_繰越金,_残高表,_残高). '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(LL) :- get_split_lines('book-6.dat',[' ',','],LL). '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金) :- 整数を得る(繰越金,_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金),!. '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金) :- writef('入力された繰越金 %t で間違いありませんか?\n間違いがなければ改行\n間違っていたら 正しい繰越金を入力してください : ',[_繰越金候補]), get_line(Line), 間違いがあるならば何度でも入力しなおす(Line,_繰越金候補,_繰越金),!. 間違いがあるならば何度でも入力しなおす('',_繰越金,_繰越金) :- !. 間違いがあるならば何度でも入力しなおす(Line,_,_繰越金) :- 間違いがある, atom_to_term(Line,_繰越金候補,_), integer(_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金). 間違いがある. 繰越金を付加して残高を計算する(LL,_繰越金,[[_日付,0,繰越金,0,0,_繰越金]|_残高表],_残高) :- LL = [[_日付|_]|_], 残高を計算する(LL,_繰越金,_残高表,_残高). 残高を計算する([],_残高,[],_残高). 残高を計算する([[_日付,_支出または収入区分,_商品名,_単価,_数量]|R1],_残高_1,[[_日付,_支出または収入区分,_商品名,_単価,_数量,_残高_2]|R2],_残高) :- 支出または収入区分に従って行の計算(_残高_1,_支出または収入区分,_単価,_数量,_残高_2), 残高を計算する(R1,_残高_2,R2,_残高). 支出または収入区分に従って行の計算(_残高_1,1,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 - _単価 * _数量. 支出または収入区分に従って行の計算(_残高_1,0,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 + _単価 * _数量. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/830 # # 誰か助けて # # 問題1 # はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示するプログラムをex08-02.rbで保存して実行してください. # # 問題2 # 問題1のプログラムは、nilのスロットが指定されると、そのままnilを返します.このときには「そのスロットには文字列はありません.」と表示されるように、書き換えて、ex08-03.rbで保存して実行してください. # # 問題3 # はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示するプログラムをex08-04.rbで保存して実行してください.たとえばstrings=[’dog’,’cat’,’mouse’]の場合、以下のように出力させます. # dogは3文字 # catは3文字 # mouseは5文字 # # 問題4 # はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示するプログラムをex08-05.rbで保存して実行してください. # # 問題5 # 以下のように入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力するプログラムをex08-07.rbで保存して実行してください. # 文字列を入力してください # dog[Enter] # 文字列を入力してください # cat[Enter] # 文字列を入力してください # elephant[Enter] # 文字列を入力してください # [Enter] # あなたの入力した文字列は # dog,cat,elephant # です. # # 問題6 # 問題5のプログラムを、文字列を入力とは逆順に出力するように書き換えたプログラムをex08-08.rbで保存して実行してください. # # 問題7 # 問題5のプログラムを、3文字の文字列のみを出力するように書き換えたプログラムをex08-09.rbで保存して実行してください. # # '問題1: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), writef('%t\n',[_文字列]). 入力された数字(_入力された数字) :- 数を得る(数字,_入力された数字). '問題2: はじめに変数に適当な数の文字列による配列をあらかじめ設定しておき、入力された数字を受け取ったら、そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する' :- 入力された数字(_入力された数字), 文字列ならび(_文字列ならび), nth1(_入力された数字,_文字列ならび,_文字列), 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'('') :- writef('%t\n',['そのスロットには文字列はありません.']). 'そのスロットの文字列を表示する。ただし、nil(空文字)を受け取ったら、「そのスロットには文字列はありません.」と表示する'(_文字列) :- \+(_文字列=''), writef('%t\n',[_文字列]). '問題3: はじめに文字列の値を設定した配列変数の各スロットについて、その文字列の文字数を表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), atom_length(_文字列,_文字数), writef('%tの文字数は%t\n',[_文字列,_文字数]), R = []. '問題4: はじめに文字列の値を設定した配列変数の各スロットの内容を3回ずつ表示する' :- 文字列ならび(_文字列ならび), append(_,[_文字列|R],_文字列ならび), writef('%t\n%t\n%t\n',[_文字列,_文字列,_文字列]), R = []. '問題5: 入力したいだけの文字列を入力するよう求めて、Enterが押されたらそれを入力した順につなげて1行に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), それを入力した順につなげて1行に出力する(_文字列ならび). 文字列を入力する(_文字列) :- writef('%t ',[文字列を入力してください]), get_line(_文字列). 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'('',[]) :- !. 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列,[_文字列|R]) :- 文字列を入力する(_文字列_2), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_2,R). それを入力した順につなげて1行に出力する(_行ならび) :- atomic_list_concat(_行ならび,_表示文字列), writef('%t\n',[_表示文字列]). '問題6: 問題5のプログラムを、文字列を入力とは逆順に出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), reverse(_文字列ならび,_反転した文字列ならび), 各文字列を反転して表示する(_反転した文字列ならび). 各文字列を反転して表示する(_反転した文字列ならび) :- append(_,[_文字列|R],_反転した文字列ならび), 文字列を反転する(_文字列,_反転した文字列), writef('%t\n',[_反転した文字列]), R = []. 文字列を反転する(_文字列,_反転した文字列) :- atom_chars(_文字列,Chars), reverse(Chars,Chars_2), atom_chars(_反転した文字列,Chars_2). '問題7: 問題5のプログラムを、3文字の文字列のみを出力する' :- 文字列を入力する(_文字列_1), 'Enterが押されれるまで入力したいだけの文字列を入力するよう求めて'(_文字列_1,_文字列ならび), '入力された文字列のうち3文字の文字列のみを出力する'(_文字列ならび). '入力された文字列のうち3文字の文字列のみを出力する'([]). '入力された文字列のうち3文字の文字列のみを出力する'([_文字列|R]) :- '3文字の文字列のみを出力する'(_文字列), '入力された文字列のうち3文字の文字列のみを出力する'(R). '3文字の文字列のみを出力する'(_文字列) :- atom_length(_文字列,3), writef('%t\n',[_文字列]),!. '3文字の文字列のみを出力する'(_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/829 # # 問題 # 数独の解答が9行9列の文字列で与えられたとき正しいかどうか判定せよ。 # # '数独の解答が9行9列の文字列で与えられたとき正しいかどうか'(_文字列) :- '数独の解答が9行9列の文字列で与えられたとき'(_文字列,L), 数独の回答が正しい(L). '数独の解答が9行9列の文字列で与えられたとき'(_9行9列の文字列,L) :- atom_chars(_9行9列の文字列,Chars), 改行を取り除きながら数字列を数値ならびに変換(Chars,L). 改行を取り除きながら数字列を数値ならびに変換([],[]). 改行を取り除きながら数字列を数値ならびに変換(['\n'|R1],R2) :- 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 改行を取り除きながら数字列を数値ならびに変換([A|R1],[N|R2]) :- atom_number(A,N), 改行を取り除きながら数字列を数値ならびに変換(R1,R2). 数独の回答が正しい([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独診断([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独診断([]) :- !. 数独診断([L|R]) :- sort(L,L1), length(L1,9), 数独診断(R). 数独([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69,_70,_71,_72,_73,_74,_75,_76,_77,_78,_79,_80,_81]) :- 数独生成([[_1,_2,_3,_4,_5,_6,_7,_8,_9], [_10,_11,_12,_13,_14,_15,_16,_17,_18], [_19,_20,_21,_22,_23,_24,_25,_26,_27], [_28,_29,_30,_31,_32,_33,_34,_35,_36], [_37,_38,_39,_40,_41,_42,_43,_44,_45], [_46,_47,_48,_49,_50,_51,_52,_53,_54], [_55,_56,_57,_58,_59,_60,_61,_62,_63], [_64,_65,_66,_67,_68,_69,_70,_71,_72], [_73,_74,_75,_76,_77,_78,_79,_80,_81], [_1,_10,_19,_28,_37,_46,_55,_64,_73], [_2,_11,_20,_29,_38,_47,_56,_65,_74], [_3,_12,_21,_30,_39,_48,_57,_66,_75], [_4,_13,_22,_31,_40,_49,_58,_67,_76], [_5,_14,_23,_32,_41,_50,_59,_68,_77], [_6,_15,_24,_33,_42,_51,_60,_69,_78], [_7,_16,_25,_34,_43,_52,_61,_70,_79], [_8,_17,_26,_35,_44,_53,_62,_71,_80], [_9,_18,_27,_36,_45,_54,_63,_72,_81], [_1,_2,_3,_10,_11,_12,_19,_20,_21], [_4,_5,_6,_13,_14,_15,_22,_23,_24], [_7,_8,_9,_16,_17,_18,_25,_26,_27], [_28,_29,_30,_37,_38,_39,_46,_47,_48], [_31,_32,_33,_40,_41,_42,_49,_50,_51], [_34,_35,_36,_43,_44,_45,_52,_53,_54], [_55,_56,_57,_64,_65,_66,_73,_74,_75], [_58,_59,_60,_67,_68,_69,_76,_77,_78], [_61,_62,_63,_70,_71,_72,_79,_80,_81]]). 数独生成([]) :- !. 数独生成([L|R]) :- 変数に数値を埋める(L), 数独生成(R). 変数に数値を埋める(L) :- 既に使われている数値は候補から外す(L,[1,2,3,4,5,6,7,8,9],_数字候補), 変数に数値を埋める(_数字候補,L). 既に使われている数値は候補から外す([],L,L). 既に使われている数値は候補から外す([V|R1],L1,L) :- var(V), 既に使われている数値は候補から外す(R1,L1,L). 既に使われている数値は候補から外す([N|R1],L1,L) :- integer(N), select(N,L1,L2), 既に使われている数値は候補から外す(R1,L2,L). 変数に数値を埋める([],[]). 変数に数値を埋める(_数字候補,[N|R]) :- integer(N), 変数に数値を埋める(_数字候補,R). 変数に数値を埋める(_数字候補,[V|R]) :- var(V), select(V,_数字候補,_残り数字候補), 変数に数値を埋める(_残り数字候補,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/350 # # [1] 授業単元:プログラミング # [2] 問題文: # ビット単位の論理演算を用いて、scanfで読み込んだ1文字の英字の大文字を小文字に 変換する関数と、小文字を大文字変換する関数をそれぞれ作りなさい。 # また、char型の変数のビットの並びを表示する関数作成しなさい。 # ただし、ビット単位の論理演算とシフト演算子を用いることとし、 # 四則演算(加減乗除)は使わない。 # 例えば、文字'A'は0x41であるので、0100 0001となる。 # [3]環境 # [3.1]OS:Linux # [3.2]コンパイラ:gcc # [3.3]言語: C # [4] 期限:8月5日 # [5] その他の制限: # 大文字→小文字にする関数では、引数の文字が大文字のときに、小文字に変換し、その他の場合は、無変換で返す関数を期待しています。 # この関数の外で文字判定はしません。 # 大文字と小文字の判定に、isupperやislowerも使いません。この判定にもビット # 単位の論理演算を使います。 # isupperやislowerの代りに、各文字の上位3ビットの並びが010ならば大文字、 # 011ならば小文字と判断します。上位3ビットを見るためには、シフト演算子を用ます。 # #define MASK 0x20 # #include <ctype.h> # #include <limits.h> # などは使用しません。 # # 制限が多いですが、どなたかよろしくお願いします。 # '引数の文字が大文字のときに、小文字に変換し、その他の場合は、無変換で返す。大文字と小文字の判定に、ビット単位の論理演算を使います。ここだけのルールとして、各文字の上位3ビットの並びが010ならば大文字、011ならば小文字と判断します。上位3ビットを見るためには、シフト演算子を用います。'(_文字_1,_文字_2) :- char_code(_文字_1,_文字コード_1), 'ここだけのルールとして、各文字の上位3ビットの並びが010ならば大文字と判断します'(_文字コード_1), 'ここだけのルールに従い、各文字の上位3ビットの並びを010から011に変えて、大文字コードを小文字コードに変換します'(_大文字コード_1,_小文字コード_2), char_code(_文字_2,_文字コード_2),!. '引数の文字が大文字のときに、小文字に変換し、その他の場合は、無変換で返す。大文字と小文字の判定に、ビット単位の論理演算を使います。ここだけのルールとして、各文字の上位3ビットの並びが010ならば大文字、011ならば小文字と判断します。上位3ビットを見るためには、シフト演算子を用います。'(_文字,_文字). '引数の文字が小文字のときに、大文字に変換し、その他の場合は、無変換で返す。小文字と大文字の判定に、ビット単位の論理演算を使います。ここだけのルールとして、各文字の上位3ビットの並びが011ならば小文字、010ならば大文字と判断します。上位3ビットを見るためには、シフト演算子を用います。'(_文字_1,_文字_2) :- char_code(_文字_1,_文字コード_1), 'ここだけのルールとして、各文字の上位3ビットの並びが011ならば小文字と判断します'(_文字コード_1), 'ここだけのルールに従い、各文字の上位3ビットの並びを011から010に変えて、小文字コードを大文字コードに変換します'(_小文字コード_1,_大文字コード_2), char_code(_文字_2,_文字コード_2),!. '引数の文字が小文字のときに、大文字に変換し、その他の場合は、無変換で返す。小文字と大文字の判定に、ビット単位の論理演算を使います。ここだけのルールとして、各文字の上位3ビットの並びが011ならば小文字、010ならば大文字と判断します。上位3ビットを見るためには、シフト演算子を用います。'(_文字,_文字). 'ここだけのルールとして、各文字の上位3ビットの並びが010ならば大文字と判断します'(_文字コード) :- (_文字コード >> 5) =:= 0b00000010. 'ここだけのルールとして、各文字の上位3ビットの並びが011ならば小文字と判断します'(_文字コード) :- (_文字コード >> 5) =:= 0b00000011. 'ここだけのルールに従い、各文字の上位3ビットの並びを010から011に変えて、大文字コードを小文字コードに変換します'(_大文字コード_1,_小文字コード_2) :- _文字コード_2 is _文字コード_1 \/ 0b00100000. 'ここだけのルールに従い、各文字の上位3ビットの並びを011から010に変えて、小文字コードを大文字コードに変換します'(_大文字コード_1,_小文字コード_2) :- _文字コード_2 is _文字コード_1 /\ 0b11011111. % 以下のサイトは ガウス法によるLU分解(_n,LL,LU,L,U) :- 解が生成される変数行列とその転置行列の生成(_n,LU,LU2), 転置(LL,LL2), ガウス法によるLU分解(LL,LL2,LU,LU2), 'LとUに分解'(LU,L,U),!. 解が生成される変数行列とその転置行列の生成(_n,LU,LU2) :- length(LU,_n), findall(L,( between(1,_n,_), length(L,_n)), LU), 転置(LU,LU2),!. ガウス法によるLU分解([],[],[],[]) :- !. ガウス法によるLU分解([[A|L1]|R1],[[A|L2]|R2],[[A|L3]|R3],[[A|L2]|R4]) :- '第一行は各列を隅要素(A)で割って置換する'(A,L1,L3), 第二行以下は次の対象矩形を生成する(L2,L3,R1,_次の対象矩形), '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41), 転置(_次の対象矩形,_転置された次の対象矩形), ガウス法によりLu分解(_次の対象矩形,_転置された次の対象矩形,R31,R41), '第一行は各列を隅要素(A)で割って置換する'(A,[],[]). '第一行は各列を隅要素(A)で割って置換する'(A,[A1|R1],[B1|R2]) :- 'A1をAで割る'(A,A1,B1), '第一行は各列を隅要素(A)で割って置換する'(A,R1,R2). 'A1をAで割る'(A,A1,B1) :- 行基本変形除算(A,1,A1,B1). 第二行以下は次の対象矩形を生成する([],_,[],[]) :- !. 第二行以下は次の対象矩形を生成する([A|R1],L2,[[_|L3]|R3],[L|R]) :- '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,L2,L3,L), 第二行以下は次の対象矩形を生成する(R1,L2,R3,R). '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(_,[],[],[]) :- !. '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,[B|R2],[C|R3],[D|R4]) :- 'D is C - A * B'(A,B,C,D), '各行の列を現在値(C)を基礎に第一列の値(A)と第一行の値(B)から書き換える'(A,R2,R3,R4). 'D is C - A * B'(A,B,C,D) :- 行基本変形乗算(A,B,V), 行基本変形減算(C,V,D),!. '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([],[],[],[]). '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'([[_|L3]|R3],[[_|L4]|R4],[L3|R31],[L4|R41]) :- '次の対象矩形の変数行列(第一行と第一列だけ段々に確定していく)'(R3,R4,R31,R41). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'LとUに分解'(LU,L,U) :- 'Lに分解'(LU,L), 'Uに分解'(LU,U). 'Lに分解'(LU,LL) :- findall(L2,( member(L1,LU), append(L0,R,L1), \+(L0 = []), '残り要素Rをすべて0に置き換える'(L0,R,L2)), LL). '残り要素Rをすべて0に置き換える'(L0,R,L2) :- length(R,Len), length(R1,Len), all(R1,0), append(L0,R1,L2),!. 'Uに分解'(LU,UU) :- findall(L2,( member(L,LU), append(L0,L1,L), 'L0の全要素を0に置き換える'(L0,L1,L2)), UU). 'L0の全要素を0に置き換える'(L,L0,[A|R1],L2) :- length(L0,Len), length(L0_2,Len), all(L0_2,0), 'L1を先頭要素で割る'(L1,L1_2), append(L0_2,L1_2,L2),!. 'L1を先頭要素で割る'([_先頭要素|R1],[1|R2]) :- findall(M,( member(A,R1), 分数を含む除算(A,_先頭要素,M)), R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行基本変形乗算(_乗数_1,_乗数_2,X) :- integer(_乗数_1), integer(_乗数_2), X is _乗数_1 * _乗数_2,!. 行基本変形乗算(_分子_1/_分母_1,_分子_2/_分母_2,X) :- _分子 is _分子_1 * _分子_2, _分母 is _分母_1 * _分母_2, 約分(_分子 / _分母,X),!. 行基本変形乗算(_分子/_分母,_乗数_2,X) :- A is _分子 * _乗数_2, 0 is A mod _分母, X is A // _分母,!. 行基本変形乗算(_乗数_1,_分子/_分母,X) :- atomic(_乗数_1), 行基本変形乗算(_分子/_分母,_乗数_1,X),!. 行基本変形乗算(_乗数_1,_乗数_2,X) :- X is _乗数_1 * _乗数_2,!. 行基本変形除算(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, 0 is A2 mod _除数, X is A * _乗数 // _除数,!. 行基本変形除算(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, \+(0 is A2 mod _除数), 約分(A2 / _除数,X),!. 行基本変形除算(A,_乗数,_除数,X) :- X is A * _乗数 / _除数. 行基本変形減算(A,B,C) :- atomic(A), atomic(B), C is A - B,!. 行基本変形減算(A1/A2,B1/B2,X) :- _分子 is A1 * B1, _分母 is A2 * B2, 約分(_分子 / _分母,X),!. 行基本変形減算(A1/A2,B1/B2,X) :- _分子 is A1 * B2 - B1 * A2, _分母 is A2 * B2, 約分(_分子 / _分母,X),!. 行基本変形減算(A1/A2,B,X) :- atomic(B), _分子 is A1 - A2 * B, _分母 is A2, 約分(_分子 / _分母,X),!. 行基本変形減算(B,A1/A2,X) :- 行基本変形減算(A1/A2,B,X),!. 行基本変形減算(A,B,X) :- X is A - B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/103 # # [1] 授業単元:C言語 # [2] 問題文: # 2つの整数aとb(但しa<b)を入力すると、aからbまでの和と積を求めるプログラムを作成せよ。 # 但し、#if〜#endif文を用いて、「#define on 1」と「#define on 0」の制御により、最終的な結果だけを出力する場合と # 和を入れる変数waと積を入れる変数sekiの計算途中の値も出力する場合の2通りで実行できるようにせよ。 # そして両方の場合について実行せよ。 # <入力例> # wa=3 seki=6 # <結果のみ出力する場合> # wa=18 seki=360 # <途中経過も出力する場合> # wa=3 seki=3 # wa=7 seki=12 # wa=12 seki=60 # wa=18 seki=360 # (最後の結果が重複して表示されてもよい。) # '2つの整数aとb(但しa<b)を入力すると、aからbまでの和と積を求める' :- '2つの整数aとb(但しa<b)を入力すると'(_a,_b), 'aからbまでの和と積を求める'(_a,_b,_和,_積). '2つの整数aとb(但しa<b)を入力すると'(_a,_b) :- repeat, 整数を得る(a,_a), 整数を得る(b,_b), _b > _a,!. 'aからbまでの和と積を求める'(_a,_b,_和,_積) :- 'aからbまでの和を求める'(_a,_b,_和), 'aからbまでの積を求める'(_a,_b,_積). 'aからbまでの和を求める'(_b,_b,_b) :- !. 'aからbまでの和を求める'(N,_b,S) :- N_2 is N + 1, 'aからbまでの和を求める'(N_2,_b,S_2), S is S_2 + N. 'aからbまでの積を求める'(_b,_b,_b) :- !. 'aからbまでの積を求める'(N,_b,M) :- N_2 is N + 1, 'aからbまでの積を求める'(N_2,_b,M_2), M is M_2 * N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/31 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # 以下の問題文の ^ はべき乗をあらわす記号とする。 # # 1.二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。 # a,b,cは乱数によって決定されるdouble型の変数とする。 # a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。 # 解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。 # # 2.解の公式を使って解く上記方法には問題点があります。 # 上記問題点とは、"a=0 , b^2-4ac<0"の時という意図ではありません、 # あくまで"a≠0 , b^2-4ac>=0"である前提での問題点です。 # その問題点がなんであるかを答え、 # その問題点を解決するプログラムを作成しなさい。 # # '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。a,b,cは乱数によって決定されるdouble型の変数とする。a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。' :- 'a,b,cは乱数によって決定される'(_a,_b,_c), 'a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。'(_a,_b,_c), '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解), 表示する(_a,_b,_c,_解). 'a,b,cは乱数によって決定される'(_a,_b,_c) :- 'aは0を避ける'(_a), _b is random(12) - 6, _c is random(12) - 6. 'aは0を避ける'(_a) :- _a is random(12) - 6, \+(_a = 0),!. 'aは0を避ける'(_a) :- 'aは0を避ける'(_a). 'a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。'(_a,_b,_c) :- \+(_a = 0), _b ^ 2 - 4 * _a * _c >= 0.0. '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,虚根です) :- 'b^2-4ac < 0の場合'(_a,_b,_c),!. '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- 'b^2-4ac=0の場合'(_a,_b,_c), _解 is (-1 * _b) / (2 * _a),!. '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- _解 is (-1 * _b + sqrt(_b ^2 - 4 * _a * _c)) / (2 * _a). '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- _解 is (-1 * _b - sqrt(_b ^2 - 4 * _a * _c)) / (2 * _a). 'b^2-4ac=0の場合'(_a,_b,_c) :- _b ^ 2 - 4 * _a * _c = 0.0. 'b^2-4ac < 0の場合'(_a,_b,_c) :- _b ^ 2 - 4 * _a * _c < 0.0. 表示する(_a,_b,_c,_解) :- \+(number(_解)), writef('%t\n',[_解]),!. 表示する(_a,_b,_c,_解) :- writef('%tx^2+%tx+%t=0 の解は x = %t\n',[_a,_b,_c,_解]), fail. 表示する(_,_,_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/31 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # 以下の問題文の ^ はべき乗をあらわす記号とする。 # # 1.二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。 # a,b,cは乱数によって決定されるdouble型の変数とする。 # a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。 # 解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。 # # 2.解の公式を使って解く上記方法には問題点があります。 # 上記問題点とは、"a=0 , b^2-4ac<0"の時という意図ではありません、 # あくまで"a≠0 , b^2-4ac>=0"である前提での問題点です。 # その問題点がなんであるかを答え、 # その問題点を解決するプログラムを作成しなさい。 # # '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。a,b,cは乱数によって決定されるdouble型の変数とする。a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。' :- 'a,b,cは乱数によって決定される'(_a,_b,_c), 'a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。'(_a,_b,_c), '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解), 表示する(_a,_b,_c,_解). 'a,b,cは乱数によって決定される'(_a,_b,_c) :- 'aは0を避ける'(_a), _b is random(12) - 6, _c is random(12) - 6. 'aは0を避ける'(_a) :- _a is random(12) - 6, \+(_a = 0),!. 'aは0を避ける'(_a) :- 'aは0を避ける'(_a). 'a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。'(_a,_b,_c) :- \+(_a = 0), _b ^ 2 - 4 * _a * _c >= 0.0. '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- _解 is (-1 * _b + sqrt(_b ^2 - 4 * _a * _c)) / (2 * _a). '解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。'(_a,_b,_c,_解) :- _解 is (-1 * _b - sqrt(_b ^2 - 4 * _a * _c)) / (2 * _a). 表示する(_a,_b,_c,_解) :- writef('%tx^2+%tx+%t=0 の解は x = %t\n',[_a,_b,_c,_解]), fail. 表示する(_,_,_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/15 # # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク): # ビット単位の論理演算を用いて、1文字の英字の大文字を小文字に変換する関数と、 # 小文字を大文字変換する関数をそれぞれ作りなさい。 # また、char型の変数のビットの並びを表示する関数を作成しなさい。 # ただし、ビット単位の論理演算とシフト演算子を用いることとし、 # 四則演算(加減乗除)は使わない。 # 例えば、文字'A'は0x41であるので、0100 0001となる。 # 配列のサイズなど、定数は#defineを利用すること. # 入力や表示を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと # 'ビット単位の論理演算を用いて、1文字の英字の大文字を小文字に変換する'(_1文字の英大字,_1文字の英小文字) :- char_code(_1文字の英大文字,Code1), Code2 is Code1 \/ 0b00100000, char_code(_1文字の英小文字,Code2). 'ビット単位の論理演算を用いて、1文字の英字の小文字を大文字に変換する'(_1文字の英小字,_1文字の英大文字) :- char_code(_1文字の英小字,Code1), Code2 is Code1 /\ 0b00100000, char_code(_1文字の英大字,Code2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/935 # # [1] 授業単元:C言語演習 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つ構造体を考える。 #  氏名 : 文字型 name[20] #  英語得点 : 整数型 eigo #  国語得点 : 整数型 kokugo #  数学 : 整数型 sugaku # SCORE型の構造体配列data[5]を宣言せよ。 # そしてキーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力するプログラムを作成せよ。 # <データ例> # 番号 氏名 英語得点 国語得点 数学得点 # 1  nakashima 75   70    75 # 2  takada  85   65    70 # 3  arita   80   80    80 # 4  shimane  65   75    55 # 5  hirakata 70   77    90 # <出力例> # 英語 takada 85 # 国語 arita 80 # 数学 hirakata 90 # 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると、最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- length(Ln,5), 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln), '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する'. 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([]). 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'([_|Ln]) :- 'データ(番号、氏名、各教科の得点)を入力すると', 'キーボードから5人分のデータ(番号、氏名、各教科の得点)を入力すると'(Ln). 'データ(番号、氏名、各教科の得点)を入力すると' :- 変数XXを得る(XX), 整数を得る(番号,_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点), 成績を定義する(XX,_番号,_氏名,_英語の得点,_国語の得点,_数学の得点). 氏名を得る(_氏名) :- write('氏名 : '), get_line(_氏名). 各教科の得点を得る(_英語の得点,_国語の得点,_数学の得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). '最高得点の学生の氏名とその得点を英語、国語、数学の各教科毎に出力する' :- append(_,[_教科|R],[英語,国語,数学]), 教科の最高得点を得る(_教科,_氏名,_最高得点), writef('%t の最高得点者は %t 得点は %t\n',[_教科,_氏名,_最高得点]). R = []. 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語,_英語得点)), assertz(成績(_XX,国語,_国語得点)), assertz(成績(_XX,数学,_数学得点)),!. 教科の最高得点を得る(_教科,_氏名,_最高得点) :- findmax([_得点,_氏名],( 成績(XX,_教科,_得点), 成績(XX,氏名,_氏名)), _最高得点). 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/924 # # [1] 授業単元:C言語 # [2] 問題文: # 学生の英語、国語、数学の合計の得点データを処理するために、次のようなデータ型と名前のメンバを持つSCORE型構造体を考える。 # 学籍番号:整数型 number # 氏名:文字型 name[20] # 英語得点:整数型 eigo # 国語得点:整数型 kokugo # 数学得点:整数型 sugaku # 合計得点:整数型 goukei # SCORE型の2つの構造体変数x1,x2を宣言せよ。 # そしてキーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力されるプログラムを作成せよ。 # <データ例> # 変数 番号 氏名 英語得点 国語得点 数学得点 # x1  1  nakashima 75  80    75 # x2  2  takada  77   82    70 # <出力列> # nakashima 230 # 'キーボードから番号、氏名、各教科の得点を入力すると英語、国語、数学の3教科の合計点が計算され、合計点の高い方の学生の氏名と合計点が出力される' :- 'キーボードから番号、氏名、各教科の得点を入力すると', '英語、国語、数学の3教科の合計点が計算され'(_合計点_番号ならび), '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび). 'キーボードから番号、氏名、各教科の得点を入力すると' :- 一人分の成績を定義する, 'キーボードから番号、氏名、各教科の得点を入力すると'. 'キーボードから番号、氏名、各教科の得点を入力すると'. 一人分の成績を定義する :- 番号を得る(_番号), 氏名を得る(_氏名), 各教科の得点を得る(_英語得点,_国語得点,_数学得点), 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点). 番号を得る(_番号) :- 整数を得る(番号,_番号),!, \+(_番号==0). 氏名を得る(_氏名) :- write('氏名を入力してください : '), get_line(_氏名). 各教科の得点を得る(_英語得点,_国語得点,_数学得点) :- 整数を得る(英語得点,_英語得点), 整数を得る(国語得点,_国語得点), 整数を得る(数学得点,_数学得点). 成績を定義する(_番号,_氏名,_英語得点,_国語得点,_数学得点) :- 変数xxを得る(_XX), 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点). 成績を定義する(XX,_番号,_氏名,_英語得点,_国語得点,_数学得点) :- assertz(成績(_XX,番号,_番号)), assertz(成績(_XX,氏名,_氏名)), assertz(成績(_XX,英語成績,_英語成績)), assertz(成績(_XX,国語成績,_国語成績)), assertz(成績(_XX,数学成績,_数学成績)),!. 変数xxを得る(_XX) :- N is random(99999999) + 1, 整数から文字列(8,N,A), atomic_list_concat([x,A],_XX), \+(成績(_XX,番号,_)),!. 変数xxを得る(_XX) :- 変数xxを得る(_XX). '英語、国語、数学の3教科の合計点が計算され'(_合計点_変数番号ならび) :- setof(_XX,[_XX,_番号] ^ ( 成績(_XX,番号,_番号)),_XXならび), findall([_合計点,_XX],( member(_XX,_XXならび), 合計点を計算する(_XX,_合計点)),_合計点_変数番号ならび). 合計点を計算する(_XX,_合計点) :- 成績(_XX,英語成績,_英語成績), 成績(_XX,国語成績,_国語成績), 成績(_XX,数学成績,_数学成績), _合計点 is _英語成績 + _国語成績 + _数学成績. '合計点の高い方の学生の氏名と合計点が出力される'(_合計点_番号ならび) :- sort(_合計点_番号ならび,_整列された合計点_番号ならび), reverse(_整列された合計点_番号ならび,_降順に整列された合計点_番号ならび), _整列された合計点_番号ならび = [[_合計点,_XX]|_], 成績(_XX,氏名,_氏名), writef('合計点が高い方は %t で合計点 %t 点です。\n',[_氏名,_合計点]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、"Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). 盤面の設定と爆弾の配置(_平坦なならびで表現された盤面) :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面),!. マインスイーパ(_平坦なならびで表現された盤面) :- マインスイーパを継続する(_平坦なならびで表現された盤面). 変数が64個になったら挑戦者の勝ちである(_平坦なならびで表現された盤面) :- 度数((member(A,_平坦なならびで表現された盤面),atom(A)),64), write('あなたの勝ちです。\n'). マインスイーパを継続する(_平坦なならびで表現された盤面) :- '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾を隠して盤面表示後、マス目を選択する'(_平坦なならびで表現された盤面,_行位置,_列位置) :- 爆弾を隠して盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面), 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面). '爆弾が置かれていないマス目が指定された場合、'(_行位置,_列位置,_nth1,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0). 'ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_nth1,_平坦なならびで表現された盤面) :- 爆弾は周囲にいくつあるか(_nth1,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %w 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), 爆弾が置かれたすべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), writef('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- 度数((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). 爆弾が置かれたすべてのマス目に小文字のxを表示し([]) :- !. 爆弾が置かれたすべてのマス目に小文字のxを表示し(L) :- 爆弾が置かれたすべてのマス目に小文字のxを表示して行く(L). 爆弾が置かれたすべてのマス目に小文字のxを表示して行く([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾が置かれたすべてのマス目に小文字のxを表示し(R). 爆弾を含むマス目を行末まで表示する([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 行末まで表示する(A,R). 行末まで表示する(A,R) :- 爆弾を含むマス目表示文字(A,_表示文字), 爆弾を含むマス目表示(R,_表示文字). 爆弾を含むマス目表示(R,_表示文字) :- writef('%w',[_表示文字]), R = [], write('\n'). マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]). 爆弾を含むマス目表示文字(V,'-') :- var(V),!. 爆弾を含むマス目表示文字('x','x') :- !. 爆弾を含むマス目表示文字(_,0). 爆弾を隠して盤面を表示する([]). 爆弾を隠して盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を隠して盤面を表示する(R). 爆弾を隠してマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- マス目を([_1,_2,_3,_4,_5,_6,_7,_8],A,R), 爆弾を隠して行末まで表示する(A,R). 爆弾を隠して行末まで表示する(A,R) :- 爆弾を隠すマス目表示文字(A,_表示文字), 爆弾を隠すマス目表示(_表示文字,R). 爆弾を隠すマス目表示(_表示文字,R) :- writef('%w',[_表示文字]), R = [], write('\n'). 爆弾を隠すマス目表示文字(V,'-') :- var(V),!. 爆弾を隠すマス目表示文字('x','-') :- !. 爆弾を隠すマス目表示文字(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(L) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランだけに配置する(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10). 同じマス目に重ならないようにランだけに配置する([],L) :- !. 同じマス目に重ならないようにランだけに配置する([_|R1],L) :- 同じマス目に重ならないようにランダムに一個爆弾を設置する(L), 同じマス目に重ならないようにランだけに配置する(R1,L). 同じマス目に重ならないようにランダムに一個爆弾を設置する(L) :- ランダムに(L,_nth0), 同じマス目に重ならないように一個爆弾を設置する(_nth0,L),!. ランダムに(L,_nth0) :- repeat, _nth0 is random(64). 同じマス目に重ならないように一個爆弾を設置する(_nth0,L) :- 同じマス目に重ならないように(_nth0,L,V), 一個爆弾を設置する(V). 同じマス目に重ならないように(_nth0,L,V) :- nth0(_nth0,L,V), var(V). 一個爆弾を設置する(x). 爆弾は周囲にいくつあるか(N,L,_個数) :- 度数(周囲の八箇所の中で爆弾があるのは(N,L),_個数). 周囲の八箇所の中で爆弾があるのは(N,L) :- 周辺の八箇所の中で(N,_nth1), '_nth1には爆弾がある'(_nth1,L). 周辺の八箇所の中で(N,_nth1) :- member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式. '_nth1には爆弾がある'(_nth1,L) :- nth1(_nth1,L,V), 変数ではなく爆弾がある(V). 変数ではなく爆弾がある(V) :- 変数ではなく(V), V = x. 変数ではなく(V) :- \+(var(V)). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8) ',between(1,8,_行位置),_行位置), 整数を得る('マス目の桁位置(1-8) ',between(1,8,_桁位置),_桁位置),!. 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数),!. 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- catch(_条件,E,fail),!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/812 # # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '要素数10以下のリスト要素をキーボードから受け取り,最大値をディスプレイに表示する' :- 要素数10以下のリスト要素をキーボードから受け取り(1,L), 最大値をディスプレイに表示する(L). 要素数10以下のリスト要素をキーボードから受け取り(N,[]) :- N > 10,!. 要素数10以下のリスト要素をキーボードから受け取り(_,[]) :- at_end_of_stream(user_input),!. 要素数10以下のリスト要素をキーボードから受け取り(N,[_数|R]) :- 数を得る(数,_数), N_2 is N + 1, 要素数10以下のリスト要素をキーボードから受け取り(N_2,R). 最大値をディスプレイに表示する(L) :- 最大値を(L,_最大値), writef('最大値は %t です\n',[_最大値]). 最大値を([A|R],_最大値) :- 最大値を([A|R],A,_最大値). 最大値を([],_最大値,_最大値). 最大値を([A|R],_現在の最大値,_最大値) :- A @> _現在の最大値, 最大値を(R,A,_最大値). 最大値を([A|R],_現在の最大値,_最大値) :- A @=< _現在の最大値, 最大値を(R,_現在の最大値,_最大値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/812 # # [1] 授業単元:c 反復処理 # [2] 問題文(含コード&リンク): # 整数 a をキーボードから入力し,a が素数かどうか判断するプログラムを作成しなさい.(2〜a/2で整数aを割ったときに全ての値で割り切れなければ,aは素数である.) # サイズm(m<=10)の整数型配列変数aをキーボードから受け取り,a[0],a[1],...,a[n-1]のうちの最大値をディスプレイに表示するプログラムを完成しなさい. # '整数 a をキーボードから入力し,a が素数かどうか判断する' :- '整数 a をキーボードから入力し'(_a), 'a が素数かどうか判断する'(_a,_素数かどうかの判断), writef('%t は %t\n',[_a,_素数かどうかの判断]). '整数 a をキーボードから入力し'(_a) :- 整数を得る('整数 a',_a). 'a が素数かどうか判断する'(_a,素数である) :- _除数になりうる最大値 is _a // 2, 'a が素数かどうか判断する'(2,_除数になりうる最大値,_a),!. 'a が素数かどうか判断する'(_,素数ではない). 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_) :- _除数 > _除数になりうる最大値,!. 'a が素数かどうか判断する'(_除数,_除数になりうる最大値,_a) :- \+(0 is _a mod _除数), _次の除数 is _除数 + 1, 'a が素数かどうか判断する'(_次の除数,_除数になりうる最大値,_a). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/791 # # [1] 授業単元:C言語演習 # [2] 問題文: # ある教科の5人の得点の入った整数型配列 x[5] および2つの整数型変数max,minを引数とし # 最高点と最低点を計算する関数maxminを作成せよ。 # そして5人の数学、英語、国語の得点をキーボードからそれぞれ配列m[5], e[5], j[5]に入力すると # 各教科の最高点と最低点を計算して表示するプログラムをmaxmin関数を利用して作成せよ。 # <条件> # 引数maxおよびminは、参照によるアドレス渡しで受け取る。maxmin関数はvoid型となる。 # 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'([_得点],_得点,_得点) :- !. 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'([_得点|R],_max,_min) :- 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'(R,_max,_min), 'max,minの更新'(_得点,_max_1,_min_1,_max,_min). 'max,minの更新'(_得点,_max_1,_min_1,_max,_min) :- maxの更新(_得点,_max_1,_max), minの更新(_得点,_min_1,_min). maxの更新(_得点,_max_1,得点) :- _得点 > _max_1,!. maxの更新(_得点,_max_1,_max_1). minの更新(_得点,_min_1,得点) :- _得点 < _max_1,!. minの更新(_得点,_min_1,_min_1). '5人の数学、英語、国語の得点をキーボードから入力すると各教科の最高点と最低点を計算して表示する' :- '5人の数学、英語、国語の得点をキーボードから入力すると'(LL), '各教科の最高点と最低点を計算して表示する'(LL). '5人の数学、英語、国語の得点をキーボードから入力すると'(LL) :- '5人の'(LL), '数学、英語、国語の得点をキーボードから入力すると'(LL). '5人の'(LL) :- length(LL,5). '数学、英語、国語の得点をキーボードから入力すると'(LL) :- findall([_数学,_英語,_国語],( nth1(_,LL,_), get_split_line([',',' '],[_数学,_英語,_国語])), LL). '各教科の最高点と最低点を計算して表示する'(LL) :- nth(N,[数学,英語,国語],_教科), 教科の得点ならび(N,LL,_教科の得点ならび), 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'(L,_最高点,_最低点), writef('教科: %t 最高点: %t 最低点: %t\n',[_教科,_最高点,_最低点]), N = 3. 教科の得点ならび(N,LL,_教科の得点ならび) :- findall(_得点,( member([_数学,_英語,_国語],LL), nth1(N,[_数学,_英語,_国語],_得点)), _教科の得点ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/791 # # [1] 授業単元:C言語演習 # [2] 問題文: # ある教科の5人の得点の入った整数型配列 x[5] および2つの整数型変数max,minを引数とし # 最高点と最低点を計算する関数maxminを作成せよ。 # そして5人の数学、英語、国語の得点をキーボードからそれぞれ配列m[5], e[5], j[5]に入力すると # 各教科の最高点と最低点を計算して表示するプログラムをmaxmin関数を利用して作成せよ。 # <条件> # 引数maxおよびminは、参照によるアドレス渡しで受け取る。maxmin関数はvoid型となる。 # 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'([_得点],_得点,_得点) :- !. 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'([_得点|R],_max,_min) :- 'ある教科の5人の得点の入った ならび _x および2つの整数型変数_max,_minを引数とし最高点と最低点を計算する'(R,_max,_min), 'max,minの更新'(_得点,_max_1,_min_1,_max,_min). 'max,minの更新'(_得点,_max_1,_min_1,_max,_min) :- maxの更新(_得点,_max_1,_max), minの更新(_得点,_min_1,_min). maxの更新(_得点,_max_1,得点) :- _得点 > _max_1,!. maxの更新(_得点,_max_1,_max_1). minの更新(_得点,_min_1,得点) :- _得点 < _max_1,!. minの更新(_得点,_min_1,_min_1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/902 # # DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0) # # [テーブルデータ] # # CREATE TABLE tblA( # id INTEGER, # status001 INTEGER, # status002 INTEGER, # status003 INTEGER, # status004 INTEGER, # . # . # . # status300 INTEGER # ); # # id |status001|status002|.... . |status300| # ----+--------+--------+ +--------| # 1| 0 | 0 | | 0 | # 2| 1 | 0 | | 0 | # 3| 0 | 0 | | 1 | # 4| 0 | 1 | | 1 | # 5| 0 | 0 | | 0 | # 6| 1 | 1 | | 0 | # 7| 0 | 1 | | 0 | # 8| 1 | 1 | | 1 | # 9| 1 | 1 | | 0 | # # 想定レコード数 50,000〜2000,000 # # [欲しい結果] # ------------------------------------------- # status001 | 4 //status001=1であるレコード数 # status002 | 5 //status002=1であるレコード数 # . # . # . # status300 | 3 //status300=1であるレコード数 # # 正規化に問題があるように思えますが # これらを一度のSQLで取得出来ないでしょうか。 # この結果を最も速く取得する方法を模索しています(__) # # 各フィールドの値が1である組数(_フィールド名,_組数) :- between(1,300,N), 引数ならびを生成し指定フィールドを1とする(L1), member([_フィールド名,L],L1), 指定フィールドが1の組数(L,_組数). 引数ならびを生成し指定フィールドを1とする(N,_フィールド名,L) :- フィールド名の復元(N,_フィールド名), length(L,300), nth1(N,L,1). 指定フィールドが1の組数(L,_組数) :- P =.. [tblA,_id|L], count(P,_組数), _組数 > 0. フィールド名の復元(_フィールド名_0,N,_フィールド名) :- '3要素のフィールド名識別名をならびで確保'(L), number_chars(N,Chars), append(L1,Chars,L), 変数として残った要素は0に単一化(L1), ならび要素を結合したものがフィールド名([_フィールド名_0|L],_フィールド名). '3要素のフィールド名識別名をならびで確保'(L) :- length(L,3). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). 変数として残った要素は0に単一化([]). 変数として残った要素は0に単一化(['0'|R]) :- 変数として残った要素は0に単一化(R). ならび要素を結合したものがフィールド名(L,_フィールド名) :- atomic_list_concat(L,_フィールド名). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/655 # # [1] 授業単元:C言語演習 # [2] 問題文: # x1, x2, wa, sa の4つの引数とし、x1とx2との和と差を計算するwasa関数を作成せよ。 # そしてmain関数で2つの実数をキーボードから変数x1, x2に入力すると # x1とx2との和と差を計算して表示するプログラムをwasa関数を利用して作成せよ。 # <実行例> # please input x1: 5.3 # please input x2: 3.5 # 和=8.8 差=1.8 # 和差(_x1,_x2,_和,_差) :- _和 is _x1 + _x2, _差 is _x1 - _x2. '2つの実数をキーボードから変数x1, x2に入力するとx1とx2との和と差を計算して表示する' :- '2つの実数をキーボードから変数x1, x2に入力すると'(_x1,_x2), x1とx2との和と差を計算して(_x1,_x2,_和,_差), 表示する(_x1,_x2,_和,_差). '2つの実数をキーボードから変数x1, x2に入力すると'(_x1,_x2) :- write('2つの実数を入力します。\n'), 数を得る(x1,_x1), 数を得る(x2,_x2). x1とx2との和と差を計算して(_x1,_x2,_和,_差) :- 和差(_x1,_x2,_和,_差). 表示する(_x1,_x2,_和,_差) :- writef('x1=%t と x2=%t の\n和は %t,差は %t です。\n',[_和,_差]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/655 # # [1] 授業単元:C言語演習 # [2] 問題文: # x1, x2, wa, sa の4つの引数とし、x1とx2との和と差を計算するwasa関数を作成せよ。 # そしてmain関数で2つの実数をキーボードから変数x1, x2に入力すると # x1とx2との和と差を計算して表示するプログラムをwasa関数を利用して作成せよ。 # <実行例> # please input x1: 5.3 # please input x2: 3.5 # 和=8.8 差=1.8 # 和差(_x1,_x2,_和,_差) :- _和 is _x1 + _x2, _差 is _x1 - _x2. '2つの実数をキーボードから変数x1, x2に入力するとx1とx2との和と差を計算して表示する' :- '2つの実数をキーボードから変数x1, x2に入力すると'(_x1,_x2), x1とx2との和と差を計算して表示する(_x1,_x2). '2つの実数をキーボードから変数x1, x2に入力すると'(_x1,_x2) :- write('2つの実数を入力します。\n'), 数を得る(x1,_x1), 数を得る(x2,_x2). x1とx2との和と差を計算して表示する(_x1,_x2) :- 和差(_x1,_x2,_和,_差), writef('x1=%t と x2=%t の\n和は %t,差は %t です。\n',[_和,_差]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/599 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):y=f(x)=2sin(πx/4) 0≦x≦1において0.1きざみでx,yの値はどのように変わるのか?配列変数を用いて作成せよ。 # f(_x,_y) :- _y is 2 * sin(pi * _x / 4). 'y=f(x)=2sin(πx/4) 0≦x≦1において0.1きざみでx,yの値はどのように変わるのか'(_x_yの値ならび) :- findall([_x,_y],( between(0,10,N), _x is N / 10, f(_x,_y)), _x_y_の値ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/652 # # 問題 # 整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 # 例 # n=15のとき # 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66 # % % これは数値演算を行わず、変数リストの要素数だけで集計するプログラム。 % '整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :- length(Ln,_n), すべてを1桁に分解して集計する(Ln,[],L), length(L,_集計値). すべてを1桁に分解して集計する([],L,L). すべてを1桁に分解して集計する([_|Ln],L1,L) :- すべてを1桁に分解して([_|Ln],L1,L2), すべてを1桁に分解して集計する(Ln,L2,L). すべてを1桁に分解して([],L,L). すべてを1桁に分解して(Ln,L1,L) :- ならびの割り算(Ln,[_,_,_,_,_,_,_,_,_,_],Lx,Lmod), append(Lmod,L1,L2), すべてを1桁に分解して(Lx,L2,L). % ならびの割り算/4 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1276873238/652 # # 問題 # 整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。 # 例 # n=15のとき # 1+2+3+4+5+6+7+8+9+(1+0)+(1+1)+(1+2)+(1+3)+(1+4)+(1+5) = 66 # # % % これは数値演算を行わず、変数リストの要素数だけで集計するプログラム。 % ただし、桁の分解にリストの割り算を使用せず、リストを数値に戻して、number_chars/2を使っている。 % '整数nが与えられたとき、1からnの数すべてを1桁に分解して集計せよ。'(_n,_集計値) :- length(Ln,_n), すべてを1桁に分解して集計する([_],Ln,[],_集計値). すべてを1桁に分解して集計する(Ln,Ln,LL1,_集計値) :- すべてを1桁に分解して(Ln,LL1,LL2), 平坦化(LL2,L), length(L,_集計値),!. すべてを1桁に分解して集計する(Ln_1,Ln,LL1,_集計値) :- すべてを1桁に分解して(Ln_1,LL1,LL2), すべてを1桁に分解して集計する([_|Ln_1],Ln,LL2,_集計値). すべてを1桁に分解して(Ln,LL1,LL2) :- length(Ln,M), number_chars(M,L), findall(L1,( member(A,L), 数字ならび表現変換(A,L1)), LL), append(LL,LL1,LL2). 数字ならび表現変換('1',[_]). 数字ならび表現変換('2',[_,_]). 数字ならび表現変換('3',[_,_,_]). 数字ならび表現変換('4',[_,_,_,_]). 数字ならび表現変換('5',[_,_,_,_,_]). 数字ならび表現変換('6',[_,_,_,_,_,_]). 数字ならび表現変換('7',[_,_,_,_,_,_,_]). 数字ならび表現変換('8',[_,_,_,_,_,_,_,_]). 数字ならび表現変換('9',[_,_,_,_,_,_,_,_,_]). % 平坦化/2 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/525 # # # [1] 授業単元: C言語入門 # [2] 問題文 # # 1)a = 1,b = 6 とする。このとき二つの変数の引き算を行う関数subt を自分で定義(作成)しメインからsubt関数を呼び出してa-b の答えを示すプログラムを作成すること。 # 2)a={1,2,3,4,5,6}およびb={6,5,4,3,2,1}の二つの配列を作成し、二つの差を配列cに入れるプログラムを作成すること # 3)sample1.dat には 少数点のデータが入っている。これらのデータをfopenで読み出し、配列名aに代入(格納)する。 # 配列の中からもっとも大きな値とその値が最初から何番めにあるかを返す関数 mxmを作成し、aの最大値とその値がある番号を出力するプログラムを作成すること。 # ひきざん([],[],[],_負,[],_負). ひきざん(_正,[],[],[],_正,[]). ひきざん([_|R1],[],[_|R3],[],_正,_負) :- ひきざん(R1,[],R3,[],_正,_負). ひきざん(L1,[],[],[_|R4],_正,_負) :- ひきざん([_|L1],[],[],R4,_正,_負). ひきざん([],L2,[_|R3],[],_正,_負) :- ひきざん([],[_|L2],R3,[],_正,_負). ひきざん([],L2,[_|R3],[],_正,_負) :- ひきざん([],[_|L2],R3,[],_正,_負). 'a={1,2,3,4,5,6}およびb={6,5,4,3,2,1}の二つの配列を作成し、二つの差を配列cに入れる'(_c) :- ならびのひきざん([[[_],[]],[[_,_],[]],[[_,_,_],[]],[[_,_,_,_],[]],[[_,_,_,_,_],[]],[[_,_,_,_,_,_],[]]],[[[_,_,_,_,_,_],[]],[[_,_,_,_,_],[]],[[_,_,_,_],[]],[[_,_,_],[]],[[_,_],[]],[[_],[]]],_c). ならびのひきざん([],[],[]). ならびのひきざん([[A1,A2]|R1],[[B1,B2]|R2],[[C1,C2]|R3]) :- ひきざん(A1,A2,B1,B2,C1,C2), ならびのひきざん(R1,R2,R3). % 以下のサイトは # 問題 # 数字がひとつ不明な13桁のISBNコードを復元せよ。 # 例(不明な所を?とする) # 9784062?72211 => 9784062772211 # 978415031?684 => 9784150310684 '数字がひとつ不明な13桁のISBNコードを復元せよ。'(_未知符号を含む13桁のISBNコード,_復元された13桁のISBNコード) :- atom_chars(_未知符号を含む13桁のISBNコード,_未知符号を含む13要素のならび), '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_未知符号を含む13要素のならび,_未知符号を解決した12要素の数値ならび,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_未知符号を解決した12要素の数値ならび,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数), 'ISBNコードを復元する'(_未知符号を解決した12要素の数値ならび,_最終桁の数,_復元された13桁のISBNコード). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(L1,L2,_最終桁の数) :- 各桁を数値に変換したならび(L1,L3), append(L2,[_最終桁の数],L3). 各桁を数値に変換したならび([],[]). 各桁を数値に変換したならび([_文字|R1],[_数値または変数|R2]) :- 数値または変数に変換(_文字,_数値または変数), 各桁を数値に変換したならび(R1,R2). 数値または変数に変換((?),_数値または変数) :- member(_数値または変数,[0,1,2,3,4,5,6,7,8,9]). 数値または変数に変換(A,_数値または変数) :- atom_number(A,_数値または変数). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび), findsum(S,( append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0), S is N1 * 3 + N2 * 1), _加算された数). '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. 'ISBNコードを復元する'(_未知符号を解決した12要素の数値ならび,_最終桁の数,_復元された13桁のISBNコード) :- append(_未知符号を解決した12要素の数値ならび,[_最終桁の数],L1), atomic_list_concat(L1,_復元された13桁のISBNコード). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/300 # # [1] 授業単元:ランダム・ウォーク # [2] 問題文(含コード&リンク): # http://ime.nu/www.kent-web.com/pubc/book/test/uploader/uploader.cgi?mode=downld&no=5450 # # 課題1 2次元ランダムウォーク # ここでは、x座標、y座標とも変化量をN(0,1)に従う独立な正規乱数とすること # で、等方的な2次元ランダム・ウォークを考える。 # # 1.原点を出発点とする等方的な2次元ランダム・ウォークを1000ステップ実行す # るプログラムを作成せよ。各ステップごとに座標値を表示し、 1000ステップの # 軌跡を描け。 # # 2.同じく原点を出発点とする等方的な2次元ランダム・ウォークを1000ステップ # 実行するプログラムを作成せよ。ただし、今度のプログラムは 1000ステップ後 # の原点からの距離を表示するものとする。 # このプログラムを1000回実行し、原点からの距離をヒストグラムにせよ。ヒスト # グラムに描く範囲や階級幅は得られた値から適当と思えるように適 宜設定する # こと。 # # # 課題2 幾何ランダム・ウォーク # 確率変数Xiは0.9以上1.1未満の一様乱数とする。この確率変数に対し、初期値を # 1として幾何ランダム・ウォークを実行するプログラムを作成する。 # # 1.1000ステップを実行し、各ステップごとの値の返歌をグラフにかけ。 # # 2.1000ステップの幾何ランダム・ウォークを1000回実行し、それぞれにおける最 # 終的な値のヒストグラムを作成せよ。ここでも、描く範囲や階級幅は適当に設 # 定すること。 '1000ステップを実行し、各ステップごとの値の変化をグラフに描く。確率変数Xiは0.9以上1.1未満の一様乱数とする。この確率変数に対し、初期値を1として幾何ランダム・ウォークを実行する' :- length(L,1000), findall(Z,( '確率変数Xiは0.9以上1.1未満の一様乱数とする'(L,1.0,Y), Z is truncate(40.0 * Y)), L), グラフ描画(L). '確率変数Xiは0.9以上1.1未満の一様乱数とする'([],_,_) :- !,fail. '確率変数Xiは0.9以上1.1未満の一様乱数とする'(_,Y,Y). '確率変数Xiは0.9以上1.1未満の一様乱数とする'([_|Ln],Y_1,Y) :- Y_2 is Y_1 * (0.9 + 0.2 * (random(100) + 1) / 100), '確率変数Xiは0.9以上1.1未満の一様乱数とする'(Ln,Y_2,Y). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/253 # # [1] 授業単元:応用情報処理I # [2] 問題文: 正規分布を計算して結果をグラフとして出力するプログラムを作成しなさい # f(_x,_y) :- _x_1 is 2 * pi * (_x / 100.0) - pi, _y is truncate(1.0 / ( (2.0 * pi) ^ 2 * exp(-1 * (_x_1 * _x_1 / 2.0))) * 100.0). '正規分布を計算して結果をグラフとして出力するプログラムを作成しなさい' :- 表にグラフを描く(LL1), 転置(LL1,LL2), グラフ表示(LL2). 表にグラフを描く(LL1) :- findall(L,( for(0,_x,100), length(L,101), f(_x,_y), append(L0,[*|R],L), length(L0,_y)), LL1). グラフ表示([]). グラフ表示([L|R]) :- 変数要素を空白に変換(L), atom_chars(A,L), writef('%t\n',[A]), グラフ表示(R). 変数要素を空白に変換([]). 変数要素を空白に変換([' '|R]) :- 変数要素を空白に変換(R). 変数要素を空白に変換([_|R]) :- 変数要素を空白に変換(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/89 # # 質問テンプレ】 # [1] 授業単元:組合せ最適化 # [2] 問題文(含コード&リンク): # # 以下のアルゴリズムを実装せよ。 # Find(j) # if j=0 何もしない # else # ・e[i][j]+C+OPT(i-1)を最小にするiを計算する # ・{p[i],p[i+1],・・・・,p[j]}を出力し、Find(i-1)を実行。 # # なおFind()は関数とし、変数はすべて計算済みとする。 # # iの範囲-> 1<=i<=j を満たす。 # e[i][j]+C+OPT(i-1)の型 →型の意味がわからなくて説明の仕方がわかりません。 # pの型 →同上 # 出力形式 →printfで表示してください。 # OPT()も計算済みです。 # OPT(j)=e[i][j]+C+OPT(i-1)になります。 # e[i][j]=Σ(k=i〜j) (y[k]-a*x[k]-b)^2 # このy[k],x[k]は入力で与えられてます。 # a,bは最小二乗法で求めてあります。 # 'Find'(0). 'Find'(_j) :- findmin([X,_i],( between(1,_j,_i), 'e[i][j]+C+OPT(i-1)'(_i,_j,X)), [_,_i]), '{p[i],p[i+1],・・・・,p[j]}を出力し'(_i,_j), _j_1 is _i - 1, 'Find'(_j_1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/64 # # [1] 授業単元:配列 # [2] 問題文(含コード&リンク):身長(cm)と体重(kg)が、(170,85), (165,65), (180,78), #             (195,80), (188,72)の学生がいる。このデータを配列変数に保存し,身長 #             を入力すると体重を検索するプログラムを作成せよ。 #              該当する身長の学生がいない場合は「みつかりません。」を表示し #             繰り返しを終了せよ。 #             ここで,次のように配列宣言を行う。 #             int shincho[ ] = { 170, 165, 180, 195, 188, 0}; #             int taiju[ ] = { 85, 65, 78, 80, 72, 0}; # # データの最後は,データの個数である 5 を用いず、身長データが0になった # とき繰り返しを終了する方法を考えること。 # ヒント:for( i=0 ; shincho[i] != 0 ; i++)を使用する。 # # '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し,身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。' :- '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長(cm)と体重(kg)が、(170,85),(165,65),(180,78),(195,80),(188,72)の学生がいる。このデータを配列数に保存し'(_身長_体重ならび) :- length(_身長_体重ならび,5), findall([_身長,_体重],( append(Ln,[_|_],_身長_体重ならび), 身長と体重の入力(Ln,_身長,_体重)), _身長体重ならび). 身長と体重の入力(Ln,_身長,_体重) :- length([_|Ln],N人目), writef('%t人目の 身長 : ',[N人目]), get_integer(_身長), write(' 体重 : '), get_integer(_体重). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- '身長を入力すると'(_身長), '体重を検索する'(_身長_体重ならび,_身長,_体重), writef('身長 %t の人の 体重は %t です。\n',[_身長,_体重]), '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび). '身長を入力すると体重を検索する。該当する身長の学生がいない場合は「みつかりません。」を表示し繰り返しを終了せよ。'(_身長_体重ならび) :- writef('見つかりません\n'). '身長を入力すると'(_身長) :- write('身長を入力してください : '), get_line(Line), '診断: 身長を入力すると'(Line,_身長),!. '身長を入力すると'(_身長) :- '身長を入力すると'(_身長). '診断: 身長を入力すると'(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長),!. '診断: 身長を入力すると'(Line,_身長) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. '体重を検索する'(_身長_体重ならび,_身長,_体重) :- member([_身長,_体重],_身長_体重ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/39 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # # 4×4のマス目のうち1ヶ所を選び、そこに爆弾をおいておく。 # マス目の座標は左上が(0,0),右下が(3,3)である。 # 実行を開始するとプレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)、 # 爆弾の置かれたマス目であった場合は”wham!”と表示する。 # このプログラムを、以下のように改良せよ。 # (a)15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。 # (b)1度選んだマス目は再度選べないようにする(試行の回数には含めない)。 # (c)マス目の範囲(0,1,2,3のいずれか)から外れた数値を打ち込んだ場合に警告を出すようにする(試行の回数には含めない)。 # (d)1度選んだマス目が分かるように、下の表示を行う。 # 0 0 0 0 # 0 0 0 0 # 0 1 0 0 # 0 0 0 0 # マス目[1,2]を選んで爆弾に当たらなかった場合、その場所に1を表示 # '4×4のマス目のうち1ヶ所を選び、そこに爆弾をおいておく'(_表) :- length(_表,4), findall(L,( member(_,表), length(L,4)), _表), 爆弾をおいておく(_表). 爆弾をおいておく(_表) :- _x座標 is random(4), _y座標 is random(4), 座標を得る(_表,_x座標,_y座標,爆弾),!. 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標) :- 表を表示する(_表), 座標の入力(_x座標,_y座標), 座標範囲検査(_x座標,_y座標), 座標を入力済みとする(_表,_x座標,_y座標),!. 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標) :- 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標). 座標の入力(_x座標,_y座標) :- write('x座標(0..3),y座標(0..3)をカンマ区切りで入力してください : '), readln([_x座標,_y座標]). 座標範囲検査(_x座標,_y座標) :- between(0,3,_x座標), between(0,3,_y座標). 座標を入力済みとする(_表,_x座標,_y座標) :- 座標を得る(_表,_x座標,_y座標,V), 座標を評価する(V),!. 座標を得る(_表,_x座標,_y座標,V) :- length(Ln_y,_y座標), append(Ln_y,[L|_],_表), length(Ln_x,_x座標), append(Ln_x,[V|_],L),!. 座標を評価する(V) :- \+(var(V)), V = 爆弾,!. 座標を評価する(V) :- var(V), V = 1. '実行を開始するとプレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)、爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(_表) :- Ln = [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_], 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_x座標,_y座標), '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(Ln,_表,_x座標,_y座標). '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'([],_表,_x座標,_y座標) :- write('You Win!\n'). '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(R,_表,_x座標,_y座標) :- '爆弾の置かれたマス目であった場合はWham!と表示する'(_表,_x座標,_y座標),!. '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'([_|Ln],_表,_x座標,_y座標) :- 座標を入力済みとする(_表,_x座標,_y座標), 'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_x座標_2,_y座標_2), '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(Ln,_表,_x座標_2,_y座標_2). '爆弾の置かれたマス目であった場合は爆弾の置かれたマス目であった場合はWham!と表示する'(_表,_x座標,_y座標) :- length(Ln_y,_y座標), append(Ln_y,[L|_],_表), length(Ln_x,_x座標), append(Ln_x,[爆弾|_],L), write('Wham!\n'). 表を表示する([]). 表を表示する([_行|R]) :- 行を表示する(_行), 表を表示する(_表). 行を表示する([]) :- write('\n'). 行を表示する([A|R]) :- 変数と爆弾は0表示それ以外は1表示(A,N), write('%t ',[N]), 行を表示する(R). 変数と爆弾は0表示それ以外は1表示(A,0) :- var(A),!. 変数と爆弾は0表示それ以外は1表示(爆弾,0) :- !. 変数と爆弾は0表示それ以外は1表示(_,1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/28 # # 以下の問題が分かりませんので、教えて頂けたら助かります。 # # [1] 授業単元:C言語 # # [2] 問題文: # http://ime.nu/codepad.org/hPrPD1Dw # 文字制限で入れれなかったため、上記のリンクで問題文を書きました。 # ファイル形式は無視してください。 # # [問1] 前回と同様に国語と数学の2科目のテストの成績を処理するプログラムを作る。 # 今回はそれぞれの科目の期末テストが合格か否かを判定したい。 # つまり前回の構造体に合格かどうかを格納する変数も必要だ。そのため、対応する # 名前のメンバーを構造体に増やす必要がある。しかし、メンバーが増えすぎると # 構造体が煩雑になって見た目にわかりにくくなることは否めない。 # そこで、今回はもっとスマートな汎用性の高いデータ構造の構築を目指そう。 # すなわち、構造体をもう1つ用意して # # struct each_score { # ??? ???; //点数 # ??? ???; //合格・不合格 # }; # # struct SEISEKI { # char name[50]; # struct each_score kokugo; # struct each_score sugaku; # }; # # としてみよう。 # 見た目にはstruct SEISEKIのメンバーの数には変わりがないことが分かるだろうか。 # しかし、そのメンバーの型がstruct each_scoreとなっていて、それぞれが # 点数のみならず、合格・不合格の情報を格納できるというわけである。 # # struct each_score の「??? ???」部分を補った上で、 # それぞれの成績がborderlineで表される成績を上回っているか否かを判定し、 # 合格・不合格を表すメンバーに1(合格の意味)もしくは0(不合格の意味)の値を # 代入して3人の学生の合否データを含めた記録を作ろう。3人の成績データを # 格納するデータ構造は、配列を利用して次のように定義できる。 # # struct SEISEKI score[3]; # # ついては、各人の成績データから合否判定をして合格・不合格情報をデータ構造に書きこむ関数 # void check_score(int borderline, struct SEISEKI *a) /* 引数aの前に'*'が付いていることに注意されたい */ # を定義して、その動作を確認する(すべての人の成績を入力し、データ構造に書きこみ、合否判定をして全結果を表示する)プログラムkadai8-1.cを作りなさい。 # 但し、ボーダーラインは60点とする。(必ず上記の型通りのcheck_scoreを定義し、引数borderlineを使用するようにプログラムを書きなさい) # # また、結果の表示を行うために、前回の課題同様に表示用の関数 # void print_score(struct SEISEKI a); # を作りなおして、使用するように。今回は合格・不合格も表示する。 # # ただし、答えの入力は前回と全く同じで、 # ex. 入力例: # yamauchi 60 70 yamada 30 90 tougou 70 80 # # 表示はつぎのフォーマットで行うようにせよ。 # 最終出力の例: # name: yamauchi # kokugo 60 : accept # sugaku 70 : accept # name: yamada # kokugo 30 : rejection # sugaku 90 : accept # name: tougou # kokugo 70 : accept # sugaku 80 : accept 合否閾値(国語,73). 合否閾値(数学,80). '国語と数学の2科目のテストの成績を入力して、それぞれの科目の期末テストが合格か否かを判定する'(_入力する人数,_試験種類) :- abolish(テスト成績/5), 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数), 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定), '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定), _残り人数 = 0. 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数) :- '何番目の入力・残り人数'(_何番目,_残り人数), 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数). '何番目の入力・残り人数'(_何番目,_入力後の残り人数) :- length(L,_入力する人数), append(Ln,[_|R],L), length(Ln,_何番目), length(R,_入力後の残り人数). 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数) :- writef('%t 番目の入力 : 氏名を入力してください : ',[_何番目]), 氏名の入力(_氏名), 国語点数の入力(_国語点数), 数学点数の入力(_数学点数). 氏名の入力(_氏名) :- get_line(_氏名). 国語点数の入力(_国語点数) :- get_line(Line), 国語点数の入力診断(Line,_国語点数),!. 国語点数の入力(_国語点数) :- 国語点数の入力(_国語点数). 国語点数の入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数), _国語点数 >= 0, _国語点数 =< 100,!. 国語点数の入力診断(Line,_国語点数) :- 再入力指示(Line,国語). 数学点数の入力(_数学点数) :- get_line(Line), 数学点数の入力診断(Line,_数学点数),!. 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 数学点数の入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数), _数学点数 >= 0, _数学点数 =< 100,!. 数学点数の入力診断(Line,_数学点数) :- 再入力指示(Line,数学). 再入力指示(Line,_科目) :- writef('入力された %t からは適切な%t点数が得られません。再入力をお願いします。\n',[Line,_科目]), fail. 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定) :- 合格か否かを判定する(国語,_国語点数,_国語の判定), 合格か否かを判定する(数学,_数学点数,_数学の判定). 合格か否かを判定する(_科目,_点数,合格) :- 合否閾値(_科目,_下限値), _点数 >= _下限値,!. 合格か否かを判定する(_,_,不合格). '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定) :- assertz(テスト成績(_氏名,_試験種類,国語,_国語点数,_国語の判定)), assertz(テスト成績(_氏名,_試験種類,数学,_数学点数,_数学の判定)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/28 # # 以下の問題が分かりませんので、教えて頂けたら助かります。 # # [1] 授業単元:C言語 # # [2] 問題文: # http://ime.nu/codepad.org/hPrPD1Dw # 文字制限で入れれなかったため、上記のリンクで問題文を書きました。 # ファイル形式は無視してください。 # # [問1] 前回と同様に国語と数学の2科目のテストの成績を処理するプログラムを作る。 # 今回はそれぞれの科目の期末テストが合格か否かを判定したい。 # つまり前回の構造体に合格かどうかを格納する変数も必要だ。そのため、対応する # 名前のメンバーを構造体に増やす必要がある。しかし、メンバーが増えすぎると # 構造体が煩雑になって見た目にわかりにくくなることは否めない。 # そこで、今回はもっとスマートな汎用性の高いデータ構造の構築を目指そう。 # すなわち、構造体をもう1つ用意して # # struct each_score { # ??? ???; //点数 # ??? ???; //合格・不合格 # }; # # struct SEISEKI { # char name[50]; # struct each_score kokugo; # struct each_score sugaku; # }; # # としてみよう。 # 見た目にはstruct SEISEKIのメンバーの数には変わりがないことが分かるだろうか。 # しかし、そのメンバーの型がstruct each_scoreとなっていて、それぞれが # 点数のみならず、合格・不合格の情報を格納できるというわけである。 # # struct each_score の「??? ???」部分を補った上で、 # それぞれの成績がborderlineで表される成績を上回っているか否かを判定し、 # 合格・不合格を表すメンバーに1(合格の意味)もしくは0(不合格の意味)の値を # 代入して3人の学生の合否データを含めた記録を作ろう。3人の成績データを # 格納するデータ構造は、配列を利用して次のように定義できる。 # # struct SEISEKI score[3]; # # ついては、各人の成績データから合否判定をして合格・不合格情報をデータ構造に書きこむ関数 # void check_score(int borderline, struct SEISEKI *a) /* 引数aの前に'*'が付いていることに注意されたい */ # を定義して、その動作を確認する(すべての人の成績を入力し、データ構造に書きこみ、合否判定をして全結果を表示する)プログラムkadai8-1.cを作りなさい。 # 但し、ボーダーラインは60点とする。(必ず上記の型通りのcheck_scoreを定義し、引数borderlineを使用するようにプログラムを書きなさい) # # また、結果の表示を行うために、前回の課題同様に表示用の関数 # void print_score(struct SEISEKI a); # を作りなおして、使用するように。今回は合格・不合格も表示する。 # # ただし、答えの入力は前回と全く同じで、 # ex. 入力例: # yamauchi 60 70 yamada 30 90 tougou 70 80 # # 表示はつぎのフォーマットで行うようにせよ。 # 最終出力の例: # name: yamauchi # kokugo 60 : accept # sugaku 70 : accept # name: yamada # kokugo 30 : rejection # sugaku 90 : accept # name: tougou # kokugo 70 : accept # sugaku 80 : accept 国語合否閾値(73). 数学合否閾値(80). '国語と数学の2科目のテストの成績を入力して、それぞれの科目の期末テストが合格か否かを判定する'(_入力する人数,_試験種類) :- abolish(テスト成績/5), 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数), 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定), '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定), _残り人数 = 0. 国語と数学の成績入力して(_入力する人数,_氏名,_国語点数,_数学点数,_残り人数) :- length(L,_入力する人数), append(Ln,[_|R],L), length(Ln,_何番目), 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数), length(R,_残り人数). 氏名と国語と数学の点数の入力(_何番目,_氏名,_国語点数,_数学点数) :- writef('%t 番目の入力 : 氏名を入力してください : ',[_何番目]), get_line(_氏名), 国語点数の入力(_国語点数), 数学点数の入力(_数学点数). 国語点数の入力(_国語点数) :- get_line(Line), 国語点数の入力診断(Line,_国語点数),!. 国語点数の入力(_国語点数) :- 国語点数の入力(_国語点数). 国語点数の入力診断(Line,_国語点数) :- atom_to_term(Line,_国語点数,_), integer(_国語点数), _国語点数 >= 0, _国語点数 =< 100,!. 国語点数の入力診断(Line,_国語点数) :- 再入力指示(Line,国語). 数学点数の入力(_数学点数) :- get_line(Line), 数学点数の入力診断(Line,_数学点数),!. 数学点数の入力(_数学点数) :- 数学点数の入力(_数学点数). 数学点数の入力診断(Line,_数学点数) :- atom_to_term(Line,_数学点数,_), integer(_数学点数), _数学点数 >= 0, _数学点数 =< 100,!. 数学点数の入力診断(Line,_数学点数) :- 再入力指示(Line,数学). 再入力指示(Line,_科目) :- writef('入力された %t からは適切な%t点数が得られません。再入力をお願いします。\n',[Line,_科目]), fail. 合格か否かを判定する(_国語点数,_数学点数,_国語の判定,_数学の判定) :- 国語が合格か否かを判定する(_国語点数,_国語の判定), 数学が合格か否かを判定する(_数学点数,_数学の判定). 国語が合格か否かを判定する(_国語点数,合格) :- 国語合否閾値(_下限値), _国語点数 >= _下限値,!. 国語が合格か否かを判定する(_国語点数,不合格). 数学が合格か否かを判定する(_数学点数,合格) :- 数学合否閾値(_下限値), _数学点数 >= _下限値,!. 数学が合格か否かを判定する(_数学点数,不合格). '氏名・点数・判定結果をテスト成績述語として定義する'(_氏名,_試験種類,国語,_国語点数,_国語の判定,_数学の点数,_数学の判定) :- assertz(テスト成績(_氏名,_試験種類,国語,_国語点数,_国語の判定)), assertz(テスト成績(_氏名,_試験種類,数学,_数学点数,_数学の判定)). % 以下のサイトは % *** user: 項複写変数指定付き / 7 *** 項複写変数指定付き(M,N,P,P1,VL,VLX,VLX) :- M > N, !. 項複写変数指定付き(M,N,P,P1,VL,VL1,VLX) :- arg(M,P,T), arg(M,P1,T1), 項複写変数指定付き(T,T1,VL,VL1,VL2), M1 is M + 1, 項複写変数指定付き(M1,N,P,P1,VL,VL2,VLX), !. % *** user: 項複写変数指定付き / 5 *** 項複写変数指定付き(P,P1,VL,VL1,VLX) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写変数指定付き(1,A,P,P1,VL,VL1,VLX), !. 項複写変数指定付き(P,P1,VL,VL1,VL2) :- var(P), member(V,VL), P == V, append(VL1,[P1],VL2), !, !. 項複写変数指定付き(P,P1,VL,VL1,VL1) :- var(P), member(V,VL), \+(P == V), !. 項複写変数指定付き(P,P1,VL,VL1,VL1) :- \+(var(P)), atom_to_term(P,Q,_), \+(P == Q), swritef(P2,'%q',[P]), atom_to_term(P2,P1,_), !. 項複写変数指定付き(P,P,VL,VL1,VL1). % *** user: 項複写変数指定付き / 4 *** 項複写変数指定付き(P,P1,VL,VLX) :- 項複写変数指定付き(P,P1,VL,[],VLY), reverse(VLY,VLX). % *** user: 項複写表示 / 4 *** 項複写表示(M,N,P,P1) :- M > N, !. 項複写表示(M,N,P,P1) :- arg(M,P,T), arg(M,P1,T1), 項複写表示(T,T1), M1 is M + 1, 項複写表示(M1,N,P,P1), !. % *** user: 項複写表示 / 2 *** 項複写表示(P,P1) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写表示(1,A,P,P1), !. 項複写表示(P,P) :- var(P), !. 項複写表示(P,P) :- integer(P),!. 項複写表示(P,P) :- real(P),!. 項複写表示(P,P1) :- \+(var(P)), swritef(S1,'%t',[P]), swritef(P1,'%q',[P]), \+(S1 = P1), swritef(P1,'%q',[P]), !. 項複写表示(P,P). % *** user: 項複写印像 / 5 *** 項複写印像(M,N,P,L,P1) :- M > N, !. 項複写印像(M,N,P,L,P1) :- arg(M,P,T), arg(M,P1,T1), 項複写印像(T,L,T1), M1 is M + 1, 項複写印像(M1,N,P,L,P1). % *** user: 項複写印像 / 3 *** 項複写印像(P,L,P1) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写印像(1,A,P,L,P1), !. 項複写印像(P,L,P1) :- var(P), 印像ならび(L,L1), sprintf('%q',[P],S1), member(P1 = S1,L1), !. 項複写印像(P,_,P). % *** user: 項複写 / 4 *** 項複写(M,N,P,P1) :- M > N, !. 項複写(M,N,P,P1) :- arg(M,P,T), arg(M,P1,T1), 項複写(T,T1), M1 is M + 1, 項複写(M1,N,P,P1), !. % *** user: 項複写 / 2 *** 項複写(P,P1) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写(1,A,P,P1), !. 項複写(P,P1) :- var(P), !. 項複写(P,P1) :- \+(var(P)), parse_atom(P,1,Q,_), \+(P == Q), sprintf(%q,[P],P1), !. 項複写(P,P). % *** user: '印像ならび' / 2 *** 印像ならび([],[]) :- !. 印像ならび([A = B|R],[A = C|R1]) :- swritef(C,'%q',[B]), 印像ならび(R,R1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/972 # # #include # main(){ # int i,j; # j=1; # for(i=1;i<11;i++){ # j=i*j; # } # printf("j=%d",j); # return 0; # } # をwhile文に書き換える時に、 # 正の整数が入力される限り繰り返すときのwhileの条件文を教えてください # # '正の整数が入力される限りwhileを繰り返す' :- while(_i > 0,[_i],1,_j), writef('_j = %t\n',[_j]). while(_条件文,_変数リスト_1,_j_1,_j) :- 項複写変数指定付き(_条件文,_条件文_2,_変数リスト_1,_変数リスト_2), get_integer(_i), _j_2 is _i * _j_1, _条件文, while(_条件文_2,_変数リスト_2,_j_2,_j). while(_,_,_j,_j). % 項複写変数指定付き/4 % Prologで一番問題となる定義だ。 % % 高階述語の罠で、項を複写しないと、再帰中に一度束縛された変数が % 解かれずに、そのまま次の呼び出しの引数となり、failしてしまう。 % % それを回避するのが項複写変数指定付き/4。全く同型の別の複合項を % 複写して、その中の変数とこれも新たに生成された変数を結びつける。 % こうすることによって、受取側述語でもその変数の利用が可能になる。 % % もし、この部分がうまくできていないと、条件文中の変数が何であるか % ここでの場合では、get_integer(_i)の_iに当たる変数が引数の中の % 何であるかがわからない。項複写されたものは元の_iとは無縁だから。 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/959 # # [1] 授業単元: c言語演習 # [2] 問題文(含コード&リンク): 整数nを入力し、以下のようなサイズnの"Z型の図形"を"*"で表示するプログラムを作成しなさい、ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了するようにしなさい。 # # [実行例] # # 3 ←nの入力 # n=3 # *** # * # *** # 4 # n=4 # **** # * # * # **** # 0 ←データの終わり(2以下の値) #   ← n=0は表示しない # # '整数nを入力し、以下のようなサイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。' :- '整数nを入力する'(_整数n), 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n). '整数nを入力する'(_整数n) :- write('図形を表示するためのnの値を入力してください : '), get_line(Line), 整数n入力診断(Line,_整数n),!. '整数nを入力する'(_整数n) :- '整数nを入力する'(_整数n). 整数n入力診断(Line,_整数n) :- atom_to_term(Line,_整数n,_), integer(_整数n),!. 整数n入力診断(Line,_整数n) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n) :- _整数n =< 2, write('2以下が入力されました。終了します。\n'),!. 'サイズnの"Z型の図形"を"*"で表示する。ただし、図形を表示するためのnの値は3以上とし、2以下の値が入力された場合は処理を終了する。'(_整数n) :- 図形を描く(_整数n,_図形), 図形を表示する(_図形). 図形を描く(_整数n,_図形) :- writef('n = %t\n',[_整数n]), '斜めの*を描く'(_整数n,_図形), '最初の行と最後の行は全部*、中間部分の変数を空白に変換する'(_図形),!. '斜めの*を描く'(_整数n,_図形) :- findall(L,( length(L,_整数n), append(_,[*|_],L)), _図形1), reverse(_図形1,_図形). '最初の行と最後の行は全部*、中間部分の変数を空白に変換する'(_図形) :- append([L1],_中間部分,[L2],_図形), 中間部分の変数を空白に変換する(_中間部分), all(L1,*), all(L2,*). 中間部分の変数を空白に変換する([]). 中間部分の変数を空白に変換する([L|R]) :- 変数を空白に変換する(L), 中間部分の変数を空白に変換する(R). 変数を空白に変換する([]). 変数を空白に変換する([' '|R]) :- 変数を空白に変換する(R),!. 変数を空白に変換する([_|R]) :- 変数を空白に変換する(R). 図形を表示する([]). 図形を表示する([L|R]) :- atomic_list_concat(L,S), writef('%t\n',[S]), 図形を表示する(R). % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/938 # # [1] 授業単元: コンピュータプログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/qvNtf # 2 # [問2] 国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから入力した後、それを表示したい。これについて、次の手順でkadai7-2.cを作成しなさい。 # 1)次の構造体を利用する。 # # struct SEISEKI { # char name[50]; # int kokugo; # int sugaku; # }; <ーセミコロンを忘れないように(慣れた人でも良く間違う) # # 2) 次の配列を用意する。 # struct SEISEKI score[3]; # # 3) main関数で上記score[3]に次のようにデータをキーボード入力するようにする。 # scanf("%s %d %d %s %d %d %s %d %d", 一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....); # 注意:上記「一人目の氏名」とは、score[0].nameのことです。またscanfの使いかたとして文字列には&は要りませんが、int型やdouble型の変数の場合には頭に&を付けないといけません。 # ex. 入力例: # yamauchi 60 70 yamada 80 90 tougou 70 80 # # 4)次の関数を定義する。 # void print_score(struct SEISEKI a); # この関数は次のように成績を出力するものとする。 # printf(" name: %s\n kokugo: %d\n sugaku: %d\n", ........); # 表示例: # name: yamauchi # kokugo: 60 # sugaku: 70 # # 5) void print_score()を使って3人分の成績を列挙する。 '国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後、それを表示する' :- '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績), それを表示する([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績]). '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績) :- write('一行に 氏名,国語の成績,数学の成績,の形式で三人分入力してください\n'), readln([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績]), 入力検査([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績],正常終了),!. '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績) :- '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績). 入力検査([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績],_診断) :- 整数項目入力検査([_一人目の国語の成績,_一人目の数学の成績,_二人目の国語の成績,_二人目の数学の成績,_三人目の国語の成績,_三人目の数学の成績],[_一人目の国語の成績,_一人目の数学の成績,_二人目の国語の成績,_二人目の数学の成績,_三人目の国語の成績,_三人目の数学の成績],_診断),!. 整数項目入力検査([],[],異常終了) :- !,fail. 整数項目入力検査([],[],正常終了) :- !. 整数項目入力検査([_科目名|R1],[_成績|R2],_診断) :- integer(_成績), 整数項目入力検査(R1,R2,_診断),!. 整数項目入力検査([_科目名|R1],[_成績|R2],異常終了) :- writef('%tが正しく入力されませんでした。\n',[_科目名]), 整数項目入力検査(R1,R2,異常終了). それを表示する([]). それを表示する([_氏名,_数学成績,_国語成績|R]) :- writef('氏名 : %t\n 数学成績: %t\n 国語成績: %t\n',[[_氏名,_数学成績,_国語成績]), それを表示する(R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/617 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:1 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 2: 1 2 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 3: 1 3 2 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:3 # 3番目の要素はありません。 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:9 # [3.3] 言語: C言語 [4] 期限:5月25日 [5] その他の制限: よろしくお願いします。 # 結び目(0,0,_). '終了の 9 が入力されるまで繰り返す'(_初期ならび,_実行終了時ならび) :- write('1.n番目を追加、2.n番目を削除、9.終了:1 \n'), get_integer(_メニュー番号), 実行の選択(_メニュー番号,_初期ならび,_実行終了時ならび). 実行の選択(9,_ならび,_ならび) :- !. 実行の選択(1,_実行前ならび,_実行終了時ならび) :- '1.n番目を追加'(_実行前ならび,_追加後のならび), '終了の 9 が入力されるまで繰り返す'(_追加後のならび,_実行終了時ならび). 実行の選択(2,_実行前ならび,_実行終了時ならび) :- '2.n番目を削除'(_実行前ならび,_削除後のならび), '終了の 9 が入力されるまで繰り返す'(_削除後のならび,_実行終了時ならび). '1.n番目を追加'(_実行前ならび,_追加後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), write('追加する要素値を入力してください : '), get_line(_要素), 要素をn番目に挿入(_要素,_n). '2.n番目を削除'(_実行前ならび,_削除後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), n番目の要素を取り除く(_n,_削除後のならび). 先頭に結び目を加える(_要素) :- 新しい結び目を得る(_新しい結び目), retract(結び目(0,_次の結び目,_)), asserta(結び目(_新しい結び目,_次の結び目,_要素)), assertz(結び目(0,_新しい結び目,_)). 末尾に結び目を加える(_要素) :- 新しい結びを得る(_新しい結び目), retract(結び目(_末尾の結び目,0,_末尾の要素)), asserta(結び目(_末尾の結び目,_新しい結び目,_末尾の要素)), asserta(結び目(_新しい結び目,0,_要素)). 先頭の結び目を取り除く :- retract(結び目(0,_先頭の結び目,_)), retract(結び目(_先頭の結び目,_次の結び目,_要素)), asserta(結び目(0,_次の結び目,_)). 末尾の結び目を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :- retract(結び目(_末尾の結び目,0,_末尾の要素)), retract(結び目(_末尾の一つ前の結び目,_末尾の結び目,_末尾の一つ前の要素)), asserta(結び目(_末尾の一つ前の結び目,0,_末尾の一つ前の要素)). n番目の要素を表示(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の要素を得る(1,_n,_最初の結び目,_n番目の要素). n番目の要素を得る(_n,_n,_n番目の結び目,_n番目の要素) :- 結び目(_n番目の結び目,_,_n番目の要素),!. n番目の要素を得る(_n_1,_n,_n_1番目の結び目,_n番目の要素) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_n番目の要素), _n_2 is _n_1 + 1, n番目の要素を得る(_n_2,_n,_n_2番目の結び目,_n番目の要素). n番目の要素を取り除く(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の結び目を取り除く(1,_n,_最初の結び目). n番目の結び目を取り除く(_n,_n,_n番目の結び目) :- retract(結び目(_n番目の結び目,_n_2番目の結び目,_n番目の要素)), retract(結び目(_n_1番目の結び,_n番目の結び目,_n_1番目の要素)), asserta(結び目(_n_1番目の結び,_n_2番目の結び目,_n_1番目の要素)),!. n番目の結び目を取り除く(_n_1,_n,_n_1番目の結び目) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_), _n_2 is _n_1 + 1, n番目の結び目を取り除く(_n_2,_n,_n_2番目の結び目,_n番目の要素). n番目の結び目を挿入(_n,_n番目の要素) :- 結び目(0,_最初の結び目,_), n番目の結び目を挿入(1,_n,_最初の結び目,_n番目の要素). n番目の結び目を挿入(_n,_n,_現在のn番目の結び目,_n番目の要素) :- retract(結び目(_n_1番目の結び目,_現在のn番目の結び目,_n_1番目の要素)), 新しい結び目(_新しい結び目), asserta(結び目(_新しい結び目,_現在のn番目の結び目,_新しい要素)), asserta(結び目(_n_1番目の結び目,_新しい結び目,_n_1番目の要素)),!. n番目の結び目を挿入(_n_1,_n,_n_1番目の結び目,_n番目の要素) :- _n_1 < _n, 結び目(_n_1番目の結び目,_n_2番目の結び目,_), _n_2 is _n_1 + 1, n番目の結び目を挿入(_n_2,_n,_n_2番目の結び目,_n番目の要素). 新しい結び目(_新しい結び目) :- _新しい結び目 is (random(40000)+1) * (random(40000)+1), \+(結び目(_新しい結び目,_,_)),!. 新しい結び目(_新しい結び目) :- 新しい結び目(_新しい結び目). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/617 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:1 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 2: 1 2 # 1.n番目を追加、2.n番目を削除、9.終了:1 # 何番目を追加しますか:2 # 3: 1 3 2 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:3 # 3番目の要素はありません。 # 2: 1 3 # 1.n番目を追加、2.n番目を削除、9.終了:2 # 何番目を削除しますか:2 # 1: 1 # 1.n番目を追加、2.n番目を削除、9.終了:9 # [3.3] 言語: C言語 [4] 期限:5月25日 [5] その他の制限: よろしくお願いします。 # '終了の 9 が入力されるまで繰り返す'(_初期ならび,_実行終了時ならび) :- write('1.n番目を追加、2.n番目を削除、9.終了:1 \n'), get_integer(_メニュー番号), 実行の選択(_メニュー番号,_初期ならび,_実行終了時ならび). 実行の選択(9,_ならび,_ならび) :- !. 実行の選択(1,_実行前ならび,_実行終了時ならび) :- '1.n番目を追加'(_実行前ならび,_追加後のならび), '終了の 9 が入力されるまで繰り返す'(_追加後のならび,_実行終了時ならび). 実行の選択(2,_実行前ならび,_実行終了時ならび) :- '2.n番目を削除'(_実行前ならび,_削除後のならび), '終了の 9 が入力されるまで繰り返す'(_削除後のならび,_実行終了時ならび). '1.n番目を追加'(_実行前ならび,_追加後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), write('追加する要素値を入力してください : '), get_line(_要素), 要素をn番目に挿入(_要素,_n,_ならび,_追加後のならび). '2.n番目を削除'(_実行前ならび,_削除後のならび) :- write('追加する要素番号を入力してください : '), get_integer(_n), n番目の要素を取り除く(_n,_ならび,_,_削除後のならび). 先頭に要素を加える(_要素,_ならび,[_要素|_ならび]). 末尾に要素を加える(_要素,_ならび,_末尾に要素を加えたならび) :- append(_ならび,[_要素],_末尾に要素を加えたならび). 先頭の要素を取り除く([_先頭の要素|_先頭の要素を除いたならび],_先頭の要素,_先頭の要素を除いたならび). 末尾の要素を取り除く(_ならび,_末尾の要素,_末尾の要素を除いたならび) :- append(_末尾の要素を除いたならび,[_末尾の要素],_ならび). n番目の要素を表示(_n,_ならび,_n番目の要素) :- length([_|L0],_n), append(L0,[_n番目の要素|_],_ならび), n番目の要素を取り除く(_n,_ならび,_n番目の要素,_n番目の要素を除いたならび) :- length([_|L0],_n), append(L0,[_n番目の要素|R],_ならび), append(L0,R,_n番目の要素を除いたならび). 要素をn番目に挿入(_要素,_n,_ならび,_要素をn番目に挿入されたならび) :- length([_|L1],_n), append(L1,L2,_ならび), append(L1,[_要素|L2],_要素をn番目に挿入されたならび). n番目の要素の置換(_n,_置換要素,_ならび,_n番目の要素を置換されたならび) :- length([_|L0],_n), append(L0,[_|R],_ならび), append(L0,[_置換要素|R],_n番目の要素を置換されたならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/589 # # [1] 授業単元:アルゴリズムとデータ構造 # [2] 問題文: http://ime.nu/codepad.org/lwC4tzs0 # このコードの関数addNewNodeToHeadとdeleteFirstNodeの中身を完成させてください。 # /*------------------------------------------------ # 連結リストの実装例(リストヘッドによる方法) # ------------------------------------------------*/ # #include # #include # # //DATA型を定義(正体は int 型) # typedef int DATA; # # //NODE型の構造体定義 # typedef struct node { # struct node *next; // 次のノードへのポインタ # DATA data; // データ部 # } NODE; # # //リストの先頭ポインタを保持する変数の宣言 # NODE list_head; # # //関数のプロトタイプ宣言 # void addNewNodeToHead( DATA* ); // 先頭ノードを追加 # void deleteFirstNode(); // 先頭ノードを削除 # void showList(); //リストの表示 # # /*--------------------------------------- # メイン関数 # ---------------------------------------*/ # int main() # { # int key; # DATA value = 1; //格納する値を生成するための変数 # # // リストヘッドの初期化 # list_head.next = NULL; # # //終了の 9 が入力されるまで繰り返す # while( key != 9 ) { # # //リストの表示 # showList(); # # //メニューを表示 # printf("1.先頭に追加,2.先頭を削除,9.終了:"); # # //メニュー番号の入力と分岐 # scanf("%d",&key); # switch( key ) { # # case 1: //リストの先頭にデータを追加 # # //追加するDATA(いまは整数値)を引数に追加関数をよぶ # addNewNodeToHead( &value ); //注意:ノードを追加後,ついでに value をインクリメントしている # break; # # case 2: //先頭のデータを削除 # # //先頭の要素を削除する関数をよぶ # deleteFirstNode(); # break; # } # } # # return 0; # } # # //リストの先頭にノードを追加する # void addNewNodeToHead( DATA *d ) # { # NODE *newNode, *pos; # # # } # # // リストの先頭ノードを削除する # void deleteFirstNode() # { # NODE *pos, *prevNode; # # # } # # //連結リストの状態を表示する # void showList() # { # NODE *pos; //読み出し位置にあるノードへのポインタ変数 # # //最初のノードのアドレスを取得(注意: リストが空の場合は NULL が入っている) # pos = list_head.next; # # //末尾のノードまで繰り返す # while ( pos != NULL ) { # printf("%d ", pos->data); //データ参照して表示 # pos = pos->next; //次のノードに進む # } # # printf("\n\n"); # } # 実行結果 # 1.先頭に追加、2.先頭を削除、9.終了:1 # 1 # 1.先頭に追加、2.先頭を削除、9.終了:1 # 2 1 # 1.先頭に追加、2.先頭を削除、9.終了:2 # 1 # 1.先頭に追加、2.先頭を削除、9.終了:2 # # 1.先頭に追加、2.先頭を削除、9.終了:2 # 削除するデータがありません # 1.先頭に追加、2.先頭を削除、9.終了:9 # リストの先頭にデータを追加(_データ,_リスト,[_データ|_リスト]). 先頭のデータを削除([_データ|_リスト],_取り除かれたデータ,_リスト). 先頭のデータを削除([],_,[]) :- write('データがありません。\n'). リストヘッドの初期化(_,[]). 実行(_現在のリスト,_実行後のリスト) :- メニューを表示, メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト_1), リストの表示(_実行後のリスト_1), 実行の終了診断(_メニュー番号,_実行後のリスト_1,_実行後のリスト). 実行の終了診断(9,_実行後リスト_1,_実行後のリスト) :- !. 実行の終了診断(_,_実行後リスト_1,_実行後のリスト) :- 実行(_実行後リスト_1,_実行後のリスト). リストの表示(_リスト) :- length(_リスト,_リストの長さ), 表示パターンの生成(_リストの長さ,_表示パターン), writef(_表示パターン,_リスト), write('\n'). 表示パターンの生成(_リストの長さ,_表示パターン) :- length(L1,_リストの長さ), all(L1,'%t'), atomic_list_concat(L1,',',_表示パターン). メニューを表示 :- write('1.先頭に追加,2.先頭を削除,9.終了:'). メニュー番号の入力と分岐(_現在のリスト,_メニュー番号,_実行後のリスト) :- メニュー番号の入力(_メニュー番号), 分岐(_メニュー番号,_現在のリスト,_実行後のリスト). メニュー番号の入力(_メニュー番号) :- get_integer(_メニュー番号). 分岐(1,_現在のリスト,_実行後のリスト) :- 追加するデータを得る(_データ), リストの先頭にデータを追加(_データ,_現在のリスト,_実行後のリスト). 分岐(2,_現在のリスト,_実行後のリスト) :- 先頭のデータを削除(_現在のリスト,_,_実行後のリスト). 分岐(9,_リスト,_リスト). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/555 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # 文字型配列moji[3][10]={"coffee","black tea","green tea"};で初期化し、 # 整数型変数aが入力された場合には「coffee」、1が入力された場合には「black tea」、 # 2が入力された場合には「green tea」が出力されるプログラムを作成しなさい。 # <入力例>0 : coffee 1 : black tea 2 : green tea? 0 # <出力例>coffee # '文字型配列moji[3][10]={"coffee","black tea","green tea"};で初期化し'(LL) :- length(LL,3), findall(L,( member(_文字列,[coffee,'black tea','green tea']), atom_chars(_文字列,Chars), length(L,10), append(Chars,_,L)), LL). '整数型変数aに0が入力された場合には「coffee」、1が入力された場合には「black tea」、2が入力された場合には「green tea」が出力される'(_a) :- '文字型配列moji[3][10]={"coffee","black tea","green tea"};で初期化し'(LL), '整数型変数aに0が入力された場合には「coffee」、1が入力された場合には「black tea」、2が入力された場合には「green tea」が出力される'(_a,LL). '整数型変数aに0が入力された場合には「coffee」、1が入力された場合には「black tea」、2が入力された場合には「green tea」が出力される'(_a,LL) :- length(Ln,_a), append(Ln,[L|_],LL), 実データ部を切り取る(L,Chars), atom_chars(_文字列,Chars), writef('%t\n',[_文字列]). 実データ部を切り取る([],[]). 実データ部を切り取る([V|_],[]) :- var(V),!. 実データ部を切り取る([A|R1],[A|R2]) :- 実データ部を切り取る(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/961 # # 【課題】ttp://www.dotup.org/uploda/www.dotup.org3000377.txt.html # 【形態】1. Javaアプリケーション(main()で開始) # 【GUI】4. 制限なし # 【期限】提出期限:5月21日 22時まで # 【Ver】java version "1.7.0_03" # 【 補足 】Java初心者なので教えていただけると幸いです。 # # Janken.java # # switch構文を使用して、じゃんけんの勝敗を決めるプログラムを作る。 # グー、チョキ、パーを、それぞれchar型の値'G' 'C' 'P'で表す。 # char型の変数 p1 と p2 にキーボードからG,C,Pのいずれかを入力し代入する。 # 結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する。 # (重要) # 条件演算子を用いて、Janken.javaのswitch文をできるだけ少なくでお願いします。 # じゃんけんの勝敗を決める :- 'キーボードからG,C,Pのいずれかを入力する'(_P1,_P2), '結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する'(_P1,_P2). 'キーボードからG,C,Pのいずれかを入力する'(_P1,_P2) :- ジャンケンの入力(_P1), ジャンケンの入力(_P2). 'ジャンケンの入力'(_P1) :- write('P1? '), get_char(_P1), 'ジャンケンの入力診断'(_P1),!. 'ジャンケンの入力'(_P1) :- 'ジャンケンの入力'(_P1). 'ジャンケンの入力診断'('G'). 'ジャンケンの入力診断'('C'). 'ジャンケンの入力診断'('P'). '結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する'(_P1,_P2) :- '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P1,_P2,_結果), writef('%t\n',[_結果]). '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P,_P,'引き分けです') :- !. '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P1,_P2,'P1の勝ちです'). append(_,[_P1,_P2|_],['G','C','P','G']),!. '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_,_,'P2の勝ちです'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/961 # # 【課題】ttp://www.dotup.org/uploda/www.dotup.org3000377.txt.html # 【形態】1. Javaアプリケーション(main()で開始) # 【GUI】4. 制限なし # 【期限】提出期限:5月21日 22時まで # 【Ver】java version "1.7.0_03" # 【 補足 】Java初心者なので教えていただけると幸いです。 # # Janken.java # # switch構文を使用して、じゃんけんの勝敗を決めるプログラムを作る。 # グー、チョキ、パーを、それぞれchar型の値'G' 'C' 'P'で表す。 # char型の変数 p1 と p2 にキーボードからG,C,Pのいずれかを入力し代入する。 # 結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する。 # (重要) # 条件演算子を用いて、Janken.javaのswitch文をできるだけ少なくでお願いします。 # じゃんけんの勝敗を決める :- 'キーボードからG,C,Pのいずれかを入力する'(_P1,_P2), '結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する'(_P1,_P2). 'キーボードからG,C,Pのいずれかを入力する'(_P1,_P2) :- ジャンケンの入力(_P1), ジャンケンの入力(_P2). 'ジャンケンの入力'(_P1) :- write('P1? '), get_char(_P1), 'ジャンケンの入力診断'(_P1),!. 'ジャンケンの入力'(_P1) :- 'ジャンケンの入力'(_P1). 'ジャンケンの入力診断'('G'). 'ジャンケンの入力診断'('C'). 'ジャンケンの入力診断'('P'). '結果の表示はどちらがどちらに勝ったか、また引き分けか、表示する'(_P1,_P2) :- '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P1,_P2,_結果), writef('%t\n',[_結果]). '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P,_P,'引き分けです') :- !. '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_P1,_P2,'P1の勝ちです'). append(_,[_P1,_P2|_],['G','C','P','G']),!. '結果の表示はどちらがどちらに勝ったか、また引き分けか'(_,_,'P2の勝ちです'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/598 # # ../test/read.cgi/db/1316769778/597 # すいませんお世話になります。 # # $recordSetは繰り返し処理で処理しをしようと思っています。 # 今後です(笑 # # 2件しかデータは入れていないですが、 # # idオートインクル # # id/day/game # # 1 / 2012/03/26 / 勝ち # 2 / 2012/04/26 / 負け # # # です。 # # ちなみに # SELECT COUNT(*) FROM fx WHERE day LIKE "%2012/03/%" AND game LIKE "%勝ち%" # で実行すると # COUNT 1 と出ます。 # # SELECT COUNT(*) FROM fx WHERE day LIKE "%2012/04/%" AND game LIKE "%勝ち%" # で実行すると # COUNT 0 と出ます。 # # これを踏まえて %ここ% この中身に変数を入れたらいいんだという # 安易な考えなのですが、 # # <?php print "{$game_s}"; ?> # これを実行したら Arrayと出ました。 # # どうでしょうか? # # fx(1,'/2012/03/26/',勝ち). fx(2,'/2012/04/26/',負け). 'SELECT COUNT(*) FROM fx WHERE $条件1 AND $条件2'(_度数) :- count((fx(_id,_day,_game),_条件1,_条件2),_度数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/349 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 平面上の位置座標(x, y)から相対的に(Δx, Δy)だけ移動した位置座標を求めたいとする。 # (x, y)と(Δx, Δy)をそれぞれ配列として表現し、これを引数として受け取って # 求めたい座標を返す関数void func1(double x[], double d[], double a[])を定義して、 # その動作を確かめるプログラムを書きなさい。ただしx[]が元の位置座標、d[]が移動分、 # そしてa[]に答え が代入されるものとする。(x, y)と(Δx, Δy)はキーボードから次で入力するものとする。 # すなわち、main()は例えば次のように定義される。 # int main() # { # double A[2], B[2], C[2];//Cはfunc1()で答えを得るための配列(返信用封筒と思えばよい) # scanf("%lf %lf %lf %lf", &A[0], &A[1],&B[0],&B[1]); # func1(A,B,C); # //答えは以下で出力されるものとする。 # printf("answer = (%lf, %lf)\n", C[0],C[1]); # } # # '平面上の位置座標(x, y)から相対的に(Δx, Δy)だけ移動した位置座標を求めたいとする。(x, y)と(Δx, Δy)をそれぞれ配列として表現し、これを引数として受け取って求めたい座標を返す'([],[],[]). '平面上の位置座標(x, y)から相対的に(Δx, Δy)だけ移動した位置座標を求めたいとする。(x, y)と(Δx, Δy)をそれぞれ配列として表現し、これを引数として受け取って求めたい座標を返す'([_変数|R1],[_|R2],[_変数|R3]) :- var(_変数), '平面上の位置座標(x, y)から相対的に(Δx, Δy)だけ移動した位置座標を求めたいとする。(x, y)と(Δx, Δy)をそれぞれ配列として表現し、これを引数として受け取って求めたい座標を返す'(R1,R2,R3),!. '平面上の位置座標(x, y)から相対的に(Δx, Δy)だけ移動した位置座標を求めたいとする。(x, y)と(Δx, Δy)をそれぞれ配列として表現し、これを引数として受け取って求めたい座標を返す'([(_x,_y)|R1],[(_xの変位,_yの変位)|R2],[(_移動したx,_移動したy)|R3]) :- _移動したx is _x + _xの変位, _移動したy is _y + _yの変位, '平面上の位置座標(x, y)から相対的に(Δx, Δy)だけ移動した位置座標を求めたいとする。(x, y)と(Δx, Δy)をそれぞれ配列として表現し、これを引数として受け取って求めたい座標を返す'(R1,R2,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/301 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/3d8CbXUM # 上記のプログラムのfunc2のようにstatic変数を関数内で宣言して、main関数側で変数nに1つの偶数を入れると # 2からnまでの偶数の和と積を計算して出力するプログラムを作成しなさい。 # '2からnまでの偶数の和と積を計算して出力する'(_n) :- '2からnまでの偶数の和と積を計算して'(_n,_2から_nまでの偶数の和,_2から_nまでの偶数の積), 出力する(_n,_2から_nまでの偶数の和,_2から_nまでの偶数の積). '2からnまでの偶数の和と積を計算して'(_n,_2から_nまでの偶数の和,_2から_nまでの偶数の積) :- '2からnまでの'(_n,_2から_nまでのならび), 偶数の和(_2から_nまでのならび,_2から_nまでの偶数の和), 偶数の積(_2から_nまでのならび,_2から_nまでの偶数の積). '2からnまでの'(_n,_2から_nまでのならび) :- findall(M,( between(2,_n,M)), _2から_nまでのならび). 偶数の和([],0). 偶数の和([N|R],_和) :- 偶数(N), 偶数の和(R,_和_1), _和 is _和_1 + N. 偶数の和([N|R],_和) :- \+(偶数(N)), 偶数の和(R,_和). 偶数の積([],1). 偶数の積([N|R],_積) :- 偶数(N), 偶数の積(R,_積_1), _積 is _積_1 * N. 偶数の積([N|R],_積) :- \+(偶数(N)), 偶数の積(R,_積). 偶数(M) :- 0 is M mod 2. 出力する(_n,_2から_nまでの偶数の和,_2から_nまでの偶数の積) :- writef('2から%tまでの偶数の和は%tです\n',[_n,_2から_nまでの偶数の和]), writef('2から%tまでの偶数の積は%tです\n',[_n,_2から_nまでの偶数の積]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/301 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/3d8CbXUM # 上記のプログラムのfunc2のようにstatic変数を関数内で宣言して、main関数側で変数nに1つの偶数を入れると # 2からnまでの偶数の和と積を計算して出力するプログラムを作成しなさい。 # '2からnまでの偶数の和と積を計算して出力する'(_n) :- '2からnまでの偶数の和と積を計算して'(_n,_2から_nまでの偶数の和,_2から_nまでの偶数の積), 出力する(_n,_2から_nまでの偶数の和,_2から_nまでの偶数の積). '2からnまでの偶数の和と積を計算して'(_n,_2から_nまでの偶数の和,_2から_nまでの偶数の積) :- '2からnまでの偶数の'(_n,_2から_nまでの偶数のならび), 和(_2から_nまでの偶数のならび,_2から_nまでの偶数の和), 積(_2から_nまでの偶数のならび,_2から_nまでの偶数の積). '2からnまでの偶数の'(_n,_2から_nまでの偶数のならび) :- findall(M,( between(2,_n,M), 偶数(M)), _2から_nまでの偶数のならび). 偶数(M) :- 0 is M mod 2. 和([],0). 和([N|R],_和) :- 和(R,_和_1), _和 is _和_1 + N. 積([],1). 積([N|R],_積) :- 積(R,_積_1), _積 is _積_1 * N. 出力する(_n,_2から_nまでの偶数の和,_2から_nまでの偶数の積) :- writef('2から%tまでの偶数の和は%tです\n',[_n,_2から_nまでの偶数の和]), writef('2から%tまでの偶数の積は%tです\n',[_n,_2から_nまでの偶数の積]). % 以下のサイトは # # Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く # 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。 # 関数の引数変数にダブリがない(_関数) :- _関数 =.. [_関数名|_引数リスト], select(_着目する要素,_引数リスト,_着目する要素以外の要素リスト), 変数リストの中に着目する要素と同一変数がある(_着目する要素,_着目する要素以外の要素リスト), !, fail. 関数の引数変数にダブリがない(_). 変数リストの中に着目する要素と同一変数がある(E,[A|R]) :- E == A,!. 変数リストの中に着目する要素と同一変数がある(E,[_|R]) :- 変数リストの中に着目する要素と同一変数がある(E,R). % 以下のサイトは # # Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く # 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。 # 関数の引数変数にダブリがない(_関数) :- _関数 =.. [_関数名|_引数リスト], append(L1,[_着目する要素|L2],_引数リスト), append(L1,L2,_着目する要素以外の要素リスト), 変数リストの中に着目する要素と同一変数がある(_着目する要素,_着目する要素以外の要素リスト), !, fail. 関数の引数変数にダブリがない(_). 変数リストの中に着目する要素と同一変数がある(E,[A|R]) :- E == A,!. 変数リストの中に着目する要素と同一変数がある(E,[_|R]) :- 変数リストの中に着目する要素と同一変数がある(E,R). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/240 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/GPP4IwcH # 上記のmain関数を修正して、1から5までの和と積を求めるプログラムに修正しなさい。 # ただし、add関数の変数nを変数n1、multi関数の変数nを変数n2に変え、これらの変数をグローバル変数としてmain関数の前で宣言。 # '1から5までの和と積を求める'(_1から5までの和,_1から5までの積) :- '1から5までの和と積を求める'(1,1,_1から5までの和,1,_1から5までの積). '1から5までの和と積を求める'(5,_1から5までの和,_1から5までの和,_1から5までの積,_1から5までの積) :- !. '1から5までの和と積を求める'(N,_1から5までの和_1,_1から5までの和,_1から5までの積_1,_1から5までの積) :- N_2 is N + 1, _1から5までの和_2 is _1から5までの和_1 + N_2, _1から5までの積_2 is _1から5までの積_1 * N_2, '1から5までの和と積を求める'(N_2,_1から5までの和_2,_1から5までの和,_1から5までの積_2,_1から5までの積). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/214 # # よろしくお願いします。 # # [1] 授業単元: プログラミングC # [2] 問題文(含コード&リンク): # 値xの二乗値および三乗値を返す関数形式マクロ # sqr (x) # cub (x) # を定義し、下記(※)のようにint型変数、double型変数を用いた結果を表示しなさい。 # ※:http://ime.nu/kie.nu/a4f # :- op(550,xfx,は). sqr(_x,_二乗値) :- intger(_x), _二乗値 is _x * _x,!. sqr(_x,_二乗値) :- float(_x), _二乗値 is _x * _x. cub(_x,_三乗値) :- integer(_x), _三乗値 is _x * _x * _x,!. cub(_x,_三乗値) :- float(_x), _三乗値 is _x * _x * _x. _値 は _式 :- _式 =.. [_関数|_引数ならび], 引数ならびの評価(_引数ならび,_評価済みの引数ならび), _式_2 =.. [_関数|_評価済みの引数ならび], _値 は _式_2,!. _値 は _式 :- 関数定義(_式,_値),!. _値 は _式 :- _式 =.. [_関数|_引数ならび], append(_引数ならび,[_値],_引数ならびの二), _目標 =.. [_関数|_引数ならびの二], call(_目標),!. _値 は _式 :- _値 is _式. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/188 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # #include <stdio.h> # # int main(void) # { # int a, b, c; /* 整数変数a,b,cの宣言 */ # # printf("身長を入力してください"); # scanf("%d", &a); # printf("体重を入力してください"); # scanf("%d", &b); # # printf( "%d-%dは %d\n", a,b,c); /* 表示 */ # return 0; # } # こちらのコードを少し変えて # 身長と体重の変数(どちらも倍精度実数変数)を宣言。身長と体重を入力し、画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。 # 【実行結果例】 # 身長を入力してください(cm)?170.5 # 体重を入力してください(cm)?65.5 # 身長は170.5で、体重は65.5です。 # '身長と体重を入力し、画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。' :- '身長と体重を入力し'(_身長,_体重), '画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重). '画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重) :- '適宜コメントを'(_身長,_体重,_コメント), '身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重,_コメント). '適宜コメントを'(_身長,_体重,_コメント) :- 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定), atomic_list_concat(['BMI値は',_BMI値,' 判定は ',_BMI値判定,' です'],_コメント). '身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。'(_身長,_体重,_コメント) :- format('身長 ~1f 体重~1f',[_身長,_体重]), writef(' コメントは %t\n',[_コメント]). '身長と体重を入力し'(_身長,_体重) :- 身長の入力(_身長), 体重の入力(_体重). 身長の入力(_身長) :- get_line(Line), 身長の入力診断(Line,_身長),!. 身長の入力(_身長) :- 身長の入力(_身長). 身長の入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), number(_身長), _身長 >= 0.0, _身長 =< 250.0,!. 身長の入力診断(Line,_身長) :- writef('入力された %t からは適切な身長が得られません。再入力をお願いします。\n',[Line]), fail. 体重の入力(_体重) :- write('体重を入力してください : '), get_line(Line), 体重の入力診断(Line,_体重),!. 体重の入力(_体重) :- 体重の入力(_体重). 体重の入力診断(Line,_体重) :- atom_to_term(Line,_体重,_), number(_体重), _体重 >= 0.0, _体重 =< 250.0,!. 体重の入力診断(Line,_体重) :- writef('入力された %t からは適切な体重が得られません。再入力をお願いします。\n',[Line]), fail. 'BMI値の計算判定'(_身長,_体重,_BMI値,_BMI値判定) :- 'BMI値の計算'(_身長,_体重,_BMI値), 'BMI値の判定'(_BMI値,_BMI値の判定). 'BMI値の計算'(_身長,_体重,_BMI値) :- _身長 > 3, _BMI値 is _体重 / (_身長 ^ 2). 'BMI値の判定'(_BMI値,やせています) :- _BMI値 < 20.0,!. 'BMI値の判定'(_BMI値,普通です) :- _BMI値 >= 20.0, _BMI値 < 20.0,!. 'BMI値の判定'(_BMI値,やや肥満です) :- _BMI値 >= 24.0, _BMI値 < 26.5,!. 'BMI値の判定'(_BMI値,肥満です) :- _BMI値 >= 26.5,!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/188 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # #include <stdio.h> # # int main(void) # { # int a, b, c; /* 整数変数a,b,cの宣言 */ # # printf("身長を入力してください"); # scanf("%d", &a); # printf("体重を入力してください"); # scanf("%d", &b); # # printf( "%d-%dは %d\n", a,b,c); /* 表示 */ # return 0; # } # こちらのコードを少し変えて # 身長と体重の変数(どちらも倍精度実数変数)を宣言。身長と体重を入力し、画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。 # 【実行結果例】 # 身長を入力してください(cm)?170.5 # 体重を入力してください(cm)?65.5 # 身長は170.5で、体重は65.5です。 # 'int main(void) { }' :- 'printf("身長を入力してください");', 'scanf("%d", &a);'(_d,_a), 'printf("体重を入力してください");', 'scanf("%d", &b);'(_b), 'c = _b / ((_a / 100) * (_a / 100));'(_a,_b,_c), 'printf( "%d-%dは %d\n", a,b,c);'(_a,_b,_c). 'printf("身長を入力してください");' :- write('身長を入力してください'). 'scanf("%d", &a);'(_d,_a) :- get_integer(_a). 'printf("体重を入力してください");' :- write('身長を入力してください'). 'scanf("%d", &b);'(_b) :- get_integer(_b). 'c = a - b;'(_a,_b,_c) :- _c is _a - b. 'printf( "%d-%dは %d\n", a,b,c);'(_a,_b,_c) :- writef('%t-%tは %t\n',[_a,_b,_c]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/188 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # #include <stdio.h> # # int main(void) # { # int a, b, c; /* 整数変数a,b,cの宣言 */ # # printf("身長を入力してください"); # scanf("%d", &a); # printf("体重を入力してください"); # scanf("%d", &b); # # printf( "%d-%dは %d\n", a,b,c); /* 表示 */ # return 0; # } # こちらのコードを少し変えて # 身長と体重の変数(どちらも倍精度実数変数)を宣言。身長と体重を入力し、画面に表示する。身長と体重の表示はprintfを1回使用する。身長と体重は小数点以下1桁を表示させる。適宜コメントを書く。 # 【実行結果例】 # 身長を入力してください(cm)?170.5 # 体重を入力してください(cm)?65.5 # 身長は170.5で、体重は65.5です。 # 'int main(void) { }' :- 'printf("身長を入力してください");', 'scanf("%d", &a);'(_d,_a), 'printf("体重を入力してください");', 'scanf("%d", &b);'(_b), 'c = _b / ((_a / 100) * (_a / 100));'(_a,_b,_c), 'printf( "%d-%dは %d\n", a,b,c);'(_a,_b,_c). 'printf("身長を入力してください");' :- write('身長を入力してください'). 'scanf("%d", &a);'(_d,_a) :- get_integer(_a). 'printf("体重を入力してください");' :- write('身長を入力してください'). 'scanf("%d", &b);'(_b) :- get_integer(_b). 'c = a - b;'(_a,_b,_c) :- _c is _a - b. 'printf( "%d-%dは %d\n", a,b,c);'(_a,_b,_c) :- writef('%t-%tは %t\n',[_a,_b,_c]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/945 # # 【課題】最終課題のプログラムを,テキストフィールドから入力した学習時間の平均を求めるように書き換えてみよう。 #      例えば,次のような仕様にするといいでしょう。(paintメソッドではなく,actionPerformedメソッドで合計していく) # # 仕様 # 合計時間を参照するMyTime型の変数を,アプレットクラスのフィールドとして用意しておき, actionPerformedメソッド内で,テキストフィールドから入力された時間データを加えていく。 # 学習時間を1人分ずつ(時間,分,秒)を3つのテキストフィールドから入力していく。 # 合計の学習時間も,テキストフィールドに表示する。 # 時間が入力されてEnterキーが押されると, actionPerfomedメソッドが呼び出されるので,そこでそれまでに入力された学習時間の平均を求めて,表示する。 # 「何人分のデータが入力されたか」なども表示するようにするといいかもしれません。 #      # 【形態】Javaアプレット # 【期限】2012年4月27日(金)15時まで # 【補足】Eclipse 3.1で動作できるソース # # # よろしくお願いします。 # # テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :- テキストフィールドから入力した学習時間の(_学習時間ならび), 学習時間の平均を求める(_学習時間ならび,_学習時間の平均). テキストフィールドから入力した学習時間の(_学習時間ならび) :- テキストフィールドから入力した学習時間(_学習時間), テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび). テキストフィールドから入力した学習時間の([],[]) :- !. テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :- テキストフィールドから入力した学習時間(_学習時間_2), テキストフィールドから入力した学習時間の(_学習時間_2,R). テキストフィールドから入力した学習時間(_学習時間) :- write('学習時間をスペース区切りで _時 _分 _秒 : '), readln(L), テキストフィールドから入力した学習時間診断(L,_学習時間),!. テキストフィールドから入力した学習時間(_学習時間) :- テキストフィールドから入力した学習時間(_学習時間). テキストフィールドから入力した学習時間診断([],[]) :- !. テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :- 時の範囲内(_時), 分の範囲内(_分), 秒の範囲内(_秒),!. テキストフィールドから入力した学習時間診断(L,_学習時間) :- writef('%t Input Error: ',[L]), fail. 時の範囲内(_時) :- integer(_時), _時 >= 0. 分の範囲内(_分) :- integer(_分), _分 >= 0, _分 < 60,!. 秒の範囲内(_秒) :- integer(_秒), _秒 >= 0, _秒 < 60,!. 学習時間の平均を求める([],_) :- write('テキストフィールドから入力した学習時間が有りません\n'), fail,!. 学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :- length(_学習時間ならび,_人数), findsum([_時,_分,_秒],( member([_時,_分,_秒],_学習時間ならび)), [_合計時,_合計分,_合計秒]), 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒). 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :- 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒), _平均秒 is truncate((_換算された秒 + 0.5) / _人数), '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日). 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :- _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒. '換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :- _時 is _換算された秒 // 3600, _剰余_1 is _換算された秒 mod 3600, _分 is _剰余_1 // 60, _秒 is _剰余_1 mod 60. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/945 # # 【課題】最終課題のプログラムを,テキストフィールドから入力した学習時間の平均を求めるように書き換えてみよう。 #      例えば,次のような仕様にするといいでしょう。(paintメソッドではなく,actionPerformedメソッドで合計していく) # # 仕様 # 合計時間を参照するMyTime型の変数を,アプレットクラスのフィールドとして用意しておき, actionPerformedメソッド内で,テキストフィールドから入力された時間データを加えていく。 # 学習時間を1人分ずつ(時間,分,秒)を3つのテキストフィールドから入力していく。 # 合計の学習時間も,テキストフィールドに表示する。 # 時間が入力されてEnterキーが押されると, actionPerfomedメソッドが呼び出されるので,そこでそれまでに入力された学習時間の平均を求めて,表示する。 # 「何人分のデータが入力されたか」なども表示するようにするといいかもしれません。 #      # 【形態】Javaアプレット # 【期限】2012年4月27日(金)15時まで # 【補足】Eclipse 3.1で動作できるソース # # # よろしくお願いします。 # # テキストフィールドから入力した学習時間の平均を求める(_学習時間の平均) :- テキストフィールドから入力した学習時間の(_学習時間ならび), 学習時間の平均を求める(_学習時間ならび,_学習時間の平均). テキストフィールドから入力した学習時間の(_学習時間ならび) :- テキストフィールドから入力した学習時間(_学習時間), テキストフィールドから入力した学習時間の(_学習時間,_学習時間ならび). テキストフィールドから入力した学習時間の([],[]) :- !. テキストフィールドから入力した学習時間の(_学習時間,[_学習時間|R]) :- テキストフィールドから入力した学習時間(_学習時間_2), テキストフィールドから入力した学習時間の(_学習時間_2,R). テキストフィールドから入力した学習時間(_学習時間) :- write('学習時間をスペース区切りで _時 _分 _秒 : '), readln(L), テキストフィールドから入力した学習時間診断(L,_学習時間),!. テキストフィールドから入力した学習時間(_学習時間) :- テキストフィールドから入力した学習時間(_学習時間). テキストフィールドから入力した学習時間診断([],[]) :- !. テキストフィールドから入力した学習時間診断([_時,_分,_秒],[_時,_分,_秒]) :- 時の範囲内(_時), 分の範囲内(_分), 秒の範囲内(_秒),!. テキストフィールドから入力した学習時間診断(L,_学習時間) :- writef('%t Input Error: ',[L]), fail. 時の範囲内(_時) :- integer(_時), _時 >= 0. 分の範囲内(_分) :- integer(_分), _分 >= 0, _分 < 60,!. 秒の範囲内(_秒) :- integer(_秒), _秒 >= 0, _秒 < 60,!. 学習時間の平均を求める([],_) :- write('テキストフィールドから入力した学習時間が有りません\n'), fail,!. 学習時間の平均を求める(_学習時間ならび,_学習時間の平均) :- length(_学習時間ならび,_人数), findsum([_時,_分,_秒],( member([_時,_分,_秒],_学習時間ならび)), [_合計時,_合計分,_合計秒]), 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒). 学習時間の平均を求める(_人数,_合計時,_合計分,_合計秒,_平均時,_平均分,_平均秒) :- 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒), _平均秒 is truncate((_換算された秒 + 0.5) / _人数), '換算された秒を時、分、秒に還元'(_換算された秒,_平均時,_平均分,_平均日). 一旦秒に換算する(_合計時,_合計分,_合計秒,_換算された秒) :- _換算された秒 is _合計時 * 3600 + _合計分 * 60 + _合計秒. '換算された秒を時、分、秒に還元'(_換算された秒,_時,_分,_秒) :- _時 is _換算された秒 // 3600, _剰余_1 is _換算された秒 mod 3600, _分 is _剰余_1 // 60, _秒 is _剰余_1 mod 60. % 以下のサイトは # # 匿名変数リストを使った割り算 # 匿名変数リストを使ったわり算(L1,L2,_商,_剰余) :- 匿名変数リストを使ったわり算(L1,L2,[],_商,_剰余). 匿名変数リストを使ったわり算(_剰余,L2,_商,_商,_剰余) :- \+((append(L2,R,L2_R),_剰余 = L2_R)). 匿名変数リストを使ったわり算(L1,L2,L3,_商,_剰余) :- append(L2,R,L2_R), L1 = L2_R, 匿名変数リストを使ったわり算(R,L2,[_|L3],_商,_剰余). % 以下のサイトは # # % ?- variablize([a,b,c], X, L). # % L = [[X, b, c], [a, X, c], [a, b, X]] # Now I am trying to extend this predicate to accept a list of variables, example: # # % ?- variablize([a,b,c], [X,Y], L). # % L = [[X, Y, c], [X, b, Y], [a, X, Y]] # My code so far is: # # replace_at([_|Tail], X, 1, [X|Tail]). # replace_at([Head|Tail], X, N, [Head|R]) :- M is N - 1, replace_at(Tail, X, M, R). # # replace_each([], _, _, [], _). # replace_each([_|Next], Orig, X, [Res|L], N) :- # replace_at(Orig, X, N, Res), # M is N + 1, # replace_each(Next, Orig, X, L, M). # # variablize(I, X, L) :- replace_each(I, I, X, L, 1). # Any pointers? Do I extend replace_at/4 to have a list of indexes that should be skipped? # variablize(L1,L2,L) :- append(L1,L2,L3), length(L1,Len1), length(L2,Len2), findall(L4,( 組合せ(L3,Len1,L4), 変数の個数(L4,Len2)), L). 変数の個数([],0). 変数の個数([V|R],N) :- var(V), 変数の個数(R,N1), N is N1 + 1. 変数の個数([_|R],N) :- 変数の個数(R,N). % 以下のサイトは # # 売上('20120416',トマト,3000). # 売上('20120417',ナス,1000). # 売上('20120416',トマト,1500). # 売上('20120417',ナス,2200). # # の時に、日付ごとの合計売上が欲しい。 # # ?- 集約加算(_集約値,[_日付,_集約値],[_日付],[_金額],売上(_日付,_品目,_金額),_解). # # _解 = [['20120416',4500],['20120417',3200]] # 集約加算(_集約解変数指定,_選択項,_鍵項,_集約項,P,_解) :- findsetof(_鍵項,P,L1), findkeysort(_選択項,_鍵項,( member(_鍵項,L1), findsum(_集約項,P,_集約解変数指定)), _解_1), 集約加算の解を平坦化する(_解_1,_解). 集約加算の解を平坦化する(_解_1,_解) :- findall(L3,( member(L2,_解_1), 平坦化(L2,L3)), _解) . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). findkeysort(Select,Keys,P,List) :- append(Keys,Select,Keys2), findall(Keys2,P,List1), sort(List1,List2), findall(Select,member(Keys2,List2),List). 平坦化(_深いならび,_平坦化されたならび) :- 差分ならびによる平坦化(_深いならび,_平坦化されたならび - []) . 差分ならびによる平坦化([_項|_残りならび],_差分ならび頭部 - _差分ならび尾部) :- 差分ならびによる平坦化(_項,_差分ならび頭部 - _不完全な差分ならび), 差分ならびによる平坦化(_残りならび,_不完全な差分ならび - _差分ならび尾部) . 差分ならびによる平坦化([],_差分ならび頭部 - _差分ならび尾部) :- _差分ならび頭部 = _差分ならび尾部 . 差分ならびによる平坦化(_項,[_項|_差分ならび尾部] - _差分ならび尾部) :- \+(list(_項)),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/745 # # ●正規表現の使用環境 # PCREライブラリを使用したアプリケーション # # ●検索か置換か? # 置換 # # ●説明 # HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索 # もし有れば対応する前方タグ内の後ろに@を付けたい # # ●対象データ # <AB><CD>nea##kv</CD>nk#eccu</AB> # nea<YY><EF>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK>#<CD>asiaev</CD>un##ima</KK> # # ●希望する結果 # <AB><CD@>nea##kv</CD>nk#eccu</AB> # nea<YY><EF@>###v</EF>orarcmm</YY> # <HA>ne#<YY>#</YY>ec#cv</HA>axxzi # <KK@>#<CD>asiaev</CD>un##ima</KK> # % % ここでは、 % 非決定性の処理を考える。先頭から順に置換が進んでいくように。 % 注意するべきことは、普通に非決定性に書くと、既に置換したつもりの % 部分が変数の束縛が解かれて、置換前の状態にもどってしまうこと。 % この型の述語では常にその点に注意する。 % 'HTMLタグ形式で括られたテキストで#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_文字列,_置換された文字列) :- タグとデータに分割する(_文字列,_タグとデータならび), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(_タグとデータならび,_置換されたタグとデータならび), atomic_list_concat(_置換されたタグとデータならび,_置換された文字列). タグとデータに分割する(_文字列,[_前データ,_タグ|R]) :- データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列), タグとデータに分割する(_残り文字列,R),!. タグとデータに分割する(_文字列,[_文字列]). データとタグの切り取り(_文字列,_前データ,_タグ,_残り文字列) :- sub_atom(_文字列,S1,1,_,'<'), sub_atom(_文字列,0,S1,_,_前データ), sub_atom(_文字列,S2,1,_,'>'), Len is S2 - S1 + 1, sub_atom(_文字列,S1,Len,R,_タグ), sub_atom(_文字列,S2_2,R,0,_残り文字列),!. '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L1,L2) :- append(L0,[A,B|R],L1). タグである(A), '#が二つ以上ある'(B), sub_atom(A,_,_,2,A_1), atomic_list_concat([A_1,'@>',B],C), append(L0,[C,B|R1],L2), '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R,L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([A|R1],[A|R2]) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,R2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'([],[]). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2). append(L0,[C|R1],L2). '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(L0,A,B,C,R1,L2) :- '#が二つ以上有るものを検索もし有れば対応する前方タグ内の後ろに@を付けたい'(R1,L2_1), append(L0,[C,B|L2_1],L2). タグである(A) :- sub_atom(A,0,1,_,<), sub_atom(A,_,1,0,>). '#が二つ以上ある'(B) :- count(sub_atom(B,_,1,_,'#'),Count), Count >= 2. % % count/2 % % 以下のサイトは % % 20年以上前のProlog反古を見つけた。少し編集して載せてみる。 % 出処は不明。内生変数,ラグつき内生変数,政策変数,与件変数の四述語で終端するらしい。 % 各変数の説明はどのように述語とするつもりだったのだろうか? % '構造方程式に含まれる経済変量は,それらの確率的特性にしたがって次のように分類される'(_構造方程式に含まれる経済変量) :- 内生変数であるか先決変数である(_構造方程式に含まれる経済変量). 内生変数であるか先決変数である(_構造方程式に含まれる経済変量) :- 内生変数(_構造方程式に含まれる経済変量). 内生変数であるか先決変数である(_構造方程式に含まれる経済変量) :- 先決変数(_構造方程式に含まれる経済変量). 先決変数(_構造方程式に含まれる経済変量) :- 外生変数であるかラグつき内生変数である(_構造方程式に含まれる経済変量). 外生変数であるかラグつき内生変数である(_構造方程式に含まれる経済変量) :- 外生変数(_構造方程式に含まれる経済変量). 外生変数であるかラグつき内生変数である(_構造方程式に含まれる経済変量) :- ラグつき内生変数(_構造方程式に含まれる経済変量). 外生変数(_構造方程式に含まれる経済変量) :- 政策変数であるか与件変数である(_構造方程式に含まれる経済変量). 政策変数であるか与件変数である(_構造方程式に含まれる経済変量) :- 政策変数(_構造方程式に含まれる経済変量). 政策変数であるか与件変数である(_構造方程式に含まれる経済変量) :- 与件変数(_構造方程式に含まれる経済変量). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/734 # # [1]C言語(やさしいC 輪講) # [2]問題文: # 次のコードは、コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力するプログラムです。 # ([1])〜([11])内を埋めてコードを完成させなさい。 # #include <stdio.h> # #include <stdlib.h> # static int readNumber(char *msg,int min,int max,int m1,int m2,int m3,int m4){ # char console[256],([1]);([2]) result; # for(;;){ # printf("%s",msg); # t=fgets( ([3]),stdin); # if(t==NULL)([5]); # result=atoi(([3])); # if(result<([6]))([5]);if(result>([7]))([5]); # if(m1==result){ # printf("その数は使われています\n"); # ([5]); # } # ([8]) # return result; # } # } # int main(void){ # int m; # m=readNumber("1個目:1以上20以下の整数を入力してください:",([9]),([10]),0,0,0,0); # ([11]) # return 0; # } # [3] Windows Vistaですがコンパイラとかよくわかりません。 # [4] 4月の最初のゼミまで(3年次・4年次と連続履修です) # [5]ローカル変数はステートメントが始まる前にすべて宣言しなければならないと注意を受けました。よろしくお願いします。 # # 'コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力する' :- 'コンソールから入力された異なる5個の1から20までの数を'([],_異なる5個の1から20までの数), 大きい順に並べ替えて出力する(_異なる5個の1から20までの数). 'コンソールから入力された異なる5個の1から20までの数を'(L,[]) :- length(L,5),!. 'コンソールから入力された異なる5個の1から20までの数を'(L,[_1から20までの数|R]) :- 'コンソールから入力された異なる1から20までの数'(L,_1から20までの数), 'コンソールから入力された異なる5個の1から20までの数を'([_1から20までの数|L],R). 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- write('異なる1から20までの数を入力して下さい : '), コンソールから入力された(Line), '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数),!. 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数). コンソールから入力された(Line) :- get_line(Line). '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数) :- atom_to_term(Line,_数,_), '異なる'(_数,L), '1から20までの数'(Line,_数),!. '異なる'(_数,L) :- \+(member(_数,L)),!. '異なる'(_数,L) :- writef('入力された数%tは既に入力済みです。再入力をお願いします。\n',[_数]), fail. '1から20までの数'(Line,_数) :- 数(_数), '1から20までの'(_数),!. '1から20までの'(_数) :- _数 >= 1, _数 =< 20,!. '1から20までの'(_数) :- writef('入力された数%tは1から20の範囲にありません。再入力をお願いします。\n',[_数]), fail. 数(_,_数) :- number(_数),!. 数(Line,_数以外の項) :- writef('入力された %t からは数が得られません。再入力をお願いします\n',[Line]), fail. 大きい順に並べ替えて出力する(_異なる5個の1から20までの数) :- 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび), 出力する(_大きい順に整列したならび). 大きい順に並べ替えて(L1,L2) :- 大きい順に並べ替えて(L1,[],L2). 大きい順に並べ替えて([],L,L). 大きい順に並べ替えて([A|R],L1,L) :- 大きい順の挿入(A,L1,L2), 大きい順に並べ替えて(R,L2,L). 大きい順の挿入(A,[],[A]). 大きい順の挿入(A,[B|R1],[A,B|R1]) :- A >= B,!. 大きい順の挿入(A,[B|R1],[B|R2]) :- 大きい順の挿入(A,R1,R2). 出力する(_大きい順に整列したならび) :- swritef(_表示する数列,'%t,%t,%t,%t,%t\n',_大きい順に整列したならび), writef('%t\n',[_表示する数列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/734 # # [1]C言語(やさしいC 輪講) # [2]問題文: # 次のコードは、コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力するプログラムです。 # ([1])〜([11])内を埋めてコードを完成させなさい。 # #include <stdio.h> # #include <stdlib.h> # static int readNumber(char *msg,int min,int max,int m1,int m2,int m3,int m4){ # char console[256],([1]);([2]) result; # for(;;){ # printf("%s",msg); # t=fgets( ([3]),stdin); # if(t==NULL)([5]); # result=atoi(([3])); # if(result<([6]))([5]);if(result>([7]))([5]); # if(m1==result){ # printf("その数は使われています\n"); # ([5]); # } # ([8]) # return result; # } # } # int main(void){ # int m; # m=readNumber("1個目:1以上20以下の整数を入力してください:",([9]),([10]),0,0,0,0); # ([11]) # return 0; # } # [3] Windows Vistaですがコンパイラとかよくわかりません。 # [4] 4月の最初のゼミまで(3年次・4年次と連続履修です) # [5]ローカル変数はステートメントが始まる前にすべて宣言しなければならないと注意を受けました。よろしくお願いします。 # # 'コンソールから入力された異なる5個の1から20までの数を大きい順に並べ替えて出力する' :- 'コンソールから入力された異なる5個の1から20までの数を'([],_異なる5個の1から20までの数), 大きい順に並べ替えて出力する(_異なる5個の1から20までの数). 'コンソールから入力された異なる5個の1から20までの数を'(L,[]) :- length(L,5),!. 'コンソールから入力された異なる5個の1から20までの数を'(L,[_1から20までの数|R]) :- 'コンソールから入力された異なる1から20までの数'(L,_1から20までの数), 'コンソールから入力された異なる5個の1から20までの数を'([_1から20までの数|L],R). 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- write('異なる1から20までの数を入力して下さい : '), コンソールから入力された(Line), '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数),!. 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数) :- 'コンソールから入力された異なる1から20までの数'(L,_異なる5個の1から20までの数). コンソールから入力された(Line) :- get_line(Line). '異なる1から20までの数'(Line,L,_異なる5個の1から20までの数) :- atom_to_term(Line,_数,_), 異なる(_数,L), '1から20までの数'(Line,_数),!. 異なる(_数,L) :- \+(member(_数,L)),!. 異なる(_数,L) :- writef('入力された数%tは既に入力済みです。再入力をお願いします。\n',[_数]), fail. '1から20までの数'(Line,_数) :- 数(_数), '1から20までの'(_数),!. '1から20までの'(_数) :- _数 >= 1, _数 =< 20,!. '1から20までの'(_数) :- writef('入力された数%tは1から20の範囲にありません。再入力をお願いします。\n',[_数]), fail. 数(_,_数) :- number(_数),!. 数(Line,_数以外の項) :- writef('入力された %t からは数が得られません。再入力をお願いします\n',[Line]), fail. 大きい順に並べ替えて出力する(_異なる5個の1から20までの数) :- 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび), 出力する(_大きい順に整列したならび). 大きい順に並べ替えて(_異なる5個の1から20までの数,_大きい順に整列したならび) :- sort(_異なる5個の1から20までの数,_整列したならび), reverse(_整列したならび,_大きい順に整列したならび). 出力する(_大きい順に整列したならび) :- swritef(_表示する数列,'%t,%t,%t,%t,%t\n',_大きい順に整列したならび), writef('%t\n',[_表示する数列]). /* 大きい順に並べ替えて(L1,L2) :- 大きい順に並べ替えて(L1,[],L2). 大きい順に並べ替えて([],L,L). 大きい順に並べ替えて([A|R],L1,L) :- 大きい順の挿入(A,L1,L2), 大きい順に並べ替えて(R,L2,L). 大きい順の挿入(A,[],[A]). 大きい順の挿入(A,[B|R1],[A,B|R1]) :- A >= B,!. 大きい順の挿入(A,[B|R1],[B|R2]) :- 大きい順の挿入(A,R1,R2). */ % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/557 # # 初めて書き込みます。よろしくお願い致します。固定長バイトの文字列の中の一部を抜き出すところがわかりませんでした。 # 1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上の # それぞれのテキストデータ・ファイルがある。 # 文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を # 比較し、 # 同じなら、文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を # 置き換える。 # 文字列Bの4カラム目が50バイト以下なら " "空白で埋める。 # 50バイトより大きい場合50バイトまでの大きさを対象とする。 # # 置き換え対象領域は日本語全角漢字含む文字列となる。 # 文字列Aの対象領域は2バイトx20文字+1バイト10文字で整形されている。 # 文字列AはSolaris10上のファイル。文字列BはエクセルファイルをCSV保存してFFFTPでSolaris10へコピーしたもの。 # 文字コード:文字列A(EUC-JP)、文字列B(sjis2eucで変換) # # 1ー77バイトが1バイト、77ー126が変換対象。126ー150が1バイトです。 '文字列A(固定長150バイト)一万行以上と文字列B(CSV)一万行以上のそれぞれのテキストデータ・ファイルがある。' :- get_lines('文字列A',Lines1), get_lines('文字列B',Lines2), '文字列Aの全行を置換する'(Lines1,Lines2,Lines3), 'Lines3を文字列Aに書き戻す'(Lines3,_文字列A),!. '文字列Aの全行を置換する'([],_,[]) :- !. '文字列Aの全行を置換する'([_文字列A|R1],Lines2,[_置換した文字列|R3]) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,Lines2,_置換した文字列), '文字列Aの全行を置換する'(R1,Lines2,R3). 'Lines2を検索して文字列Aを置換する'(_文字列A,[],_文字列A) :- !. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_文字列B|R2],_置換した文字列) :- '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列),!. 'Lines2を検索して文字列Aを置換する'(_文字列A,[_|R2],_置換した文字列) :- 'Lines2を検索して文字列Aを置換する'(_文字列A,R2,_置換した文字列),!. '文字列Aを一行の置換'(_文字列A,_文字列B,_置換した文字列) :- split(_文字列B,[' ',','],L), '文字列A の5文字目から6文字分と文字列Bの2カラム目の4文字目から6文字分を比較し同じなら'(_文字列A,L), '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列). '文字列Aの 77文字目から50バイト分を文字列Bの4カラム目を置き換える'(_文字列A,L,_置換された文字列) :- sub_byte_atom(_文字列A,0,76,_,S1), sub_byte_atom(_文字列A,126,_,0,S3), '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2), concat_atom([S1,S2,S3],_置換された文字列),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- '文字列Bの4カラム目が'(L,S2_1), '50バイト以下なら'(S2_1), '" "空白で埋める'(S2_1,S2),!. '文字列Bの4カラム目が50バイト以下なら " "空白で埋める。50バイトより大きい場合50バイトまでの大きさを対象とする。'(L,S2) :- nth1(4,L,S_1), sub_byte_atom(S_1,0,50,_,S2). '文字列Bの4カラム目が50バイト以下なら'(L) :- nth1(4,L,S_1), atom_byte_length(S_1,_長さ), _長さ =< 50,!. '" "空白で埋める'(S2_1,S2) :- length(L2,50), atom_byte_codes(S2_1,L_1), append(L_1,_,L2), 変数を空白に置換(L2), atom_byte_codes(S2,L2),!. 変数を空白に置換([]). 変数を空白に置換([' '|R]) :- 変数を空白に置換(R),!. 変数を空白に置換([A|R]) :- 変数を空白に置換(R). 'Lines3を文字列Aに書き戻す'(Lines3) :- put_lines('文字列A',Lines3). atom_byte_codes(Atom,ByteCodes) :- atom(Atom), atom_codes(Atom,Codes), バイトに分解(Codes,ByteCodes),!. atom_byte_codes(Atom,ByteCodes) :- \+(atom(Atom)), 'ByteCodes2Codes'(ByteCodes,Codes), atom_codes(Atom,Codes),!. 'ByteCodes2Codes'([],[]). 'ByteCodes2Codes'([A,B|R1],[C|R2]) :- A > 127, B > 127, C is 256 * A + B, 'ByteCodes2Codes'(R1,R2),!. 'ByteCodes2Codes'(R1,R2) :- 'ByteCodes2Codes'(R1,R2),!. atom_byte_length(Atom,ByteLength) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), length(ByteCodes). atom_byte_codes(Atom,ByteCodes) :- atom_codes(Atom,Codes), バイトに分解(Code,ByteCodes). sub_byte_atom(_文字列,_スタートバイト位置,_バイト数,_残りバイト,_副文字列) :- atom_codes(_文字列,Codes), バイトに分解(Codes,ByteCodes), sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList), atom_code(_副文字列,SubList). sub_byte_list(ByteCodes,_スタートバイト位置,_バイト数,_残りバイト,SubList) :- length(L0,_スタートバイト位置), length(L1,_バイト数), append(L0,SubList,L2,ByteCodes), length(L2,_残りバイト),!. バイトに分解([],[]). バイトに分解([A|R1],[B,C|R2]) :- A > 255, B is A // 256, C is A mod 256, バイトに分解(R1,R2),!. バイトに分解([A|R1],[A|R2]) :- バイトに分解(R1,R2). % 以下のサイトは # # Prologという宣言型プログラミング言語にふれる。ルールを定義するという点を除くと、 # 確かにSQL(データに対しこれ欲しいみたいなクエリ)に近しい感じがします。 # ということで、アクセスパス(性能)が気になるのは、命令型に侵されてるからかな? % % Prologの述語の定義節の間では基本的に情報の授受ができません。 % 具体的に示しましょう。 % 成績(阿部,70). 成績(尾崎,55). 成績(山田,90). % と定義されている時、三人の平均点を取りたいとします。(集約問題) ?- 成績(_,_成績). _ = 阿部, _成績 = 70; _ = 尾崎, _成績 = 55; _ = 山田, _成績 = 90; false % というように取得できますが、_ = _尾崎,_成績 = 55が取得できた時には阿部の % 情報は変数の束縛を開放してしまっていますから、利用できません。 % 個々の節が全く独立しているわけですから合計していくことができないことになります。 % ただし、以下のように情報が連鎖するように仕組めば可能になります。 % 成績(阿部,尾崎,70). 成績(尾崎,山田,55). 成績(山田,阿部,90). 成績の平均(_起点,_平均点) :- 成績(_起点,_生徒,_), 成績の合計(_起点,_生徒,_人数,_合計), _平均点 is _合計 / _人数. 成績の合計(_起点,_起点,1,_成績) :- 成績(_起点,_,_成績),!. 成績の合計(_起点,_生徒_1,_人数,_合計) :- 成績(_生徒_1,_生徒_2,_成績), 成績の合計(_起点,_生徒_2,_人数_2,_合計_2), _合計 is _合計_2 + _成績, _人数 is _人数_2 + 1. % と一応はできました。 % 実は集約するために必要な条件は情報の連鎖なのです。 % Prologで扱う連鎖構造の代表にリストがあります。 % ここでも、[70,55,90]というリストが欲しい。 % 成績という述語の節の中にある成績(点数)だけを抜き出してリストとしたい。 % これを実現するfindallというメタ述語がPrologには用意されています。 成績(阿部,70). 成績(尾崎,55). 成績(山田,90). 成績リスト(_成績リスト) :- findall(_成績,成績(_,_成績),_成績リスト). ?- 成績リスト(_成績リスト). _成績リスト = [70,55,90]; false % と成ります。 % % このfindallこそ SQL にそっくりですね。 % 成績の平均(_平均点) :- 成績リスト(_成績リスト), sum(_成績リスト,_合計), length(_成績リスト,_人数), _平均点 is _合計 / _人数. % ただし、sumの定義は sum([],0). sum([N|R],_合計) :- sum(R,_合計_2), _合計 is _合計_2 + N. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1328276597/489 # # [1] 授業単元:C言語演習 # [2] 問題文: # キーボードで入力された名前をchar型の一次元の配列nameに入れていきます。 # 各名前の先頭アドレスをp_nameに入れます。 # p_nameのアドレスをptrptrに入れます。 # 最後に一番長い名前と一番短い名前、変数ptrptr、p_name、nameのアドレスを表示します。 # 実行例: # 名前を10個まで入力できます。桁数は最大30です。 # name1: tanaka # name2: nakabayashi # name3: hama #    ・ #    ・ # 一番長いのは"nakabayashi"で、11桁。 # 一番短いのは"hama"で、4桁。 # Adress of name: 231191 Adress of p_name: 231511 Adress of ptrptr: 231551 # # 'キーボードで入力された名前をならび_nameに入れていきます。一番長い名前と一番短い名前を表示します。' :- キーボードで入力されたならび_nameに入れていきます(_name), 一番長い名前と一番短い名前を表示します(_name). 一番長い名前と一番短い名前を表示します(_name) :- 一番長い名前(_name,_一番長い名前ならび), 一番短い名前(_name,_一番短い名前ならび), 表示します(_一番長い名前ならび,_一番短い名前ならび). 一番長い名前(_name,_一番長い名前ならび) :- findmax(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番長い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番長い長さ,_名前)), 一番長い名前ならび). 一番短い名前(_name,_一番短い名前ならび) :- findmin(_名前の長さ,( member(_名前,_name), sub_atom(_名前,0,_名前の長さ,0,_名前)), _一番短い長さ), findall(_名前,( member(_名前,_name), sub_atom(_名前,0,_一番短い長さ,_名前)), 一番短い名前ならび). 表示します(_一番長い名前ならび,_一番短い名前ならび) :- concat_atom(_一番長い名前ならび,' , ',_一番長い名前表示), writef('一番長い名前は %t です。\n',[_一番長い名前表示]), concat_atom(_一番短い名前ならび,' , ',_一番短い名前表示), writef('一番短い名前は %t です。\n',[_一番短い名前表示]). キーボードで入力された名前をならび_nameに入れていきます(_name) :- findall(_名前,( 名前を入力(_名前,_終了状態), ( _終了状態=終了,!,fail; true)), _name). 名前を入力(_名前,_終了状態) :- append(L0,_,_), length([_|L0],Nth), writef('名前[%t]: ',[Nth]), get_line(Line), 名前入力検査(Line,_名前,_終了状態). 名前入力検査('',_,終了) :- !. 名前入力検査(end_of_file,_,終了) :- !. 名前入力検査(名前,_名前,正常). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1325685876/122 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org2496567.txt.html # # 設問1-1 # プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録するプログラムを作成し、 # 10人分の適当なデータをキーボードから入力して実行しなさい。 # プログラムとしてはn(>0)人分のデータを記録できるように作成し、変数nの値はキーボードから入力できるようにしなさい。 # ただし、データはキーボードから入力しファイルに書き込むこととする。 # それぞれのファイルには、出席番号、前期の結果、後期の結果を次のように記録するものとする。 # # 出席の記録 # ファイル名:Class_Participation.txt # # 1, 12, 5 # 2, 10, 12 # 3, 11, 15 # 4, 4, 15 # 5, 8, 14 # # …, …, … # # 試験の記録 # ファイル名:Exams.txt # # 1, 88, 90 # 2, 96, 75 # 3, 40, 80 # 4, 40, 75 # 5, 90, 90 # # …, …, … # # 設問1-2 # 設問1-1のデータについて、成績は、((前期出席回数+後期出席回数)+(前期試験点数+後期試験点数))/2で評価するものとし、 # 設問1-1で作成したファイルからデータを読み込み、成績を計算表示するプログラムを作成し、実行してみなさい。 # 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録するプログラムを作成し、10人分の適当なデータをキーボードから入力して実行しなさい' :- 'n人分の適当なデータをキーボードから入力'(10,_n人分のデータ), 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録する'(_n人分のデータ). 'n人分の適当なデータをキーボードから入力'(_n人,_n人分のデータ) :- length(_n人分のデータ,_n人), findall(_データ,( append(Ln,[_データ|_],_n人分のデータ), データ入力([_|Ln],_データ)), _n人分のデータ). データ入力(Ln,[_学生番号,_前期出席数,_後期出席数,_前期成績,_後期成績]) :- length(Ln,_何番目), writef('第%t番目の 学生番号,前期出席数,後期出席数,前期成績,後期成績(5項目)をカンマ区切りで入力してください : ',[_何番目]), readln([_学生番号,_前期出席数,_後期出席数,_前期成績,_後期成績]),!. データ入力(Ln,_データ) :- write('もう一度入力しなおして下さい\n'), データ入力(Ln,_データ). 'プログラミング実習の出席回数と試験結果をそれぞれ別々のファイルに記録する'(_n人分のデータ) :- 'プログラミング実習の出席回数をファイルClass_Participation.txtに書きだす'(_n人分のデータ), 'プログラミング実習の試験結果をファイルExams.txtに書きだす'(_n人分のデータ). 'プログラミング実習の出席回数をファイルClass_Participation.txtに書きだす'(_n人分のデータ) :- open('Class_Participation.txt',write,Outstream), append(_,[[_学生番号,_前期出席数,_後期出席数,_,_]|R],_n人分のデータ), writef(Outstream,'%t,%t,%t\n',[_学生番号,_前期出席数,_後期出席数]), R = [], close(Outstream). 'プログラミング実習の出席回数をファイルExams.txtに書きだす'(_n人分のデータ) :- open('Exams.txt',write,Outstream), append(_,[[_学生番号,_,_,_前期成績,_後期成績]|R],_n人分のデータ), writef(Outstream,'%t,%t,%t\n',[_学生番号,_前期成績,_後期成績]), R = [], close(Outstream). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/903 # # [1] 授業単元:計算機アルゴリズムファイルへの書き込み # [2] 問題文(含コード&リンク):以下の実行例のように、キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数) # を次々と読み込んで、そのデータをファイルに書きこむプログラムを作成せよ。 # # 以下の要件を満たすとする # ・書きこむのファイル名をユーザに入力させる # ・同じ名前の友人の情報がすでに入力されたかどうかは確認しなくても良い。 # ・同じ名前のファイルはすでに存在する場合には、内容を上書きするものとする。 # ・作成されたファイルの中身は以下の実行例(catコマンドの結果)のようにするものとする。 # ・以下の実行例のように,1人文のデータを入力するごとに「続けますか(yse...1/NO...0:)」のように表示を促し1が入力されたら処理を続けるプログラムとする。 # # [5] その他の制限:[実行例] # 書きこむファイル名:friends.txt # 友人の名前:Goro # 誕生日(yyyymmdd):19911001 # 続けますか?(yes...1/NO...0):1 # 友人の名前:Taro # 誕生日(yyyymmdd):19890505 # 続けますか?(yes...1/NO...0):1 # 友人の名前:Akira # 誕生日(yyyymmdd):19920222 # 続けますか?(yes...1/NO...0):0 # # %cat freinds.txt # Goro 19911001 # Taro 19890505 # Akira 19920222 # 宜しくお願いします。 # 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで、そのデータをファイルに書きこむ'(_ファイル) :- 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_名前_生年月日ならび), 'そのデータをファイルに書きこむ'(_ファイル,_名前_生年月日ならび). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_名前_生年月日ならび) :- 友人の名前を読み込む(_友人の名前), 生年月日を読み込む(_生年月日), 続行するか終了するか問う(_答え), 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_答え,_友人の名前,_生年月日,_名前_生年月日ならび). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(0,[]). 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_,_友人の名前,_生年月日,[[_友人の名前,_生年月日]|R]) :- 友人の名前を読み込む(_友人の名前_2), 生年月日を読み込む(_生年月日_2), 続行するか終了するか問う(_答え), 'キーボードから友人の名前(文字列)と生年月日(yyyymmdd形式のlong型変数)を次々と読み込んで'(_答え,_友人の名前_2,_生年月日_2,R). 友人の名前を読み込む(_友人の名前) :- write('友人の名前:'), get_line(_友人の名前). 生年月日を読み込む(_生年月日) :- write('誕生日(yyyymmdd):'), get_line(_生年月日). 続行するか終了するか問う(_答え) :- write('続けますか?(yes...1/NO...0):'), get_line(Line), 続行するか終了するか診断(Line,_答え),!. 続行するか終了するか問う(_答え) :- 続行するか終了するか問う(_答え). 続行するか終了するか診断(Line,_答え) :- atom_to_term(Line,_答え,_), integer(_答え), _答え >= 0, _答え =< 1,!. 続行するか終了するか診断(Line,_答え) :- fail. 'そのデータをファイルに書きこむ'(_ファイル,_名前_生年月日ならび) :- open(_ファイル,write,Outstream), append(_,[[_友人の名前,_生年月日]|R],_名前_生年月日ならび), writef('%t %t\n',[_友人の名前,_生年月日]), R = [], close(Outstream). % 以下のサイトは # Prologの問題です。 # リストがあります。このリストの要素数を割り算する述語を作ります。 # 第二引数の匿名変数のリストの要素数で割り、 # 商を第三引数にリストの要素数として、 # 余りを第四引数のリストの要素数として返します。 # 第二引数以降は全て匿名変数のリストになります。 リストの要素数の割り算(_リスト,_除数リスト,_商リスト,_剰余リスト) :- length(_リスト,_要素数), length(L,_要素数), リストの割り算(L,_除数リスト,_商リスト,_剰余リスト). リストの割り算(L,_除数リスト,[_|R3],R4) :- append(_除数リスト,R1,L), リストの割り算(R1,_除数リスト,R3,R4),!. リストの割り算(L,_,[],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/562 # # [1] プログラミング実習応用 # [2] ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み、 # x,yそれぞれの平均値(重心)を計算して、画面上に表示するプログラムを作成せよ # □"tmp.csv"は「関数y=x^3-xのグラフを描くため、定義域[-2,2]に対するyの値を0.1刻みで計算し、 # 結果をファイルに出力する」というプログラムで作ったファイルで、もう用意してあります。 # □コンパイラの標準外の仕様による異常終了を避けるため、変数の宣言部分にダミーの変数を追加する。例えば、"double dummy=0.0;"(変数名や値は変えてよい) # 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み、x,yそれぞれの平均値(重心)を計算して、画面上に表示する' :- 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み'(_x座標ならび,_y座標ならび), 'x,yそれぞれの平均値を計算して'(_x座標ならび,_y座標ならび,_xの平均,_yの平均), 画面上に表示する(_xの平均,_yの平均). 'ファイル"tmp.csv"を入力ファイルとして、座標(x,y)の組を終端まで読み込み'(_x座標ならび,_y座標ならび) :- get_chars('tmp.csv',Chars), 座標の組(Chars,_x座標ならび,_y座標ならび). 座標の組(Chars,[V|_座標ならび_1],_座標ならび_2) :- 座標の組(Chars,L,_座標ならび_2,_座標ならび_1), 実数に変換(L,V). 座標の組([],[],[],[]) :- !. 座標の組([],L,[V],[]) :- 実数に変換(L,V),!. 座標の組([_区切り記号|R1],[],[V|_座標ならび_1],_座標ならび_2) :- member(_区切り記号,[' ','\t',',','\n','(',')']), 座標の組(R1,L,_座標ならび_2,_座標ならび_1), 実数に変換(L,V),!. 座標の組([A|R1],[A|R2],_座標ならび_1,_座標ならび_2) :- \+(member(A,[' ','\t',',','\n','(',')'])), 座標の組(R1,R2,_座標ならび_1,_座標ならび_2),!. 座標の組([_|R1],L,_座標ならび_1,_座標ならび_2) :- 座標の組(R1,L,_座標ならび_1,_座標ならび_2). 実数に変換([],_) :- !,fail. 実数に変換(_実数数字ならび,_実数値) :- concat_atom(_実数数字ならび,_文字列), atom_to_term(_文字列,_実数値,_). 'x,yそれぞれの平均値を計算して'(_x座標ならび,_y座標ならび,_xの平均,_yの平均) :- 相加平均(_x座標ならび,_xの平均), 相加平均(_y座標ならび,_yの平均). 相加平均(_値ならび,_相加平均) :- length(_値ならび,_標本数), 相加平均(_値ならび,_標本数,0,_相加平均). 相加平均([],_標本数,_合計,_相加平均) :- _相加平均 is _合計 / _標本数,!. 相加平均([V|R],_標本数,_合計_1,_相加平均) :- _合計_2 is _合計_1 + V, 相加平均(R,_標本数,_合計_2,_相加平均). 画面上に表示する(_xの平均,_yの平均) :- writef('座標の組の平均(重心)は (%t,%t) です。\n',[_xの平均,_yの平均]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/420 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):メイン関数でキーボードから2つの整数値を入力し、関数sisokuenzanにて和差積商を計算するプログラムを作成せよ。 # なお、関数sisokuenzanの仕様は以下のとおりとし、計算結果はメイン関数で表示するものとする。計算結果の変数は、結果をよく考えて適切な型を使うこと。 # # 関数名: sisokuenzan #  引数 :整数1: x #      整数2: y #      計算結果:和 wa, 差 sa,積 seki,商 syou #      (ただし、計算結果はポインタ) # #  返却値:無し(return文は無い) #  その他:「関数sisokuenzanが呼ばれました」と、画面に表示する。 # # # (実行例) # # 整数1= 10 # 整数2= 3 # # 関数sisokuenzanが呼ばれました # # メイン関数に戻りました # 和 = 13 差 = 7 積 = 30 商 = 3.3 # 'メイン関数でキーボードから2つの整数値を入力し、関数sisokuenzanにて和差積商を計算するプログラムを作成せよ。' :- 催促付き整数入力('整数1= ',_整数1), repeat, 催促付き整数入力('整数2= ',_整数2), sisokuenzan(_整数1,_整数2,_和,_差,_積,_商), writef('メイン関数に戻りました\n和 = %t 差 = %t 積 = %t 商 = %t\n',[_和,_差,_積,_商]),!. sisokuenzan(_整数1,0,_和,_差,_積,_商) :- write('整数2に0が入力されましたが商を求めることができません。0以外の数字を再入力してください\n'), !,fail. sisokuenzan(_整数1,_整数2,_和,_差,_積,_商) :- _和 is _整数1 + _整数2, _差 is _整数1 - _整数2, _積 is _整数1 * _整数2, _商 is _整数1 / _整数2. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/707 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 名前(char name[20])と点数(int score)からなる構造体の配列を作る. # 件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し, # 点数の平均点と、平均点以上の学生の名前を表示するプログラムを作成せよ. # なお,文字列aと整数bを同時にキーボード入力するには、scanf("%s %d",a,&b)とすればよい(文字列変数には&がいらない). # # 実行例 # $./kadai # n? 5 # name score? taro 52 # name score? jiro 84 # name score? saburo 38 # name score? hanako 63 # name score? youko 72 # Average:61 # Above average:jiro hanako youko # # ヒント # struct student { # char name[20]; # int score; # } student; # # scanf("%s %d",student.name, &student.score); # '件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し,点数の平均点と、平均点以上の学生の名前を表示する' :- '件数(10以下)をキーボード入力'(_件数), 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数), '点数の平均点と、平均点以上の学生の名前を表示する'. '点数の平均点と、平均点以上の学生の名前を表示する' :- 点数の平均点(_平均点), 平均点以上の学生の名前を表示する(_平均点), fail. '点数の平均点と、平均点以上の学生の名前を表示する'. 平均点以上の学生の名前を表示する(_平均点) :- 名前と得点(_名前,_得点), _得点 >= _平均点, writef('平均点%t以上の名前は : %t\n',[_名前]),!. 点数の平均点(_平均点) :- findavg(_点数,( 名前と得点(_名前,_得点)), _平均点). '件数(10以下)をキーボード入力'(_件数) :- 催促付き整数入力('件数を入力して下さい(10以下) : ',_件数), _件数 =< 10,!. '件数(10以下)をキーボード入力'(_件数) :- '件数(10以下)をキーボード入力'(_件数). 'その件数だけ名前と点数をキーボード入力して配列に格納し'(0) :- !. 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数) :- 名前と点数の入力(_名前,_点数), assertz(名前と点数(_名前,_点数)), _件数_1 is _件数 - 1, 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数_1). 名前と点数の入力(_名前,_点数) :- write('名前と点数をカンマ区切りて入力して下さい : '), readln(L), 名前と点数の入力(L,_名前,_点数),!. 名前と点数の入力(_名前,_点数) :- 名前と点数の入力(_名前,_点数). 名前と点数の入力([_名前,_点数],_名前,_点数) :- !. 名前と点数の入力([_名前1,_名前2,_点数],_名前,_点数) :- concat_atom([_名前1,_名前2],' ',_名前). 名前と点数の入力(L,_,_) :- writef('入力データの解析結果は%tで名前,点数が得られません。再入力をお願いします。\n',[L]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/707 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 名前(char name[20])と点数(int score)からなる構造体の配列を作る. # 件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し, # 点数の平均点と、平均点以上の学生の名前を表示するプログラムを作成せよ. # なお,文字列aと整数bを同時にキーボード入力するには、scanf("%s %d",a,&b)とすればよい(文字列変数には&がいらない). # # 実行例 # $./kadai # n? 5 # name score? taro 52 # name score? jiro 84 # name score? saburo 38 # name score? hanako 63 # name score? youko 72 # Average:61 # Above average:jiro hanako youko # # ヒント # struct student { # char name[20]; # int score; # } student; # # scanf("%s %d",student.name, &student.score); # '件数(10以下)をキーボード入力後、その件数だけ名前と点数をキーボード入力して配列に格納し,点数の平均点と、平均点以上の学生の名前を表示する' :- '件数(10以下)をキーボード入力'(_件数), 'その件数だけ名前と点数をキーボード入力して配列に格納し'(_件数,_名前と点数構造ならび), '点数の平均点と、平均点以上の学生の名前を表示する'(_名前と点数構造ならび). '件数(10以下)をキーボード入力'(_件数) :- 催促付き整数入力('件数を入力して下さい(10以下) : ',_件数), _件数 =< 10,!. '件数(10以下)をキーボード入力'(_件数) :- '件数(10以下)をキーボード入力'(_件数). 'その件数だけ名前と点数をキーボード入力して配列に格納し'(0,[]) :- !. 'その件数だけ名前と点数をキーボード入力して配列に格納し'(N,[(名前(_名前),点数(_点数))|R]) :- 名前と点数の入力(_名前,_点数), N_1 is N - 1, 'その件数だけ名前と点数をキーボード入力して配列に格納し'(N_1,R). 名前と点数の入力(_名前,_点数) :- write('名前と点数をカンマ区切りて入力して下さい : '), readln(L), 名前と点数の入力(L,_名前,_点数),!. 名前と点数の入力(_名前,_点数) :- 名前と点数の入力(_名前,_点数). 名前と点数の入力([_名前,_点数],_名前,_点数) :- !. 名前と点数の入力([_名前1,_名前2,_点数],_名前,_点数) :- concat_atom([_名前1,_名前2],' ',_名前). 名前と点数の入力(L,_,_) :- writef('入力データの解析結果は%tで名前,点数が得られません。再入力をお願いします。\n',[L]), fail. '点数の平均点と、平均点以上の学生の名前を表示する'(_名前と点数構造ならび) :- 点数の平均点(_名前と点数構造ならび,_平均点), writef('平均点は %t です\n',[_平均点]), 平均点以上の学生の名前を表示する(_平均点,_名前と点数構造ならび), 平均点以上の学生の名前を表示する(_,[]). 平均点以上の学生の名前を表示する(_平均点,[(名前(_名前),点数(_点数))|R]) :- _点数 >= _平均点, writef('平均点%t以上の生徒: %t\n',[_平均点,_名前]), 平均点以上の学生を表示する(_平均点,R). 平均点以上の学生の名前を表示する(_平均点,[_|R]) :- 平均点以上の学生の名前を表示する(_平均点,R). 点数の平均点(_名前と点数構造ならび,_平均点) :- length(_名前と点数構造ならび,_標本数), 点数の合計(_名前と点数構造ならび,_合計), _平均点 is _合計 / _標本数. 点数の合計([],0). 点数の合計([(名前(_),点数(_点数))|R],_点数合計) :- 点数の合計(R,_点数合計_1), _点数合計 is _点数 + _点数合計_1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/666 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 為替レート(rate)、円(yen)、ドル(doll)、セント(cent)(いずれも整数)からなる構造体moneyの # ポインタを引数とし円からドルへの変換を行う関数exchangeを作成せよ. # # 関数exchangeのプロトタイプ宣言 # void exchange(struct money *mp); # # 上の関数を使ってrateが80円のときの25800円のドルとセントを求めるプログラムを作成せよ。 # なお、メインプログラム内に以下のような初期値つきの構造体変数宣言を使うこと. # # struct money m = { 80, 25800, 0, 0 }; # # 実行例 # $./kadai1 # 322 doll 50 cent # # ヒント # 「 # struct money { # // メンバー # }; # # exchange(&m); // 擬似的参照渡しになるので,結果はmoneyに返る # 」 # 為替レート(円,ドル,80.0,1). 'セント・ドル'(セント,ドル,100,1). '為替レート(rate)、円(yen)、ドル(doll)、セント(cent)(いずれも整数)から円からドルへの変換を行う'(_円,_ドル,_セント) :- 為替レート(円,ドル,A,B), 'セント・ドル'(セント,ドル,C,D), E is truncate(floor(_円 * (B / A) * C / D)), _ドル is E // (C / D), _セント is _ドル mod (C / D). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/624 # # [1] 授業単元:リスト構造体 # [2] 問題文(含コード&リンク): # enqueue()とdequeue()を用いて実行結果が # # Please input E(登録) or D(削除): E # Input number and name: 8 Nakamura # Please input E(登録) or D(削除): E # Input number and name: 3 Saito # Please input E(登録) or D(削除): D # Number=8 Name=Nakamura # Please input E(登録) or D(削除): D # Number=3 Name=Saito # Please input E(登録) or D(削除): D # No Data! # Please input E(登録) or D(削除): E # ・ # ・ # ・ # のように動作するプログラムを作成せよ # 'enqueue()とdequeue()を用いて実行' :- start_queue, 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). 要求の取得(_要求) :- write('Please input E(登録) or D(削除): '), get_line(_要求),!. 'enqueue()とdequeue()を用いて実行'(q) :- !. 'enqueue()とdequeue()を用いて実行'('E') :- enqueue, fail. 'enqueue()とdequeue()を用いて実行'('D') :- dequeue, fail. 'enqueue()とdequeue()を用いて実行'(_) :- 要求の取得(_要求), 'enqueue()とdequeue()を用いて実行'(_要求). start_queue :- キューの生成(一時的). enqueue :- write('Input number and name: ' 'Input number and name'(_number,_name), キューに追加(一時的,[_number,_name]). 'Input number and name'(_number,_name) :- readln([_number,_name]). dequeue :- キューからの取り出し(一時的,_値), dequeue(_項), dequeue診断(_項,_診断), writef('%t\n',[_診断]). dequeue診断([],' No Data!') :- !. dequeue診断([_number,_name],_表示文字列) :- concat_atom(['nunmber = ',_number,' name = ',_name],_表示文字列). キューの生成(_キューの名前) :- キュー(_キューの名前,_), writef('%tというキューは既に存在します。登録できません。\n',[_キューの名前]),!. キューの生成(_キューの名前) :- asserta(キュー(_キューの名前,[])). キューからの取り出し(_キューの名前,_取り出した項) :- retract(キュー(_キューの名前,[_項|R])), asserta(キュー(_キューの名前,R)),!. キューからの取り出し(_キューの名前,[]). キューへの追加(_キュー名,_追加する項) :- retract(キュー(_キューの名前,_キュー)), append(_キュー,[_追加する項],_追加されたキュー), asserta(キュー(_キューの名前,_追加されたキュー)). キューを空にする(_キュー名) :- retract(キュー(_キューの名前,_)), asserta(キュー(_キューの名前,[])). % % キューは引数内の論理変数として重リストを使って定義し、 % それを更新しながら持ちまわるのが普通だが、 % ここでは愚直に、キューを述語としてassertし、reatract/assertを % 繰り返して値を出入りさせる述語群を定義してみた。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/477 # # [1] 授業単元:C言語 # [2] 問題文:3*3の逆行列Aをもとめよ # http://ime.nu/ideone.com/erZBk # '3*3の逆行列Aをもとめよ'(_a,_逆行列A) :- var(_a), '3行3列の行列aを入力'(_a), 逆行列(_a,_逆行列A). '3*3の逆行列Aをもとめよ'(_a,_逆行列A) :- \+(var(_a)), 逆行列(_a,_逆行列A). 逆行列(_行列,_逆行列) :- 行列に単位行列を結合して(_行列,_行列の二), 既約ガウス行列に変形(_行列の二,_既約ガウス行列), 変数正方行列(1,N,_逆行列), 行列の結合(_,_逆行列,_既約ガウス行列). 行列に単位行列を結合して(_行列,_行列の二) :- length(_行列,N), 単位行列(N,L), 行列の結合(_行列,L,_行列の二). 行列の結合(Len1,Len2,[_行1],[_行2],[_行3]) :- append(_行1,_行2,_行3), length(_行1,Len1), length(_行2,Len2). 行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :- append(_行1,_行2,_行3), 行列の結合(Len1,Len2,R1,R2,R3), length(_行1,Len1), length(_行2,Len2). 行列の結合([_行1|R1],[_行2|R2],_結合された行列) :- 行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列), Len1 > 0, Len2 > 0. 変数正方行列(M,N,[]) :- M > N. 変数正方行列(M,N,[L|R]) :- length(L,N), M2 is M + 1, 変数正方行列(M2,N,R). '3行3列の行列aを入力'(_a) :- length(_a,3), findall(L,( append(L0,[L|_],_a), length(L,3), length(L0,_行位置), '3列入力する'(_行位置,1,L)), _a). '3列入力する'(_,_,[]). '3列入力する'(_行位置,_列位置,[V|R]) :- writef('列入力[_行位置][_列位置] : '), get_line(Line), atom_to_term(Line,V,_), _列位置_2 is _列位置 + 1, '3列入力する'(_行位置,_列位置_2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/260 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # sinのグラフを次のように描くプログラムを作成せよ # ただしsin90°とsin270°に対するアスタリスクの数は20個とする。 # http://ime.nu/beebee2see.appspot.com/i/azuYk7KSBQw.jpg # 'sinのグラフを次のように描くただしsin90°とsin270°に対するアスタリスクの数は20個とする' :- length(_キャンパス,25), 'キャンパスにsinカーブを描画する'(_キャンパス), キャンパスを表示する(_キャンパス). 'キャンパスを構成しながらsinカーブを描画する'(_キャンパス) :- findall(_キャンパス,( append(L0,[L|_],_キャンパス), length(L,40), キャンパスに描画(L0,L)), _キャンパス). キャンパスに描画(Ln,L) :- 刻みを得る(_刻み), length(Ln,N), _星の位置 is truncate(20 * sin(_刻み * N)) + 20, 星の位置描画(N,_星の位置,L). 刻みを得る(_刻み) :- _刻み is 2 * pi / 24. 星の位置描画(N,10,L) :- 変数を全て置換する(N,L,L),!. 星の位置描画(N,_星の位置,L) :- N > 10, for(11,M,N), 星を描画(M,L), M = N, 変数を全て置換する(N,L,L),!. 星の位置描画(N,_星の位置,L) :- N < 10, for(9,M,N), 星を描画(M,L), M = N, 変数を全て置換する(N,L,L),!. 星を描画(M,L) :- length([_|Ln],M), append(L2,[*|R],L),!. 変数を全て置換する(_,[],[]) :- !. 変数を全て置換する(N,[V|R1],[' '|R2]) :- var(V), 変数を全て空白に置換する(N,R1,R2),!. 変数を全て空白に置換する(N,[A|R1],[A|R2]) :- 変数を全て空白に置換する(N,R1,R2). キャンパスを表示する([]). キャンパス表示する([L|R]) :- 左端の十文字分は空白, 一行表示する(L), キャンパスを表示する(R). 左端の十文字分は空白 :- write(' '). 一行表示する([]) :- !. 一行表示する([A|R]) :- write(A), 一行表示する(R). % % C153_216.html の類型 % % 述語 星の位置描画/3 のあたりが微妙に違う。 % X軸、Y軸を描かなくてよいことからも差異を生じる。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/216 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):sinカーブを縦に描画するプログラムを作れ。0度から360度までの範囲を描画し、 # 縦軸と横軸も描画すること。 # 'sinカーブを縦に描画するプログラムを作れ。0度から360度までの範囲を描画し、縦軸と横軸も描画すること' :- length(_キャンパス,61), 'キャンパスにsinカーブを描画する'(_キャンパス), キャンパスを表示する(_キャンパス). 'キャンパスを構成しながらsinカーブを描画する'(_キャンパス) :- findall(_キャンパス,( append(L0,[L|_],_キャンパス), length(L,49), キャンパスに描画(L0,L)), _キャンパス). キャンパスに描画(Ln,L) :- 刻みを得る(_刻み), length(Ln,N), _星の位置 is truncate(24 * sin(_刻み * N)) + 25, 星の位置描画(N,_星の位置,L). 刻みを得る(_刻み) :- _刻み is 2 * pi / 60. 星の位置描画(N,_星の位置,L) :- length(L0,_星の位置), append(L0,[*|L0],L), 変数を全て置換する(N,L,L),!. 星の位置描画(N,_星の位置,L) :- length(L0,_星の位置), append(L1,['|'|L1],L), append(L0,[*|_],L), 変数を全て置換する(N,L,L),!. 変数を全て置換する(_,[],[]) :- !. 変数を全て置換する(N,[V|R1],['-'|R2]) :- var(V), member(N,[0,15,30,45,60]), 変数を全て空白に置換する(N,R1,R2),!. 変数を全て置換する(N,[V|R1],[' '|R2]) :- var(V), 変数を全て空白に置換する(N,R1,R2),!. 変数を全て空白に置換する(N,[A|R1],[A|R2]) :- 変数を全て空白に置換する(N,R1,R2). キャンパスを表示する([]). キャンパス表示する([L|R]) :- 左端の十文字分は空白, 一行表示する(L), キャンパスを表示する(R). 左端の十文字分は空白 :- write(' '). 一行表示する([]) :- !. 一行表示する([A|R]) :- write(A), 一行表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/230 # # ・DBMS名とバージョン # oracle11g # # ・テーブルデータ # userテーブル # # id int # name varchar # # ・欲しい結果&説明 # idを外からバインド変数で渡し、 # IDが一致するレコードと、 # その一致したレコードとnameが一致するレコードの2レコードを取得したいです。 # # 例) # バインド変数:1 # id  name # 1   aaa # 2   bbb # 3  aaa # idが1と3のレコードを抽出したいです。 # # 自己結合して1レコードとして取得することはできるのですが2レコード取得する方法が思いつきません。 # 宜しくお願いします。 # # # 'idを外からバインド変数で渡し、IDが一致するレコードと、その一致したレコードとnameが一致するレコードの2レコードを取得したい'(_外からのバインド変数,_IDが一致するレコード,_その一致したレコードとnameが一致するレコード) :- userテーブル(_外からのバインド変数,_name), userテーブル(_id,_name), \+(_id = _外からのバインド変数), _IDが一致するレコード = [_外からのバインド変数,_name], _その一致したレコードとnameが一致するレコード = [_id,_name]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/136 # # [1] 授業単元:基礎プロ # [2] 問題文(含コード&リンク): # 整数型の変数 i の値を 1 から k まで順に変化させ,以下を繰り返す. # n に i の値を代入する. # n が偶数のときは n を 2 で割った値を n に代入する. # n が奇数のときは n を 3 倍して 1 を加えた値を n に代入する. # n の値が 1 になるまで b. の操作を繰り返す. # i ごとに繰り返した回数を以下の実行例のように出力する. # 実行例 # >./extra06-2 # 自然数を入力: 4 # 1: 0 # 2: 1 # 3: 7 # 4: 2 # > # この動作をするプログラムを作成せよ # '整数型の変数 i の値を 1 から k まで順に変化させ,以下を繰り返す. n に i の値を代入する. n が偶数のときは n を 2 で割った値を n に代入する.n が奇数のときは n を 3 倍して 1 を加えた値を n に代入する.n の値が 1 になるまで b. の操作を繰り返す.i ごとに繰り返した回数を以下の実行例のように出力する' :- '整数型の変数 i の値を 1 から k まで順に変化させ,以下を繰り返す'(_k,_n), 以下を繰り返す(0,_m,_n), 実行例のように出力する(_m,_n), _n = _k. '整数型の変数 i の値を 1 から k まで順に変化させ'(_k,_i) :- for(1,_i,_k). 以下を繰り返す(_m,_m,1) :- !. 以下を繰り返す(_m_1,_m,_n_1) :- 'n が偶数のときは n を 2 で割った値を n に代入する'(_n_1,_n_2), _m_2 is _m_1 + 1, 以下を繰り返す(_m_2,_m,_n_2). 以下を繰り返す(_m_1,_m,_n_1) :- 'n が奇数のときは n を 3 倍して 1 を加えた値を n に代入する'(_n_1,_n_2), _m_2 is _m_1 + 1, 以下を繰り返す(_m_2,_m,_n_2). 'n が偶数のときは n を 2 で割った値を n に代入する'(_n_1,_n_2), 'n が偶数のときは'(_n_1), _n_2 is _n_1 // 2. 'n が奇数のときは n を 3 倍して 1 を加えた値を n に代入する'(_n_1,_n_2), 'n が奇数のときは'(_n_1), _n_2 is (_n_1 * 3) + 1. 'n が偶数のときは'(_n) :- 0 is _n mod 2. 'n が偶数のときは'(_n) :- 1 is _n mod 2. 実行例のように出力する(_m,_n) :- writef('%t: %t\n',[_n,_m]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/134 # # [2] 問題文(含コード&リンク): # 1:キーボードから自然数 m と n を読み込む. 2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示. 3:この 2:の操作を m 回繰り返す. # 実行例 # > ./ex06-3 # 繰り返し回数を入力: 10 # 乱数の個数を入力: 100 # 回 平均 # 1 0.509034 # 2 0.488603 # 3 0.485044 # 4 0.473806 # 5 0.503660 # 6 0.519470 # 7 0.477955 # 8 0.536236 # 9 0.516652 # 10 0.467380 # > # この動作をするプログラムを作成せよ。乱数は疑似乱数発生関数 drand48 を用いる.この関数は呼び出すたびにdrand48() を 3 回呼び出すと,drand48() の生成した三つの乱数がそれぞれ変数 x, y, z に格納される. # double x, y, z; x = drand48(); y = drand48(); z = drand48(); # この関数を用いるプログラムは,冒頭に #include <stdlib.h> と記述 # '1:キーボードから自然数 m と n を読み込む. 2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示. 3:この 2:の操作を m 回繰り返す.' :- '1:キーボードから自然数 m と n を読み込む'(_m,_n), '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(1,_実行回数,_m,_n), '3:この 2:の操作を m 回繰り返す.' (_実行回数,_m). '1:キーボードから自然数 m と n を読み込む'(_m,_n) :- 'キーボードから自然数 m を読み込む'(_m), 'キーボードから自然数 n を読み込む'(_n). 'キーボードから自然数 m を読み込む'(_m) :- 自然数を読み込む(_m). 'キーボードから自然数 n を読み込む'(_n) :- 自然数を読み込む(_n). 自然数を読み込む(_自然数) :- get_line(Line), 自然数を読み込む(Line,_自然数),!. 自然数を読み込む(_自然数) :- 自然数を読み込む(_自然数). 自然数を読み込む(Line,_自然数) :- atom_to_term(Line,_自然数,_), integer(_自然数), _自然数 >= 0,!. 自然数を読み込む(Line,_自然数) :- writef('入力された %t からは自然数が得られません。再入力をお願いします。\n'), fail. '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数,_実行回数,_n) :- '0 以上 1 未満の一様乱数 n 個の平均値を計算して'(_n,_平均値), '実行例ように表示'(_実行回数,_平均値). '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数_1,_実行回数,_n) :- _実行回数_2 is _実行回数_1 + 1, '2:0 以上 1 未満の一様乱数 n 個の平均値を計算して、実行例ように表示'(_実行回数_2,_実行回数,_n). '0 以上 1 未満の一様乱数 n 個の平均値を計算して'(_n,_平均値) :- findavg(_一様乱数,( for(1,_,_n), '0 以上 1 未満の一様乱数'(_一様乱数)), _平均値). '0 以上 1 未満の一様乱数'(_一様乱数) :- _一様乱数 is random(1000000) / 1000000. '実行例ように表示'(_実行回数,_平均値) :- writef('%3l%8l\n',[_実行回数,_平均値]). '3:この 2:の操作を m 回繰り返す.' (_m,_m). % % 目下の課題は以下の実行例をどのように述語定義の中に取り込むかだ % /* 実行例 :- # 1 0.509034 # 2 0.488603 # 3 0.485044 # 4 0.473806 # 5 0.503660 # 6 0.519470 # 7 0.477955 # 8 0.536236 # 9 0.516652 # 10 0.467380 */ % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/92 # # [1] 授業単元:C言語 # [2] 問題文:ttp://www1.axfc.net/uploader/Sc/so/290413 # # 数字の文字列を 1文字ずつ整数値に変換するプログラムを作成せよ. # (例)文字列"12345" → 5つの整数値 1, 2, 3, 4, 5 # # ただし,次の手順に沿って作成せよ # # 手順1.数字を数値に変換する関数 char_to_intの作成 # # 数字1文字を数値に変換する(文字'1'であれば整数値1に変換する)関数char_to_int # を作成せよ.ただし,引数として 1文字を値渡しで渡し,戻り値は変換後の数値とする. # また,数字以外の文字が渡された場合は戻り値を‐1とする. # # 作成した関数 char_to_intが正常に動作するかどうかは次のmain関数を使って確認すること. # # int main(void) # { # char a = '2'; # char b = '5'; # char c = 'A'; # # printf("%c, %d, %d\n", a, (int)a, char_to_int(a)); # printf("%c, %d, %d\n", b, (int)b, char_to_int(b)); # printf("%c, %d, %d\n", c, (int)c, char_to_int(c)); # # # return 0; # } # # # 実行結果 # 2, 50, 2 # 5, 53, 5 # A, 65, ‐1 # # # # 手順2. 数字の文字列を 1文字ずつ整数値に変換する関数 str_to_intの作成 # # 数字の文字列を 1文字ずつに分割し,それぞれの文字を整数値に変換して,その整数値を # # 配列に代入して返す関数 str_to_intを作成せよ.ただし,第1引数は文字列が # # 代入されている配列の先頭アドレスを受け取るポインタ変数,第2引数は変換後の整数値を # # 代入する配列の先頭アドレスを受け取るポインタ,第3引数は数値の個数(文字列の長さ)を # # 返すためのポインタ変数とすること.また,関数内ではポインタを使って # # 簡潔かつ高速に文字列を操作すること.この関数内で配列を使用した場合や意味のないポインタの # # 使い方をした場合は,課題を達成したとは認めない.また手順1で作成した char_to_intを # # 有効利用すること # # # 関数 str_to_intが正しく動作することを次の main関数を使って確認せよ. # ([]は適切に埋めること.) # # int main(void) # { # char *str1 = "4096"; /*変換対象の文字列 1 */ # char *str2 = "1A5z24"; /*変換対象の文字列 2 */ # # int data[20]; /*変換後のデータを代入する配列 */ # int num; /*データ数を代入する変数 */ # int i; # # str_to_int([] ,[] ,[]); /*関数呼び出し */ # for(i = 0; i < num; i++) # printf("%d ", data[i]); # printf("\n"); # # str_to_int([],[] ,[]); /*関数呼び出し*/ # for(i = 0; i < num; i++) # printf("%d ", data[i]); # printf("\n"); # # # return 0; # } # # # (3)実行結果 # 4 0 9 6 # 1 ‐1 5 ‐1 2 4 # '数字の文字列を 1文字ずつに分割し,それぞれの文字を整数値に変換して,その整数値をならびとして返す'(_数字の文字列,_整数値ならび) :- findall(_整数値,( '数字の文字列を 1文字ずつ整数値に変換する'(_数字の文字列,_整数値)), _整数値ならび). '数字の文字列を 1文字ずつ整数値に変換する'(_数字の文字列,_整数値) :- sub_atom(_数字の文字列,_,1,_,_文字としての数字), 文字としての数字を整数値に変換する(_文字としての数字,_整数値). 文字としての数字を整数値に変換する('0',0) :- !. 文字としての数字を整数値に変換する('1',1) :- !. 文字としての数字を整数値に変換する('2',2) :- !. 文字としての数字を整数値に変換する('3',3) :- !. 文字としての数字を整数値に変換する('4',4) :- !. 文字としての数字を整数値に変換する('5',5) :- !. 文字としての数字を整数値に変換する('6',6) :- !. 文字としての数字を整数値に変換する('7',7) :- !. 文字としての数字を整数値に変換する('8',8) :- !. 文字としての数字を整数値に変換する('9',9) :- !. 文字としての数字を整数値に変換する(_,-1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/92 # # [1] 授業単元:C言語 # [2] 問題文:ttp://www1.axfc.net/uploader/Sc/so/290413 # # 数字の文字列を 1文字ずつ整数値に変換するプログラムを作成せよ. # (例)文字列"12345" → 5つの整数値 1, 2, 3, 4, 5 # # ただし,次の手順に沿って作成せよ # # 手順1.数字を数値に変換する関数 char_to_intの作成 # # 数字1文字を数値に変換する(文字'1'であれば整数値1に変換する)関数char_to_int # を作成せよ.ただし,引数として 1文字を値渡しで渡し,戻り値は変換後の数値とする. # また,数字以外の文字が渡された場合は戻り値を‐1とする. # # 作成した関数 char_to_intが正常に動作するかどうかは次のmain関数を使って確認すること. # # int main(void) # { # char a = '2'; # char b = '5'; # char c = 'A'; # # printf("%c, %d, %d\n", a, (int)a, char_to_int(a)); # printf("%c, %d, %d\n", b, (int)b, char_to_int(b)); # printf("%c, %d, %d\n", c, (int)c, char_to_int(c)); # # # return 0; # } # # # 実行結果 # 2, 50, 2 # 5, 53, 5 # A, 65, ‐1 # # # # 手順2. 数字の文字列を 1文字ずつ整数値に変換する関数 str_to_intの作成 # # 数字の文字列を 1文字ずつに分割し,それぞれの文字を整数値に変換して,その整数値を # # 配列に代入して返す関数 str_to_intを作成せよ.ただし,第1引数は文字列が # # 代入されている配列の先頭アドレスを受け取るポインタ変数,第2引数は変換後の整数値を # # 代入する配列の先頭アドレスを受け取るポインタ,第3引数は数値の個数(文字列の長さ)を # # 返すためのポインタ変数とすること.また,関数内ではポインタを使って # # 簡潔かつ高速に文字列を操作すること.この関数内で配列を使用した場合や意味のないポインタの # # 使い方をした場合は,課題を達成したとは認めない.また手順1で作成した char_to_intを # # 有効利用すること # # # 関数 str_to_intが正しく動作することを次の main関数を使って確認せよ. # ([]は適切に埋めること.) # # int main(void) # { # char *str1 = "4096"; /*変換対象の文字列 1 */ # char *str2 = "1A5z24"; /*変換対象の文字列 2 */ # # int data[20]; /*変換後のデータを代入する配列 */ # int num; /*データ数を代入する変数 */ # int i; # # str_to_int([] ,[] ,[]); /*関数呼び出し */ # for(i = 0; i < num; i++) # printf("%d ", data[i]); # printf("\n"); # # str_to_int([],[] ,[]); /*関数呼び出し*/ # for(i = 0; i < num; i++) # printf("%d ", data[i]); # printf("\n"); # # # return 0; # } # # # (3)実行結果 # 4 0 9 6 # 1 ‐1 5 ‐1 2 4 # '数字の文字列を 1文字ずつ整数値に変換する'(_数字の文字列,_整数値) :- sub_atom(_数字の文字列,_,1,_,_文字としての数字), 文字としての数字を整数値に変換する(_文字としての数字,_整数値). 文字としての数字を整数値に変換する('0',0) :- !. 文字としての数字を整数値に変換する('1',1) :- !. 文字としての数字を整数値に変換する('2',2) :- !. 文字としての数字を整数値に変換する('3',3) :- !. 文字としての数字を整数値に変換する('4',4) :- !. 文字としての数字を整数値に変換する('5',5) :- !. 文字としての数字を整数値に変換する('6',6) :- !. 文字としての数字を整数値に変換する('7',7) :- !. 文字としての数字を整数値に変換する('8',8) :- !. 文字としての数字を整数値に変換する('9',9) :- !. 文字としての数字を整数値に変換する(_,-1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/84 # # [1] 授業単元:C言語 # [2] 問題文:10個の要素が格納できる配列を2つ宣言し、それぞれ任意の整数で初期化せよ。 # その後、この2つの配列の中身を入れ替えよ。 # '10個の要素が格納できるならびを2つ宣言し、それぞれ任意の整数で初期化する'(L1,L2) :- '10個の要素が格納できるならびを2つ宣言し'(_宣言名1,_宣言名2), 'それぞれ任意の整数で初期化する'(_宣言名1,_宣言名2). '10個の要素が格納できるならびを2つ宣言し'(_宣言名1,_宣言名2) :- '10個の要素が格納できるならびを宣言する'(_宣言名1), '10個の要素が格納できるならびを宣言する'(_宣言名2),!. '10個の要素が格納できるならびを宣言する'(_宣言名) :- length(L1,10), P =.. [_宣言名,L1], assertz(P). 'それぞれ任意の整数で初期化する'(_宣言名1,_宣言名2) :- 任意の整数で初期化する(_宣言名1), 任意の整数で初期化する(_宣言名2). 任意の整数で初期化する(_宣言名) :- P =.. [_宣言名,L], retract(P), 変数ならびを任意の整数で初期化する(L), assertz(P),!. 変数ならびを任意の整数で初期化する([]) :- !. 変数ならびを任意の整数で初期化する([N|R]) :- get_integer(N), 変数ならびを任意の整数で初期化する(R). get_integer(N) :- get_line(Line), 整数入力診断(Line,N),!. get_integer(N) :- get_integer(N). 整数入力診断(Line,N) :- atom_to_term(Line,N,_), integer(N),!. 整数入力診断(Line,N) :- writef('入力された %t から整数が得られません。再入力をお願いします。\n',[Line]), fail. 'その後、この2つのならびの中身を入れ替える'(_宣言名1,_宣言名2) :- 'この2つのならびの中身を'(_宣言名1,_宣言名2,L1,L2), 入れ替える(_宣言名1,_宣言名2,L1,L2),!. 'この2つのならびの中身を'(_宣言名1,_宣言名2,L1,L2) :- P1 =.. [_宣言名1,L1), P2 =.. [_宣言名2,L2), retract(P1), retract(P2),!. 入れ替える(_宣言名1,_宣言名2,L1,L2) :- P1_2 =.. [_宣言名1,L2], P2_2 =.. [_宣言名2,L1], assertz(P1_2), assertz(P2_2),!. % Prologにとって難題。 % % 実は「入れ替える」ということが普通にはできない。 % % 宣言するという事を述語としてassertすることとして捉えてみた。 % 'この2つの中味を'述語のretractのタイミングが相当に怪しい。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/59 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例7.3.1をswitch文を使わずにif文、else if文を使うプログラムに変更しなさい。 # #include # # int main(void) # { # int x, z; # x=5; # z= x % 2; # switch(z) # { # case 0: # printf("x= %d は偶数です.\n",x); # break; # case 1: # printf("x= %dは奇数です.\n",x); # break; # default: # printf("xは負の数である可能性があります.\n"); # } # return 0; # # 変数xの値をキーボードから入力するように機能変更しなさい。 # プログラム例7.3.1 # http://www.dotup.org/uploda/www.dotup.org2233167.txt.html # '変数xの値をキーボードから入力して、奇数か偶数かを表示しなさい' :- '変数xの値をキーボードから入力して'(_x), '奇数か偶数かを表示しなさい'(_x). '変数xの値をキーボードから入力して'(_x) :- write('整数を入力して下さい : '), get_line(Line), '変数xの値をキーボードから入力診断'(Line,_x),!. '変数xの値をキーボードから入力して'(_x) :- '変数xの値をキーボードから入力して'(_x). '変数xの値をキーボードから入力診断'(Line,_x) :- atom_to_term(Line,_x,_), integer(_x),!. '変数xの値をキーボードから入力診断'(Line,_x) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '奇数か偶数かを表示しなさい'(_x) :- 0 is _x mod 2, writef('%tは偶数です.\n',[_x]),!. '奇数か偶数かを表示しなさい'(_x) :- 1 is _x mod 2, writef('%tは奇数です.\n',[_x]),!. '奇数か偶数かを表示しなさい'(_x) :- writef('%tは負の数である可能性があります.\n',[_x]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/940 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # int型の2次元配列がある。このうち1つの変数に注目したとき、その変数の値と同じ値を持つ変数が # 上下左右に何個繋がっているかを返すプログラムを作成せよ。 # 例えば以下のような配列 int array[8][8];があるとき、 # 左下の1 (array[7][0])を指定した場合、「1」は5個繋がっていることになる。 # その右隣の3 (array[7][1])を指定した場合、「3」は3個繋がっていることになる。 # # 0 2 1 3 0 1 1 2 # 2 2 2 1 1 2 3 3 # 3 0 2 1 2 3 2 2 # 1 1 1 2 1 0 0 1 # 2 3 3 2 1 0 1 0 # 2 1 1 2 2 3 0 1 # 1 1 2 1 2 0 3 1 # 1 3 3 3 0 0 1 1 # # '行列の位置を指定してその位置の値と同じ値が上下左右に何個繋がっているかを返す'(LL,_行位置,_列位置,_度数) :- append(L1,[_列|R1],LL), length([_|L0],_行位置), append(L11,[_値|R11],_列), length([_|L11],_列位置), 上下左右に何個繋がっているか(なし,[L1,[_列|R1]],[L11,[_値|R11]],_度数). 上下左右に何個繋がっているか(_来た方向,[L1,[_列|R1]],[L11,[_値|R11]],_度数) :- 来た方向を取り除く(_方向,_方向ならび), 各方向の個数を集計する(_方向ならび,[L1,[_列|R1]],[L11,[_値|R11]],_度数_L), length(_度数_L,_度数). 各方向の個数を集計する([],_,_,[]) :- !. 各方向の個数を集計する各方向の個数を集計する([_方向|R],[L1,[_列|R1]],[L11,[_値|R11]],[_|_度数]) :- 連接する値(_方向,[L1,[_列|R1]],[L11,[_値|R11]],[L2,[_列2|R2]],[L22,[_値|R22]]), 上下左右に何個繋がっているか(_方向,[L2,[_列2|R2]],[L22,[_値2|R22]],_度数_1), 各方向の個数を集計する(R,[L1,[_列|R1]],[L11,[_値|R11]],_度数_2), append(_度数_1,_度数_2,_度数),!. 各方向の個数を集計する([_|R],[L1,[_列|R1]],[L11,[_値|R11]],_度数) :- 各方向の個数を集計する(R,[L1,[_列|R1]],[L11,[_値|R11]],_度数). 連接する値(上,[L1,[_列|R1]],[L2,[_値|R2]],[L11,[_上の列|[_列|R11]]],[L22,[_上の値|R22]]) :- append(L11,[_上の列],L1), length(L2,Len), append(L22,[_上の値|R22],_上の列), length(L22,Len),!. 連接する値(右,[L1,[_列|R1]],[L2,[_値|R2]],[L1,[_列|R1]],[L22,[_右の値|R22]]) :- append(L2,[_値],L22), [_右の値|R22] = R2,!. 連接する値(左,[L1,[_列|R1]],[L2,[_値|R2]],[L1,[_列|R1]],[L22,[_左の値|[_値|R2]]]) :- append(L22,[_左の値],L2),!. 連接する値(下,[L1,[_列|R1]],[L2,[_値|R2]],[L11,[_下の列|R11]],[L22,[_上の値|R22]]) :- length(L2,Len), append(L1,[_列],L11), [_下の列|R11] = R1, append(L22,[_上の値|R22],_下の列), length(L22,Len),!. 来た方向を取り除く(上,[上,右,左]) :- !. 来た方向を取り除く(右,[上,右,下]) :- !. 来た方向を取り除く(左,[上,左,下]) :- !. 来た方向を取り除く(下,[右,左,下]) :- !. 来た方向を取り除く(なし,[上,右,左,下]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/936 # # 下のように定義される等比級数の第1項から第n項までの和 sum を # 求めるプログラムを for文を用いて作成せよ。 # # a1 = 1.0 # a i+1 = a i *0.5 # #    n # sum= Σ(ai) # i=1 # # # # すみません。かなりの時間ねばったんですが、できませんでした。 # お願いいたします。 # # sum(1,_n,Sum) :- sum(1,_n,1,0,_sum). sum(_n,_n,_ai,sum,_sum). sum(_i,_n,_ai,sum_1,_sum) :- _ai_2 is _ai * 0.5, _sum_2 is _sum_1 + _ai, _i_2 is _i + 1, sum(_i_2,_n,_ai_2,_sum_2,_sum). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% f(X,Y) :- Y is X * 0.5. sum(1,_n,Sum) :- sum(1,_n,1,P,0,_sum). sum(_n,_n,_ai,_sum,_sum). sum(_i,_n,_ai,_sum_1,_sum) :- f(_ai,_ai_2), _sum_2 is _sum_1 + _ai, _i_2 is _i + 1, sum(_i_2,_n,_ai_2,_sum_2,_sum). % % 大事なことは、http://nojiriko.asia/prolog/c152_503.html で定義したシグマは使えないことだ。 % この定義では式に関係する変数は第一引数だけであり、一つ前の計算結果に % 依存することがない。計算は完結していてデータの連関はない。 % データの連関が無いから、findall/3を使用できた。すなわち非決定性として、 % バックトラックさせることができた。 % ここでの例では_ai_2 は _ai に依存する。このようなケースでは再帰述語として書く。 % 更に言えば、ここでf/2として定義している本体部分を式として引数に持たせてはならない。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/911 # # # [1] 授業単元:基礎C言語 # [2] 問題文(含コード&リンク):二つの3×3行列A.Bを入力して、それぞれの逆行列を出力するプログラムを作れ。 # '二つの3×3行列A.Bを入力して、それぞれの逆行列を出力する' :- '二つの3×3行列A.Bを入力して'(_A,_B), それぞれの逆行列を出力する(_A,_B,_Aの逆行列,_Bの逆行列). '二つの3×3行列A.Bを入力して'(_A,_B) :- '二つの3×3行列A.B'(_A,_B) , '入力して'(_A,_B). '二つの3×3行列A.B'(_A,_B) :- length(_A,3), length(_B,3), findall(L1,( append(_,[L1|_],_A)), _A), findall(L2,( append(_,[L2|_],_B)), _B). '入力して'(_A,_B) :- '_Aを入力する'(_A), '_Bを入力する'(_B). '_Aを入力する'(_A) :- findall([_値1,_値2,_値3],( append(_,[_|_],_A), readln([_値1,_値2,_値3])), _A). '_Bを入力する'(_B) :- findall([_値1,_値2,_値3],( append(_,[_|_],_B), readln([_値1,_値2,_値3])), _B). それぞれの逆行列を出力する(_A,_B,_Aの逆行列,_Bの逆行列) :- '_Aの逆行列を出力する'(_A,_Aの逆行列), '_Bの逆行列を出力する'(_B,_Bの逆行列). '_Aの逆行列を出力する'(_A,_Aの逆行列) :- 逆行列(_A,_Aの逆行列), 行列を出力する(_A), write('の逆行列は\n'), 行列を出力する(_Aの逆行列),!. '_Bの逆行列を出力する'(_B,_Bの逆行列) :- 逆行列(_B,_Bの逆行列), 行列を出力する(_B), write('の逆行列は\n'), 行列を出力する(_Bの逆行列),!. 逆行列(_行列,_逆行列) :- length(_行列,N), 単位行列(N,L), 行列の結合(_行列,L,_行列の二), 既約ガウス行列に変形(_行列の二,_既約ガウス行列), 変数正方行列(1,N,_逆行列), 行列の結合(_,_逆行列,_既約ガウス行列). 行列の結合(Len1,Len2,[_行1],[_行2],[_行3]) :- append(_行1,_行2,_行3), length(_行1,Len1), length(_行2,Len2). 行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :- append(_行1,_行2,_行3), 行列の結合(Len1,Len2,R1,R2,R3), length(_行1,Len1), length(_行2,Len2). 行列の結合([_行1|R1],[_行2|R2],_結合された行列) :- 行列の結合(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列), Len1 > 0, Len2 > 0. 単位行列(M,N1,N,[]) :- N1 > N,!. 単位行列(M,M,N,[1|R]) :- N2 is M + 1, 単位行列(M,N2,N,R). 単位行列(M,N1,N,[0|R]) :- \+(N1 = M), N2 is N1 + 1, 単位行列(M,N2,N,R). 単位行列(M,N,[]) :- M > N,!. 単位行列(M,N,[_行|R]) :- 単位行列(M,1,N,_行), M2 is M + 1, 単位行列(M2,N,R). 単位行列(N,_単位行列) :- 単位行列(1,N,_単位行列). 単位行列(_単位行列) :- 正方行列(_単位行列), length(_単位行列,_次数), 単位行列(_次数,_単位行列) . 変数正方行列(M,N,[]) :- M > N. 変数正方行列(M,N,[L|R]) :- length(L,N), M2 is M + 1, 変数正方行列(M2,N,R). % % ガウス行列に変形/2は http://nojiriko.asia/prolog/Gauss_gyoretsu_ni_henkei.html % 既約ガウス行列に変形/2 は http://nojiriko.asia/prolog/kiyaku_Gauss_gyoretsu_ni_henkei.html % を参照して下さい。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/153 # # if select * from t where id=1 # then update t set foo=bar where id=1 # # これをSQLで表現したいのですが可能でしょうか? # # 'if select * from t where id=1 then update t set foo=bar where id=1' :- '1要素のupdate'(t,id1,'1',foo,bar). '1要素のupdate'(_テーブル名,_鍵属性名,_鍵値,_置換属性名,_置換する値) :- 組構造を得る(_テーブル名,_属性名ならび), 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,P), 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換する項), retract(_現在の項), '置換される組の変数部分だけ元の値に単一化する'(_現在の組,_置換する組), asserta(_置換する項). 組構造を得る(_テーブル名,_属性名ならび) :- findall([_属性番号,_属性名],( テーブル構造(_テーブル名,_属性番号,_属性名)), L1), sort(L1,L2), findall(_属性名,( member([_,_属性名],L2)), _属性名ならび). 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換項) :- 置換する組(_属性名ならび,_置換する組), 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組), _置換項 =.. [_テーブル名|_置換する組]. 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,_現在の項) :- 現在の組(_属性名ならび,_現在の組), 鍵を現在の組に設定(_属性名ならび,_鍵属性名,_鍵値,_現在の組), _現在の項 =.. [_テーブル名|_現在の組]. 現在の組(_属性名ならび,_現在の組) :- length(_属性名ならび,Len), length(_現在の組,Len). 置換する組(_属性名ならび,_置換する組) :- length(_属性名ならび,Len), length(_置換する組,Len). 鍵を現在の組に設定(_属性名ならび,_鍵名,_鍵値,_現在の組) :- nth1(_鍵属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_現在の組,_鍵値),!. 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組) :- nth1(_置換属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_置換する組,_鍵値),!. '置換する組の変数部分だけ元の値に単一化する'([],[]). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[A|R2]) :- '置換する組の変数部分だけ元の値に単一化する'(R1,R2). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[B|R2]) :- \+(A = B), '置換する組の変数部分だけ元の値に単一化する'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/575 # # 学校で宿題が出ました、助けて下さい>< # 実行すると下記のような動作をするバッチファイルスクリプトを作成したいです。 # よろしくお願いいたします。 # # 実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。 # テキストファイルの中に、pass = "C:\Users\users\Documents\workspace\test.txt"というような # パスを変数に代入する記述があった場合 # そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ\test.txt" # という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。 # '実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。テキストファイルの中に、pass = /Users/users/Documents/workspace/test.txt"というようなパスを変数に代入する記述があった場合そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ/test.txt"という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。'(_テキストファイル) :- pwd(CWDIR), get_chars(_テキストファイル,Chars_1), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2), put_chars(_テキストファイル,Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2) :- atom_chars(CWDIR,CWDIRL), search_part_list(Chars_1,[<,p,a,s,s,' ',=,' ','"'],['"'],L0,L1,L2), パス部分を現在のディレクトリに置換する(CWDIRL,L1,L11), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,L2,Chars_2_2), append(L0,L11,Chars_2_2,Chars_2),!. 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars,Chars). パス部分を現在のディレクトリに置換する(CWDIRL,L1,L11) :- ファイル部分(L1,_ファイル部分), append(CWDIRL,[/|_ファイル部分],L11). ファイル部分(_実質パス部分,_ファイル部分) :- append(_,[/|_ファイル部分],_実質パス部分), \+(member(/,_ファイル部分)),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% search_part_list(L,SL0,SL2,L0,L1,L2) :- append(SL0,[R0],SL0_1), append(SL2,[R2],SL2_1), partition_list_1(L,SL0_1,L0,R1), partition_list_1(R1,SL2_1,L1,L2). partition_list(L1,_指定ならび,L,R) :- append(_指定ならび,[R1],_指定ならび_1), partition_list_1(L1,_指定ならび_1,LX,R). partition_list_1([],_,[],[]) :- !. partition_list_1(L1,L1,[],R) :- !. partition_list_1([A|R1],L1,[A|R2],R) :- partition_list_1(R1,L1,R2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1276873238/575 # # 学校で宿題が出ました、助けて下さい>< # 実行すると下記のような動作をするバッチファイルスクリプトを作成したいです。 # よろしくお願いいたします。 # # 実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。 # テキストファイルの中に、pass = "C:\Users\users\Documents\workspace\test.txt"というような # パスを変数に代入する記述があった場合 # そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ\test.txt" # という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。 # '実行するバッチファイルが現在存在するディレクトリにある全てのテキストファイルを書き換えるバッチを作成しなさい。テキストファイルの中に、pass = /Users/users/Documents/workspace/test.txt"というようなパスを変数に代入する記述があった場合そのパスの部分を、pass = "現在のバッチファイルの存在するディレクトリ/test.txt"という風にディレクトリ名だけを(ファイル名は書き換えない)書き換えるバッチを作成しなさい。'(_テキストファイル) :- pwd(CWDIR), get_chars(_テキストファイル,Chars_1), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2), put_chars(_テキストファイル,Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars_1,Chars_2) :- atom_chars(CWDIR,CWDIRL), パス部分を現在のディレクトリに置換する(CWDIRL,_chars_1,_前部分,_置換_後部分), 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,_後部分,Chars_2_2), append(_前部分,_置換された部分,Chars_2_2,_Chars_2). 'ディレクトリ名だけを(ファイル名は書き換えない)書き換える'(CWDIR,Chars,Chars). パス部分を現在のディレクトリに置換する(Chars_1,_前部分,_置換された部分,_後部分) :- パス部分(_パス部分,_実質パス部分), append(_前部分,_パス部分,_後部分,Chars_1), ファイル部分(_実質パス部分,_ファイル部分), append([p,a,s,s,' ',=,' ','"'|CWDIRL],[/|_ファイル部分],['"'],_置換された部分),!. パス部分([p,a,s,s,' ',=,' ','"'|R],_実質パス部分) :- append(_実質パス部分,['"'],R), \+(member('"',_実質パス部分)),!. ファイル部分(_実質パス部分,_ファイル部分) :- append(_,[/|_ファイル部分],_実質パス部分), \+(member(/,_ファイル部分)),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/849 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例6.3.1を配列変数xの要素数(変数memberの値)と各要素の値をキーボードから入力するように変更しなさい。 # プログラム例6.3.1 # #include <stdio.h> # # int main(void) # { # int x[10] = {80, 56, 68, 75, 45, 100, 92, 73, 63, 95}; # int member = 10; # int total; # float average; # int i; # for (i = 0, total = 0; i < member; ++i ) # total += x[i]; # average = (float)total / (float)member; # printf("総和=%d\n",total); # printf("平均点=%7.2f\n", average); # return 0; # } # # 設問1-2 # 上記設問1-1と同じ配列変数xの要素をその並びを逆順にして配列変数yへ代入し、yの全要素を表示するプログラムを作りなさい。 # '要素数と各要素の値を逆順にキーボードから入力して、その総和と平均点を求める' :- '要素数とならびの各要素を逆順に入力して'(_要素数,_ならび), 全要素を表示する(_逆順ならび). '要素数とならびの各要素を逆順に入力して'(_要素数,_逆順ならび) :- 要素数の入力(_要素数), length(Ln,_要素数), ならびを逆順に入力([],Ln,[],_逆順ならび). 要素数の入力(_要素数) :- write('要素数を入力してください : '), get_line(Line), 要素数入力診断(Line,_要素数),!. 要素数の入力(_要素数) :- 要素数の入力(_要素数). 要素数入力診断(Line,_要素数) :- atom_to_term(Line,_要素数,_), integer(_要素数), _要素数 > 0,!. 要素数入力診断(Line,_要素数) :- writef('入力された %t からは適切な要素数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ならびを逆順に入力(Ln,Ln,_逆順ならび,_逆順ならび) :- !. ならびを逆順に入力(L0,Ln,L,_逆順ならび) :- length([_|L0],_何番目), writef('%t番目の数値を入力してください : '), 値の入力(_値), ならびを逆順に入力([_|L0],Ln,[_値|L],_逆順ならび). 値の入力(_値) :- get_line(Line), 値の入力診断(Line,_値),!. 値の入力(_値) :- 値の入力(_値). 値の入力診断(Line,_値) :- atom_to_term(Line,_値,_), number(_値),!. 値の入力診断(Line,_値) :- writef('入力された%tからは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. 全要素を表示する([]). 全要素を表示する([_要素]) :- writef('%t\n',[_要素]),!. 全要素を表示する([_要素|R]) :- writef('%t ',[_要素]), 全要素を表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/849 # # [1] 授業単元:計算機アルゴリズム # [2] 問題文(含コード&リンク): # 設問1-1 # プログラム例6.3.1を配列変数xの要素数(変数memberの値)と各要素の値をキーボードから入力するように変更しなさい。 # プログラム例6.3.1 # #include <stdio.h> # # int main(void) # { # int x[10] = {80, 56, 68, 75, 45, 100, 92, 73, 63, 95}; # int member = 10; # int total; # float average; # int i; # for (i = 0, total = 0; i < member; ++i ) # total += x[i]; # average = (float)total / (float)member; # printf("総和=%d\n",total); # printf("平均点=%7.2f\n", average); # return 0; # } # # 設問1-2 # 上記設問1-1と同じ配列変数xの要素をその並びを逆順にして配列変数yへ代入し、yの全要素を表示するプログラムを作りなさい。 # '要素数と各要素の値をキーボードから入力して、その総和と平均点を求める' :- '要素数とならびの各要素を入力して'(_要素数,_ならび), その総和と平均点を求める(_要素数,_ならび,_総和,_平均点), writef('総和=%t 平均点= %7c\n',[_総和,_平均点]). '要素数とならびの各要素を入力して'(_要素数,_ならび) :- 要素数の入力(_要素数), ならびの入力(_要素数,_ならび). 要素数の入力(_要素数) :- write('要素数を入力してください : '), get_line(Line), 要素数入力診断(Line,_要素数),!. 要素数の入力(_要素数) :- 要素数の入力(_要素数). 要素数入力診断(Line,_要素数) :- atom_to_term(Line,_要素数,_), integer(_要素数), _要素数 > 0,!. 要素数入力診断(Line,_要素数) :- writef('入力された %t からは適切な要素数が得られませんでした。再入力をお願いします。\n',[Line]), fail. ならびの入力(_要素数,_ならび) :- length(_ならび,_要素数), findall(_値,( append(L0,[_値|_],_ならび), length([_|L0],_何番目), writef('%t番目の数値を入力してください : '), 値の入力(_値)), _ならび). 値の入力(_値) :- get_line(Line), 値の入力診断(Line,_値),!. 値の入力(_値) :- 値の入力(_値). 値の入力診断(Line,_値) :- atom_to_term(Line,_値,_), number(_値),!. 値の入力診断(Line,_値) :- writef('入力された%tからは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. その総和と平均点を求める(_要素数,_ならび,_総和,_平均点) :- sum(_ならび,_総和), _平均点 is _総和 / _要素数. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/666 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): 月の英語名を初期値とした文字列配列(大きさは12x10)を使って # キーボードから月の英語名を入力しそれが何月かを表示するプログラムを作成せよ. # 実行例↓ # $./kadai # Month? October # October is 10 gatsu # # $./kadai # Month? May # May is 5 gatsu # '月の英語名を初期値とした文字列配列(大きさは12x10)を作る' :- length(LL,12), findall(L,( append(L0,[L|R],LL), length(L,10), length([_|L0],_nth), write('%t月の英語名を入力してください : '), get_line(Line), atom_chars(Line,Chars), append(Chars,_,L)), LL), assertz('月の英語名を初期値とした文字列配列(大きさは12x10)'(LL)). '月の英語名を初期値とした文字列配列(大きさは12x10)を使ってキーボードから月の英語名を入力しそれが何月かを表示する' :- '月の英語名を初期値とした文字列配列(大きさは12x10)'(_文字列配列), キーボードから月の英語名を入力し(_月の英語名), それが何月かを(_月の英語名,_文字列配列,_月), 表示する(_月). キーボードから月の英語名を入力し(_月の英語名) :- write('月の英語名を入力してください : '), get_line(_月の英語名). それが何月かを(_月の英語名,_文字列配列,_月) :- atom_chars(月の英語名,Chars), append(Chars,R,L), nth1(_月,_文字列配列,_月の英語名), すべてが変数(R),!. それが何月かを(_月の英語名,_文字列配列,_月) :- writef('%tは英語の月名ではありません。\n',[_月の英語名]), fail. 表示する(_月) :- writef('%t月です\n',[_月]). すべてが変数([]). すべてが変数([V|R]) :- var(V), すべてが変数(R). % % C152_666.htmlとは違って、無理に文字列配列(大きさは12x10)に近い構造を % 作ってみた。これでも、結局は処理はリストの先頭からだから、ここでの努力は % ほとんど無駄である。 % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/659 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 以下を参考に再帰的二分探索を作成せよ。 # http://ime.nu/codepad.org/BHEasb4b # お手数ですが、詳細はURLでお願いします。 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # 以下を参考に再帰的二分探索を作成せよ。 # # int binsearch (int x, int v[], int n) # { # int p, q, m; # p = 0; # q = n ? 1; # while (p <= q) { # m = (p + q)/2; # if (x < v[m]) # q = m ? 1; # else if (x > v[m]) # p = m + 1; # else # return m; # } # return ?1; # # ?入力:int x, int v[], int n (binsearchに同じ) # ?出力:配列vにxが存在すれば、その場所(添字)。存在しなければ,‐1 # ? プログラムの構造 # ? ループを使用せず,関数の再帰呼び出しを使うこと # ? 外部変数で値の受け渡しをしないこと # # [3] 環境 #  [3.1] OS:windows 7 #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語:c言語 # [4] 期限:2011/10/15 23:00 # [5] その他の制限:配列は整数で昇順にソートされている前提でした。授業では配列、ポインタは習っています。よろしくお願いします。 # 整列ならびの二分検索(_検索要素,_ならび,_前半ならび,_残りならび) :- ならびを二つ折りにする(_ならび,_前半ならび_1,_後半ならび_1), 整列ならびの二分検索(_検索要素,_前半ならび_1,_後半ならび_1,_前半ならび,_残りならび). 整列ならびの二分検索(_検索要素,_前半ならび,[_検索要素|_残りならび],_前半ならび,_残りならび) :- !. 整列ならびの二分検索(_検索要素,_前半ならび_1,[_要素|_残りならび_1],_前半ならび,_残りならび) :- _検索要素 @< _要素, 整列ならびの二分検索(_検索要素,_前半ならび_1,_前半ならび,_残りならび_2), append(_残りならび_2,_残りならび_1,_残りならび). 整列ならびの二分検索(_検索要素,_前半ならび_1,[_要素|_残りならび_1],_前半ならび,_残りならび) :- _検索要素 @> _要素, 整列ならびの二分検索(_検索要素,_残りならび_1,_前半ならび_2,_残りならび), append(_前半ならび_1,_前半ならび_2,_前半ならび). ならびを二つ折りにする(_ならび,_前半ならび,_後半ならび) :- length(_ならび,M), ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび). ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび) :- 0 is M mod 2, M1 is M // 2, length(_前半ならび,M1), length(_後半ならび,M1), append(_前半ならび,_後半ならび,_ならび). ならびを二つ折りにする(M,_ならび,_前半ならび,_後半ならび) :- 1 is M mod 2, M1 is M // 2, M2 is M1 + 1, length(_前半ならび,M1), length(_後半ならび,M2), append(_前半ならび,_後半ならび,_ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/645 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # ■プログラム1: # りんごが30個中、腐ったりんごが10個あったとき、 # 腐ってないりんごを3人で分けると、 # 一人当たりのりんごの個数は何個になるか、計算し、 # "一人あたりのりんごの個数"と"残ったりんごの個数"を # 出力するプログラム。 # (C言語の足し算、引き算、かけ算、割り算はそれぞれ、 +, -, *, / を使うが、 # 割った余り(剰余) は % で計算できる。 (例: n を m で割った余りは n % m )) # ■プログラム2: # 上記プログラム1 のリンゴの個数などの数を scanfを使ってキーボードから # 入力することで、任意の個数に対して計算できるように改良したプログラム。 # ただし両プログラムの変数名は、最初のりんごの個数をapple、 # 腐っていたりんごの個数を bad_apple、人数をpersons、 # 一人当たりのりんごの個数を apple_for_one、余りをrest とすること。 # 'りんごの個数を入力し、その中の腐ったりんごの個数を入力する。人数を入力して、腐ってないりんごをこの人数で分けると、一人当たりのりんごは何個になるかを計算し、"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する' :- りんごの個数を入力し(_りんごの個数), 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数), 人数を入力して(_分割する人数), '腐ってないりんごを何人かで分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数), '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数). りんごの個数を入力し(_りんごの個数) :- write('りんごの個数を入力してください : '), get_line(Line), りんごの個数入力検査(Line,_りんごの個数),!. りんごの個数を入力し(_りんごの個数) :- りんごの個数を入力し(_りんごの個数). りんごの個数入力検査(Line,_りんごの個数) :- atom_to_term(Line,_りんごの個数,_), integer(_りんごの個数), _りんごの個数 > 0,!. りんごの個数入力検査(Line,_りんごの個数) :- writef('入力された%tからは適切なりんごの個数が得られません。再入力をお願いします。\n',[Line]), fail. 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数) :- writef('腐ったりんごの個数を入力してください( >%t ) : ',[_りんごの個数]), get_line(Line), 腐ったりんごの個数入力検査(Line,_腐ったりんごの個数),!. 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数) :- 腐ったりんごの個数を入力する(_りんごの個数,_腐ったりんごの個数). 腐ったりんごの個数入力検査(Line,_りんごの個数,_腐ったりんごの個数) :- atom_to_term(Line,_腐ったりんごの個数,_), integer(_腐ったりんごの個数), _腐ったりんごの個数 < _りんごの個数,!. 腐ったりんごの個数入力検査(Line,_りんごの個数,_腐ったりんごの個数) :- writef('入力された%tからは適切な腐ったりんごの個数は得られません。再入力をお願いします。\n',[Line]), fail. 人数を入力して(_分割する人数) :- write('分割する人数を入力してください : '), get_line(Line), 人数入力検査(Line,_分割する人数),!. 人数を入力して(_分割する人数) :- 人数を入力して(_分割する人数). 人数入力検査(Line,_分割する人数) :- atom_to_term(Line,_分割する人数,_), integer(_分割する人数), _分割する人数 > 0,!. 人数入力検査(Line,_分割する人数) :- writef('入力された%tからは適切な分割する人数が得られません。再入力をお願いします。\n',[Line]), '腐ってないりんごを何人かで分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数) :- '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数), '何人かで分ける'(_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数). '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数) :- _腐っていないりんごの個数 is _りんごの個数 - _腐ったりんごの個数. '何人かで分ける'(_腐っていないりんごの個数,_分割する人数,_一人当たりのりんごの個数,_残ったりんごの個数) :- _一人当たりのりんごの個数 is _腐っていないりんごの個数 // _分割する人数, _残ったりんごの個数 is _腐っていないりんごの個数 mod _分割する人数. '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数) :- 出力する('一人あたりのりんごの個数 = %t\n',_一人当たりのりんごの個数), 出力する('残ったりんごの個数 = %t\n',_残ったのりんごの個数). 出力する(_表示パターン,_表示項目) :- writef(_表示パターン,[_表示項目]). % このプログラムは http://nojiriko.asia/prolog/c152_645_1.html のどこを変更 % したかを確認してこそ、意味のあるものです。 % 最初の述語名が大きく異なっていること。これが一番重要だと思います。 % それから具体値を一般化した場合の述語名の書き換え方。 % やはり、Prologは国語だ。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/645 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # ■プログラム1: # りんごが30個中、腐ったりんごが10個あったとき、 # 腐ってないりんごを3人で分けると、 # 一人当たりのりんごの個数は何個になるか、計算し、 # "一人あたりのりんごの個数"と"残ったりんごの個数"を # 出力するプログラム。 # (C言語の足し算、引き算、かけ算、割り算はそれぞれ、 +, -, *, / を使うが、 # 割った余り(剰余) は % で計算できる。 (例: n を m で割った余りは n % m )) # ■プログラム2: # 上記プログラム1 のリンゴの個数などの数を scanfを使ってキーボードから # 入力することで、任意の個数に対して計算できるように改良したプログラム。 # ただし両プログラムの変数名は、最初のりんごの個数をapple、 # 腐っていたりんごの個数を bad_apple、人数をpersons、 # 一人当たりのりんごの個数を apple_for_one、余りをrest とすること。 # 'りんごが30個中、腐ったりんごが10個あったとき、腐ってないりんごを3人で分けると、一人当たりのりんごの個数は何個になるか、計算し、"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する' :- 'りんごが30個'(_りんごの個数), '腐ったりんごが10個'(_腐ったりんごの個数), '腐ってないりんごを3人で分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_一人当たりのりんごの個数,_残ったりんごの個数), '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数). 'りんごが30個'(30). '腐ったりんごが10個'(10). '腐ってないりんごを3人で分ける'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数,_一人当たりのりんごの個数,_残ったりんごの個数) :- '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数), '3人で分ける'(_腐っていないりんごの個数,_一人当たりのりんごの個数,_残ったりんごの個数). '腐っないりんごを'(_りんごの個数,_腐ったりんごの個数,_腐っていないりんごの個数) :- _腐っていないりんごの個数 is _りんごの個数 - _腐ったりんごの個数. '3人で分ける'(_腐っていないりんごの個数,_一人当たりのりんごの個数,_残ったりんごの個数) :- _一人当たりのりんごの個数 is _腐っていないりんごの個数 // 3, _残ったりんごの個数 is _腐っていないりんごの個数 mod 3. '"一人あたりのりんごの個数"と"残ったりんごの個数"を出力する'(_一人当たりのりんごの個数,_残ったりんごの個数) :- 出力する('一人あたりのりんごの個数 = %t\n',_一人当たりのりんごの個数), 出力する('残ったりんごの個数 = %t\n',_残ったのりんごの個数). 出力する(_表示パターン,_表示項目) :- writef(_表示パターン,[_表示項目]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/627 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク): # scanf で n を受け取り, 要素数 n の乱数配列を作成し, 指定した 2 つの要素番号にある要素を交換するプログラムを作成せよ. # 'n を受け取り, 要素数 n の乱数ならびを作成し, 指定した 2 つの要素番号にある要素を交換する' :- 'n を受け取り'(_n), '要素数 n の乱数配列を作成し'(_n,_乱数ならび), '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび), 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび),!. 'n を受け取り'(_n) :- write('要素数nを入力してください : '), get_line(Line), 'n受け取り検査'(Line,_n),!. 'n を受け取り'(_n) :- 'n を受け取り'(_n). 'n受け取り検査'(Line,_n) :- atom_to_term(Line,_n,_), integer(_n), _n > 0,!. 'n受け取り検査'(Line,_n) :- writef('入力された%tからは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '要素数 n の乱数配列を作成し'(_n,_乱数ならび) :- length(_乱数ならび,_n), findall(_乱数,( append(_,[_乱数|_],_乱数ならび), _乱数 is random(100) + 1), _乱数ならび). '指定した 2 つの要素番号にある要素を交換する'(_n,_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2), '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび). '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- writef('2つの要素番号[1~%t]をカンマ区切りで入力してください : ',[_n]), get_line(Line), '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2) :- '指定した 2 つの要素番号'(_n,_要素番号_1,_要素番号_2). '指定した 2 つの要素番号入力検査'(Line,_n,_要素番号_1,_要素番号_2) :- '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2), '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2),!. '指定した 2 つの要素番号入力検査'(Line,_要素番号_1,_要素番号_2) :- write('再入力をお願いします\n'), fail. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- split(Line,[','],[_要素番号_1,_要素番号_2]),!. '入力行を2要素に分解する'(Line,_要素番号_1,_要素番号_2) :- writef('入力された%tからは2要素の要素番号が得られません。\n',[Line]), fail. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- _要素番号_1 > 0, _要素番号_1 =< _n, _要素番号_2 > 0, _要素番号_2 =< _n,!. '2要素はならびの要素範囲を指している'(Line,_n,_要素番号_1,_要素番号_2) :- writef('入力された要素には[1~%t]の範囲を逸脱しているものが有ります。\n',[Line,_n]), fail. '2 つの要素番号にある要素を交換する'(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- 要素番号を変数に置換(_乱数ならび,_要素番号_1,_元の値_1,_変数_1,_乱数ならびの一), 要素番号を変数に置換(_乱数ならびの一,_要素番号_2,_元の値_2,_変数_2,_2要素が交換された乱数ならび), _変数_1 = _元の値_2, _変数_2 = _元の値_1,!. 要素番号を変数に置換(_ならび,_要素番号,_元の値,_変数,_置換されたならび) :- length([_|L0],_要素番号), append(L0,[_元の値|R],_ならび), append(L0,[_変数|R],_置換されたならび). 表示する(_乱数ならび,_要素番号_1,_要素番号_2,_2要素が交換された乱数ならび) :- writef('元の乱数ならびは: %t\n',[_乱数ならび]), writef('%t番目と%t番目の要素を交換する\n',[_要素番号_1,_要素番号_2]), writef('2要素が交換された乱数ならびは: %t\n',[_2要素が交換された乱数ならび]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/594 # # 正規表現は、既出かどうかってのがわかりにくいね。 # # ●正規表現の使用環境 # Java1.6 # # ●検索か置換か? # 検索 # # ●説明 # 変数文字列とその添字の取得 # # ●対象データ # $AAA.BBB+$CCC.DDD.EEE(1234)-#FFF*#GGG.HHH(567) # # ●希望する結果 # 検索1回目 # group1 : $AAA.BBB # # 検索2回目 # group1 : $CCC.DDD.EEE # group2 : 1234 # # 検索3回目 # group1 : #FFF # # 検索4回目 # group1 : #GGG.HHH # group2 : 567 # # # ($.*)\\(([0-9]*)\\) # これで、$CCC.DDD.EEE(1234)をみつけれるのは出来たけど、添え字が無い場合を引っ掛けるのができない。 # # '変数文字列とその添字の取得'(_文字列,_前文字列,_適合文字列,_後文字列,Group1,Group2) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,['$'|R2],L3), \+((member(A,R),member(A,['+','-','*','/']))), '[]であるか先頭に+,-,*,/,が来る'(L3), group検査(R2,Group1,Group2). '[]であるか先頭に+,-,*,/,が来る'([]) :- !. '[]であるか先頭に+,-,*,/,が来る'([A|_]) :- member(A,[+,-,*,/]),!. group検査(R2,Group1,'') :- \+(append(_,['('|_],R2)), atom_chars(Group1,R2),!. group検査(R2,Group1,Group2) :- atom_chars(Group1,R2), append(_,['('|R3],R2), append(L0,[')'|_],R3), atom_chars(Group2,L0),!. % 以下のサイトは # http://stackoverflow.com/questions/7540952 # 私は、プロローグでの単純な問題にこだわっている。プログラムを考えてみましょう # # 労働者(手形)。 # 労働者(smitt)。 # 労働者(フレッド)。 # 労働者(ダニー)。 # 労働者(ジョン)。 # 車(BMW)。 # 車(マツダ)。 # 車(アウディ)。 # 所有者(フレッド、マツダ)。 # 所有者(ダニー、BMW)。 # 所有者(ジョン、アウディ)。 # ?- no_car(X) - :私たちが入力するクエリをした場合、ワーカーXがない車、 # すなわち、持っていない場合にtrueとなる複数の述語no_car(X)を、 # 追加する必要があります。プロローグは、答える必要があります # # X = smitt、 # X =手形、 # はい # 私が行っていることです。 # # hascar(X): - 所有者(X、_)。 # nocar(X): - 労働者(X)ではなく、hascar(X)。 # anonimous変数は、クエ??リだけで使用可能なのでしかし、このアプローチは # 動作しません。だから、私は本当にこの上こだわっている。 # 私は、クエリでこのロジックを表現できるようにSQL内の単語を"NOT EXISTSを"が、 # プロローグのそれらに類似したものがあるがあると知っていますか? # 私は、プロローグでの単純な問題にこだわっている。プログラムを考えてみましょう 労働者(bill). 労働者(smitt). 労働者(fred). 労働者(dany). 労働者(john). 車('BMW'). 車(マツダ). 車(アウディ). 所有者(fred,マツダ). 所有者(dany,'BMW'). 所有者(john,アウディ). 労働者で車を所有していない(_労働者) :- 労働者(_労働者), 車を所有していない(_労働者). 車を所有していない(_所有者) :- \+(車を所有している(_所有者)). 車を所有している(_所有者) :- 車(_所有種類), 所有者(_所有者,_所有種類). % 以下のサイトは # http://stackoverflow.com/questions/7542406/ # ここで私が何をしたいです。 # 私は文字のリストを持っている(基本的に単語)と私はアンダースコアで # 単語に母音を代入する['_']と新しいリストを返します。 # 例: # # ?- サブ([s,e,g,e,d],A). # A = [s,_,g,_,d] # ここで私が試みたが、述語から、それが終了するが、それがすべてを解体し、 # それが出力文字列なしで目標を見つけたことを宣言し呼び出すときに、 # それが最終的に折返しのために新しいリストを作成し、何です!... # 私が使用されるアルゴリズムは以下のとおりです。リストの要素を選択し、 # それが母音であるかどうかをチェックし、新しいリストに['_']または要素自体を # 追加。 '文字のリストの母音要素を一旦匿名変数に置き換え、その匿名変数を5つの母音で置換して得られる文字リスト'(_文字リスト,_母音を置換した文字列) :- 文字リストの母音要素を匿名変数に置き換える(_文字リスト,_母音を匿名変数に置換した文字列), 匿名変数に5つの母音で置換して得られる文字リスト(_母音を匿名変数に置換した文字列,_母音を置換した文字列). 匿名変数を5つの母音で置換して得られる文字リスト([],[]). 匿名変数を5つの母音で置換して得られる文字リスト([A|R1],[A|R2]) :- \+(var(A)), 匿名変数を5つの母音で置換して得られる文字リスト(R1,R2). 匿名変数を5つの母音で置換して得られる文字リスト([A|R1],[B|R2]) :- var(A), 母音(B), 匿名変数を5つの母音で置換して得られる文字リスト(R1,R2). 文字リストの母音要素を匿名変数に置き換える([],[]). 文字リストの母音要素を匿名変数に置き換える([A|R1],[A|R2]) :- \+(母音(A)), 文字リストの母音要素を匿名変数に置き換える(R1,R2). 文字リストの母音要素を匿名変数に置き換える([A|R1],['_'|R2]) :- 母音(A), 文字リストの母音要素を匿名変数に置き換える(R1,R2). 母音(a). 母音(e). 母音(i). 母音(o). 母音(u). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/503 # # あんまり暇なんでΣのプログラムの例を作ってみた # #include <stdio.h> # typedef double(*fk)(double); # double sigma(int k,int klimit,fk); # /* # 例えば # 5 # Σ (2k+1) # k=1 # */ # double func(double k) # { # return 2*k+1; # } # double sigma(int k,int klimit,fk FK) # { # double red = 0; # for(;k <= klimit;k++){ # printf("%.0lf",FK(k)); # if(k<klimit) # putchar('+'); # red += FK(k); # } # return red; # } # int main() # { # double result = sigma(1,5,func); # printf("=%.0lf \n",result); # return 0; # } # # シグマ(_k,S,E,_式,X) :- 実数総計(Y,( for(S,_k,E), Y is _式), X). 実数総計(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 実数加算(_値ならび,_合計値),!. 実数加算([],0.0). 実数加算([A|R],S) :- 実数加算(R,S1), S is S1 + A. % ?- シグマ(_k,1,5,2 * _k + 1,X). % X = 35.0 % % この問題のポイント % シグマの第一引数は変数のまま質問します。ただし、必ず _式 の中に_k を含める % ようにします。この点が大事です。第一引数の _k は _式 の中で % シグマの _k に当たるものが何であるかを知らせるためにあります。 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/471 # # [1]情報基礎概論 # [2] F(x)を計算する関数double func1(double x)を作成せよ。ただしμの値はμ=0.891とし、 # double mu=0.891; # と変数の初期化時に与えるようにせよ。 # 関数は F(x)=μ*x+2*(1-μ)*x^2/(1+x^2) で与えられてます # [3] # [3.1] windows7  # [3.2]gcc  # [3.3] c言語: # [4] 無期限 # # mu(0.891). func1(_x,_y) :- mu(_mu), _y is _mu * _x + 2 * (1 - _mu) * _x # 2 / (1 + _x # 2). % 以下のサイトは #

Best Cow Line(POJ3617)

# # N文字の文字列Sが与えられ、N文字の文字列Tを作ります。 # はじめはTは長さ0の文字列で、次のいずれかの操作が行えます。 # ・Sの先頭を一文字削除し、Tの末尾に追加する # ・Sの末尾を一文字削除し、Tの末尾に追加する # 辞書順比較でできるだけ小さくなるようにTを作ってください。 # # 制約 # ・1 =< N =< 2000 # ・文字列Sに含まれるのはローマ字の大文字のみ # poj3617(S,T) :- 'stringは引数として渡されると文字コードのリストとして扱われる', '第二引数が[]から成長する、それが実はTである'(Ln,S,[],L), '最後に文字コードのリストをstringに戻す'(L,T). '第二引数が[]から成長する、それが実はTである'(S,T1,T) :- '引数として渡されたものはS,Tのままにするがこれは文字コードのリストだ', '処理した文字数を制御するため、Sの文字数と同じ要素数の匿名変数リストLnを用意する'(S,Ln), 'リストの比較がし易いように反転リストS2を作る'(S,S2), 'S,S2からTを生成'(Ln,S,S2,T1,T). '処理した文字数を制御するため、Sの文字数と同じ要素数の匿名変数リストLnを用意する'(S,Ln) :- length(S,N), length(Ln,N). 'リストの比較がし易いように反転リストS2を作る'(S,S2) :- reverse(S,S2). 'S,S2からTを生成'([],_,_,T,T) :- '第四引数に生成された物それがTである'. 'S,S2からTを生成'([_|Ln],[A|R1],[B|R2],T1,T) :- [A|R1] @=< [B|R2], '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,A,T2), 'S,S2からTを生成'(Ln,R1,R22,T2,T). 'S,S2からTを生成'([_|Ln],[A|R1],[B|R2],T1,T) :- [A|R1] @> [B|R2], '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,B,T2), 'S,S2からTを生成'(Ln,R11,R2,T2,T). '選択された要素をT1(実はT)の末尾に付加してT2とする'(T1,_選択された要素,T2) :- append(T1,[_選択された要素],T2). '最後に文字コードのリストをstringに戻す'(L,T) :- string_to_list(T,L). % 以下はコメント的な述語 'stringは引数として渡されると文字コードのリストとして扱われる'. '引数として渡されたものはS,Tのままにするがこれは文字コードのリストだ'. '第四引数に生成された物それがTである'. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/350 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n # を出力するプログラムを作成しろ # % 馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら % どのような困難があるかということを示す。 '整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :- '整数 mとnを入力して'(_m,_n), 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S), '_m,_n,の値と適用するための工夫をする'(S,S2), 文字列を項に変換する(S2,P,VL), '表示文字列Xの表すものは変数Xである'(VL,X), call(P), '_mをmに_nをnに変換すると'(S,S3), writef('%t = %t\n',[S3,X]). 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :- _n_1 is _n - _m - 1, findall(S1,( for(1,N,_n_1), concat_atom(['(_m+',N,')'],S1)), L), concat_atom(L,'+',S),!. '_m,_n,の値と適用するための工夫をする'(S1,S2) :- concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!. '表示文字列Xの表すものは変数Xである'(VL,X) :- member('X'=X,VL). 文字列を項に変換する(S,P,VL) :- atom_to_term(S,P,VL),!. '_mをmに_nをnに変換すると'(S1,S2) :- atom_chars(S1,Chars), 'ならびの_mをmに_nをnに変換すると'(L1,L2), atom_chars(S2,L2),!. 'ならびの_mをmに_nをnに変換すると'([],[]) :-!. 'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. '整数 mとnを入力して'(_m,_n) :- write('m + 1 < n となるように'), 整数を入力(_m), 整数を入力(_n), '整数 mとnを入力診断'(_m,_n),!. '整数 mとnを入力して'(_m,_n) :- '整数 mとnを入力して'(_m,_n). 整数を入力(_整数) :- write('整数を入力しなさい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力(_整数) :- 整数を入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '整数 mとnを入力診断'(_m,_n) :- _n > _m + 1,!. '整数 mとnを入力診断'(_m,_n) :- write('m + 1 < n でなくてはなりません。再入力をお願いします。'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/350 # # [1] 授業単元:プログラミングC # [2] 問題文(含コード&リンク):整数 mとnを入力して m+(m+1)+(m+2)+…+n # を出力するプログラムを作成しろ # % 馬鹿正直に、m+(m+1)+(m+2)+…+n をプログラムとして書こうとしたら % どのような困難があるかということを示す。 '整数 mとnを入力して m+(m+1)+(m+2)+…+nを出力するプログラムを作成しろ' :- '整数 mとnを入力して'(_m,_n), 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S), '_m,_n,の値と適用するための工夫をする'(S,S2), 文字列を項に変換する(S2,P,VL), '表示文字列Xの表すものは変数Xである'(VL,X), call(P), '_mをmに_nをnに変換すると'(S,S3), writef('%t = %t\n',[S3,X]). 'm+(m+1)+(m+2)+…+nを文字列で表す'(_m,_n,S) :- _n_1 is _n - _m - 1, findall(S1,( for(1,N,_n_1), concat_atom(['(_m+',N,')'],S1)), L), concat_atom(L,'+',S),!. '_m,_n,の値と適用するための工夫をする'(S1,S2) :- concat_atom(['_m=',_m,',_n=',_n,',',X is S1,'+_n'],S2),!. '表示文字列Xの表すものは変数Xである'(VL,X) :- member('X'=X,VL). 文字列を項に変換する(S,P,VL) :- atom_to_term(S,P,VL),!. '_mをmに_nをnに変換すると'(S1,S2) :- atom_chars(S1,Chars), 'ならびの_mをmに_nをnに変換すると'(L1,L2), atom_chars(S2,L2),!. 'ならびの_mをmに_nをnに変換すると'([],[]) :-!. 'ならびの_mをmに_nをnに変換すると'(['_',m|R1],[m|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'(['_'|n],[n|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. 'ならびの_mをmに_nをnに変換すると'([A|R1],[A|R2]) :- 'ならびの_mをmに_nをnに変換すると'(R1,R2),!. '整数 mとnを入力して'(_m,_n) :- write('m + 1 < n となるように'), 整数を入力(_m), 整数を入力(_n), '整数 mとnを入力診断'(_m,_n),!. '整数 mとnを入力して'(_m,_n) :- '整数 mとnを入力して'(_m,_n). 整数を入力(_整数) :- write('整数を入力しなさい : '), get_line(Line), 整数入力診断(Line,_整数),!. 整数を入力(_整数) :- 整数を入力(_整数). 整数入力診断(Line,_整数) :- atom_to_term(Line,_整数,_), integer(_整数),!. 整数入力診断(Line,_整数) :- writef('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '整数 mとnを入力診断'(_m,_n) :- _n > _m + 1,!. '整数 mとnを入力診断'(_m,_n) :- write('m + 1 < n でなくてはなりません。再入力をお願いします。'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/909 # # [1] 授業単元:プログラム概論 # [2] 問題文(含コード&リンク): #   多角形を中心座標に対し上下反転させる関数を作成しなさい。この関数の引数は、多角形のデータが #   収められた構造体のアドレスをとる。また、上下反転された座標は元の頂点座標に格納する変数に再代入される。 # '多角形を中心座標に対し上下反転させる関数を作成しなさい。この関数の引数は、多角形のデータが収められた構造体のアドレスをとる。また、上下反転された座標は元の頂点座標に格納する変数に再代入される'(_多角形の頂点座標ならび,_中心座標に対して上下反転された多角形座標ならび) :- 中心y座標を得る(_多角形の頂点座標ならび,_中心y座標), 上限反転座標ならび(_中心y座標,_多角形の頂点座標ならび,_中心座標に対して上下反転された多角形座標ならび). 上限反転座標ならび(_,_,[],[]) :- !. 上限反転座標ならび(_中心y座標,[(_x座標,_y座標)|R1],[(_x座標,_y座標_2)|R2]) :- _y座標 >= _中心y座標, _y座標_2 is _y座標 - (_y座標-_中心y座標) * 2, 上限反転座標ならび(_中心x座標,_中心y座標,R1,R2),!. 上限反転座標ならび(_中心y座標,[(_x座標,_y座標)|R1],[(_x座標,_y座標_2)|R2]) :- _y座標 < _中心y座標, _y座標_2 is _y座標 + (_中心y座標-_y座標) * 2, 上限反転座標ならび(_中心x座標,_中心y座標,R1,R2),!. 中心y座標を得る(_多角形の頂点座標ならび,_中心y座標) :- findavg(_y座標,( append(_,[(_,_y座標)|_],_多角形の頂点座標ならび)), _中心のy座標),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/726 # # [1] 授業単元:プログラミング演習 # [2] 問題文:char str[4]="ABCD" # 上記の変数strには"A" "B" "C" "D"がstrの[0]〜[3]が入っています。 # この文字を三つ取り出して文字が同じになってもいいので組み合わせを表示 # させるプログラムを教えてください。 # 例: # ABC # ACB # ADC # AAA # AAB # str('ABCD'). 'char str[4]="ABCD" 上記の変数strには"A" "B" "C" "D"がstrの[0]〜[3]が入っています。この文字を三つ取り出して文字が同じになってもいいので組み合わせを表示させる' :- str(_文字列), atom_char(_文字列,_4文字ならび), findall(_重複組合せ,( 重複組合せ(_4文字ならび,3,_重複組合せ)), _重複組合せならび), 表示させる(_重複組合せならび). 重複組合せ(X,1,[A]) :- member(A,X). 重複組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 重複組合せ([A|Y],M,X). 重複組合せ([_|Y],N,A) :- N > 1, 重複組合せ(Y,N,A). 表示させる(_重複組合せならび) :- append(_,[_重複組合せ|R],_重複組合せならび), writef('%t,%t,%t\n',_重複組合せ), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/658 # # 助けてください。5つあります。 # 明日提出期限です。 # # 入力した数の階乗を計算するプログラムを作れ。 # nの階乗とは、n!と書いて、次のような計算をするものである。 # n! = n × (n – 1) × (n – 2) × … × 2 × 1 # # ヒント)関数 fact(n)を n!を計算するプログラムとする。 # この時、 # n! = n × (n – 1)! # だから、fact(n) を計算するには、fact(n-1)を計算してから、nをかければ良い。 # 'n!'(_n,_階乗) :- 階乗式評価項文字列の生成(N,_階乗式評価項文字列), atom_to_term(_階乗式評価項文字列,P,VL), '文字列の中の変数と_論理変数を結びつける'('_n',VL,_n), '文字列の中の変数と_論理変数を結びつける'('_階乗',VL,_階乗), call(P). 階乗式評価項文字列の生成(_n,_階乗式評価項文字列) :- 階乗式文字列の生成(_n,_階乗式文字列), swritef(_階乗式評価項文字列,'_階乗 is %t,[_階乗式文字列]). 階乗式文字列の生成(_n,_階乗式文字列) :- _n_3 is _n - 3, findall(S,( for(0,M,_n_3), concat_atom(['(','_n',' - ',M,')'],S)), L), append(L,['2','1'],L1), concat_atom(L1,' * ',_階乗式文字列),!. '文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_変数文字列=V],V) :- !. '文字列の中の変数と_論理変数を結びつける'(_変数文字列,[_|R],V) :- '文字列の中の変数と_論理変数を結びつける'(_変数文字列,R,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/623 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # n個のデータを降順に並び変える関数を作成しなさい。 # ただし、個数nを先に入力し、必要なメモリ領域を関数malloc()を用いて確保すること。 # すなわち、配列による宣言はせずに、ポインタで宣言する。 # また、2つの変数の値を入れ替える関数swap()も作成すること。 # http://ime.nu/codepad.org/hZCN4vEh # 上の課題を提出したのですが、再提出を要求されました。 # コメントに対する直しがわかる方よろしくお願いします。 # 'n個のデータを降順に並び変える'(_n個) :- length(L1,_n個), n個の要素に値を詰める(L1), 降順にならび変える(L1,L2). '二つの要素を入れ替える'(_m番目,_n番目,L1,L2) :- length([_|L01],_m番目), length([_|L02],_n番目), append(L01,[A|R1],L1), append(L01,[B|R1],L3), append(L02,[B|R2],L3), append(L02,[A|R2],L2),!. n個の要素に値を詰める(L1) :- findall(N,( append(_,[_|_],L1), N is random(1000)), L1). 降順にならび変える([],[]) :- !. 降順にならび変える(L1,L2) :- L1 = [A|R], 降順にならび変える(A,R,L2). 降順にならび変える(A,L1,L2) :- 分割(A,L1,_より大きいならび,_より小さいならび), 降順にならび変える(_より大きいならび,L3), 降順にならび変える(_より小さいならび,L4), append(L3,[A|L4],L2). 分割(_,[],[],[]) :- !. 分割(A,[B|R1],[B|R2],R3) :- B @> A, 分割(A,R1,R2,R3). 分割(A,[B|R1],R2,[B|R3]) :- B @=< A, 分割(A,R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/511 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 演習目的 # 々渋ぢ里筌櫂ぅ鵐燭鰺用して、データ構造を設計することができる。 # 構造体をreturn文で返却する関数を作ることができる。 # ポインタを扱うことができる。 # 課題: # 2つのビット列(unsigned char型の2変数)を受け取り、 # そのビット列のハミング距離を返す関数を作成しなさい。 # また、ビットの並を表示する関数を作成しなさい。 # ビット列x=(x0,x1,…,x7)とy=(y0,y1,…,y7)の # ハミング距離dは次で定義される。 # すなわち、異なるビットの個数である。 # d=[i=0,7](xi^yi), xi,yi∈{0,1} # 例えば、x=5,y=3のとき、x=(00000101),y=(00000011)であり、 # ハミング距離はd=2となる。 # 01の並びを入力し、変数に代入する関数を作ってもよい。 # ハミング距離(N1,N2,_ハミング距離) :- N3 is N1 # N2, ハミング距離_2(N3,_ハミング距離). ハミング距離_2(0,0). ハミング距離_2(N,S) :- D is N // 2, M is N mod 2, ハミング距離_2(D,S_1), S is M + S_1. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/801 # # [1] 授業単元:スタックとキュー # [2] 問題文(含コード&リンク): http://codepad.org/Os0523nV #   3問あります。問題文もリンク先に書いてあります。 # # 【問題1】 # スタックを実現するための配列stack[]をグローバル変数として宣言したものを下に示す。 #    /* スタックを実現する配列 */ #     #define STACK_SIZE 5 # #define NO_DATA -1 # # int stack[STACK_SIZE]; # int sp=-1; # # ここで、スタックの最大サイズは5とし、スタックポインタは-1に初期化している。 # # 以下の各関数を作成しなさい。 # 1)スタックをプッシュする関数:int Push(int data) #   引数の整数データをスタックに積み上げ、スタックポインタをインクリメントする。 #   プッシュが成功した場合は0を返し、スタックがオーバーフローした場合は-1を返す。 # 2)スタックをポップする関数:int Pop() #   スタックからデータを取り出し、スタックポインタをデクリメントする。ポップが成功した場合は #   取り出した整数を返し、スタックにデータがない場合は-1を返す。 # 3)スタックを底から頂上へ向けて表示する関数:void ShowStack() #   スタックに積み上がったデータを順に表示する。 # # 上記の各関数を使用して、スタックにデータをプッシュおよびポップするメインプログラムを作成し、以下のスタック動作を行いなさい。 # # 1)スタックをNO_DATAで初期化する。 # 2)スタックにデータ(例えば 111,222,333,444,555)を順にプッシュする。 # 3)適当にポップおよびプッシュを行うことにより、スタックの機能を確認する。 # 4)プッシュおよびポップを行った際にスタックにある全データを表示する。 # # <表示例> # (1) Push (2) Pop (0) Exit :1 # Data:111 # Stack : [111] # (1) Push (2) Pop (0) Exit :1 # Data:222 # Stack : [111][222] # (1) Push (2) Pop (0) Exit :1 # Data:333 # Stack : [111][222][333] # (1) Push (2) Pop (0) Exit :1 # Data:444 # Stack : [111][222][333][444] # (1) Push (2) Pop (0) Exit :1 # Data:555 # Stack : [111][222][333][444][555] # (1) Push (2) Pop (0) Exit :1 # Data:666 # Stack Overflow! # Stack Push is failed! # (1) Push (2) Pop (0) Exit :2 # Pop data is 555 # Stack : [111][222][333][444] # (1) Push (2) Pop (0) Exit :2 # Pop data is 444 # Stack : [111][222][333] # (1) Push (2) Pop (0) Exit :1 # Data:666 # Stack : [111][222][333][666] # (1) Push (2) Pop (0) Exit :2 # Pop data is 666 # Stack : [111][222][333] # (1) Push (2) Pop (0) Exit :2 # Pop data is 333 # Stack : [111][222] # (1) Push (2) Pop (0) Exit :2 # Pop data is 222 # Stack : [111] # (1) Push (2) Pop (0) Exit :2 # Pop data is 111 # Stack : # (1) Push (2) Pop (0) Exit :2 # Stack Empty! # Stack Pop is failed! # (1) Push (2) Pop (0) Exit :0 # # スタックサイズ(5). '引数の整数データをスタックに積み上げ、スタックポインタをインクリメントする。プッシュが成功した場合は0を返し、スタックがオーバーフローした場合は-1を返す。'(N,_スタック1,_スタック2,_診断) :- スタックをプッシュする(N,_スタック1,_スタック2,_診断). スタックをプッシュする(N,_スタック,_スタック,-1) :- スタックがオーバーフローした場合(_スタック),!. スタックをプッシュする(N,_スタック,[N|_スタック],0) :- プッシュが成功した場合([N|_スタック]),!. スタックがオーバーフローした場合(_スタック) :- スタックサイズ(_スタックサイズ), length(_スタック,_現在の要素数), _現在の要素数 >= _スタックサイズ,!. プッシュが成功した場合(L) :- スタックサイズ(_スタックサイズ), length(_スタック,_プッシュした後の要素数), _スタックサイズ >= _プッシュした後の要素数,!. 'スタックからデータを取り出し、スタックポインタをデクリメントする。ポップが成功した場合は取り出した整数を返し、スタックにデータがない場合は-1を返す'(_値,_スタック1,_スタック2) :- スタックをポップする(_スタック1,_スタック2,N). スタックをポップする(_スタック1,_スタック2,N) :- ポップが成功した場合は取り出した整数を返し(_スタック1,_スタック2,N). スタックをポップする(_スタック1,_スタック2,N). 'スタックにデータがない場合は-1を返す'(_スタック1,_スタック2,N), ポップが成功した場合は取り出した整数を返し([N|_スタック],_スタック,N) :- !. 'スタックにデータがない場合は-1を返す'([],[],-1). スタックを底から頂上へ向けて表示する(_スタック) :- reverse(_スタック,_反転したスタック), 表示する(_反転したスタック). 表示する([]). 表示する([_要素|R]) :- writef('%t\n',[_要素]), 表示する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/731 # # 線形リストでノードを順に辿りつつ、変数aとbそれぞれを100〜250の間の乱数で初期化する関数 # を作りたいんですが… # '線形リストでノードを順に辿りつつ、変数aとbそれぞれを100〜250の間の乱数で初期化する'([],[]). '線形リストでノードを順に辿りつつ、変数aとbそれぞれを100〜250の間の乱数で初期化する'([L|R1],[L1|R2]) :- findall(V1,( append(_,[V|_],L), 値変換(V,V1)), L1), '線形リストでノードを順に辿りつつ、変数aとbそれぞれを100〜250の間の乱数で初期化する'(R1,R2). 値変換(a(_),a(A)) :- A is random(150) + 100,!. 値変換(b(_),b(B)) :- B is random(150) + 100,!. 値変換(V,V). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/328 # # [1]授業単元:アルゴリズム概論 # [2]課題:次の関数は引数で与えられた配列を整列するものである。 # コードを補って完成させなさい。 # # void sort(int[] a,int lengh){ # int tmp,i; # ここにコードを追加して完成させる。 # # } # [3] C言語 # [4] 7/31まで # [5] # ・降順(大きいもの順)に整列すること # ・ローカル変数やグローバル変数を追加しないこと # ・lengthが負の値の時はなにもしないこと # ・関数を呼び出さないこと # # よろしくお願いします。(前期単位がかかってます) # # 標準入出力による整列(_length) :- length(L,_lenght), _length > 0, 標準入力からの入力(L), 降順に整列しながら標準出力に出力(L). 標準入力からの入力(L) :- findall(_data,( readln([_data]), append(_,[_|_],L)), L). 降順に整列しながら標準出力に出力([]) :- write('\n'),!. 降順に整列しながら標準出力に出力(L) :- append(L0,[A|R],L), \+((member(B,L0),B @> A)), \+((member(C,R),C @> A)), writef('%t ',[A]), append(L0,R,L2), 降順に整列しながら標準出力に出力(L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/188 # # [1] 授業単元: 演算子 # # [2] 問題文: 変数の下位16ビット中の 1 のビット数を数える関数 int bit_count(int x) を作成し、それを用いて実際に 1 のビット数を数えて、その値を出力するプログラムを作成せよ。 # '1 のビット数を数えて、その値を出力する'(_整数) :- _整数_1 is _整数 // 2, _整数_2 is _整数 mod 2, bit_count(_整数_1,_1ビット数_1), bit_count(_整数_2,_1ビット数_2), Count is _1ビット数_1 + _1ビット数_2, writef('1ビット数の数は %t です。\n',[Count]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/184 # # [1] 授業単元: 演算子 # # [2] 問題文: 変数の下位16ビット中の 1 のビット数を数える関数 int bit_count(int x) を作成せよ。 # bit_count(_整数,_1ビット数) :- '変数の下位16ビット中の 1 のビット数を数える'(_整数,_1ビット数). '変数の下位16ビット中の 1 のビット数を数える'(_整数,_1ビット数) :- _整数_1 is _整数 mod 0x10000, '1 のビット数を数える'(_整数_1,Count). '1 のビット数を数える'(0,0) :- !. '1 のビット数を数える'(1,1) :- !. '1 のビット数を数える'(N,X) :- N_1 is N // 2, M is N mod 2, '1 のビット数を数える'(M,Y), X is Y + N_1. % 以下のサイトは # 述語 項複写/2 を定義してください。第二引数に以下のように複写された項が # 戻されます。 # # ?- 項複写(p(u,A,B,A),X). # X = p(u,_1,_2,_1). # # A が 2つ現れるので、複写された項にも _1 が2つ必要。 # 基本的にはfunctor/3や=../2を使えば構造の複写はできるのですが、 # 最終的に第一引数に現れる共通する変数の関係を第二引数の項に # 反映しなくてはなりません。 # これをどうやって定義するか? % *** user: 項複写 / 6 *** 項複写(M,N,P,P1,VarList,VarList) :- M > N,!. 項複写(M,N,P,P1,VarList1,VarList2) :- arg(M,P,T), arg(M,P1,T1), 項複写(T,T1,VarList1,VarList3), M1 is M + 1, 項複写(M1,N,P,P1,VarList3,VarList2),!. % *** user: 項複写 / 4 *** 項複写(P,P1,VarList1,VarList2) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写(1,A,P,P1,VarList1,VarList2),!. 項複写(P,P1,VarList1,[(P,P1)|Varlist2]) :- var(P), 変数リストの更新(P,P1,VarList1,VarList2),!. 項複写(P,P1,VarList,VarList) :- \+(var(P)), atom_to_term(P,Q,_), \+(P == Q), sprintf(%q,[P],P1),!. 項複写(P,P,Varlist,VarList). % *** user: 項複写 / 2 *** 項複写(_項1,_項2) :- 項複写(_項1,_項2,[],VarList),!. % *** user: 変数リストの更新 / 4 *** 変数リストの更新(P1,P2,[],[]) :- !. 変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,P2)|R4]) :- V1 == P1, V2 = P2, 変数リストの更新(P1,P2,R3,R4),!. 変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :- \+(V1 == P1), 変数リストの更新(P1,P2,R3,R4),!. % 以下のサイトは # 述語 全ての要素についてPである (引数の数は任意) を定義してください。 # 条件 第一引数には リストがきます。このリストの要素を全て満足する目標が # 最後の引数Pとなります。 % % ?- 全ての要素についてPである([1,2,3],_要素,member(_要素,[2,2,4,1,3])). % _要素 = _1001 % true % 全ての要素についてPである([],_,_). 全ての要素についてPである([_要素|R],_要素,P) :- 項複写((_要素,P),(_要素1,P1)), call_P(P), 全ての要素についてPである(R,_要素1,P1). call_P(P) :- call(P),!. % *** user: 項複写 / 6 *** 項複写(M,N,P,P1,VarList,VarList) :- M > N,!. 項複写(M,N,P,P1,VarList1,VarList2) :- arg(M,P,T), arg(M,P1,T1), 項複写(T,T1,VarList1,VarList3), M1 is M + 1, 項複写(M1,N,P,P1,VarList3,VarList2),!. % *** user: 項複写 / 4 *** 項複写(P,P1,VarList1,VarList2) :- struct(P), functor(P,F,A), functor(P1,F,A), 項複写(1,A,P,P1,VarList1,VarList2),!. 項複写(P,P1,VarList1,[(P,P1)|Varlist2]) :- var(P), 変数リストの更新(P,P1,VarList1,VarList2),!. 項複写(P,P1,VarList,VarList) :- \+(var(P)), atom_to_term(P,Q,_), \+(P == Q), sprintf(%q,[P],P1),!. 項複写(P,P,Varlist,VarList). % *** user: 項複写 / 2 *** 項複写(_項1,_項2) :- 項複写(_項1,_項2,[],VarList),!. % *** user: 変数リストの更新 / 4 *** 変数リストの更新(P1,P2,[],[]) :- !. 変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :- V1 == P1, V2 = P2, 変数リストの更新(P1,P2,R3,R4),!. 変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :- \+(V1 == P1), 変数リストの更新(P1,P2,R3,R4),!. % 以下のサイトは # [1] 授業単元: プログラミング # [2] rand()を使い、モンテカルロ法により円周率を求めるプログラムを作る。 #    具体的な手順として #     ・0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする。 #     ・乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える #     ・1:π/4 = n:r から π = 4*r/n  #      この式に従いπを計算する。 #    参考として #     ・rand()でx座標とy座標を求める #       x=(double)rand()/RAND_MAX; # y=(double)rand()/RAND_MAX; # ・その点の原点からの距離rを計算する #       r=x*x+y*y #     ・For分で点の発生を繰り返す #     ・点が円の内側か外側かを判定し、内側ならカウンタの変数を1増やす #      (演算子++を使う) #  っていうのが問題です。 試行回数(1000). モンテカルロ法により円周率を求める(_円周率) :- 試行回数(_n), '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r), _円周率 is 4 * _r / _n. '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y) :- _x is random(1001) / 1000, _y is random(1001) / 1000,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(0,0) :- !. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :- '0から1の乱数2つをペアにし、片方をx座標、もう1方をyとする'(_x,_y), ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y), _n_1 is _n - 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r_1), _r is _r_1 + 1,!. '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n,_r) :- _n_1 is _n - 1, '乱数のペアをn個のうち半径1の円の内部に落ちた点の数rを数える'(_n_1,_r). ピタゴラスの定理を使って座標点が円の内部であるか判定する(_x,_y) :- 1.0 >= _x * _x + _y * _y. % 以下のサイトは # 【課題】キーボードから入力された1〜9までを九九にし、 # 答えを1行に3個ずつ表示する。半角数字以外が入力された場合、 # 任意のエラーメッセージを表示させること。 # 【形態】public class Kuku1{で始める # 【期限】4月11日 # 【Ver 】jdk1.6.0_24 # 【注】変数、if,for,whileまで学習。 # # 単なる九九の計算のプログラムはできるのですが、例えば、3と入力して # 3の段の答えだけを表示するやり方、エラーを表示させるやり方、 # 3つずつというのが全くわかりません。 'キーボードから入力された1〜9までを九九にし、答えを1行に3個ずつ表示する' :- 'キーボードから入力された1〜9までを'(_1〜9までの数), append(_,[[N1,N2,N3]|R],[[1,2,3],[4,5,6],[7,8,9]]), M1 is N1 * _1〜9までの数, M2 is N2 * _1〜9までの数, M3 is N3 * _1〜9までの数, writef('%t %t %t\n',[M1,M2,M3]), R = []. 'キーボードから入力された1〜9までを'(_1〜9までの数) :- get_line(Line), 'キーボードからの入力診断'(Line,_1〜9までの数),!. 'キーボードから入力された1〜9までを'(_1〜9までの数) :- 'キーボードから入力された1〜9までを'(_1〜9までの数). 'キーボードからの入力診断'(Line,_1〜9までの数) :- atom_to_term(Line,_1〜9までの数,_), integer(_1〜9までの数), _1〜9までの数 >= 1, _1〜9までの数 =< 9,!. 'キーボードからの入力診断'(Line,_1〜9までの数) :- writef('入力された %t からは1〜9までの数が得られません。再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/889 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/MysbRMqT # # キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボード # から入力したデータを保存し、最後に保存した内容を表示するプログラム # kadai10-1.cを次のステップにしたがって 作成せよ。但し、各ロッカーには # 次のロッカーへのポインター(次のロッカーの鍵と思えばわかりやすい)も # 荷物に相当するデータといっしょに保存するものとする。 # # 1-1 データ構造として次の構造体を用意する。 # struct rocker { # int data; //保存するデータ # struct rocker *next; //次のボックスのアドレス(鍵) # }; # # 1-2 最初の鍵として次のポインターを大域変数として用意する。 # struct rocker *head; # # 1-3 1個のロッカーを割り当てて、最後に割り当てたロッカーに新しく割り当てた # ロッカーのアドレス(鍵)を保存する関数 struct rocker *new_rocker(struct rocker *last_rocker)を定義しなさい。 # ただし引数 last_rockerは最後に作ったボックスのポインターとする。この間数は # 新しく割り当てたロッカーのアドレスを返すものとする。 # # 1-4 全てのロッカーに保存したデータを最初のロッカーから順番に表示していく # 関数 void display_rockers(struct rocker *pt)を定義しなさい。 # ただし、実行結果が次のようになるように定義しなさい。 # # gcc kadai10-1.c # ./a.out # 3      説明:ロッカーの数を入力 # 1 3 4       データ入力 # [ data = 1 ]->[ data = 3 ]->[ data = 4 ]       表示 # # ※ 表示部分では printf("[ data = %d ]->", xxxxx); もしくは printf("[ data = %d ]\n", xxxxxx);を使用する # 'キーボードから入力した数だけのロッカーを割り付け、各ロッカーにキーボードから入力したデータを保存し、最後に保存した内容を表示する' :- キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび), 各ロッカーにキーボードから入力したデータを保存し(_ロッカーならび), 最後に保存した内容を表示する(_ロッカーならび). キーボードから入力した数だけのロッカーを割り付け(_ロッカーならび) :- キーボードから入力した数(_キーボードから入力した数), length(_ロッカーならび,_キーボードから入力した数). キーボードから入力した数(_キーボードから入力した数) :- write('ロッカーの数を入力してください : '), get_line(Line), キーボードから入力した数診断(Line,_キーボードから入力した数),!. キーボードから入力した数(_キーボードから入力した数) :- キーボードから入力した数(_キーボードから入力した数). キーボードから入力した数診断(Line,_キーボードから入力した数) :- atom_to_term(Line,_キーボードから入力した数,_), integer(_キーボードから入力した数), _キーボードから入力した数 >= 1,!. キーボードから入力した数診断(Line,_キーボードから入力した数) :- writef('入力された %t から適切な整数が得られません。再入力をお願いします。\n',[Line]), fail. 各ロッカーにキーボードから入力したデータを保存し([]). 各ロッカーにキーボードから入力したデータを保存し([Line|R]) :- キーボードから入力したデータを(Line), 各ロッカーにキーボードから入力したデータを保存し(R). 最後に保存した内容を表示する(_ロッカーならび) :- append(L0,[_データ|R],_ロッカーならび), length([_|L0],_n番目), writef('ロッカー[%t]: %t\n',[_n番目,_データ]), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301067486/200 # # ●正規表現の使用環境 # VBScript # # ●検索か置換か? # 検索 # # ●説明 # http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # だけを変数に入れて、後で変数を利用したい # # ●対象データ # </style> # # <META HTTP-EQUIV="Refresh" CONTENT="1;URL=http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip"> # </HEAD> # # ●希望する結果 # 適当な変数=http://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # 例:もし変数 var5 とかにとんこつ.zipを代入できるなら # WScript.Echo var5 # としたときにhttp://ime.nu/upload.jpn.ph/500/bin/とんこつ.zip # と出力できるようにしたいです。 # # もし上手く説明できてなかったらごめんなさい。 # よろしくお願いします。 # # 'URLを検索する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,[h,t,t,p,:,/,/|R2],[' '|R3]), \+(sub_atom(S2,_,1,_,' ')), \+(append(_,[h,t,t,p,:,/,/|_],R2)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/668 # # [1] 授業単元: 構造体 # [2] 問題文(含コード&リンク): :char name[20],int english,int mathematics をメンバとする構造体 score を定義せよ。 # # :以下の5人の情報をもつ配列 seito[5] を、,悩鄒した構造体 score 型を使って宣言せよ。なお、5人の情報は初期値として宣言することにする。 # name english mathematics # ”yamada” 50 70 # ”tanaka” 70 60 # ”suzuki” 80 70 # ”yamamoto”40 60 # ”sakata” 90 80 # # :△能藉値を代入した構造体 score 型の構造体配列 seito[5] を宣言し、各メンバ変数でソートする関数を作成せよ。 # # score(yamada,50,70). score(tanaka,70,60). score(suzuki,80,70). score(yamamoto,40,60). score(sakata,90,80). 構造体定義(_述語名/_アリティ,_項目名ならび,_述語,_引数ならび,_構造体,_項目名構造体ならび) :- length(_引数ならび,_アリティ), length(_項目名構造体ならび,_アリティ), _述語 =.. [_述語名|_引数ならび], _構造体 =.. [_述語名|_項目名構造体ならび]. 述語定義から構造体ならびへの変換(_述語名/_アリティ,_項目名ならび,_構造体ならび) :- 構造体定義(_述語名/_アリティ,_項目名ならび,_述語,_引数ならび,_構造体,_項目名構造体ならび), findall(_構造体,( call(_述語), 項目名構造体ならび(_項目名ならび,_引数ならび,_項目名構造体ならび)), _構造体ならび). 項目名構造体ならび([],_,[]) :- !. 項目名構造体ならび([_項目名|R1],[_項|R2],[P|R3]) :- P =.. [_項目名,_項], 項目名構造体ならび(R1,R2,R3). % 実行例 % ?- 述語定義から構造体ならびへの変換(score/3,[name,english,mathematics],L). % % L = [score(name(yamada),english(50),mathematics(70)), ... ,score(name(sakata),englisth(90),mathematics(80))] % % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/515 # # [1] 論理演算 # 4つの変数a, a1, b, b1(全てint 型)に対して次の演算を実行します # a に0 を代入 # b に1 を代入 # a1 = ~a # b1 = ~b # その後、4つの変数の値を10進数で表示するプログラムを書いてください。 # プログラムのソースと実行結果をメモ帳にまとめて、何故その結果に # なったのか、自分で考えた理由を書き加えて、提出してください。 # '4つの変数a, a1, b, b1(全てint 型)に対して次の演算を実行します。a に0 を単一化 b に1 を単一化 a1 = ~a b1 = ~b その4つの変数の値を10進数で表示する'(_a1,_b) :- '~の実行'(_a,_a1), '~の実行'(_b,_b1), 'その4つの変数の値を10進数で表示する'(_a,_a1,_b,_b1),!. '~の実行'(X,Y) :- X >= 0, Y is (X * -1) - 1,!. '~の実行'(X,Y) :- X < 0, Y is abs(X) - 1,!. 'その4つの変数の値を10進数で表示する'(_a,_a1,_b,_b1) :- writef('%t %t %t %t\n',[_a,_a1,_b,_b1]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/232 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # ../test/read.cgi/tech/1307166756/189のシステムを以下のように拡張する。 # 指定済みの座標を入力した場合、「先手の負け」または「後手の負け」と表示する。 # 全てのマスが埋まったら、「試合終了」と表示する。 # この段階でも、勝ち負けの判定も行わない。 '先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :- length(LL,3), findall(L,(append(_,[L|_],LL),length(L,3)),LL), 3目並べを実現する(後手,LL,_診断). 3目並べを実現する(_,_,_診断) :- \+(var(_診断)),!. 3目並べを実現する(_,LL,正常終了) :- 打つところがない(LL), write('試合終了),!. 3目並べを実現する(_前の手番,LL,正常終了) :- 三目ならび完成(LL), writef('%tの勝ちです\n',[_前の手番]),!. 3目並べを実現する(_前の手番,LL,_診断) :- \+(三目ならび完成(LL)), 手番(_前の手番,_手番), 座標値を与える(_手番,LL,_診断), 3目並べを実現する(_手番,LL,_診断). 打つところがない([]). 打つところがない([L|R]) :- 全て変数(L), 打つところがない(R). すべて変数([]). すべて変数([V|R]) :- var(V), すべて変数(R). 三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!. 三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!. 三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!. 三目ならび完成(L) :- 転置(L,L1), 三目ならび完成(L1). 手番(先手,後手). 手番(後手,先手). 着手記号(先手,'O'). 着手記号(後手,'@'). 座標値を与える(_手番,LL,_診断) :- 盤面表示(LL), writef('%t の手番です : \n',[_手番]), 座標値を得る(_x,_y), 座標値診断(_手番,_x,_y,LL),!. 座標値を得る(_x,_y) :- get_line(Line), split(Line,[' ',','],[_x,_y]),!. 座標値診断(_手番,_x,_y,LL,_診断) :- nth1(_y,LL,L), nth1(_x,L,V), var(V), 着手記号(_手番,_記号), V = _記号,!. 座標値診断(_手番,_,_,_,異常終了) :- write('%tの負けです。\n',[_手番]),!. 盤面表示(LL) :- write('---------\n'), append(_,[[A,B,C]|R],LL), 変数は空白に変換([A,B,C],[A2,B2,C2]), concat_atom([A2,B2,C2],'|',S), writef('|%t|\n',[S]), R = [], write('---------\n'),!. 変数は空白に変換([],[]). 変数は空白に変換([V|R1],[' '|R2]) :- var(V), 変数は空白に変換(R1,R2). 変数は空白に変換([V|R1],[V|R2]) :- \+(var(V)), 変数は空白に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/189 # # [1] 授業単元:配列の並び替え # [2] 問題文(含コード&リンク): # 先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならO、後手なら@を表示して、3目並べを実現するプログラムを作成しなさい。 # 操作は、先手・後手が交互に座標の数値を1ずつ与えるものとし、入力ミスは考えない。 # すでに指定済みの座標かどうかについては判定し、指定済みの座標を入力した場合は、「異常終了」と表示し、プログラムを終了することとする。 # この段階では、勝ち負けの判定も行わない。 # '先手、後手の順番で、x=1,2,3 y=1,2,3の座標の整数値をx yの順番で与えると、その場所に先手ならA、後手ならBを表示して、3目並べを実現する' :- length(LL,3), findall(L,(append(_,[L|_],LL),length(L,3)),LL), 3目並べを実現する(後手,LL,_診断), 診断値表示(_診断). 3目並べを実現する(_,_,_診断) :- \+(var(_診断)),!. 3目並べを実現する(_前の手番,LL,正常終了) :- 三目ならび完成(LL), writef('%tの勝ちです\n',[_前の手番]),!. 3目並べを実現する(_前の手番,LL,_診断) :- \+(三目ならび完成(LL)), 手番(_前の手番,_手番), 座標値を与える(_手番,LL,_診断), 3目並べを実現する(_手番,LL,_診断). 三目ならび完成([[_,_,A],[_,A,_],[A,_,_]]) :- \+(var(A)),!. 三目ならび完成([[A,_,_],[_,A,_],[_,_,A]]) :- \+(var(A)),!. 三目ならび完成([[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,[A,A,A]|_]) :- \+(var(A)),!. 三目ならび完成([_,_,[A,A,A]]) :- \+(var(A)),!. 三目ならび完成(L) :- 転置(L,L1), 三目ならび完成(L1). 手番(先手,後手). 手番(後手,先手). 着手記号(先手,'O'). 着手記号(後手,'@'). 座標値を与える(_手番,LL,_診断) :- 盤面表示(LL), writef('%t の手番です : \n',[_手番]), 座標値を得る(_x,_y), 座標値診断(_手番,_x,_y,LL),!. 座標値を得る(_x,_y) :- get_line(Line), split(Line,[' ',','],[_x,_y]),!. 座標値診断(_手番,_x,_y,LL,_診断) :- nth1(_y,LL,L), nth1(_x,L,V), var(V), 着手記号(_手番,_記号), V = _記号,!. 座標値診断(_,_,_,_,異常終了). 診断値表示(異常終了) :- write('異常終了\n'),!. 診断値表示(_). 盤面表示(LL) :- write('---------\n'), append(_,[[A,B,C]|R],LL), 変数は空白に変換([A,B,C],[A2,B2,C2]), concat_atom([A2,B2,C2],'|',S), writef('|%t|\n',[S]), R = [], write('---------\n'),!. 変数は空白に変換([],[]). 変数は空白に変換([V|R1],[' '|R2]) :- var(V), 変数は空白に変換(R1,R2). 変数は空白に変換([V|R1],[V|R2]) :- \+(var(V)), 変数は空白に変換(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/204 # # 【質問テンプレ】 # [1] 授業単元:プログラム言語 # [2] 問題文:コマンドプロンプト上で名前と # 国語、社会、数学、理科、社会の5科目の成績を入力して、 # それをバイナリファイルで保存するプログラムを作成せよ。 # 保存するファイル名はこれらを入力する前、つまり一番最初に入力して # そのファイル名で保存するものとする。 # 30件の入力があるか、EOFの入力を持って入力を終了するものとする。 # また、これとは別に入力して作成されたバイナリファイルを開く # プログラムを作成すること。 # sample # 保存したいファイル名:student.dat # 名前:tanaka # 国語:65 # 社会:80 # 数学:54 # 理科:71 # 英語:48 #   ・ #   ・ #   ・ # ※30件かEOFの入力を持って終了 # プログラムを開くほう # sample # オープンしたいファイル:student.dat # tanakaさんの成績 国語:65点 社会:80点 数学:54点 理科:71点 英語:48点#                       ・ #                       ・ #                       ・ # 科目名(国語). 科目名(社会). 科目名(数学). 科目名(理科). 科目名(英語). 国語、社会、数学、理科、英語の5科目の成績を入力して、それをバイナリファイルで保存する :- length(_成績ならび,30), write('保存したいファイル名:'),get_line(_保存ファイル名), write('名前:'),get_line(_名前), 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,_成績ならびの一), 末尾の変数部分を切り取る(_成績ならびの一,_成績ならび), バイナリファイルで保存する(_保存ファイル名,_成績ならび). 国語、社会、数学、理科、英語の5科目の成績を入力(end_of_file,L) :- !. 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,[[_名前|_5科目の成績]]) :- '5科目の成績を入力'(_名前,_5科目の成績), write('名前:'),get_line(_名前2),!. 国語、社会、数学、理科、英語の5科目の成績を入力(_名前,[[_名前|_5科目の成績]|R]) :- '5科目の成績を入力'(_名前,_5科目の成績), write('名前:'),get_line(_名前2), 国語、社会、数学、理科、英語の5科目の成績を入力して(_名前2,R). '5科目の成績を入力'(_5科目の成績) :- findall([_科目名,_成績],( 科目名(_科目名), writef('%t: ',[_科目名]), get_integer(_成績)), _5科目の成績). 末尾の変数部分を切り取る([],[]) :- !. 末尾の変数部分を切り取る([V|R],[]) :- var(V),!. 末尾の変数部分を切り取る([A|R1],[A|R2]) :- 末尾の変数部分を切り取る(R1,R2). バイナリファイルで保存する(_保存ファイル名,_成績ならび) :- open(_保存ファイル名,write,Outstream,[type(binary)]), append(_,[_科目ならび]|R],_成績ならび), '8ビットコードで一行分書き出す'(Outstream,_項目ならび), R = [], close(Outstream),!. '8ビットコードで一行分書き出す'(Outstream,[_氏名,_5科目ならび]) :- 氏名の出力(Outstream,_氏名), append(_,[[_科目名,_成績ならび]|R],_5科目ならび), 成績ならびの出力(Outstream,_5科目ならび), R = [], put_byte(Outstream,10),!. 氏名の出力(Outstream,_氏名) :- atom_codes(_氏名,Codes), 全角文字を8ビット展開(Codes,Codes1), append(_,[Code|R1],Code1), put_byte(Outstream,Code), R1 = [], put_byte(Outstream,32),!. 成績ならびの出力(Outstream,_5科目ならび) :- append(_[[_科目名,_成績]|R],_5科目ならび), 科目名の出力(Outstream,_科目名), 成績の出力(Outstream,_成績), R = [],!. 科目名の出力(Outstram,_科目名) :- atom_codes(_項目名,Codes), 全角文字を8ビット展開(Codes,Codes2), append(_,[Code|R],Code2), put_byte(Outstream,Code), R = [], put_byte(Outstream,58),!. 成績の出力(Outstram,_成績) :- number_codes(_成績,Codes), append(_,[Code|R],Code), put_byte(Outstream,Code), R = [], put_byte(Outstream,32),!. 全角文字を8ビット展開([],[]). 全角文字を8ビット展開([N|R1],[N2,N3|R2]) :- N >= 256, N2 is N // 256, N3 is N mod 256, 全角文字を8ビット展開(R1,R2). 全角文字を8ビット展開([N|R1],[N|R2]) :- N < 256, 全角文字を8ビット展開(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/13 # # [1] 授業単元:繰り返し・条件分岐 # [2] 問題文(含コード&リンク): # 3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画するプログラムを作成しなさい。 # 例: 3 # *** # * * # *** # '3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する' :- '3以上40未満の整数Nを入力したとき'(_N), '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N). '3以上40未満の整数Nを入力したとき'(_N) :- write('3以上40未満の整数を入力してください : '), get_line(Line), '3以上40未満の整数Nを入力診断'(Line,_N),!. '3以上40未満の整数Nを入力したとき'(_N) :- '3以上40未満の整数Nを入力したとき'(_N). '3以上40未満の整数Nを入力診断'(Line,_N) :- atom_to_term(Line,_N,_), integer(_N), _N >= 3, _ < 40,!. '3以上40未満の整数Nを入力診断'(Line,_N) :- writef('入力された %t からは3以上40未満の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N) :- 一辺の長さがNの(_N,LL), 中を塗りつぶさない正方形を描画する(LL). 一辺の長さがNの(_N,LL) :- length(LL,_N), findall(L,( append(_,[L|_],LL), length(L,_N)), LL),!. 中を塗りつぶさない正方形を描画する([L|R]) :- all(L,'*'), 中を塗りつぶさいない正方形を(R), 描画する([L|R]). 中を塗りつぶさない正方形を([L]) :- all(L,'*'),!. 中を塗りつぶさない正方形を([['*'|R1]|R]) :- last(R1,'*'), 変数を空白に変換(R1,' '), 中を塗りつぶさない正方形を(R). 変数を空白に変換([]) :- !. 変数を空白に変換([' '|R]) :- 変数を空白に変換(R),!. 変数を空白に変換([_|R]) :- 変数を空白に変換(R). 描画する([]). 描画する([L|R]) :- concat_atom(L,S), writef('%t\n',[S]), 描画する(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/13 # # [1] 授業単元:繰り返し・条件分岐 # [2] 問題文(含コード&リンク): # 3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画するプログラムを作成しなさい。 # 例: 3 # *** # * * # *** # '3以上40未満の整数Nを入力したとき、「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する' :- '3以上40未満の整数Nを入力したとき'(_N), '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N). '3以上40未満の整数Nを入力したとき'(_N) :- write('3以上40未満の整数を入力してください : '), get_line(Line), '3以上40未満の整数Nを入力診断'(Line,_N),!. '3以上40未満の整数Nを入力したとき'(_N) :- '3以上40未満の整数Nを入力したとき'(_N). '3以上40未満の整数Nを入力診断'(Line,_N) :- atom_to_term(Line,_N,_), integer(_N), _N >= 3, _ < 40,!. '3以上40未満の整数Nを入力診断'(Line,_N) :- writef('入力された %t からは3以上40未満の整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. '「*」の記号を使い、一辺の長さがNの中を塗り潰さない正方形を描画する'(_N) :- 一辺の長さがNの(_N,LL), 中を塗りつぶさない正方形を描画する(LL). 一辺の長さがNの(_N,LL) :- length(LL,_N), findall(L,( append(_,[L|_],LL), length(L,_N)), LL),!. 中を塗りつぶさない正方形を描画する([L|R]) :- all(L,'*'), 中を塗りつぶさいない正方形を(R), 描画する([L|R]). 中を塗りつぶさない正方形を([L]) :- all(L,'*'),!. 中を塗りつぶさない正方形を([['*'|R1]|R]) :- last(R1,'*'), 変数を空白に変換(R1,' '), 中を塗りつぶさない正方形を(R). 変数を空白に変換([]) :- !. 変数を空白に変換([' '|R]) :- 変数を空白に変換(R),!. 変数を空白に変換([_|R]) :- 変数を空白に変換(R). 描画する([]). 描画する([L|R]) :- concat_atom(L,S), writef('%t\n',[S]), 描画する(R). % 以下のサイトは # Prologでのリストが難しい。変数の実行結果をリストに入れることはできるのかな? % 変数の実行が述語呼び出しを意味する場合はこうはいかない。 % この場合は高階組込述語findall/3を使ってリストに取り出す 名前(青木). 名前(吉田). 名前(尾崎). 変数の実行結果をリストに入れる(_リスト) :- findall(X,名前(X),_リスト). % 以下のサイトは # Prologでのリストが難しい。変数の実行結果をリストに入れることはできるのかな? % 例えば要素数N(ここでは_要素数とした)のリストを定義してそこに変数の値をセットするには。 変数の実行結果をリストに入れる(_要素数,_リスト) :- length(_リスト,_要素数), 変数の実行結果をリストに入れる(_リスト). 変数の実行結果をリストに入れる([]). 変数の実行結果をリストに入れる([_変数|R]) :- _変数 is random(9999), /* 仮にこれを変数の実行結果ということにする */ 変数の実行結果をリストに入れる(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/697 # # [1] 授業単元:プログラミング言語 # [2] 問題文: ../test/read.cgi/tech/1301553333/693 # # strSrcの文字列を逆にして,strDstに書き込むプログラムを作成してください. #  ただし,文字列の操作にはポインタ変数strDst, strSrc, pC, pDを用いることとし,strSrc[i] のような配列操作は用いないこととします. #  また,配列strSrc[]の1つ前の番地に0が入っていることを前提としないプログラムにしてください. # # http://ime.nu/codepad.org/V7e6qsPC % 文字列をアトムと解釈する 'strSrcの文字列を逆にして,strDstに書き込む'(_strSrc,_strDst) :- atom_chars(_strSrc,Chars), 'strSrcの文字列を逆にして,strDstに書き込む'(Chars1,[],Chars2), atom_chars(_strDst). 'strSrcの文字列を逆にして,strDstに書き込む'([],Chars,Chars). 'strSrcの文字列を逆にして,strDstに書き込む'([_文字|R1],Chars2,Chars) :- !. 'strSrcの文字列を逆にして,strDstに書き込む'(R1,[_文字|Chars2],Chars). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/286 # # [1] 授業単元: C # [2] 問題文(含コード&リンク): # エラトステネスの篩 # 第一引数にint型の変数m, 第二引数にint型の配列Pが与えられたとき、 # 配列Pにm以下のすべての素数を格納し、格納した素数の個数を返す関数 # int eratosthenes(int m, intP[]) # を作成せよ。 # なお、格納した素数の個数がhの場合、素数の配列PのP[0]からP[h-1]に昇順に # 格納されているものとする。 # 'エラトステネスの篩 第一引数にint型の変数m, 第二引数にint型の配列Pが与えられたとき、配列Pにm以下のすべての素数を格納し、格納した素数の個数を返す関数'(_m,_格納した素数の個数) :- findall(N,for(2,N,_m),L), エラトステネスの篩(L,_P), length(_P,_格納した素数の個数). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1301553333/104 # # [1] 授業単元:プログラムA # [2] 問題文(含コード&リンク):演習問題です。 # # 2.float 型の変数a、およびb を引数とし、a がb よりも大きければ整数1 を、小さければ整数‐1 を、同じであれ # ば整数0 を返す関数を作りなさい。 # 'float 型の変数a、およびb を引数とし、a がb よりも大きければ整数1 を、小さければ整数‐1 を、同じであれば整数0 を返す'(_a,_b,1) :- _a > _b. 'float 型の変数a、およびb を引数とし、a がb よりも大きければ整数1 を、小さければ整数‐1 を、同じであれば整数0 を返す'(_a,_b,-1) :- _a < _b. 'float 型の変数a、およびb を引数とし、a がb よりも大きければ整数1 を、小さければ整数‐1 を、同じであれば整数0 を返す'(_a,_b,0) :- _a == _b. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1299291519/777 # # #include <ctime> # #include <cstdlib> # #include <iostream> # # using namespace std; # # int main() # { # srand(time(NULL)); # const int n = 10; # int a[n]; # # for (int i = 0; i < n; i++){ # retry: # ; # a[i] = rand() % 10 + 1; # for (int j = 0; j < i; j++) # if (a[i] == a[i - j - 1]) # goto retry; # else; # } # } # # goto文なしで書こうと思ったらどうなるんですか? # もう少しスマートにしたいです # # 乱数値のならびを得る(_要素数,_乱数下限,_乱数上限,_乱数値のならび) :- length(_乱数値のならび,_要素数), 乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,_乱数値のならび). 乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,L) :- 最初の変数を得る(_前ならび,_変数,L), 乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,_前ならび,_変数,L). 乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,L). 乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,_前ならび,_変数,L) :- 得られた乱数は初出である(_要素数,_乱数下限,_乱数上限,_前ならび,_変数,L), 乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,L),!. 乱数値でならびを埋める(_要素数,_乱数下限,_乱数上限,_,_,L) :- 乱数値でならびを埋める(_要素数,L). 最初の変数を得る(_前ならび,_変数,L) :- append(_前ならび,[_変数|_],L), var(V),!. 得られた乱数は初出である(_要素数,_乱数下限,_乱数上限,_前ならび,_乱数,L) :- 乱数値を得る(_乱数下限,_乱数上限,_乱数), \+(append(_,[_乱数|_],_前ならび)),!. 乱数値を得る(_乱数下限,_乱数上限,_乱数) :- _乱数 is (random mod (_乱数上限-_乱数下限+1)) + _乱数下限. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/106 # # ストアドプロシージャについて質問させてください。 # # 簡単な結果を返すクエリ # SELECT A,B,C FROM TEST # # といったクエリの結果を戻り値として返すストアドを作成したいのですが # どのように書けば良いのかわかりません。 # # 単一の列のみを返す方法ならわかったのですが、複数列を返す方法が # 分からないといった状態です。 # テーブル構造('TEST',1,'A'). テーブル構造('TEST',2,'B'). テーブル構造('TEST',3,'C'). 簡単な結果を返すクエリ(_テーブル名,_選択項ならび,_値ならび) :- count(テーブル構造('TEST',_,_),Len), length(_値ならび,Len), findsetof(_,( テーブル構造(_テーブル名,Nth,_)), L), P =.. [_テーブル|_変数ならび], call(P), 選択項と値の結合(L,_選択項ならび,_値ならび). 選択項と値の結合(_テーブル名,L,[],[]) :- !. 選択項と値の結合(_テーブル名,L,[_選択項|R1],[_値|R2]) :- テーブル構造(_テーブル名,Nth,_選択項), list_nth(Nth,L,_値), 選択項と値の結合(_テーブル名,L,R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/97 # # select * from table1 where col1 in (select colx, coly from table2); # # 的な書き方は無い? # ↓ってするしかない? # # select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2) ; # # 'select * from table1 where col1 in (select colx from table2) or col1 in (select coly from table2)'(L1) :- テーブルの選択(table1,[col1],[_col1],L1,P1), テーブルの選択(table2,[colx,coly],[_colx,_coly],L2,P2), P1, P2, 選択条件(_col1,_colx,_coly). 選択条件(X,X,_) :- !. 選択条件(X,_,X) :- !. %%% テーブルが生成される時に定義される %%% テーブル構造(table1,1,col1). テーブル構造(table2,1,colx). テーブル構造(table2,2,coly). %%% 汎用述語 %%% テーブルの選択(_テーブル名,_鍵名ならび,_鍵変数ならび,L,P) :- findall(_,テーブル構造(_テーブル名,_,_),L), P =.. [_テーブル名|L], 鍵変数の指定(_テーブル名,L,_鍵名ならび,_鍵変数ならび). 鍵変数の指定(_テーブル名,L,[],[]) :- !. 鍵変数の指定(_テーブル名,L,[_鍵名|R1],[_鍵変数|R2]) :- テーブル構造(_テーブル名,_位置,_鍵名), list_nth(_位置,L,_鍵変数), 鍵変数の指定(_テーブル名,R1,R2,L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/92 # # 環境はoracle9iです。 # # ■テーブルの構成 # |年度|月|部署コード|商品コード|金額| # # ■テーブルの内容 # |2010|01|AAA|001|1000| # |2010|02|AAA|001|2000| # |2010|01|AAA|001|3000| # |2010|01|AAA|002|3000| # |2010|02|BBB|003|4000| # |2010|01|CCC|001|5000| # |2010|03|CCC|001|6000| # # 上記のようなテーブルがあり、 # これを # と、ここまでなら上の4つでGROUP BYしてあげれば良いのですが、 # そこに年度,部署コード,商品コードでサマリした # 「累計金額」列を加える必要があります。(イメージは下記のとおりです。) # # # ■抽出結果の構成 # |年度|月|部署コード|商品コード|金額|累計金額| # # ■抽出結果の内容 # |2010|01|AAA|001|4000|6000| # |2010|02|AAA|001|2000|6000| # |2010|02|BBB|003|4000|4000| # |2010|01|CCC|001|5000|11000| # |2010|03|CCC|001|6000|11000| # # # GROUP BYと別の集計単位で列を作ることが可能か、 # 可能であればどのようなSQLを書くべきか、 # というところを教えてください。 # # '|年度|月|部署コード|商品コード|金額| テーブルを年度,月,部署コード,商品コードでサマリした値にさらに年度,部署コード,商品コードでサマリした値を付加した行表示' :- 鍵ならびの生成([_年度,_部署コード,_商品コード],テーブル(_年度,_月,_部署コード,_商品コード,_金額),_鍵ならびの一), 鍵ならびの生成([_年度,_月,_部署コード,_商品コード],テーブル(_年度,_月,_部署コード,_商品コード,_金額),_鍵ならびの二), append(_,[[_年度,_部署コード,_商品コード]|R],_鍵ならびの一), 金額制約(_鍵ならびの二,_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計), writef('|%t|%t|%t|%t|%t|%t\n',[_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計]), R = []. 金額集約(L2,_年度,_月,_部署コード,_商品コード,_金額月合計,_金額総合計) :- 年度・部署コード・商品コード集約(_年度,_部署コード,_商品コード,_金額総合計), append(_,[[_年度,_月,_部署コード,_商品コード]|_],L2), 年度・月・部署コード・商品コード集約(_年度,_月,_部署コード,_商品コード,_金額月合計). 年度・月・部署コード・商品コード集約(_年度,_月,_部署コード,_商品コード,_金額合計) :- findsum(_金額,( テーブル(_年度,_月,_部署コード,_商品コード,_金額)), _年度・月・部署コード・商品コード集約). 年度・部署コード・商品コード集約(_年度,_部署コード,_商品コード,_金額合計) :- findsum(_金額,( テーブル(_年度,_月,_部署コード,_商品コード,_金額)), _年度・部署コード・商品コード集約). 鍵ならびの生成(_鍵変数ならび,_述語,_鍵ならび) :- findsetof(_鍵変数ならび,_述語,_鍵ならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1200175247/927 # # n=12 # x=[2,6,20,15,8,21,8,22,15,20,1,15] # y=["Jan","Feb","Mar","Apr","Mey","Jun","Jul","Aug","Sep","Oct","Nov","Dec"] # sx=0 # upper=0 # middle=0 # lower=0 # xmax=0 # xmin=0 # best_x=0 # worst_x=0 # # for i in 0..n-1 # sx=sx+x[i] # end # xave=sx/n # print "Sipments:Total=",sx," Average=",xave,"\n" # puts # for i in 0..n-1 # if x[i] >= xave*1.5 then # upper = upper + 1 # elsif x[i] <= xave*1.5*0.5 # middle = middle + 1 # else x[i] <= xave/2 # lower = lower + 1 # end # end # print "Sales:Upper=",upper," Middle=",middle," Lower=",lower,"\n" # puts # xmax=x[0] # xmin=x[0] # for i in 0..n-1 # if xmax >= x[i] then # best_x = best_x + 1 # else xmin <= x[i] # worst_x = worst_x + 1 # end # end # print "Best Month:",best_x, " Worst Month:",worst_x,"\n" # puts # 出力結果 # Sipments:Total=153 Average=12 # Sales:Upper=4 Middle=5 Lower=3 # Best Month:2 Worst Month:10 # 本当はBest Month:Aug、Worst Month:Novとしたいんですけど、どうしたらいいですか? # やっぱり変数がおかしいんですか?それとも条件の書き方ですか?? 値([2,6,20,15,8,21,8,22,15,20,1,15]). 月表示(['Jan','Feb','Mar','Apr','Mey','Jun','Jul','Aug','Sep','Oct','Nov','Dec']). 月毎の売上分析 :- 値(_値ならび), 月表示(_月表示ならび), 値と月表示を対にする(_値ならび,_月表示ならび,_値・月表示ならび), sum(_値ならび,_合計値), avg(_値ならび,_平均値), 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下), max(_値・月表示ならび,[_Max,_最良月]), min(_値・月表示ならび,[_Min,_最悪月]), writef('合計値=%t,平均値=%t\n',[_合計値,_平均値]), writef('上=%t,中の上=%t,中の下=%t,下=%t\n',[_上,_中の上,_中の下,_下]), writef('最良月=%t,最悪月=%t\n',[_最良月,_最悪月]),!. 値と月表示を対にする([],[],[]). 値と月表示を対にする([_値|R1],[_月表示|R2],[[_値,_月表示]|R3]) :- 値と月表示を対にする(R1,R2,R3). 月値評価度数(_値ならび,_平均値,_上,_中の上,_中の下,_下) :- count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5),_上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 1.5 / 2,_値 < _平均値 * 1.5),_中の上), count((append(_,[_値|_],_値ならび),_値 >= _平均値 * 0.5,_値 < _平均値 * 1.5 / 2),_中の下), count((append(_,[_値|_],_値ならび),_値 < _平均値 * 0.5),_下). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/620 # # [1] プログラミング言語 # [2]問題文 以下のソースプログラムで誤っている箇所(○行目の〜の部分)とそれを # どのように修正すればよいのかを指摘しなさい。誤っている箇所は複数あるので、以下の # 例のように箇条書きにして、誤っている部分と修正安を指摘してください。(一箇所の指摘に対して1点、最大5点まで加点) # (箇条書きの例) # ・9行目の「kekka =10;」で、合計を求める変数kekkaの初期化が正しく行われていない。 # 「kekka = 0;」とすべき。 # ・○行目の〜の部分で・・・・・など。 # # 2つの整数を引数として受け取り、第一引数と第2引数の足し算の結果(整数) # を戻り値とする関数をsumという関数名で作成せよ。さらに、関数sumを利用して、以下の # 配列numberの10個の数値の合計値を求めるプログラムを作成せよ。 # int number[10]={1,2,3,4,5,6,7,8,9,10}; # # '2つの整数を引数として受け取り、第一引数と第2引数の足し算の結果(整数)を戻り値とする関数をsumという関数名で作成せよ。さらに、関数sumを利用して、以下の配列numberの10個の数値の合計値を求める。int number[10]={1,2,3,4,5,6,7,8,9,10};'(_合計値) :- abolish(sum/3), assertz((sum(_整数1,_整数2,_戻り値) :- _戻り値 is _整数1 + _整数2))), 'さらに、関数sumを利用して、以下の配列numberの10個の数値の合計値を求める'(_number,_合計値). 'さらに、関数sumを利用して、配列numberの10個の数値の合計値を求める'(_合計値) :- 配列に模したならび(number,_number), sumを利用して、合計値を求める(_number,_合計値). sumを利用して、合計値を求める([],0). sumを利用して、合計値を求める([N|R],_合計値) :- sumを利用して、合計値を求める(R,_合計値2), sum(N,_合計値2,_合計値). 配列に模したならび(number,[1,2,3,4,5,6,7,8,9,10]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1258320456/189 # # 解答お願いします。 # # 1. 下記のような九九の計算表を出力するプログラムを作成し、実行してください。このときforループを使用するもの(q11.py)と、whileループを使用するもの(q12.py)の2種類を作成してください。 # 1の段 1 2 3 4 5 6 7 8 9 # 2の段 2 4 6 8 10 12 14 16 18 # ..........中略.... # 9の段 9 18 27 36 45 54 63 72 81 # # 2. 次のような手順で、キーボードから入力した数値の合計を求めるものとします。実際に Python プログラム (q2.py) の形にして、実行してください。 # 合計に使う変数を 0 にする。 # キーボードから数値を入れる。 # 入力した数値が 0 より大きい間次のブロックを繰り返す: # 合計に数値を加える。 # キーボードから数値を入れる。 # 合計を印刷する # 3. turtleを使用して、図形を表示するスクリプトg.pyを作成してください。どのような図形を作成するか記述(少なくとも6角形よりは複雑である事)して、スクリプトの内容をメールに含めてください。なお、スクリプトには、必ず for ループを含むようにしてください # # # キーボードから入力した数値の合計 :- キーボードから入力した数値の合計(0). キーボードから入力した数値の合計(S1) :- 数値を入力する(N), N > 0, S2 is S1 + N, キーボードから入力した数値の合計(S2). キーボードから入力した数値の合計(S) :- write_formatted('合計は %t\n',[S]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- 数値を入力する(N), キーボードから入力した数値の合計(N,0). キーボードから入力した数値の合計(N,S) :- N =< 0, write_formatted('合計は %t\n',[S]),!. キーボードから入力した数値の合計(N,S1) :- S2 is S1 + N, 数値を入力する(N2), キーボードから入力した数値の合計(N2,S2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- キーボードから入力した数値の合計(0,S), write_formatted('合計は %t\n',[S]). キーボードから入力した数値の合計(S1,S) :- 数値を入力する(N), N > 0, S2 is S1 + N, キーボードから入力した数値の合計(S2,S). キーボードから入力した数値の合計(S,S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% キーボードから入力した数値の合計 :- 数値を入力する(N), キーボードから入力した数値の合計(N,0,S), write_formatted('合計は %t\n',[S]). キーボードから入力した数値の合計(N,S,S) :- N =< 0,!. キーボードから入力した数値の合計(N,S1,S) :- S2 is S1 + N, 数値を入力する(N2), キーボードから入力した数値の合計(N2,S2,S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数値を入力する(_数値) :- get_line(Line), 数値入力診断(Line,_数値),!. 数値を入力する(_数値) :- 数値を入力する(_数値). 数値入力診断(Line,_数値) :- atom_to_term(Line,_数値,_), number(_数値),!. 数値入力診断(Line,_) :- write_formatted('入力された %t からは数値が得られませんでした。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/371 # # [1] 授業単元:万年カレンダーの作成 # [2] 問題文(含コード&リンク): # ユーザーが指定した年・月のカレンダーを表示するアプリケーションを作る。 # ユーザーに年と月の入力させ、指定された月から4ヶ月分のカレンダーを表示させる。 # 詳しい説明・仕様 http://ime.nu/www1.axfc.net/uploader/File/so/58289 # # 1.ユーザーが指定可能な日付の範囲 # 西暦1年の1月から西暦9999年の9月まで ※表示範囲は9999年12月まで # # 2.暦の条件 # 2.1.曜日 #  西暦1年1月1日を月曜日とする。 # # 2.2.うるう年 #  ・4で割り切れる年はうるう年 #  ・ただし100で割り切れる年はうるう年ではない #  ・ただし400で割り切れる年はうるう年 # # 2.3.祝日・国民の休日 #  ・祝日が日曜の場合は翌日以降の平日を振替休日にする #  ・国民の休日とは、国民の祝日にはさまれた平日を指す 例)2009/09/22 # # 元旦     1月1日 # 成人の日   1月第2月曜日 # 建国記念日  2月11日 # 春分の日※ # 昭和の日   4月29日 # 憲法記念日  5月3日 # みどりの日  5月4日 # こどもの日  5月5日 # 海の日    7月の第3月曜日 # 敬老の日   9月の第3月曜日 # 秋分の日※ # 体育の日   10月の第2月曜日 # 文化の日   11月3日 # 勤労感謝の日 11月23日 # 天皇誕生日  12月23日 # # 春分の日・秋分の日は次の計算式によって求める。 # a)西暦1980年〜2099年 #  春分の日(3月X日) #   X=INT(20.8431+0.242194*(Year-1980)-INT((Year-1980)/4)) # 秋分の日(9月X日) #   X=INT(23.2488+0.242194*(Year-1980)-INT((Year-1980)/4)) # (Yearは西暦の年、INT()は、括弧内の小数部切り捨てを意味する) # # b)a以外の年 #  春分の日:3月23日,秋分の日:9月23日 # # 3.動作の流れ # 1)プログラムを実行 # 2)年入力をうながすメッセージの表示 ex.西暦何年のカレンダーを表示しますか? # 3)ユーザーが年情報の入力する # 4)(?)入力された年情報が1〜9999だった場合は、月情報の入力をうながすメッセージが表示される。 ex.何月から表示しますか? #  (?)未入力や、無効な数値・文字が入力された場合はエラーメッセージが表示され、再入力をうながして2)にもどる ex.年は1〜9999の範囲で入力してください # 5)ユーザーが月情報を入力する # 6)(?)入力された月情報が1〜12(9999年の場合は1〜9)だった場合は、指定された年月から4ヶ月分のカレンダーが表示される #  (?)未入力や、無効な数値・文字が入力された場合はエラーメッセージが表示され、再入力をうながして4)(?)にもどる ex.月は1〜12の範囲で入力してください # 7)続いてカレンダーを表示するかをユーザーに問う  # ex.続けて表示しますか? 1:次の4ヶ月を表示/2:年と月を指定する/9:終了する ユーザーの入力値により処理続行または終了する # # 4.出力イメージ # ・カレンダーは指定年月から4ヶ月分を一度に表示する # ・各月を横に2ヶ月ずつ、2段に表示する # ・土日祝日及び振替休日は、日付前にマークをつけ、平日と区別する # ・各月ごとのレイアウトが自由  # # # ↓コマンドプロンプトでの出力イメージ # # # 2009 9月 2009 10月 # 日 月 火 水 木 金 土  9月と同じ要領で  #    1 2 3 4 * 5 # @ 6 7 8 9 10 11 *12 # @13 14 15 16 17 18 *19 # @20 #21 $22 #23 24 25 *26 # @27 28 29 30 # # 2009 11月     2009 12月 # 9月と同じ要領で  9月と同じ要領で # # # # # # # # @:日曜日 *:土曜日 #:祝日 $:休日 &:振替休日 # # 1:次の4ヶ月を表示 2:年と月を指定する 9:終了する  カレンダー表示(_年,_月) :- 四ヶ月分のカレンダー((_年,_月,_カレンダー,_年_1,_月_1,_カレンダー_1,_年_2,_月_2,_カレンダー_2,_年_3,_月_3,_カレンダー_3), カレンダー見出し(_年,_月,_年_1,_月_1), 二ヶ月ならびカレンダー表示(_カレンダー,_カレンダー1), write('\n\n'), カレンダー見出し(_年_2,_月_2,_年_3,_月_3), 二ヶ月ならびカレンダー表示(_カレンダー_2,_カレンダー3),!. カレンダー見出し(_年_1,_月_1,_年_2,_月_2) :- write_formatted('%4d年%2d月 %4d年%2d月\n',[_年_1,_月_1,_年_2,_月_2]),!. 二ヶ月ならびカレンダー表示([],[]) :- !. 二ヶ月ならびカレンダー表示([L1|R1],[L2|R2]) :- flat(L1,S1), flat(L2,S2), write_formatted('%t %t\n',[S1,S2]), 二ヶ月ならびカレンダー表示(R1,R2). 四ヶ月分のカレンダー(_年,_月,_カレンダー,_年_1,_月_1,_カレンダー_1,_年_2,_月_2,_カレンダー_2,_年_3,_月_3,_カレンダー_3) :- カレンダー(_年,_月,_カレンダー), 翌月(_年,_月,_年_1,_月_1), カレンダー(_年_1,_月_1,_カレンダー_1), 翌月(_年_1,_月_1,_年_2,_月_2), カレンダー(_年_2,_月_2,_カレンダー_2), 翌月(_年_2,_月_2,_年_3,_月_3), カレンダー(_年_3,_月_3,_カレンダー_3),!. カレンダー(_年,_月,_カレンダー) :- length(Cal,35), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,日曜), length(L0,_曜日を表す値), append(L0,L1,Cal), この月の最終日は(_最終日), 日付を振る(1,_最終日,L1), 付加する符号を振る(1,_最終日,_年,_月,L1), すべての変数に空白を埋める(Cal,_カレンダー),!. 日付を振る(N,_最終日,_) :- N > _最終日,!. 日付を振る(N,_最終日,[[_,_,_,N]|R]) :- N < 10, N2 is N + 1, 日付を振る(N2,_最終日,R),!. 日付を振る(N,_最終日,[[_,_,N10,N0]|R]) :- N >= 10, N10 is N // 10, N0 is N mod 10, N2 is N + 1, 日付を振る(N2,_最終日,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'#',D1,D2]|R]) :- 国民の祝日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'$',D1,D2]|R]) :- 国民の休日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'&',D1,D2]|R]) :- 振替休日(_,_年,_月,N), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'@',D1,D2]|R]) :- 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,日曜), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[[_,'*',D1,D2]|R]) :- 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_曜日を表す値,土曜), N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. 付加する符号を振る(N,_最終日,_年,_月,[_|R]) :- N2 is N + 1, 付加する符号を振る(N2,_最終日,_年,_月,R),!. すべての変数に空白を埋める([],[]) :- !. すべての変数に空白を埋める([V|R1],[[' ',' ',' ',' ']|R2]) :- var(V), すべての変数に空白を埋める(R1,R2),!. すべての変数に空白を埋める([L|R1],[L1|R2]) :- 変数を空白に変換(L,L1), すべての変数に空白を埋める(R1,R2),!. 変数を空白に変換([],[]) :- !. 変数を空白に変換([V|R1],[' '|R1]) :- var(V), 変数を空白に変換(R1,R2),!. 変数を空白に変換([V|R1],[V|R1]) :- \+(var(V)), 変数を空白に変換(R1,R2),!. この月の最終日は(_年,2,29) :- うるう年(_年),!. この月の最終日は(_年,2,28) :- \+(うるう年(_年)),!. この月の最終日は(_年,_月,31) :- append(_,[_月|_],[1,3,5,7,8,10,12]),!. この月の最終日は(_年,_月,30) :- append(_,[_月|_],[4,6,9,11]),!. 祝日が日曜の場合は翌日以降の平日を振替休日にする(_振替休日の年,_振替休日の月,_振替休日の日) :- 国民の祝日(_,_振替休日の年,_振替休日の月,_日), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_日,_,日曜), 振替休日を探す(_振替休日の年,_振替休日の月,_日,_振替休日の日). 国民の休日とは、国民の祝日にはさまれた平日を指す(_国民の休日の年,_国民の休日の月,_国民の休日の日) :- 前日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_前日の年,_前日の月,_前日の日), 翌日(_国民の休日の年,_国民の休日の月,_国民の休日の日,_翌日の年,_翌日の月,_翌日の日), 国民の祝日(_,_前日の年,_前日の月,_前日の日), 国民の祝日(_,_翌日の年,_翌日の月,_翌日の日),!. 振替休日を探す(_振替休日の年,_振替休日の月,_日,_振替休日の日) :- between(_日,31,_振替休日の日), \+(国民の祝日(_,_振替休日の年,_振替休日の月,_振替休日の日)), 'Zellerの公式を用いて曜日を得る'(_振替休日の年,_振替休日の月,_振替休日の日,_,_曜日), \+(_曜日=日曜),!. 翌月(_年,12,_翌年,1) :- _翌年 is _年 + 1,!. 翌月(_年,_月,_年,_翌月) :- _翌月 is _月 + 1. 前日(_年,_月,_日,_前日の年,_前日の月,_前日の日) :- 前日のの月がわり調整(_年,_月,_日,_前日の年,_前日の月,_前日の日). 翌日(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日) :- 翌日の月がわり調整(_年,_月,_日,_翌日の年,_翌日の月,_翌日の日). 前日の月がわり調整(_整数年,1,1,_変更された整数年,12,31) :- _変更された整数年 は _整数年 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,31) :- member(_整数月,[2,4,6,8,9,11]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,_整数月,1,_整数年,_変更された整数月,30) :- member(_整数月,[5,7,10,12]), _変更された整数月 は _整数月 - 1,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,29) :- 0 is _整数年 mod 4,!. 前日の月がわり調整(_整数年,3,1,_整数年,2,28) :- \+(0 is _整数年 mod 4),!. 前日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 - 1,!. 翌日の月がわり調整(_整数年,12,31,_変更された整数年,1,1) :- _変更された整数年 は _整数年 + 1,!. 翌日の月がわり調整(_整数年,_整数月,30,_整数年,_変更された整数月,1) :- member(_整数月,[4,6,8,9,11]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,_整数月,31,_整数年,_変更された整数月,1) :- member(_整数月,[1,3,5,7,10]), _変更された整数月 は _整数月 + 1,!. 翌日の月がわり調整(_整数年,2,29,_整数年,3,1) :- 0 is _整数年 mod 4,!. 翌日の月がわり調整(_整数年,2,28,_整数年,3,1) :- \+(うるう年(_整数年)),!. 翌日の月がわり調整(_整数年,_整数月,_整数日,_整数年,_整数月,_変更された整数日) :- _変更された整数日 は _整数日 + 1,!. 祝休日の記号(日曜日,'@'). 祝休日の記号(土曜日,'*'). 祝休日の記号(国民の祝日,'#'). 祝休日の記号(国民の休日,'$'). 祝休日の記号(振替休日,'&'). 国民の祝日(元旦,_年,1,1). 国民の祝日(成人の日,1,_日) :- between(8,14,_日), 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_,月曜). 国民の祝日(建国記念日,_年,2,11). 国民の祝日(春分の日,_年,3,_日) :- 春分の日(_年,3,_日). 国民の祝日(昭和の日,_年,4,29). 国民の祝日(憲法記念日,_年,5,3). 国民の祝日(みどりの日,_年,5,4). 国民の祝日(こどもの日,_年,5,5). 国民の祝日(海の日,_年,7,_日) :- between(15,21,_日), 'Zellerの公式を用いて曜日を得る'(_年,7,_日,_,月曜). 国民の祝日(敬老の日,_年,9,_日) :- between(15,21,_日), 'Zellerの公式を用いて曜日を得る'(_年,9,_日,_,月曜). 国民の祝日(秋分の日,_年,9,_日) :- 秋分の日(_年,9,_日). 国民の祝日(体育の日,_年,10,_日) :- between(8,14,_日), 'Zellerの公式を用いて曜日を得る'(_年,10,_日,_,月曜). 国民の祝日(文化の日,_年,11,3). 国民の祝日(勤労感謝の日,_年,11,23). 国民の祝日(天皇誕生日,_年,12,23). 春分の日(_年,3,_日) :- _年 >= 1980, _年 =< 2099, _日 is truncate(20.8431+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 春分の日(_年,3,23). 秋分の日(_年,9,_日) :- _年 >= 1980, _年 =< 2099, _日 is truncate(23.2488+0.242194*(_年-1980)-truncate((_年-1980)/4)),!. 秋分の日(_年,9,23). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 'Zellerの公式を用いて曜日を得る'(_年,1,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,13,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,2,_日,_曜日を表す値,_曜日) :- _年_1 is _年 - 1, 'Zellerの公式を用いて曜日を得る'(_年_1,14,_日,_曜日を表す値,_曜日),!. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日),!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/351 # # [1] 授業単元:課題 # [2] 問題文:単方向リスト # typedef struct list # { # char name[20]; // 名前 # char tel[20]; // 電話番号 # struct list *next; // 次のデータを指す構造体ポインタ # } # # グローバル変数とダミーノードを使わない。追加、削除、全体表示の動作を行う # ことができる住所録のプログラムをよろしくお長いします 住所録追加(_名前,_電話番号) :- assertz(住所録(_名前,_電話番号)). 住所録削除(_名前,_電話番号) :- retract(住所録(_名前,_電話番号)), fail. 住所録削除(_,_). 住所録全体表示 :- 名前の最大長(_名前の最大長), 電話番号の最大長(_電話番号の最大長), concat_atom(['%',_名前の最大長,'s | ','%',_電話番号の最大長,s],_表示形式), write_formatted(_表示形式,[名前,電話番号]), clause(住所録(_名前,_電話番号),_), write_formatted(_表示形式,[_名前,_電話番号]), fail. 住所録全体表示. 住所録の保存 :- tell('住所録#2.pro'), listing(住所録/2), told. 住所録の準備 :- retract('住所録#2.pro'). 名前の最大長(_名前の最大長) :- findmax(_名前の長さ,( clause(住所録(_名前,_), sub_atom(_名前,0,_長さ,0,_名前)), _名前の最大長). 電話番号の最大長(_電話番号の最大長) :- findmax(_電話番号の長さ,( clause(住所録(_,_電話番号), sub_atom(_電話番号,0,_長さ,0,_電話番号)), _電話番号の最大長). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/819 # # 正規表現の使用環境は秀丸です。 # やりたいことは置換で、VBのソースを編集したいのが目的です。 # # 例: # ・Before # Dim s1, s2, s3 As String # # ・After # Dim s1 As String, s2 As String, s3 As String # # 上記のように、1行で複数の変数宣言を行っている箇所で # 型の宣言を省略している箇所を、最後の型宣言で補いたいのですが # どのように指定してやればよいでしょうか? # # '型の宣言を省略している箇所を、最後の型宣言で補う'(_文字列,_補正された文字列) :- 's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分), findall(W,( append(_,[_変数|_],_変数部分ならび), concat_atom([_変数,_型部分],W)), L2), concat_atom(L2,',',S5), concat_atom(_型宣言部分,S5,_補正された文字列). 's1, s2, S3 の認識'(_文字列,_型宣言部分,_変数部分ならび,_型部分) :- split(_文字列,[','],[_第一要素|R1]), sPLIT(_第一要素,[' '],L1), append(L0,[A],L1), concat_atom(L0,_型宣言部分), append(L2,[U],R1), sPLIT(U,[' '],L3), '最後の変数と型部分に分離する'(L3,Z,_型部分), append([A],L2,[Z],_変数部分ならび),!. '最後の変数と型部分に分離する'(L,S,_型部分) :- append(L0,[_最後の変数|R],L), \+(A = ' '), all(L0,' '), concat_atom(R,_型部分),!. '最後の変数と型部分に分離する'([_最後の変数|R],_最後の変数,_型部分) :- concat_atom(R,_型部分),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/313 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。 # ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と # 氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前は # プログラムの引数として与えられるものとする。 program :- user_parameters([_n個文字列,_ファイル]), atom_to_term(_n個文字列,_n個,_), キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n個,_ファイル), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n個,_ファイル) :- length(L,_n個), 学生番号と氏名の組を読み込む(L), open(_ファイル,write,Outstream), append(_,[[_学生番号,_氏名]|R],L), write_foratted(Outstream,'%t,%t\n',[_学生番号,_氏名]), R = [], close(Outstream),!. 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_ファイル,_n個) :- length(L,_n個), get_line(_ファイル,Lines), append(L,_,Lines), sort(L,_整列済みデータ), append(_,[[_学生番号,_氏名]|R],_整列済みデータ), write_formatted('%t,%t\n',[_学生番号,_氏名]), R = [],!. 学生番号と氏名の組を読み込む([]) :- !. 学生番号と氏名の組を読み込む([[_学生番号,_氏名]|R]) :- 学生番号を読み込む(_学生番号), 氏名を読み込む(_氏名), 学生番号と氏名の組を読み込む(R). 学生番号を読み込む(_学生番号) :- write('学生番号を入力してください : '), get_line(_学生番号),!. 学生番号を読み込む(_氏名) :- write('氏名を入力してください : '), get_line(_氏名),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294836668/172 # # 質問 # リストから特定の方法でそのメンバーを消去したいとき # for member in list: # if (delete condition): # list.remove(member) # とすると、消去条件のメンバーがリスト中に並んでると、 # 処理がスキップされます # 理由はメンバーを消したときにインデックスがずれるからだと思うんですが # そして実際消去するメンバーリストを別に作ると回避できるんですが # 普通はどうやるもんなんでしょうか? # # リストから条件付きでメンバーを消去する(_ならび,_要素変数,_要素変数を含む条件,_消去されたならび) :- findall(_要素変数,( append(_,[_要素変数|_],_ならび), \+(call(_要素変数を含む条件))), _消去されたならび). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/147 # # [1] 授業単元:ポインタ # [2] 問題文(含コード&リンク): # ランダムな数値が格納された配列を昇順にソートし、結果を画面に出力する。(コマンドプロンプト) # 課題ファイルのmain関数・昇順ソート関数・ソート結果表示関数に、仮引数と関数の中身を追加する。基本的に、main関数内は、関数呼び出しのみとする。 # 課題ファイル http://ime.nu/uproda.2ch-library.com/lib339300.txt.shtml # # #include # # void Sort_func( int * ); /* ソート処理関数の定義 */ # void Disp_func( int * ); /* ソート結果表示関数の定義 */ # # # /* # ※ 2つの関数を呼出しソート結果を画面に出力する。 # 関数を完成させよ。 # 定義済の関数宣言・変数の変更(移動)を禁止する。 # */ # # void main() # { # /* # 配列変数 intNumFrom に格納された数値を、 # 昇順となるようにintNumFrom を変更せよ。 # */ # # int intNumFrom[8] = {88,52,6,43,65,38,46,16}; # # # Sort_func( intNumFrom ); /* ソート処理関数呼出し*/ # # Disp_func( &intNumFrom[1] ); /* ソート結果表示関数呼出し */ # # return; # } # # void Sort_func( ###### ) # { # # } # # # void Disp_func( ###### ) # { # # } 'ランダムな数値が格納されたならびを昇順にソートし、結果を画面に出力する。' :- ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび), 昇順にソートし(_ランダムな数値が格納されたならび,[],_昇順に整列したならび), 画面に出力する(_昇順に整列したならび). ランダムな数値が格納されたならびを(_ランダムな数値が格納されたならび) :- ならびの要素数を入力する(_要素数), length(L,_要素数), findall(_ランダムな数値,( append(_,[_ランダムな数値|_],L), ランダムな数値(_ランダムな数値)), _ランダムな数値が格納されたならび). ランダムな数値(_ランダム数値) :- 1 is random mod 2, _ランダムな数値 is ( random mod 10000 ) / 100),!. ランダムな数値(_ランダム数値) :- _ランダムな数値 is random mod 100,!. ならびの要素数を入力する(_要素数) :- 範囲指定付き整数入力(要素数,'要素数を入力してください : ',1,100,_要素数). 昇順にソートし([],_昇順に整列したならび,_昇順に整列したならび) :- !. 昇順にソートし([_値1|R1],L1,_昇順に整列したならび) :- 昇順に挿入(_値1,L1,L2), 昇順にソートし(R1,L2,_昇順に整列したならび). 昇順に挿入(V,[],[V]) :- !. 昇順に挿入(V,[V1|R1],[V,V1|R1]) :- V =< V1,!. 昇順に挿入(V,[V1|R1],[V1|R2]) :- V > V1, 昇順に挿入(V,R1,R2). 画面に出力する(L) :- append(_,[_数値|R],L), write_formatted('%t ',[_数値]), R = [], nl. 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :- write(_催促), get_line(Line), 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値),!. 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値) :- 範囲指定付き整数入力(_入力項目名,_催促,_範囲下限,_範囲上限,_値). 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :- atom_to_term(Line,_値,_), integer(_値), _値 >= _範囲下限, _値 =< _範囲上限,!. 範囲指定付き整数入力診断(_入力項目名,Line,_範囲下限,_範囲上限,_値) :- write_formatted('入力された %t からは、%tから%tの範囲の適切な%tを得られませんでした。再入力をお願いします。\n',[Line,_範囲下限,_範囲上限,_入力項目名]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1296387672/4 # # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://ime.nu/img406.imageshack.us/img406/7043/toi8.jpg # # 問題8. (8点)ワクに埋め込まれた各行の数の和が等しくなるという。 # a,b,cに入る数の組み合わせを、すべて求めるプログラムを作成しなさい。 # ただし、a,b,cの数は1桁の異なる数とする。 # # 4,9,a -> s1 # 3,b,7 -> s2 # c,1,6 -> s3 ワクに埋め込まれた各行の数の和を等しくする(_1行目,_2行目,_3行目,_解決済みならび) :- ワクに埋め込まれた各行の数の和を等しくする([_1行目,_2行目,_3行目],[],_解決済みならび,_合計). ワクに埋め込まれた各行の数の和を等しくする([],_,[],_). ワクに埋め込まれた各行の数の和を等しくする([L|R],_解決済みならび1,[_数|_解決済みならび],_合計) :- 行の変数(L,_数), append(_,[_数|_],[0,1,2,3,4,5,6,7,8,9]), \+(append(_,[_数|_],_解決済みならび1), 加算(L,_合計), ワクに埋め込まれた各行の数の和を等しくする(R,[_数|_解決済みならび1],_解決済みならび,_合計). 行の変数([_変数|_],_変数) :- var(_変数),!. 行の変数([_|R],_変数) :- 行の変数(R,_変数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/819 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 球の体積を計算するプログラムを作成しなさい。 # <作成条件> # 関数の定義は以下の順序で行うこと。(プロトタイプ宣言が必要となります) # main()関数 # 下記の関数を組み合わせて呼び出し、直径15のときの球の体積を求め、その値を表示してください。 # ただし、main()関数内では、変数を一切使うことなく関数の呼び出しを行ってください。 # 体積の計算用として、下記の2つの関数を定義してください。 # 1. radius関数:直径を引数として受け取り、半径を返却値として返す # 2. volume関数:半径を引数として受け取り、球の体積を返却値として返す # ただし、引数及び返却値の型は、すべて double 型とします。 # <実行例> # 体積 = 1766.25 :- op(700,xfx,は). 球の体積を計算する :- 関数表示(球の体積(直径から半径を得る(15))), nl. 直径から半径を得る(_直径,_半径) :- _半径 is _直径 / 2. 球の体積(_半径,_球の体積) :- _球の体積 is (4 * _半径 * _半径 * _半径) / 3. 関数表示(_関数) :- _関数の値 は _関数, write_formatted('%t',[_関数の値]). % は/2 % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/703 # # [1] 授業単元:プログラミング演習 2 # [2] 問題文(含コード&リンク) # # 1..キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む関数を作れ。ただし、nの値とファイル名は引数として取得するものとする。 # 2..引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する関数を作れ。 # 3..以上で作成した関数を使用し、プログラムを完成せよ。ただし、nの値と使用するファイルの名前はプログラムの引数として与えられるものとする。 キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む。その後そのファイルから情報を読み込み学生番号順に表示する(_n,_ファイル名) :- キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む(_n,_ファイル名), 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名). 'キーボードから学生番号と氏名の組をn個読み込み、ファイルに書き込む'(_n,_ファイル名) :- write('学生番号と氏名の組みをカンマ区切りで%t行入力してください : '), length(L,_n), findall(_行,( append(_,[_行|_],L)), L), put_lines(_ファイル名,L). 引数で取得したファイル名のファイルから同じく引数で取得した個数の学生番号と氏名のデータを構造体変数に格納し、学生番号順に表示する(_n,_ファイル名) :- length(LL1,_n), see(_ファイル名), findall([_学生番号,_氏名],( append(_,[_|_],L1L), get_split_line(Instream,[','],[_学生番号,_氏名])), LL1), close(Instream), sort(LL1,LL2), append(_,[L|R],LL2), write_formatted('%t%t\n',L), R = []. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/648 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) 球の体積を計算するプログラムを作成せよ。 # 関数の定義は以下の順序で行うこと。(プロトタイプ宣言が必要となります) # main()関数 # 下記の関数を組み合わせて呼び出し、直径15のときの球の体積を求め、その値を表示してください。 # ただし、main()関数内では、変数を一切使うことなく関数の呼び出しを行ってください。 # # 体積の計算用として、下記の2つの関数を定義してください。 # 1. radius関数:直径を引数として受け取り、半径を返却値として返す # 2. volume関数:半径を引数として受け取り、球の体積を返却値として返す # ただし、引数及び返却値の型は、すべて double 型とします。 # [3.1] OS: unix #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語: C # [4] 期限:1月19日 # [5] その他の制限: なし # よろしくお願いします。 # # 球の体積を計算する(_直径,_球の体積) :- 直径を引数として受け取り、半径を返却値として返す(_直径,_半径), 半径を引数として受け取り、球の体積を返却値として返す(_半径,_球の体積). 直径を引数として受け取り、半径を返却値として返す(_直径,_半径) :- number(_直径), _半径 is _直径 / 2,!. 半径を引数として受け取り、球の体積を返却値として返す(_半径,_球の体積) :- _球の体積 is (4 * pi * _半径 ^ 3) / 3. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/455 # # [1] 授業単元: Cプログラミング演習2 # [2] 問題文(含コード&リンク): 2つ unsighned char型のポインタ変数を用意する。 # キーボードから数値を入力し、 malloc を用いて、1つめのポインタに入力数値バイト分のメモリを確保する。 # 次に2つめのポインタに固定バイト数(いくつでも良いが、例えば16)分のメモリを確保する。 # この時、2つのポインタが指すアドレスが連続しているかどうか確認するプログラムを作成せよ。 # '2つ unsighned char型のポインタ変数を用意する。キーボードから数値を入力し、 malloc を用いて、1つめのポインタに入力数値バイト分のメモリを確保する。次に2つめのポインタに固定バイト数(いくつでも良いが、例えば16)分のメモリを確保する。この時、2つのポインタが指すアドレスが連続しているかどうか確認する' :- get_integer(_数値), malloc(_数値,_先頭アドレス), _続きのアドレス is _先頭アドレス + _数値, malloc(16,_先頭アドレス2), '2つのポインタが指すアドレスが連続しているかどうか確認する'(_続きのアドレス,_先頭アドレスの二,_診断), wr('%t\n',[_診断]). '2つのポインタが指すアドレスが連続しているかどうか確認する'(_アドレス,_アドレス,連続しています) :- !. '2つのポインタが指すアドレスが連続しているかどうか確認する'(_,_,連続していません) :- !. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/771 # # 【課題】 # インスタンス変数として、氏名、生年月日、教員IDを持つTeacherというクラスを実装する必要が生じたとする。 # TeacherはStudentクラスの氏名、生年月日に関するコードの再利用して実装出来そうである。 # 【形態】1. Javaアプリケーション # 【期限】1月13日 # 【補足】もう一度書きなおしてみました。継承を使ってください。Personクラスを新たに導入してください。../test/read.cgi/tech/1267796762/721の問題と関連しています。 # # class 'Person' has instance attribute 氏名,生年月日; end. class 'Teacher' has nature 'Person'; instance attribute 教員ID; end. class 'Student' has nature 'Person'; instance end. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/266 # # 問題2 問題1のプログラムを関数を使用たプログラムに改良しなさい。すなわち、キーボードから4つの整数を入力し、その中の最大値を表示するプログラムを、maxof関数を定義して作成しなさい。 # ただし、このプログラムは問題3と同様下記の2つの種類の処理を、1つのプログラム内で行うように作成すること。 # 配列を使わないで、最大値を求める処理(入力用変数:num1,num2,num3,num4) # 配列を使わない処理です # num1 = 34 # num2 = 21 # num3 = 98 # num4 = 5 # 最大値は98です。 # 配列を使用した処理です # num1 = 34 # num2 = 21 # num3 = 98 # num4 = 5 # 最大値は98です。 # 配列を使わない処理です # num1 = 3 # num2 = 4 # num3 = 5 # num4 = 6 # 最大値は6です。 # 配列を使用した処理です # num1 = 7 # num2 = 8 # num3 = 6 # num4 = 5 # num5 = 4 # num6 = 3 # num7 = 2 # num8 = 3 # 最大値は8です。    # [3.1] OS: unix [3.2] コンパイラ名とバージョン: gcc [3.3] 言語: C  [4] 期限:1月12日 # # 'キーボードから4つの整数を入力し、その中の最大値を表示する' :- repeat, write('ならびを使わない処理です\n'), write('num1 = '),get_integer(_整数1), write('num2 = '),get_integer(_整数2), write('num3 = '),get_integer(_整数3), write('num4 = '),get_integer(_整数4), maxof(_整数1,_整数2,_整数3,_整数4,_最大値1), write_formatted('最大値は%tです\n',[_最大値1]), write('ならびを使用した処理です\n'), write('num1 = %t\nnum2 = %t\nnum3 = %t\nnum4 = %t\n',[_整数1,_整数2,_整数3,_整数4]), maxof([_整数2,_整数3,_整数4],_整数1,_最大値2), write_formatted('最大値は%tです\n',[_最大値2]). maxof([],_最大値,_最大値). maxof([A|R],_最大値1,_最大値) :- A >= _最大値1, maxof(R,_最大値2,_最大値),!. maxof([_|R],_最大値1,_最大値) :- maxof(R,_最大値1,_最大値),!. maxof(_整数1,_整数2,_整数3,_整数4,_最大値) :- ( _整数1 >= _整数2,_整数1 = X1; _整数1 < _整数2,_整数2 = X1), ( _整数3 >= _整数4,_整数3 = X2; _整数3 < _整数4,_整数4 = X2), ( X1 >= X2,_最大値 = X1; X1 < X2,_最大値 = X2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/155 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # char型の配列を適当に大きなサイズで宣言し、その中に1文字ずつ、改行が来るまで # 格納しなさい(改行コードは格納しない。) 。その後で、入力された文字列を逆順で出力しなさい。 # 例えば、入力された文字がdogならばgodになる。 # 適当なサイズ(1000). 'ならびを適当に大きなサイズで確保し、その中に1文字ずつ、改行が来るまで格納しなさい(改行コードは格納しない。) 。その後で、入力された文字列を逆順で出力しなさい。'(_ならび) :- ならびを適当に大きなサイズで確保し(_ならび), その中に1文字ずつ、改行が来るまで格納しなさい(_ならび), その後で、入力された文字列を逆順で出力しなさい(_ならび). ならびを適当に大きなサイズで確保し(_ならび) :- 適当なサイズ(_適当なサイズ), length(_ならび,_適当なサイズ). その中に1文字ずつ、改行が来るまで格納しなさい(_ならび) :- get_char(_文字), その中に1文字ずつ、改行が来るまで格納しなさい(_文字,_ならび). その中に1文字ずつ、改行が来るまで格納しなさい('\n',_) :- !. その中に1文字ずつ、改行が来るまで格納しなさい(_文字,[_文字|R]) :- get_char(_文字2), その中に1文字ずつ、改行が来るまで格納しなさい(_文字2,R). その後で、入力された文字列を逆順で出力しなさい(_ならび) :- その後で、入力された文字列を逆順で出力しなさい(_ならび,[],_逆順ならぴ), put_lines(_逆順ならび). その後で、入力された文字列を逆順で出力しなさい([_変数|_],_逆順ならび,_逆順ならぴ) :- var(_変数),!. その後で、入力された文字列を逆順で出力しなさい([A|R1],L1,_逆順ならぴ) :- その後で、入力された文字列を逆順で出力しなさい(R1,[A|L1],_逆順ならぴ). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/721 # # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), split(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生日の和暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日,_整数学籍番号), 和暦西暦変換(_誕生日の和暦,_誕生日). 誕生年を西暦で返す(_学籍番号,_誕生日の西暦) :- 学籍番号変換(_学籍番号,_整数学籍番号), 学生(_氏名,_誕生日の西暦,_整数学籍番号). 入学年度を返す(_学籍番号,_入学年度) :- 学籍番号変換(_学籍番号,_整数学籍番号), _入学年度 is _整数学籍番号 // 10000. 学籍番号変換(_学籍番号,_学籍番号) :- integer(_学籍番号),!. 学籍番号変換(_学籍番号,_整数学籍番号) :- \+(integer(_学籍番号)), atom_chars(_学籍番号,Chars), すべてが数字(Chars), atom_to_term(_学籍番号,_整数学籍番号,_),!. 学籍番号変換(_学籍番号ではなくて氏名,_整数学籍番号) :- atom(_学籍番号ではなくて氏名), 学生(_学籍番号ではなくて氏名,_,_整数学籍番号),!. すべてが数字([]) :- !. すべてが数字([A|R]) :- append(_,[A|_],['0','1','2','3','4','5','6','7','8','9']), すべてが数字(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1294061094/21 # # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org1340661.txt # # 6.外部変数を利用して自分が呼ばれた回数を数えて返す関数times()を作成せよ。 :- assertz(呼ばれた回数(timer1,0)). 'asserta/1,retract/1を利用して自分が呼ばれた回数を数えて返す述語times'(_タイマー名,_自分が呼ばれた回数) :- times(_タイマー名,_自分が呼ばれた回数). times(_タイマー名,_自分が呼ばれた回数) :- retract(呼ばれた回数(_タイマー名,_これまでに呼ばれた回数)), _自分が呼ばれた回数 is _これまでに呼ばれた回数 + 1, asserta(呼ばれた回数(_タイマー名,_自分が呼ばれた回数)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/729 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1309111.txt.html # 構造体を用いて一人分の名前,性別,年齢,身長[m],体重[kg],BMI値,BMI判定を処理するプログラムを # 以下の手順(1)〜(4)に従って作成せよ.ただし,BMIの判定はBMI値が # 18.5未満なら1, 18.5以上25未満なら2,25以上30未満なら3,30以上なら4 とする. # # (1) 次のようなPERSON構造体を定義せよ # # 【PERSON構造体】 # # メンバ:名前を代入する配列 name # 性別を代入する変数 gender # 年齢を代入する変数 age # 身長を代入する変数 height # 体重を代入する変数 weight # BMI値を代入する変数 bmi # BMI判定結果を代入する変数judge # # (2) 以下の仕様を満たす関数makePersonalDataを作成せよ. # # ◎char *data = "Andrew M 38 1.805 105.2"; #  のように文字列で与えられている一人分の名前,性別,年齢,身長[m],体重[kg]のデータを引数として受け取る # # # ◎受け取った文字列を名前,性別,年齢,身長,体重のデータに分割し,PERSON構造体 #  変数のメンバ変数name, gender, age, height, weightに代入する # # ◎BMI値を計算し,メンバ変数bmiに代入する # # ◎BMI値を判定し,判定結果をメンバ変数judgeに代入する # # ※BMI値の計算と判定は以下に示す関数calc_bmiを利用する # # (3) 以下の仕様を満たす関数printPersonalDataを作成せよ. # ◎PERSON構造体変数を引数として受け取る # ◎PERSON構造体のメンバを1行で出力する.順番は名前,性別,年齢,身長,体重, #  BMI値,BMI判定とし,タブ区切り(’\t’を用いる)とする. #  Andrew M 38 1.805000 105.200000 32.289501 4 # # (4) (1)〜(3)で作成した構造体と関数が正しく動作することを次のmain関数を用いて確認せよ. # # 【実行結果】 # # Andrew M 38 1.805000 105.200000 32.289501 4 # # Jane F 31 1.724000 75.400000 25.368619 3 # # Thomas M 43 1.892000 65.100000 18.186064 1 # # 個人データの作成(_個人データ文字列,_名前,_性別,_年齢,_身長,_体重) :- split(_個人データ文字列,[' '],[_名前,_性別,_年齢,_身長,_体重]), 'BMI値の判定'(_身長,_体重,_BMI値,_BMI判定), assertz(個人データ(_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定)). 個人データの表示 :- 個人データ(_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定), write_formatted('%t\t%t\t%t\t%t\t%t\t%t\t%t\n',[_名前,_性別,_年齢,_身長,_体重,_BMI値,_BMI判定]), fail. 個人データの表示. 'BMI値の判定'(_身長,_体重,_BMI値,_BMI判定) :- _BMI値 is _体重 / ( _身長 * _身長), 'BMI値の判定'(_BMI値,_BMI判定). 'BMI値の判定'(_BMI値,1) :- _BMI値 < 18.5,!. 'BMI値の判定'(_BMI値,2) :- _BMI値 < 25.0,!. 'BMI値の判定'(_BMI値,3) :- _BMI値 < 30.0,!. 'BMI値の判定'(_BMI値,4). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/611 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/www1.axfc.net/uploader/File/so/55622 ←問題文です # http://ime.nu/www1.axfc.net/uploader/File/so/55623 ←datファイルです # # (1) C言語における各文の基本機能に対する設問。 # (例えば、下記の様なもの) # ・変数の宣言、型 # ・代入文 (四則演算、剰余、演算子等を含む) # ・if文 # ・while文 # ・for文 # ・switch/case文 # # (2) 課題による実際のプログラミング。 # ・hドライブのogawaフォルダ配下のkyuuyo.datからデータを入力し、そのデータを # 金額とした時の金種の一覧を表示するプログラムを作成せよ。 #   但し、kyuuyo.datファイルはint型の複数データが格納されたバイナリファイルとする。 'hドライブのogawaフォルダ配下のkyuuyo.datからデータを入力し、そのデータを金額とした時の金種の一覧を表示するプログラムを作成せよ。但し、kyuuyo.datファイルはint型の複数データが格納されたバイナリファイルとする。' :- 'hドライブのogawaフォルダ配下のkyuuyo.datからデータを入力し'(_金額ならび), write(',給与,一万円,五千円,千 円,五百円,百 円,五十円,十 円,五 円,一 円\n'), 'そのデータを金額とした時の金種の一覧を表示する'(1,_金額ならび,0,_,[0,0,0,0,0,0,0,0,0],_). 'hドライブのogawaフォルダ配下のkyuuyo.datからデータを入力し'(_金額ならび) :- open('h:\\ogawa\\kyuuyo.dat',read,instream,[type(binary)]), データを入力(Instream,L), close(Instream). データを入力(Instream,[]) :- at_end_of_stream(Instream),!. データを入力(Instream,[N|R]) :- '4byteづつ入力する'(Instream,[N1,N2,N3,N4]), N is N1 * 256 * 256 * 256 + N2 * 256 * 256 + N3 * 256 + N4, データを入力(Instream,R). '4byteづつ入力する'(Instream,[]) :- !. '4byteづつ入力する'(Instream,[N|R]) :- get_byte(Instream,N), '4byteづつ入力する'(Instream,R). 'そのデータを金額とした時の金種の一覧を表示する'(_,[],_金額合計,_金額合計,LS,LS) :- 金種表示(' ',_金額合計,LS),!. 'そのデータを金額とした時の金種の一覧を表示する'(N,[_金額|R],_金額合計1,_金額合計,LS1,LS) :- _金額合計2 is _金額合計1 + _金額, 金種計算(_金額,_金種ならび,LS1,LS2), 金種表示(N,_金額,_金種ならび), N2 is N + 1, 'そのデータを金額とした時の金種の一覧を表示する'(N2,R,_金額合計2,_金額合計,LS2,LS). 金種計算(_金額,_金種ならび,LS1,LS) :- 金種計算(_金額,[10000,5000,1000,500,100,50,10,5,1],_金種ならび,LS1,LS). 金種計算(_,[],[],[],[]) :- !. 金種計算(K,[K1|R1],[K2|R2],[S1|R3],[S2|R4]) :- K2 is K // K1, K3 is K mod K1, S2 is S1 + K2, 金種計算(K3,R1,R2,R3,R4). 金種表示(N,_金額,_金種ならび) :- write_formatted('%t,%t,%t,%t,%t,%t,%t,%t,%t,%t,%t\n',[N,_金額|_金種ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/373 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # # 以下の問題文の ^ はべき乗をあらわす記号とする。 # # 1.二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示しなさい。 # a,b,cは乱数によって決定されるdouble型の変数とする。 # a,b,cは "a≠0 , b^2-4ac>=0" を満たすものとする。 # 解の公式は {-b±√(b^2-4ac)}/(2a) を使うこと。 # # '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示する'(_a,_b,_c) :- \+(_a = 0),\+(_a = 0.0), _b ^ 2 - 4 * _a * _c >= 0, X_1 is ((-1) * _b + sqrt(_b ^ 2 - 4 * _a * _c)) / ( 2 * _a), X_2 is ((-1) * _b - sqrt(_b ^ 2 - 4 * _a * _c)) / ( 2 * _a), write_formatted('%tx^2+%tx+%t=0 の解は\n',[_a,_b,_c]), write_formatted('x = %t または x = %t\n',[X_1,X_2]). '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示する'(_a,_b,_c) :- ((_a = 0);(_a = 0.0)), X is ((-1) * _c) / _b, write('これは二次方程式ではありません。一次方程式として解を求めます。\n'), write_formatted('%tx+%t=0 の解は\n',[_b,_c]), write_formatted('x = %t\n',[X]). '二次方程式 "ax^2+bx+c=0" のxの解を"解の公式"を使って求め、表示する'(_a,_b,_c) :- \+(_a = 0),\+(_a = 0.0), _b ^ 2 - 4 * _a * _c < 0, write_formatted('%tx^2+%tx+%t=0 の解は虚根となります\n',[_a,_b,_c]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/111 # # [1] 授業単元:アルゴリズム # [2] 問題文 # ・正の値をキーボードから入力。-の値の場合停止。 # ・入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。 # そして降順に並びかえて画面に出力 # '正の値をキーボードから入力。-の値の場合停止。入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。そして降順に並びかえて画面に出力 ' :- 配列を生成, 値をキーボードから入力(_値), '入力された値をヒープ配列(入力された値の並びをヒープに)に格納。配列の大きさはランダムにしておく。配列の大きさはランダムにしておく。'(_値). 降順に並びかえて画面に出力. '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_負の値) :- '-の値の場合停止'(_負の値),!. '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_正の値) :- retract(heap(L1)), append(L1,[V|R],L2), var(V), 全要素が変数でない(L1), V = _正の値, assertz(heap(L2)), 値をキーボードから入力(_値の二), '入力された値をヒープ配列(入力された値の並びをヒープに)に格納'(_値の二),!. 配列を生成 :- _要素数 is (random mod 90) + 10, length(L,_要素数), assertz(heap(L)). '-の値の場合停止'(_負の値) :- _負の値 < 0,!. '値をキーボードから入力'(_値) :- write('整数を入力してください : '), get_line(Line), 値をキーボードから入力の診断(Line,_値),!. '値をキーボードから入力'(_値) :- '値をキーボードから入力'(_値). 値をキーボードから入力の診断(Line,_値) :- atom_to_term(Line,_値,_), integer(_値),!. 値をキーボードから入力の診断(Line,_値) :- write_formatted('入力された %t からは整数が得られません。再入力をお願いします。\n',[Line]), fail. '降順に並びかえて画面に出力' :- heap(L1), append(L0,[V|_],L1), var(V), 全要素が変数でない(L0), 降順に並びかえて(L0,L2), 画面に出力(L2). 全要素が変数ではない(L) :- 全要素が変数でない(L). 全要素が変数でない([]) :- !. 全要素が変数でない([A|R]) :- \+(var(A)), 全要素が変数でない(R). 降順に並びかえて(L1,L2) :- sort(L1,L3), reverse(L3,L2). 画面に出力([]) :- nl,!. 画面に出力([A|R]) :- write_formatted('%t '\n',[A]), 画面に出力(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/617 # # 【 課題 】 http://ime.nu/ideone.com/fWVjI # 【 形態 】1. Javaアプリケーション # 【 期限 】本日 # 【 補足 】よろしくお願いします! # # # 1 課題 # 10 進数の自然数を与えて、その数を2 進数から16 進数まで全てについて基数変換するクラスKisu を作成 # する。クラスKisu には、属性、コンストラクタ、setter、getter、その他必要なメソッド、基数変換した結果 # を表示するメソッドを必ず入れること。ただし、getter で基数変換した結果を別の変数に代入し、その変数の # 内容を変更しても、クラスKisu 内の基数変換の内容は変わらないようにする。 #  クラスKisu の例 # class Kisu { # // 属性 # private static final int N = 15; # // 2 進数から16 進数までの数 # private int m; // 基数変換する数 # private String [] kisu1; # // 基数変換した結果を入れる1 次元配列 # private String [][] kisu2; # // 基数変換した結果を入れる2 次元配列 # // コンストラクター # public Kisu() {...} # public Kisu(int m) {...} # // setter # public void setM(int m) { # // 基数変換する数を代入する # } # public void setKisu() { # // 変数m を2 進数から16 進数に変換し、 # // その結果を変数kisu1、kisu2 に代入する # } # // 必要があれば他のメソッドを付け加える # // getter # 1 # public String[] getKisu1() { # // 変数kisu1 を外部の変数に代入する # } # public String[][] getKisu2() { # // 変数kisu2 を外部の変数に代入する # } # // 表示用のメソッド # public void show1() { # // 変数kisu1 の内容を画面に表示する # } # public void show2() { # // 変数kisu2 の内容を画面に表示する # } # } # 2 実行例 # main 関数を # class Rep3 { # public static void main(String[] args){ # Kisu a = new Kisu(); # // 基数変換する数をセットし、変換する # a.setM(12345678); # a.setKisu(); # // main プログラムの変数b に代入し、その変数b # // にでたらめなデータを代入する # String [] b = a.getKisu1(); # int k = b.length; # for(int i=0;i javac Rep3.java # > java Rep3 # 1 次元配列 # 101111000110000101001110 // 2 進数 # 212020020002100      // 3 進数 # 233012011032        // 4 進数 # 11130030203 // 5 進数 # 1120335530 // 6 進数 # 206636142 // 7 進数 # 57060516 // 8 進数 # 25206070 // 9 進数 # 12345678 //10 進数 # 6a72544 //11 進数 # 41745a6 //12 進数 # 2733447 //13 進数 # 18d5222 //14 進数 # 113cea3 //15 進数 # bc614e //16 進数 # 2 次元配列 # 101111000110000101001110 // 2 進数 # 212020020002100      // 3 進数 # 233012011032       // 4 進数 # 11130030203 // 5 進数 # 1120335530 // 6 進数 # 206636142 // 7 進数 # 57060516 // 8 進数 # 25206070 // 9 進数 # 12345678 //10 進数 # 6a72544 //11 進数 # 41745a6 //12 進数 # 2733447 //13 進数 # 18d5222 //14 進数 基数進数(_基数,_対象自然数,_基数進数表現) :- \+(var(_対象自然数)), length(_基数ならび,_基数), length(_対象自然数のおおいさ,_対象自然数), ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_基数進数表現ならび), 基数進数表現(_基数進数ならび,_基数進数表現ならび), concat_atom(_基数進数表現ならび,_基数進数表現),!. 基数進数(_基数,_対象自然数,_基数進数表現) :- var(_対象自然数), length(_基数ならび,_基数), atom(_基数進数表現), atom_chars(_基数進数表現,_基数進数表現ならび), 基数進数表現(_基数進数ならび,_基数進数表現ならび), ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_基数進数ならび), length(_対象自然数のおおいさ,_対象自然数),!. 基数進数(_基数,_対象自然数,_基数進数表現) :- length(_基数ならび,_基数), length(_対象自然数のおおいさ,_対象自然数), ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_基数進数ならび), 基数進数表現(_基数進数ならび,_基数進数表現ならび), concat_atom(_基数進数表現ならび,_基数進数表現). ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_基数進数ならび) :- 反転ならびによる基数進数(_基数ならび,_対象自然数のおおいさ,_反転した基数進数ならび), reverse(_反転した基数進数ならび,_基数進数ならび),!. 反転ならびによる基数進数(_,[],[]) :- !. 反転ならびによる基数進数(Ln,L1,[Mod|R]) :- ならび割り算(L1,Ln,L2,Mod), 反転ならびによる基数進数(Ln,L2,R). 基数進数表現([],[]) :- !. 基数進数表現([L|R1],[A|R2]) :- 基数進数の一桁の文字表現(L,A), 基数進数表現(R1,R2). 基数進数の一桁の文字表現([],'0') :- !. 基数進数の一桁の文字表現([_],'1') :- !. 基数進数の一桁の文字表現([_,_],'2') :- !. 基数進数の一桁の文字表現([_,_,_],'3') :- !. 基数進数の一桁の文字表現([_,_,_,_],'4') :- !. 基数進数の一桁の文字表現([_,_,_,_,_],'5') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_],'6') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_],'7') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_],'8') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_],'9') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_],'A') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_],'B') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_,_],'C') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_,_,_],'D') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_,_,_,_],'E') :- !. 基数進数の一桁の文字表現([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],'F') :- !. 基数進数の一桁の文字表現(L,A) :- append([_,_,_,_,_,_,_,_,_,_],L1,L), length(L1,N), N < 17, N2 is N + 65, char_code(A,N2),!. 基数進数の一桁の文字表現(L,A) :- append([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],L1,L), length(L1,N), N < 27, N2 is N + 97, char_code(A,N2),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/409 # # [1] 授業単元: プログラミングおよび演習 # [2] 問題文(含コード&リンク): # 1.解答例のカレンダー(下にリンクはってます)について、dayofweek()を再帰で書き直せ。 #  ◦ある月の1日の曜日は、前の月の日数と1日の曜日から計算できる # ◦ある年の1月1日の曜日は、前の年の日数と前の年の1月1日の曜日から、あるいは、その年の日数と次の年の1月1日の曜日から計算できる # ◦2000年1月1日は土曜日である # # 2.このプログラムについて、任意の年月についてdayofweek() の呼び出し回数が何回になるかを理論的に考察せよ。また、呼び出し回数を計測し、結果が実際に理論と合致しているかを確認せよ。 # 2.ヒント:呼出し回数を数えるためにグローバル変数を使用する # # ある年・ある月の一日の曜日は(_年,_月,_曜日) :- うるう年(_年), ある年の一月一日の曜日は(_年,_曜日ならび1,_), 日めくりカレンダ(うるう年,_年,_曜日ならび1,_日めくりカレンダ), append(_,[_月/1/_曜日|_],_日めくりカレンダ),!. ある年・ある月の一日の曜日は(_年,_月,_曜日) :- \+(うるう年(_年)), ある年の一月一日の曜日は(_年,_曜日ならび1,_), 日めくりカレンダ(平年,_年,_曜日ならび1,_日めくりカレンダ), append(_,[_月/1/_曜日|_],_日めくりカレンダ),!. ある年の一月一日の曜日は(_年,_曜日ならび,_曜日) :- '2000年1月1日は土曜日である'(_曜日ならびの一). ある年の一月一日の曜日は(2000,_年,_曜日ならびの一,_曜日ならび), _曜日ならび = [_曜日|_],!. ある年の一月一日の曜日は(_年,_年,_曜日順ならび,_曜日順ならび) :- !. ある年の一月一日の曜日は(_N,_年,_曜日順ならび1,_曜日順ならび) :- _年 >= 2000, うるう年(_N), ならびの回転(左方向,366,_曜日順ならび1,_曜日順ならび2), _N2 is _N + 1, ある年の一月一日の曜日は(_N2,_年,_曜日順ならび2,_曜日順ならび). ある年の一月一日の曜日は(_N,_年,_曜日順ならび1,_曜日順ならび) :- _年 >= 2000, \+(うるう年(_N)), ならびの回転(左方向,365,_曜日順ならび1,_曜日順ならび2), _N2 is _N + 1, ある年の一月一日の曜日は(_N2,_年,_曜日順ならび2,_曜日順ならび). ある年の一月一日の曜日は(_N,_年,_曜日順ならび1,_曜日順ならび) :- _年 < 2000, _N1 is _N - 1, うるう年(_N1), ならびの回転(右方向,366,_曜日順ならび1,_曜日順ならび2), ある年の一月一日の曜日は(_N1,_年,_曜日順ならび2,_曜日順ならび). ある年の一月一日の曜日は(_N,_年,_曜日順ならび1,_曜日順ならび) :- _年 < 2000, _N1 is _N - 1, \+(うるう年(_N1)), ならびの回転(右方向,365,_曜日順ならび1,_曜日順ならび2), ある年の一月一日の曜日は(_N1,_年,_曜日順ならび2,_曜日順ならび). '2000年1月1日は土曜日である'([土,日,月,火,水,木,金]). 月日数ならび(平年,[1:31,2:28,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31]). 月日数ならび(うるう年,[1:31,2:29,3:31,4:30,5:31,6:30,7:31,8:31,9:30,10:31,11:30,12:31]). 日めくりカレンダの生成(平年,_曜日ならび,_日めくりカレンダ) :- 月日数ならび(平年,L), 日めくりカレンダの生成(L,_曜日ならび,_日めくりカレンダの一), flat(_日めくりカレンダの一,_日めくりカレンダ). 日めくりカレンダの生成(うるう年,_曜日ならび,_日めくりカレンダ) :- 月日数ならび(うるう年,L), 日めくりカレンダの生成(L,_曜日ならび,_日めくりカレンダの一), flat(_日めくりカレンダの一,_日めくりカレンダ). 日めくりカレンダの生成([],_,[]) :- !. 日めくりカレンダの生成([[_月:_末日]|R1],_曜日ならび1,[L|R2]) :- 一ヶ月分の日めくりを生成(1,_末日,_曜日ならび1,_曜日ならび2,L), 日めくりカレンダの生成(R1,_曜日ならび2,R2). 一ヶ月分の日めくりを生成(N,_末日,_月,_曜日ならび,_曜日ならび,[]) :- N > _末日,!. 一ヶ月分の日めくりを生成(N,_末日,_月,[_曜日|R4],_曜日ならび,[_月/N/_曜日|R]) :- N2 is N + 1, ならびの回転(左方向,1,[_曜日|R4],_曜日ならび2), 一ヶ月分の日めくりを生成(N2,_末日,_月,_曜日ならび2,_曜日ならび,R). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/294 # # [1] 授業単元: プログラミング # [2] 問題文: # 変数iに100が入っています、 # # iとは別に、50,75,55,60というように、ランダムな数字の配列があり、 # 次にくる数字が前の数字(ここでは60)より、5%大きかったら、 # iに1を加算するプログラムを作成。 # # -5%なら-1で、10%なら+2するといった感じです。5%未満なら加算しません。 # '変数iに100が入っています、iとは別に、50,75,55,60というように、ランダムな数字の配列があり、次にくる数字が前の数字(ここでは60)より、5%大きかったら、iに1を加算する。-5%なら-1で、10%なら+2するといった感じです。5%未満なら加算しません。'(_ランダムな数1,_ランダムな数2,_i) :- length(_ランダムな数ならび,100), ランダムな数列を得る(_ランダムな数ならび), 変数iの変化をみる(100,_ランダムな数ならび,_ランダムな数1,_ランダムな数2,_i). 変数iの変化をみる(_i1,[_ランダムな数1,_ランダムな数2|R],_ランダムな数11,_ランダムな数12,_i) :- iの変化(_ランダムな数1,_ランダムな数2,_i1,_i2), 変数iの変化をみる(_i2,_ランダムな数1,_ランダムな数2,R,_ランダムな数11,_ランダムな数12,_i). 変数iの変化をみる(_i,_ランダムな数1,_ランダムな数2,R,_ランダムな数1,_ランダムな数2,_i). 変数iの変化をみる(_i2,_ランダムな数1,_ランダムな数2,R,_ランダムな数11,_ランダムな数12,_i) :- 変数iの変化をみる(_i2,[_ランダムな数2|R],_ランダムな数11,_ランダムな数12,_i). iの変化(_ランダムな数1,_ランダムな数2,_i1,_i2) :- '_ランダムな数の変化率が5%,-5%,10%以上変化したら_i1を_i2に変化される'(_ランダムな数1,_ランダムな数2,_i1,_i2),!. iの変化(_ランダムな数1,_ランダムな数2,_i1,_i1). '_ランダムな数の変化率が5%,-5%,10%以上変化したら_i1を_i2に変化される'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- '5%大きかったらiに1を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2). '_ランダムな数の変化率が5%,-5%,10%以上変化したら_i1を_i2に変化される'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- '-5%大きかったらiに-1を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2). '_ランダムな数の変化率が5%,-5%,10%以上変化したら_i1を_i2に変化される'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- '10%大きかったらiに2を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2). '5%大きかったらiに1を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- _ランダムな数2 > _ランダムな数1 * 1.05, _i2 is _i + 1. '-5%大きかったらiに-1を加算する'(_ランダムな数1,_ランダムな数2,_i1,_i2) :- _ランダムな数2 < _ランダムな数1 * 0.95, _i2 is _i - 1. '10%大きかったらiに2を加算数(_ランダムな数1,_ランダムな数2,_i1,_i2) :- _ランダムな数2 > _ランダムな数1 * 1.10, _i2 is _i + 2. ランダムな数列を得る([]). ランダムな数列を得る([_ランダムな数|R]) :- _ランダムな数 is random(30), ランダムな数列を得る(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/116 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):名前、学年、学科、番号を標準入力から入力し、 # サブルーチン内で表示するプログラムを構造体を用いて作成せよ。ただし、 # 構造体のメンバに値を代入する際には変数実体を操作する。 # すなわちドット演算子を用いること。 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:Visual Studio 2005 #  [3.3] 言語:C++ # [4] 期限:11/19 # [5] その他の制限:特になし # # 連投しますが、よろしくお願いします。 # '名前、学年、学科、番号を標準入力から入力し、構造体を用いてサブルーチン内で表示する' :- '名前、学年、学科、番号を標準入力から入力し、'(L), サブルーチン内で表示する([名前,学年,学科,番号],L). '名前、学年、学科、番号を標準入力から入力し、'(L) :- write('名前,学年,学科,番号 をカンマで区切り一行で入力しなさい : '), get_split_line([','],L). サブルーチン内で表示する([],[]) :- nl,!. サブルーチン内で表示する([_項目名|R1],[_値|R2]) :- write_formatted('%t, ',[_項目名:_値]), サブルーチン内で表示する(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/627 # # mysql 5.0 (windows 7)です # 下記のようなテーブルで # amountの合計の最も多いidを取得するsql文がわかりません… # # select id, sum(amount) as "total" from orders # group by id order by total desc limit 1; # # とすれば一応取得できたのですが、別の方法はないでしょうか # 初歩的な質問ですみません… # # +------+------+--------+ # | id | name | amount | # +------+------+--------+ # | 1 | C1 | 3 | # | 1 | C2 | 10 | # | 2 | C2 | 5 | # | 2 | C3 | 10 | # | 3 | C3 | 2 | # +------+------+--------+ # 'amountの合計の最も多いidを取得する'(_最もaumout合計が多いid) :- find_sum_max([_id,_値],orders(_id,_,_値),[_最もamount合計が多いid,_最大合計値]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % _合計値 は任意の変数として、利用者が設定する find_sum_max([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最大合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmax(_合計値,( append(_,[[_鍵,_合計値]|_],L), _合計値の条件), _最大合計値), append(_,[[_鍵,_最大合計値]|_],L). find_sum_min([_鍵,_値],P,_合計値,_合計値の条件,[_鍵,_最小合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmin(_合計値,( append(_,[[_鍵,_合計値]|_],L), _合計値の条件), _最小合計値), append(_,[[_鍵,_最小合計値]|_],L). find_sum_max([_鍵,_値],P,[_鍵,_最大合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmax(_合計値,append(_,[[_鍵,_合計値]|_],L),_最大合計値), append(_,[[_鍵,_最大合計値]|_],L). find_sum_min([_鍵,_値],P,[_鍵,_最小合計値]) :- findall([_鍵,_値],( 単一(_鍵,P)), findsum(_値,P,_合計値)), L), findmin(_合計値,append(_,[[_鍵,_合計値]|_],L),_最小合計値), append(_,[[_鍵,_最小合計値]|_],L). 単一(A,P) :- findsetof(A,P,L),!, append(_,[A|_],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/6 # # [1] 授業単元:C言語基礎 # [2] 問題文(含コード&リンク):http://ime.nu/www.dotup.org/uploda/www.dotup.org1254228.txt.html # # [1]呼び出された回数を表示する関数 count を作成せよ.ただし,呼び出された回数が 3 の # 倍数のときには回数の後に!を,5 の倍数のときには?を付けて表示すること.なお,プログラム中では # グローバル変数を使用しないものとする. # 下のmain関数で count を呼び出した場合,正しい動作結果が得られるか確認せよ # '呼び出された回数を表示する関数 count を作成せよ.ただし,呼び出された回数が 3 の倍数のときには回数の後に!を,5 の倍数のときには?を付けて表示する' :- assertz((count(1) :- fail)), assertz((count(N) :- retract((count(N) :- _)),Mod3 is N mod 3,Mod5 is N mod 5,count表示(N,Mod3,Mod5),N2 is N + 1,asserta((count(N2) :- fail)))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(1) :- fail. count(N) :- retract((count(N) :- _)), Mod3 is N mod 3, Mod5 is N mod 5, count表示(N,Mod3,Mod5), N2 is N + 1, asserta((count(N2) :- fail)). count表示(N,0,0) :- write_formatted('%t!? ',[N]),!. count表示(N,0,_) :- write_formatted('%t! ',[N]),!. count表示(N,_,0) :- write_formatted('%t? ',[N]),!. count表示(N,_,_) :- write_formatted('%t ',[N]),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/970 # # 0か1かをランダムに出力する変数rndを作りたいのですが、以下のように記述し、ループを回すと # ほとんど0しか出力されませんでした。どのようにすればこれより良い乱数が作れますか? # rnd=(int)((double)rand() / ((double)RAND_MAX + 1) * 2); # # '0か1かをランダムに出力する'(_0か1) :- _0か1 is random mod 2. %%%%%%%%%%%%%%%%%%%%%% repeatパターンだと %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '0か1かをランダムに出力する'(_0か1) :- _0か1 is random mod 2. '0か1かをランダムに出力する'(_0か1) :- '0か1かをランダムに出力する'(_0か1). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/781 # # こんにちは。基礎クラスで恐縮ですがよろしくお願いします。 # [1] 授業単元: C基礎 # [2] 問題文(含コード&リンク): # 問題1 int型変数 i , j が -10 < i <10 , -20 < j < 20 を満たすとする。 # 11*i + 7*j がちょうど1となるi , jの組み合わせを全て求めるプログラムを作成せよ。 # '変数 i , j が -10 < i < 10 , -20 < j < 20 を満たすとする。 11*i + 7*j がちょうど1となるi , jの組み合わせを全て求める'(_i,_j) :- findall([_i,_j],( for(-10,_i,10), \+(_i = -10), \+(_i = 10), for(-20,_j,20), \+(_j = -20), \+(_j = 20), 1 is 11 * _i + 7 * _j), L), append(_,[[_i,_j]|_],L). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/542 # # [2] 問題文: # (1)10個の最大値を求める # 10人の身長データを順にcmで入力したとき、一番大きな身長は何僂を表示するプログラムを作成しなさい。 #    実行結果は次の形らしいです。 #    1人目の身長を入力してください (単位 : cm) # (入力待ち) # 2人目の身長を入力してください (単位 : cm) # (入力待ち) .....略..... # 10人目の身長を入力してください (単位 : cm) # (入力待ち) #    この中で身長が高い人は、○○cmです。 #  ・指定 #    for文を使い処理を10回繰り返す。 #    最大値を記憶する変数を用意し、0を代入しておく。 # # '10人の身長データを順にcmで入力したとき、一番大きな身長は何僂を表示する' :- 身長を入力する(1,_身長), 最大値を確保しながら身長を入力してもらう(1,_身長,0,_最大値), write_formatted('この中で身長が高い人は、%tcmです。',[_最大値]). 最大値を確保しながら身長を入力してもらう(10,_身長,_これまでの最大値,_身長) :- _身長 > _これまでの最大値,!. 最大値を確保しながら身長を入力してもらう(10,_身長,_これまでの最大値,_最大値) :- _身長 =< _これまでの最大値, _最大値 = _これまでの最大値,!. 最大値を確保しながら身長を入力してもらう(N,_身長1,_これまでの最大値,_最大値) :- _身長1 > _これまでの最大値, 身長を入力する(N,_身長2), N2 is N + 1, 最大値を確保しながら身長を入力してもらう(N2,_身長2,_身長1,_最大値). 最大値を確保しながら身長を入力してもらう(N,_身長1,_これまでの最大値,_最大値) :- _身長1 =< _これまでの最大値, 身長を入力する(N,_身長2), N2 is N + 1, 最大値を確保しながら身長を入力してもらう(N2,_身長2,_これまでの最大値,_最大値). 身長を入力する(N,_身長) :- write_formatted('%t人目の身長を入力してください (単位 : cm) : ',[N]), get_line(Line), 身長を入力診断(Line,_身長),!. 身長を入力する(N,_身長) :- 身長を入力する(N,_身長). 身長を入力診断(Line,_身長) :- atom_to_term(Line,_身長,_), integer(_身長), _身長 > 0,!. 身長を入力診断(Line,_身長) :- write_formatted('入力された %t からは身長らしき整数は得られませんでした。',[Line]), write('再入力をお願いします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/449 # # [1] 授業単元:cプログラミング # [2] 問題文(含コード&リンク): # キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形 # を表示する。なお、入力が間違っている場合、再度入力を要求する。 # ↓こんな感じ # 実行結果例 # # 数字(2〜9)を入力してください:0 # 入力エラーです!! # 数字(2〜9)を入力してください:3 #  * * *  #   #  *   * #   #  * * * # # 'キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形を表示する。なお、入力が間違っている場合、再度入力を要求する。' :- 'キーボードから数字(2〜9)を入力し、'(N), 正方形の格を変数のリストとして生成する(N,LL), 第一行を星で詰める(LL), 置換する(LL), 各行を反転しながら、変数を空白に置換して行を表示する(LL). 正方形の格を変数のリストとして生成する(N,LL) :- 星の間に空白を挿むからその分、格を拡張する(N,LL), findall(L,( append(_,[L|_],LL), length(L,N)), LL). 星の間に空白を挿むからその分、格を拡張する(N,L2) :- length(L,N), append(L,L,L2), append(L,[_],L2). 第一行を星で詰める([*]) :- !. 第一行を星で詰める([*,' '|R]) :- 第一行を星で詰める(R). 置換する(L) :- 置換(L,L). 各行を反転しながら、変数を空白に置換して行を表示する([]) :- !. 各行を反転しながら、変数を空白に置換して行を表示する([L|R]) :- reverse(L,L), 変数を要素を空白に置換する(L), concat_atom(L,A), write_formatted('%t\n',[A]), 各行を反転しながら、変数を空白に置換して行を表示する(R). 変数要素を空白に置換する([]) :- !. 変数要素を空白に置換する([' '|R]) :- 変数要素を空白に置換する(R),!. 変数要素を空白に置換する([_|R]) :- 変数要素を空白に置換する(R),!. 'キーボードから数字(2〜9)を入力し、'(N) :- write('2〜9の整数を入力してください : '), get_line(Line), 'キーボードから数字(2〜9)を入力診断'(Line,N),!. 'キーボードから数字(2〜9)を入力し、'(N) :- 'キーボードから数字(2〜9)を入力し、'(N). 'キーボードから数字(2〜9)を入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 2, N =< 9,!. 'キーボードから数字(2〜9)を入力診断'(Line,N) :- write_formatted('入力された %t は2〜9の整数ではありませんでした\n',[Line]), write('再入力をお願いします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/449 # # [1] 授業単元:cプログラミング # [2] 問題文(含コード&リンク): # キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形 # を表示する。なお、入力が間違っている場合、再度入力を要求する。 # ↓こんな感じ # 実行結果例 # # 数字(2〜9)を入力してください:0 # 入力エラーです!! # 数字(2〜9)を入力してください:3 #  * * *  #   #  *   * #   #  * * * # # 'キーボードから数字(2〜9)を入力し、入力された数字を辺の長さとする正方形を表示する。なお、入力が間違っている場合、再度入力を要求する。' :- 'キーボードから数字(2〜9)を入力し、'(N), 正方形の格を変数のリストとして生成する(N,LL), 第一行を星で詰める(LL), 置換する(LL), 各行を反転しながら、変数を空白に置換して行を表示する(LL). 正方形の格を変数のリストとして生成する(N,LL) :- 星の間に空白を挿むからその分、格を拡張する(N,N2), findall(L,( for(1,_,N2), length(L,N2)), LL). 星の間に空白を挿むからその分、格を拡張する(N,N2) :- N2 is N * 2 - 1. 第一行を星で詰める([*]) :- !. 第一行を星で詰める([*,' '|R]) :- 第一行を星で詰める(R). 置換する(L) :- 置換(L,L). 各行を反転しながら、変数を空白に置換して行を表示する([]) :- !. 各行を反転しながら、変数を空白に置換して行を表示する([L|R]) :- reverse(L,L), 変数を要素を空白に置換する(L), concat_atom(L,A), write_formatted('%t\n',[A]), 各行を反転しながら、変数を空白に置換して行を表示する(R). 変数要素を空白に置換する([]) :- !. 変数要素を空白に置換する([' '|R]) :- 変数要素を空白に置換する(A,R),!. 変数要素を空白に置換する([_|R]) :- 変数要素を空白に置換する(R),!. 'キーボードから数字(2〜9)を入力し、'(N) :- write('2〜9の整数を入力してください : '), get_line(Line), 'キーボードから数字(2〜9)を入力診断'(Line,N),!. 'キーボードから数字(2〜9)を入力し、'(N) :- 'キーボードから数字(2〜9)を入力し、'(N). 'キーボードから数字(2〜9)を入力診断'(Line,N) :- atom_to_term(Line,N,_), integer(N), N >= 2, N =< 9,!. 'キーボードから数字(2〜9)を入力診断'(Line,N) :- write_formatted('入力された %t は2〜9の整数ではありませんでした\n',[Line]), write('再入力をお願いします。\n'), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/391 # # 関数A内で変数Bが一定以上の数値であるかどうかを判断(変数にはfor文で次々と値が代入されていく)し、以上なら1、以下なら0が結果として帰ってくるようにした後 # main関数内で何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込むプログラムを組んでもらえませんか? # # 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_csvファイル,_開始点,_終了点,_B,_閾値) :- tell(_csvファイル), 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値), 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_,_,_,_,_) :- told. 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値) :- var(_終了点), length(_B,_終了点), forもどきA(_開始点,N,_終了点,_B,_閾値,_A), write_formatted('%t,%t\n',[N,_A]), N = _終了点. 何番目の変数Aが1で何番目の変数Aが0だったかをcsvにひたすら書き込む(_開始点,_終了点,_B,_閾値) :- \+(var(_終了点)), forもどきA(_開始点,N,_終了点,_B,_閾値,_A), write_formatted('%t,%t\n',[N,_A]), N = _終了点. forもどきA(Start,N,Max,_B,_閾値,_A) :- for(Start,N,Max), list_nth(N,_B,M), forもどきA診断(M,_閾値,_A). forもどきA診断(M,_閾値,1) :- M >= _閾値. forもどきA診断(M,_閾値,0) :- M < _閾値. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/572 # # sqlite3です、PHPを使ってやりたいんですが、 # # データにある、ある項目が引用されたとき、 # そのデータにあるcntというカラムにカウンターみたいなのを付けたいんですが # 何か良い方法はありますか? # http://ime.nu/oku.edu.mie-u.ac.jp/~okumura/php/counter-sqlite.php # それっぽいのがあったんですけど 複数のcnt[カラム]ごとに取得したいんですよね # カウンタ付き参照(P) :- P =.. [_テーブル名,_id|L], 参照位置ならび(2,L,_条件項位置ならび,_変数位置ならび), call(P), 条件項カウンタの更新(_テーブル名,_id,_条件項位置ならび), 変数項カウンタの更新(_テーブル名,_id,_変数位置ならび). 参照位置ならび(_,[],[],[]) :- !. 参照位置ならび(N,[A|R1],[N|R2],R3) :- \+(var(A)), N2 is N + 1, 参照位置ならび(N2,R1,R2,R3). 参照位置ならび(N,[V|R1],R2,[N|R3]) :- var(V), N2 is N + 1, 参照位置ならび(N2,R1,R2,R3). 条件項カウンタの更新(_テーブル名,_id,_条件項位置ならび) :- append(_,[_位置|R],_条件項位置ならび), 条件項カウンタの更新(_テーブル名,_id,_位置), R = []. 条件項カウンタの更新(_テーブル名,_id,_位置) :- retract(条件項カウンタ(_テーブル名,_id,_位置,N)), N2 is N + 1, asserta(条件項カウンタ(_テーブル名,_id,_位置,N2)). 条件項カウンタの更新(_テーブル名,_id,_位置) :- \+(条件項カウンタ(_テーブル名,_id,_位置,_)), asserta(条件項カウンタ(_テーブル名,_id,_位置,1)). 変数項カウンタの更新(_テーブル名,_id,_位置) :- retract(変数による参照項カウンタ(_テーブル名,_id,_位置,N)), N2 is N + 1, asserta(変数による参照項カウンタ(_テーブル名,_id,_位置,N2)). 変数項カウンタの更新(_テーブル名,_id,_位置) :- \+(変数項カウンタ(_テーブル名,_id,_位置,_)), asserta(変数による参照項カウンタ(_テーブル名,_id,_位置,1)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1288531658/3 # # [1] 授業単元:C言語入門 # # [2] 問題文):最大24個の整数が格納できる配列を用意する。 # この配列の先頭から10個分には1を代入し, # つづく6個分には0を入れ,最後の8個分には-1を入れよ。 # # '最大24個の整数が格納できる配列を用意する。この配列の先頭から10個分には1を代入し,つづく6個分には0を入れ,最後の8個分には-1を入れよ。'(L) :- 最大24個の整数が格納できる配列を用意する(L), この配列の先頭から10個分には1を代入し(L,R1), つづく6個分には0を入れ(R1,R2), '最後の8個分には-1を入れよ'(R2). 最大24個の整数が格納できる配列を用意する(L) :- length(L,24). この配列の先頭から10個分には1を代入し(L,R) :- length(L1,10), all(L1,1), append(L1,R,L). つづく6個分には0を入れ(L,R) :- length(L1,6), all(L1,0), append(L1,R,L). '最後の8個分には-1を入れよ'(L) :- length(L,8), all(L,-1). ?- ti. no. ?- keizo104 :: pwd(X). ?- w3db(keizo104,7083,true). yes. ?- !'ls -l *.html | grep "2010-10-31"'. -rw-r--r-- 1 root root 745 2010-10-31 17:15 c141_966.html -rw-r--r-- 1 root root 1057 2010-10-31 20:54 c141_971.html -rw-r--r-- 1 root root 592 2010-10-31 22:42 c141_983.html yes. ?- cat c141_966.html. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/966 # # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # http://ime.nu/img69.imageshack.us/img69/1731/65183447.jpg # (b)、(d)の回答をよろしくお願いします。 # # 1 dを入力し、(n+1)^2 - n^2 =< d なる最小のnを出力するプログラムを #  while 文を使って作りたい。nは整数、 dは実数とせよ。以下の問に答えよ。 # # (a) このプログラムに必要な変数を述べよ。 # (b) (n + 1)^2 - n^2 =< d を判定するC言語の条件式を書け。 # (c) 処理の手順を番号付き箇条書、または、フローチャートで示せ。 # (d) プログラムを書け。 yes. ?- cat c141_971.html. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/971 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # *記号を使ってでsin曲線を描け。 # '*記号を使ってsin曲線を描け。' :- '*記号を使ってでsin曲線を描け。'(1,LL), 転置(LL,LL2), append(_,[L|R],LL2), concat_atom(L,A), write_formatted('%t\n',[A]), R = []. '*記号を使ってsin曲線'(X,[]) :- X > 629,!. '*記号を使ってsin曲線'(X,[L|R]) :- length(L0,101), Y is truncate((100 * sin((X-1) * pi / 100))+101), list_nth(Y,L0,'*'), reverse(L0,L1), 全ての変数を空白に(L0), X2 is X + 1, '*記号を使ってsin曲線'(X2,R). 全ての変数を空白に([]) :- !. 全ての変数を空白に([V|R]) :- var(V), V = ' ', 全ての変数を空白に(R),!. 全ての変数を空白に([_|R]) :- 全ての変数を空白に(R),!. ?- nojiri('c141_971.html'). yes. ?- ti. ?- !'ls -l *.html | grep "2010-10-30"'. -rw-r--r-- 1 root root 3258 2010-10-30 03:06 c141_863.html -rw-r--r-- 1 root root 2471 2010-10-30 17:27 c141_863_1.html -rw-r--r-- 1 root root 3771 2010-10-30 09:07 c141_863_2.html -rw-r--r-- 1 root root 561 2010-10-30 23:28 c141_948.html yes. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/948 # # [1] 授業単元:プログラムとアルゴリズム # [2] 問題文(含コード&リンク):整数配列aとその長さnを渡して、配列のそれぞれの要素を10倍して戻す関数Funcを作成し、必要な追加を行って動作を確認しなさい。 # 下敷きとするソースコードは以下のURL(jpgで見にくくてすみません)でお願いします。 # http://ime.nu/pc.gban.jp/?p=24057.jpg # 'リストa、長さnを渡して、n要素だけ10倍して戻す'(_a,_n,X) :- length(L,_n), append(L,R,_a), '10倍して戻す'(L,L10), append(L10,R,X). '10倍して戻す'(L,L10) :- findall(N2,( append(_,[N|_],L), N2 is N * 10), L10). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'リストa、長さnを渡して、n要素だけ10倍して戻す'(_a,_n) :- length(L,_n), '10倍して戻す'(L,_a,X), '10倍して戻す'([],X,X) :- !. '10倍して戻す'([_|R1],[N|R2],[N2|R3]) :- N2 is N * 10, '10倍して戻す'(R1,R2,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'リストa、要素位置m、長さnを渡して、最初からm要素目からn要素だけ10倍して戻す'(_a,_m,X) :- length(L,_n), _m_1 is _m - 1, length(L1,_m_1), append(L1,R,_a), '10倍して戻す'(L,R,L2), append(L1,L2,X). '10倍して戻す'([],X,X) :- !. '10倍して戻す'([_|R1],[N|R2],[N2|R3]) :- N2 is N * 10, '10倍して戻す'(R1,R2,R3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/971 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # *記号を使ってでsin曲線を描け。 # '*記号を使ってsin曲線を描け。' :- '*記号を使ってでsin曲線を描け。'(1,LL), 転置(LL,LL2), append(_,[L|R],LL2), concat_atom(L,A), write_formatted('%t\n',[A]), R = []. '*記号を使ってsin曲線'(X,[]) :- X > 629,!. '*記号を使ってsin曲線'(X,[L|R]) :- length(L0,101), Y is truncate((100 * sin((X-1) * pi / 100))+101), list_nth(Y,L0,'*'), reverse(L0,L1), 全ての変数を空白に(L0), X2 is X + 1, '*記号を使ってsin曲線'(X2,R). 全ての変数を空白に([]) :- !. 全ての変数を空白に([V|R]) :- var(V), V = ' ', 全ての変数を空白に(R),!. 全ての変数を空白に([_|R]) :- 全ての変数を空白に(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/715 # # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # # 問題1 # 整数型配列に格納された5個の整数{8,5,12,7,9}を大きい数の順番(降順)に並べ替えて表示するプログラムを作れ。 # 並び替えの方法は、まず全体の最大値を選び、つぎにその最大値である数値を除いた中の最大値を求め…という方法(通称、馬鹿ソート)を使うこと。 # [ヒント]2個の配列変数(1つは元データ用、1つは並び替えたデータ用)を使うと容易 # 問題2 # 問題1について「降順」を「昇順」に変えたプログラムを作成せよ。 # 結果は5、7、8、9、12 '整数型配列に格納された5個の整数{8,5,12,7,9}を大きい数の順番(降順)に並べ替えて表示する'([],[]) :- !. '整数型配列に格納された5個の整数{8,5,12,7,9}を大きい数の順番(降順)に並べ替えて表示する'(L,[Max|R]) :- 最大値を削除(L,Max,_残りならび), '整数型配列に格納された5個の整数{8,5,12,7,9}を大きい数の順番(降順)に並べ替えて表示する'(_残りならび,R). 最大値を削除(L,_最大値,_残りならび) :- append(L0,[_最大値|R],L), すべてAより小さい(L0,_最大値), すべてAより小さい(R,_最大値), append(L0,R,_残りならび),!. 最大値を削除(L,_,L). すべてAより小さい([],_) :- !. すべてAより小さい([B|R],A) :- B =< A, すべてAより小さい(R,A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/654 # # キーボードにより配列へデータを入力させ, # その配列データの数値の平均を関数 mean() に # より計算させたい. # 以下の条件を満たしたプログラムを作成せよ. # ただし,関数 mean() は,引数なし,戻り値なしとする. # void mean(void) # { # } # 「ヒント」 # 1)本プログラムのどこかに、「double data[100];」を宣言しておく。 # 2)本プログラムのどこかに「double heikin;」と「int kosuu;」を宣言しておく。 # 3)main 関数内で,配列data[] へ入力したいデータの個数 kosuu をキーボード入力させる. # 4)main 関数内で,double型配列 data[]にキーボードで数値を入力させる. # 5)関数 mean() の内部で 配列 data[]の値の平均を計算させる. # 6)main 関数内で,関数 mean()で計算した結果をprintfで表示させる # */ # #include<stdio.h> # int main(void) # { # int i; # printf("データ個数(100個以下):"); # scanf("%d",&kosuu); # printf("平均値=%d\n",heikin); # return (0); # } # /* 平均値を計算する関数 */ # void mean(void) # { # } # これどうやるの? # %  % 先に変数リストの枠(_data)があって、一引数で処理していくことを試みたのだが、 % 後半、変数要素を表示させたくはないため、苦しい展開となった。 % _kosu分入力して、まだ_dataに変数要素の余りがある場合、そこで切り捨てる方がいいのだろう。 % そうすれば、変数が現れたら平均計算を終了するというような、尋常でない条件が必要なくなる。 % ただし、 % length(L0,_kosu),append(L0,_,_data), で表示には _data0 を使う必要がある。 % _kosuが100を越えていることもありうるからその点に注意して定義しなくてはならない。 data([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]). 'キーボードにより配列へデータを入力させ,その配列データの数値の平均を関数mean()により計算させる' :- 個数を入力する(_kosu), data(_data), キーボードにより配列へデータを入力させ'(_kosu,_data), 'その配列データの数値の平均を関数mean()により計算させる'(_kosu,_data,_平均), 入力されたデータならびと平均を表示する(_data,_平均). 個数を入力する(_kosu) :- write('個数を入力してください : '), get_line(Line), 個数入力診断(Line,_kosu),!. 個数を入力する(_kosu) :- 個数を入力する(_kosu). 個数入力診断(Line,_kosu) :- atom_to_term(Line,_kosu,_), integer(_kosu), _kosu > 0, _kosu =< 100,!. 個数入力診断(Line,_kosu) :- write_formatted('入力された %t からは適切な整数が得られませんでした。再入力をお願いします。\n',[Line]), fail. キーボードにより配列へデータを入力させ(0,_) :- !. キーボードにより配列へデータを入力させ(_,[]) :- !. キーボードにより配列へデータを入力させ(_kosu,[_データ要素|R]) :- データを入力する(_データ要素), _kosu1 is _kosu - 1, キーボードにより配列へデータを入力させ(_kosu1,R). mean(_data,_要素数,_平均) :- mean(_data,_要素数,0,_平均). mean([V|_],_要素数,Sum,_平均) :- var(V), _平均 is Sum / _要素数,!. mean([],_要素数,Sum,_平均) :- _平均 is Sum / _要素数,!. mean([V|R],_要素数,Sum1,_平均) :- Sum2 is Sum1 + V, mean(R,_要素数,Sum2,_平均). 入力されたデータならびと平均を表示する(_data,_平均) :- 変数要素が現れたら以下のならびを切り捨てる(_data,_data2), concat_atom(_data2,' ',_入力データ表示), write_formatted('入力された %t の平均は %t です\n',[_入力データ表示,_平均]). 変数要素が現れたら以下のならびを切り捨てる([],[]) :- !. 変数要素が現れたら以下のならびを切り捨てる([V|R1],[]) :- var(V),!. 変数要素が現れたら以下のならびを切り捨てる([A|R1],[A|R2]) :- \+(var(A)), 変数要素が現れたら以下のならびを切り捨てる(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/628 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク) # 問題1 10と20の和を、変数を使用して表示するプログラムを作成せよ。 '10と20の和を、変数を使用して表示する' :- lengh(L1,10), length(L2,20), 和(L1,L2,X), write_formatted('10と20の和は%tです\n',[X]). 和(L1,L2,X) :- append(L1,L2,L3), length(L3,X). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/585 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク):入力された"short型"変数を # 2進数で表示するプログラムを作って提出せよ。 # 入力された値までの2進数は全て表示すること # 下にサンプルを記しておく。 # input>5 # 0:0 # 1:1 # 2:10 # 3:11 # 4:100 # 5:101 # # '入力された"short型"変数を2進数で表示するプログラムを作って提出せよ。入力された値までの2進数は全て表示すること' :- 整数の入力(N), for(0,M,N), '2進数として表示'(M,_2進数表示), write_formatted('%t:%t\n',[M,_2進数表示), M = N. 整数の入力(N) :- write('整数を入力してください : '), get_line(Line), 整数入力の診断(Line,N),!. 整数の入力(N) :- 整数の入力(N). 整数入力の診断(Line,N) :- atom_to_term(Line,N,_), integer(N), N > 0,!. 整数入力の診断(Line,N) :- write_formatted('入力された %t から適切な整数を得られませんでした\n再入力をお願いします\n',[Line]), fail. '2進数として表示'(N,_2進数表示) :- '10進数から反転したビットならびを得る'(N,_反転したビットならび), reverse(_反転したビットならび,_ビットならび), concat_atom(_ビットならび,_2進数表示). '10進数から反転したビットならびを得る'(0,[]) :- !. '10進数から反転したビットならびを得る'(N,[M|R]) :- M is N mod 2, N2 is N // 2, '10進数から反転したビットならびを得る'(N2,R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/480 # # [1] 授業単元:プログラミング2 # [2] 問題文(含コード&リンク): # (1)文字列を入力してその文字列のデータサイズを求めて表示させるプログラムを作成せよ。 #  実行例: #    >入力文字列は? 大阪府 #    >文字列"大阪府"のデータサイズは 7byte # # # ヒント: # 入力文字列を一時保存するための入力バッファchar buf[256];を用意する # 文字列の大きさは関数strlenで求めることができる。string.hをインクルード # 文字列は最後にnull文字'\0'が入っており、strlenで求めた大きさにはnull文字は含まれないので注意すること。 # # (2)char*型配列 char *ps[10];を用意する。 # キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。 # ただし、文字列は動的確保を用いて文字列の大きさ分だけを確保し、余分なメモリをしようしないようにせよ。 # すべての文字列を入力し終わったら、ps[]に格納された文字列を順にディスプレイに表示させよ。 # # ヒント: # 最初にps[]の初期化としてps[]の各要素にNULLを代入しておく。 # 配列の動的確保も変数と同様に配列データの大きさ分(byte)をmallocで確保すればよい。 # プログラムの最後で、ps[]の各要素に対して、動的確保したメモリを開放するのを忘れないこと。 # # 文字列を入力してその文字列のデータサイズを求めて表示させる :- write('入力文字列は? '), get_line(Line), atom_codes(Line,Codes), findsum(Code_size,( append(_,[Code|_],Codes), Code_size is (Code // 32768) + 1), _データサイズ), write_formatted('入力文字列のデータサイズは%tです\n',[_データサイズ]). 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。' :- length(L1,10), 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'(L1,_ps), put_lines(_ps). 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'([],[]) :- !. 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'([_|R1],[_行|R2]) :- get_line(_行), 'キーボードから10個の文字列を入力し、入力された文字列を配列ps[]に格納せよ。'(R1,R2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/455 # # [1]授業単元 情報処理 # [2]問題文 大きさを入力して、半角文字*を使い、Xを描く。大きさは # Xの縦と横の半角文字数である。 # [3]環境 # [3-1]os: windows7 # [3-2]コンパイラ名とバージョン:visualstdio2008 # [3-3]C言語 # [4]期限 2010/10/22 # [5]繰り返し文までしか習っていません。 # if文とfor文で書くこととのことです。おねがいいたします。さっぱりわかりません。 # '大きさを入力して、半角文字*を使い、Xを描く。大きさはXの縦と横の半角文字数である。' :- '3以上の奇数を得る'(_大きさ), for(1,N,_大きさ), 一行描く(N,_大きさ), N = _大きさ. '3以上の奇数を得る'(_大きさ) :- write('大きさを3以上の奇数で入力してください : '), get_line(Line), 診断(Line,_大きさ),!. '3以上の奇数を得る'(_大きさ) :- '3以上の奇数を得る'(_大きさ). 診断(Line,_大きさ) :- atom_to_term(Line,_大きさ,_), integer(_大きさ), 大きさ>=3, 奇数(_大きさ),!. 診断(Line,_大きさ) :- write_formatted('入力された %t からは3以上の奇数は得られませんでした。再入力をお願いします。\n'), fail. 一行描く(N,_大きさ) :- 一行分の枠を作る(_大きさ,L), M is _大きさ - N + 1, list_nth(N,L,'*'), list_nth(M,L,'*'), 変数をスペースで埋める(L), concat_atom(L,S), write_formatted('%t\n',[S]),!. 一行分の枠を作る(_大きさ,L) :- length(L,_大きさ). 変数をスペースで埋める([]) :- !. 変数をスペースで埋める([V|R]) :- var(V), V = ' ', 変数をスペースで埋める(R),!. 変数をスペースで埋める([A|R]) :- \+(var(V)), 変数をスペースで埋める(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124 # # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 全社員が売上を記録した日を求めよ(_日) :- count(社員(_社員),_社員人数), findsetof(_日,売上(_社員,_日,_データ),L1), append(_,[_日|R],L1), findsetof(_社員,社員(_社員,_日,_データ),L2), length(L2,_社員人数). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), 加算(_値ならび,_合計値),!. findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). 加算(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). 加算_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). 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). ならび加算([],L,L) :- !. ならび加算(L,[],L) :- !. ならび加算([A|R],[B|R1],[C|R2]) :- C is A + B, ならび加算(R,R1,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/228 # # 【質問テンプレ】 # [1] 授業単元: # [2] 問題文(含コード&リンク): # # 角度thetaを媒介変数として,(x,y)を計算してください. # thetaは0度から360度まで変化させた場合の(x,y)を出力せよ。 # # x=acosθ  # y=bsin(θ+α) # # ともうひとつ。 # # 「個体群動態で N(t+dt) - N(t) = (r - hN(t)) N(t) として,rを増 殖率,hをこみあいの効果とする。 # 適当な,N(0) r, h を与えて, N(t) の変化を示しなさい。 # '「個体群動態で N(t+dt) - N(t) = (r - hN(t)) N(t) として,rを増殖率,hをこみあいの効果とする。適当な,N(0) r, h を与えて,N(t) の変化を示しなさい。' :- '適当なN(0),r,h,tmax'(_N_0,_r,_h,_tmax), 'N(t) の変化'(_N,0,_tmax,_r,_h,X), write_formatted('(t:%t) : (N(t):%t)\n',[_N,X]), 'N(t) の変化'(_N,_t1,_tmax,_r,_h,_N) :- _t1 < _tmax. 'N(t) の変化'(_N1,_t1,_tmax,_r,_h,X) :- _t1 < tmax, _N2 is _N1 + ((_r - _h * _N1) * _N1), _t2 is _t1 + 1, 'N(t) の変化'(_N2,_t2,_tmax,_r,_h,X). '適当なN(0),r,h,tmax'(_N_0,_r,_h,_tmax) :- write('N(0)の値を入力してください : '), 数値入力(_N_0), write('増殖率 _r を入力してください : '), 数値入力(_r), write('こみあいの効果 _h を入力してください : '), 数値入力(_h), write('時間 _t の max値 を入力したください : '), 数値入力(_tmax),!. 数値入力(I) :- get_line(Line), 数値入力診断(Line,I),!. 数値入力(I) :- 数値入力(I). 数値入力診断(Line,I) :- atom_to_term(Line,I,_),number(I),!. 数値入力診断(Line,I) :- write_formatted('入力された %t から適切な数が得られませんでした\n再入力をお願いします\n',[Line]),fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/228 # # 【質問テンプレ】 # [1] 授業単元: # [2] 問題文(含コード&リンク): # # 角度thetaを媒介変数として,(x,y)を計算してください. # thetaは0度から360度まで変化させた場合の(x,y)を出力せよ。 # # x=acosθ  # y=bsin(θ+α) # # ともうひとつ。 # # 「個体群動態で N(t+dt) - N(t) = (r - hN(t)) N(t) として,rを増 殖率,hをこみあいの効果とする。 # 適当な,N(0) r, h を与えて, N(t) の変化を示しなさい。 # '角度thetaを媒介変数として,(x,y)を計算してください.thetaは0度から360度まで変化させた場合の(x,y)を出力せよ。' :- append(_,[A|R1],[0.0,0.2,0.4,0.6,0.8,1.0]), append(_,[B|R2],[0.0,0.2,0.4,0.6,0.8,1.0]), append(_,[_alpha|R3],[0.0,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0]), for(0,_theta角度,360), _ラジアン角 is pi * _theta角度 / 180, X = A * cos(_ラジアン角), Y = B * sin(_ラジアン角 + _alpha), write_formatted('A=%t,B=%t,_alpha=%tの時,_theta角度=%t,X = %t,Y = %t\n',[A,B,_alpha,_theta角度,X,Y]), _theta角度 = 360, write('\n'), R3 = [], R2 = [], R1 = [],!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/269 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):int main(void) # #               { # #             char word[101],boin[5]={'a','i','u','e','o'}; #            int i,count[5]; # #            printf("アルファベットで文字列を入力してください>>>"); #            scanf("%s",word); # #            count[0]=0,count[1]=0,count[2]=0,count[3]=0,count[4]=0; # #            for(i=0; word[i]!='\0'; i++) # #         { #          if(word[i]==boin[0]) {count[0]++;} if(word[i]==boin[1]) {count[1]++;} #             if(word[i]==boin[2]) {count[2]++;} if(word[i]==boin[3]) {count[3]++;} if(word[i]==boin[4]) {count[4]++;} # } # # printf(" a>>>%d\n i>>>%d\n u>>%d\n e>>>%d\n o>>>%d\n",count[0],count[1],count[2],count[3],count[4]); # # return 0; # # } # アルファベット文字列の中から母音をカウントするプログラムなのですが、現在ソース中の配列は # 定数によって値が参照されています。これをboin[i] count[j]のように変数で値を参照するものに書き換えてください。 # [3]環境:linux コンパイラ:gcc  C言語 # [4] 期限:2010年10月19日10:00まで # [5] その他の制限:変数で配列要素の値を参照するときfor文と組み合わせること。 # どうか、よろしくお願いします # 母音([a,i,u,e,o]). アルファベット文字列の中から母音をカウントする(_アルファベット文字列,_母音の数) :- 母音(_母音ならび), findall(_,( sub_atom(_アルファベット文字列,_,1,_,_文字), member(_文字,_母音ならび)), L), length(L,_母音の数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/508 # # http://www.dotup.org/uploda/www.dotup.org1202425.jpg # # ItemTable # ItemID,ItemName,Price,Maker # -------------------------------------- # '0001','Red bollpen',150,'Four Diamond' # '0002','Sharp pen',250,'Four Diamond' # '0003','Metal ruler',200,'Pantel' # '0004','Eraser',100,'Four Diamond' # '0005','Pencil box',150,'Pantel' # # 対応するPrologコードを書きなさい。 # % テーブル構造(関係名,_属性番号,_属性名,_属性名の変数文字列表現). テーブル構造('ItemTable',1,'ItemID','ItemID'). テーブル構造('ItemTable',2,'ItemName','ItemName'). テーブル構造('ItemTable',3,'Price','Price'). テーブル構造('ItemTable',4,'Maker','Maker'). 'ItemTable'('0001','Red bollpen',150,'Four Diamond'). 'ItemTable'('0002','Sharp pen',250,'Four Diamond'). 'ItemTable'('0003','Metal ruler',200,'Pantel'). 'ItemTable'('0004','Eraser',100,'Four Diamond'). 'ItemTable'('0005','Pencil box',150,'Pantel'). # Q1. # SELECT MIN(Price) AS Result FROM ItemTable; 'Q1'(Result) :- findmin(Price,'ItemTable'(_,_,Price,_),MIN_Price). # Q2. # SELECT ItemName,Price FROM ItemTable WHERE Price >= 250; 'Q2'(ItemName,Price) :- 'ItemTable'(_,ItemName,Price,_), Price >= 250. # Q3. # SELECT MAX(Price) FROM ItemTable WHERE Maker = 'Pantel'; 'Q3'(MAX_Price) :- findmax(Price,'ItemTable'(_,_,Price,_),MAX_Price). # Q4. # SELECT MIN(Price) FROM ItemTable WHERE Price > (SELECT MIN(Price) FROM ItemTable); 'Q4'(Min_Price) :- findmin(Price,'ItemTable'(_,_,Price,_),MIN_Price1), findmin(Price,( 'ItemTable'(_,_,Price,_),Price > MIN_Price1)), MIN_Price). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/948 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # ビット演算子 # データ出力用変数dを用いてループさせ、 # int型整数において、キーボードから数値を入力して下位からi番目のビットを1にセットする。 # # 条件は、 # 値が0→break # 値が正→対応するビットをON(1〜8) # 値が負→対応するビットをOFF # (値が大きすぎたらエラーにする) # # 'データ出力用変数dを用いてループさせ、int型整数において、キーボードから数値を入力して下位からi番目のビットを1にセットする。'(_d) :- 整数を得る(_値), 対応するビットのON・OFF(_値,_d,_ビットにセットされたd表示), write_formatted('%t\n',[_ビットにセットされたd表示]),!. 対応するビットのON・OFF(0,_,_) :- !,fail. 対応するビットのON・OFF(_値,_,_) :- _値 > 8,!,fail. 対応するビットのON・OFF(_値,_d,_ビットにセットされたd表示) :- 値が正(_値), 対応するビットをON(_値,_d,_ビットにセットされたd表示). 対応するビットのON・OFF(_値,_d,_ビットにセットされたd表示) :- 値が負(_値), 対応するビットをOFF(_値,_d,_ビットにセットされたd表示). 値が正(_値) :- _値 > 0. 値が負(_値) :- _値 < 0. 対応するビットをON(_値,_d,_ビットにセットされたd表示) :- 二進数(_d,L), _値_1 is _値 - 1, length(R,_値_1), append(L0,[_|R],L), append(L0,[1|R],L2), concat_atom(L2,_ビットにセットされたd表示). 対応するビットをOFF(_値,_d,_ビットにセットされたd表示) :- 二進数(_d,L), _値_1 is _値 - 1, length(R,_値_1), append(L0,[_|R],L), append(L0,[0|R],L2), concat_atom(L2,_ビットにセットされたd表示). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/921 # # 質問にきましたお邪魔します。 # [1] Cプログラミング # [2] 問題文(含コード&リンク): 数問あるのでリンクからお願いします。 # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10941.txt # # # 問2.  キーボードから実数を1つ入力。10倍した数の整数部だけをint型の変数に代入して表示するプログラム。 # //int型の変数に〜というのがよくわからなかったです # 'キーボードから実数を1つ入力。10倍した数の整数部だけをint型の変数に代入して表示する' :- 実数を得る(_実数), _10倍した数の整数部 is truncate(_実数 * 10), write_formatted('10倍した数の整数部は %t です\n',[_10倍した数の整数部]). 実数を得る(N) :- write('実数を入力してください : '), get_line(Line), 実数を得るための診断(Line,V),!. 実数を得る(V) :- 実数を得る(V). 実数を得るための診断(Line,V) :- atom_to_term(Line,V,_), float(N),!. 実数を得るための診断(Line,N) :- write_formatted('%t からは実数を得ることができません\n再入力をお願いします\n',[Line]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/451 # # 【 課題 】ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/1040.zip # 【 形態 】Javaアプリケーション(main()で開始)/ # 【 期限 】10/15 # 【 Ver  】"1.6.0_21" # 【 補足 】丸投げですがよろしくお願いします。 # # [問3] # [ファイル名] Lesson1_3.java # Lesson1_2 で作成したTrumpCard を拡張します.トランプでゲームを行う場合,そのカードが表を向いているか裏を向いているかという要素は重要なので,それを表現できるようにします. # この場合の表とはマークや数値が表示されている側,裏はその逆で絵柄が付いている側を指すこととします.サンプルプログラムが動作するように,以下の実装を付け加えなさい. # 1. クラスTrumpCard は,インスタンス変数として,boolean openStat を持ちます.そのインスタンスが表の場合はtrue,裏の場合はfalse の値を持つものとします. # 2. クラスTrumpCard は,コンストラクタTrumpCard(String mark, int number, booleanopen)を持ちます.open によって,インスタンスの初期状態での表裏の値(openStat の値)を決めることができるものとします.また,指定されない場合の初期値はfalse(裏向き)とします. # 3. クラスTrumpCard は,メソッドとしてpublic void setOpened(boolean open)を持ちます.このメソッドが呼ばれた場合そのインスタンスが持つopenStat の値をopen の値に置き換えます. # 4. クラスTrumpCard は,メソッドとしてpublic boolean getOpened()を持ちます.このメソッドが呼ばれた場合そのインスタンスが持つopenStat の値を返り値として返します. # トランプのカード初期状態(_マーク,_数字,_トランプ_前状態,_トランプ_後状態) :- 0 is random mod 2, append(L0,[[_マーク,_数字,_,_位置]|R],_トランプ_前状態), append(L0,[[_マーク,_数字,表,_位置]|R],_トランプ_後状態). トランプのカード初期状態(_マーク,_数字,_トランプ_前状態,_トランプ_後状態) :- 1 is random mod 2, append(L0,[[_マーク,_数字,_,_位置]|R],_トランプ_前状態), append(L0,[[_マーク,_数字,裏,_位置]|R],_トランプ_後状態). 表にする(_マーク,_数字,_トランプ_前状態,_トランプ_後状態) :- append(L0,[[_マーク,_数字,_,_位置]|R],_トランプ_前状態), append(L0,[[_マーク,_数字,表,_位置]|R],_トランプ_後状態). 裏にする(_マーク,_数字,_トランプ_前状態,_トランプ_後状態) :- append(L0,[[_マーク,_数字,_,_位置]|R],_トランプ_前状態), append(L0,[[_マーク,_数字,裏,_位置]|R],_トランプ_後状態). 表である(_マーク,_数字,_トランプ) :- append(L0,[[_マーク,_数字,表,_]|R],_トランプ),!. 裏である(_マーク,_数字,_トランプ) :- append(L0,[[_マーク,_数字,裏,_]|R],_トランプ),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/534 # # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): 1×8の配列のうち、3番目だけに1を入れて、その他を0にするプログラムを作る。 # '1×8の配列のうち、3番目だけに1を入れて、その他を0にする'(_配列) :- lenth(_配列,8), list_nth(3,_配列,[1]), ならび全ての変数と特定値を単一化(_配列,[0]). ならびの全ての変数と特定値を単一化([],_) :- !. ならびの全ての変数と特定値を単一化([_値|R],_値) :- ならびの全ての変数と特定値を単一化(R,_値),!. ならびの全ての変数と特定値を単一化([A|R],_値) :- ならびの全ての変数と特定値を単一化(R,_値),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/506 # # [1] 授業単元:プログラム総合 # [2] 問題文(含コード&リンク) # 並列に接続した3つの抵抗の合成抵抗を求める。さらに、その両端に電圧V0を印加されたときに流れる電流を2通り # (全体に流れる電流、3つの抵抗それぞれに流れる電流)求めるプログラムを作れ # また変数は実数型とすること # 並列に接続した3つの抵抗の合成抵抗を求める(_抵抗1,_抵抗2,_抵抗3,_合成抵抗) :- _抵抗1 =< 10000,_抵抗2 =< 10000,_抵抗3 =< 10000, _合成抵抗 is (_抵抗1 * _抵抗2 * _抵抗3) / (_抵抗1 * _抵抗2 + _抵抗2 * _抵抗3 + _抵抗1 * _抵抗3),!. 並列に接続した3つの抵抗の合成抵抗を求める(_抵抗1,_抵抗2,_抵抗3,_合成抵抗) :- \+((_抵抗1 < 10000,_抵抗2 < 10000,_抵抗3 < 10000)), _合成抵抗 is 1 / ( 1 / _抵抗1 + 1 / _抵抗2 + 1 / _抵抗3). 'その両端に電圧V0を印加されたときに流れる電流を2通り(全体に流れる電流、3つの抵抗それぞれに流れる電流)求める'(_電圧,_抵抗1,_抵抗2,_抵抗3,_全体に流れる電流,_電流1,_電流2,_電流3) :- 並列に接続した3つの抵抗の合成抵抗を求める(_抵抗1,_抵抗2,_抵抗3,_合成抵抗), _全体に流れる電流 is _電圧 / _合成抵抗, _電流1 is _全体に流れる電流 * _抵抗2 * _抵抗3 / (_抵抗1 * _抵抗2 *_抵抗3), _電流2 is _全体に流れる電流 * _抵抗1 * _抵抗3 / (_抵抗1 * _抵抗2 *_抵抗3), _電流3 is _全体に流れる電流 * _抵抗1 * _抵抗2 / (_抵抗1 * _抵抗2 *_抵抗3). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/499 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク) # 実数の変数を小数点第一位で四捨五入しなさい。 # # 実数の変数を小数点第一位で四捨五入する(0.0,0.0) :- !. 実数の変数を小数点第一位で四捨五入する(_実数の変数,_小数点第一位で四捨五入された実数の変数) :- _実数の変数 > 0.0, _小数点第一位で四捨五入された実数の変数 is 1.0 * floor(_実数の変数 + 0.5). 実数の変数を小数点第一位で四捨五入する(_実数の変数,_小数点第一位で四捨五入された実数の変数) :- _実数の変数 < 0.0, _小数点第一位で四捨五入された実数の変数 is 1.0 * ceiling(_実数の変数 - 0.5). % 以下のサイトは # 出典 :: C言語の宿題片付けます 139代目 #160 # [1]プログラミング演習 # [2]ttp://www.comm.info.eng.osaka-cu.ac.jp/~sugi/C_lang2/C6.htmlの # [問題6-2]はこのページの本文の指示通りにやるとどうなるのでしょうか? # [3.1]Linux環境 # [3.2] gcc # [3.3]C言語 # [3.4]今日の午後9時 # # よろしくお願いします # # # [ 問題6‐2 ] # 上の問題で定義した TIME型の構造体変数2個を引数として,両者の和を TIME型の値として返す関数 time_add() を作成しなさい.ただし,この関数の第一行を次のように定めます. # TIME time_add(TIME t1, TIME t2) # 次に,「時間の長さ」(日数,時,分の組)を繰り返しキーボードから読み込み,読み込むたびに # それまでの「時間の長さ」の総和を出力するプログラムを,関数 time_add() を引用して作成しなさい. # なお,最後に負の数を入力すれば実行を停止するようにすること.このプログラムの動作は,例えば # 次のようになります. # > a.out # (day, hour, minute)? 3 12 44 # sum = 3 12 44 # (day, hour, minute)? 1 22 54 # sum = 5 11 38 # (day, hour, minute)? 8 21 0 # sum = 14 8 38 # (day, hour, minute)? -1 -1 -1 ( ← 負の数を入力すれば停止) # > # (ヒント)各メンバーどうしの和をとり,その結果が上記の値の範囲を超える場合は「繰り上がり」の # 処理が必要になります.ただし繰り上がる値は1か0しかないので,if文などを用いて比較的簡単に # 書くことができます.繰り返しの部分は,例えば while(1){...} の無限ループを作り,負の数が # 入力されたら break; でループから出るなどの方法が考えられます. 入力された時間の総和を計算する(_累計日,_累計時,_累計分) :- 日・時・分の入力(_日,_時,_分), 入力された時間の総和を計算する(_日,_時,_分,0,0,0,_累計日,_累計時,_累計分). 入力された時間の総和を計算する(_日,_時,_分,_累計日,_累計時,_累計分,_累計日,_累計時,_累計分) :- 負数が入力されたら終了します(_日,_時,_分),!. 入力された時間の総和を計算する(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日,_累計時,_累計分) :- 日・時・分の加算(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日2,_累計時2,_累計分2), 日・時・分の入力(_日2,_時2,_分2), 入力された時間の総和を計算する(_日2,_時2,_分2,_累計日2,_累計時2,_累計分2,_累計日,_累計時,_累計分). 日・時・分の加算(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日2,_累計時2,_累計分2) :- _累計時1 >= 24, _累計時2 is _累計時1 - 24, _累計日2 is _累計日1 + 1, 日・時・分の加算(_日,_時,_分,_累計日2,_累計時2,_累計分1,_累計日2,_累計時2,_累計分2). 日・時・分の加算(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日,_累計時,_累計分) :- _累計分1 >= 60, _累計分2 is _累計分1 - 60, _累計時2 is _累計時1 + 1, 日・時・分の加算(_日,_時,_分,_累計日1,_累計時2,_累計分2,_累計日,_累計時,_累計分). 日・時・分の加算(0,0,0,_累計日,_累計時,_累計分,_累計日,_累計時,_累計分) :- !. 日・時・分の加算(_日,_時,_分,_累計日1,_累計時1,_累計分1,_累計日,_累計時,_累計分) :- _累計日2 is _日 + _累計日1,   _累計時2 is _時 + _累計時1, _累計分2 is _分 + _累計分1, 日・時・分の加算(0,0,0,_累計日2,_累計時2,_累計分2,_累計日,_累計時,_累計分). 負数が入力されたら終了します(_日,_時,_分) :- _日 < 0,!. 負数が入力されたら終了します(_日,_時,_分) :- _時 < 0,!. 負数が入力されたら終了します(_日,_時,_分) :- _分 < 0,!. 日・時・分の入力(_日,_時,_分) :- write('時間を 日 時 分 の順に空白で区切って入力してください : '), get_split_line([' '],[_日,_時,_分]), 診断(_日,_時,_分),!. 日・時・分の入力(_日,_時,_分) :- 日・時・分の入力(_日,_時,_分). 診断(_日,_時,_分) :- integer(_日), _時 < 24, _分 < 60,!. 診断(_日,_時,_分) :- write_formatted('日=%t,時=%t,分=%t には誤りの部分があります\n',[_日,_時,_分]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/336 # # [1] 授業単元: 情報処理B # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10463.txt # # ★課題1★ # キーボードから(標準入力から)1つの十進数表現の正の整数を受け取って、 # その数が3の倍数かまたは各桁の数字のいづれかに3が入っている数ならば # 画面に(標準入力に)YES、そうでなければ、NOと出力せよ。与えられた条件を # 判定する部分はmain関数とは別の関数にしてmain関数から呼ぶこと。 # グローバル変数の使用は禁止。 'キーボードから(標準入力から)1つの十進数表現の正の整数を受け取って、その数が3の倍数かまたは各桁の数字のいづれかに3が入っている数ならば画面に(標準入力に)YES、そうでなければ、NOと出力せよ' :- 'キーボードから(標準入力から)1つの十進数表現の正の整数を受け取って'(_正の整数), 'その数が3の倍数かまたは各桁の数字のいづれかに3が入っている数ならば画面に(標準入力に)YES、そうでなければ、NOと出力せよ'(_正の整数). 'その数が3の倍数かまたは各桁の数字のいづれかに3が入っている数ならば画面に(標準入力に)YES、そうでなければ、NOと出力せよ'(_正の整数) :- 0 is _正の整数 // 3, write('YES\n'),!. 'その数が3の倍数かまたは各桁の数字のいづれかに3が入っている数ならば画面に(標準入力に)YES、そうでなければ、NOと出力せよ'(_正の整数) :- number_chars(_正の整数,L), append(_,[3|R],L), write('YES\n'),!. 'その数が3の倍数かまたは各桁の数字のいづれかに3が入っている数ならば画面に(標準入力に)YES、そうでなければ、NOと出力せよ'(_正の整数) :- write('NO\n'),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/786 # # 【質問テンプレ】 # [1]プログラム演習 # [2]標準入力から入力した自然数を変数iに格納し i<(2のj乗)となる最小の自然数j # を求める。ただし再帰関数を用いる。 # [3] Windows 7/Borland C++ 5.0/C言語 # [4] 3/1迄 # # 再帰関数がよくわからないので分かり易いサイトなどあれば教えてください。 # '標準入力から入力した自然数を変数iに格納し i<(2のj乗)となる最小の自然数jを求める'(_j) :- 自然数を入力する(_i), 'i < 2^jとなる最小の自然数j'(_i,_j). 'i < 2^jとなる最小の自然数j'(_i,_j) :- 'i < 2^jとなる最大のj'(_i,_j1), _j is _j1 + 1. 'i < 2^jとなる最大のj'(0,0) :- !. 'i < 2^jとなる最大のj'(1,0) :- !. 'i < 2^jとなる最大のj'(N,M) :- 偶数(N), N1 is N // 2, 'i < 2^jとなる最大のj'(N1,M1), M is M1 + 1,!. 'i < 2^jとなる最大のj'(N,M) :- 奇数(N), N1 is N - 1, 'i < 2^jとなる最大のj'(N1,M). 自然数を入力する(_i) :- write('0より大きい自然数を入力してください : '), get_integer(_i), 入力の診断(_i),!. 自然数を入力する(_i) :- 自然数を入力してください(_i). 入力の診断(_i) :- _i > 0,!. 入力の診断(_i) :- write_formatted('%tは適切な自然数ではありません。再入力が必要です。\n',[_i]), fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/483 # # [1] C言語プログラミング初歩(専門学校) # [2] int型の配列変数A[64][32]をB[32][64]に代入する. # 次の対応があるようにすること # A[0][0] -> A[0][1] -> A[0][31] ->A[1][0] ->....->A[63][31] # B[0][0] -> B[0][1]-> B[0][31] -> B[0][32]->....->B[31][63] # (上の段と下の段が一致) # A[m][n]には値 (m+n) % 31が入っているものとする。 # [3] Windows Vista /Visual studio 2008/C言語 # [4] 2/15迄 # [5] 1月開講です。ポインタはまだ習ってません # ならびの構造変換(_変換対象ならび,_変換後ならびの列数,_変換後ならび) :- 最上位構造のみ平滑化(_変換対象ならび,_平滑化されたならび), length(L,_変換後ならびの列数), findall(L,append(L,_,_平滑化されたならび),_変換後ならび). 最上位構造のみ平滑化([],[]) :- !. 最上位構造のみ平滑化([L1|R1],L) :- 最上位構造のみ平滑化(R1,L2), append(L1,L2,L),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/619 # # [1] 授業単元:Cプログラミング演習 # [2] 問題文(含コード&リンク): # 問題1. 10進数1234を2進数で表示するプログラムを作成せよ。 # 問題2. 変数の下位16ビット中の1のビット数を数える # '10進数1234を2進数で表示する' :- write('0b'), '10進数1234を2進数で表示する'(1234,[],L), append(_,[A|R],L), write_formatted('%t\n',[A]), R = []. '10進数1234を2進数で表示する'(_,L,L) :- !. '10進数1234を2進数で表示する'(N,L1,L) :- M is N mod 2, N1 is N // 2, '10進数1234を2進数で表示する'(N1,[M|L1],L). 変数の下位16ビット中の1のビット数を数える(_変数,_頻度) :- integer(_変数), M is _変数 mod 65536, 整数の下位16ビット中の1のビット数を数える(M,_頻度). 変数の下位16ビット中の1のビット数を数える(_変数,_頻度) :- atom(_変数), atom_codes(_変数,Codes), 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度). 整数の下位16ビット中の1のビット数を数える(0,0) :- !. 整数の下位16ビット中の1のビット数を数える(N,X) :- 0 is N mod 2, N1 is N // 2, 整数の下位16ビット中の1のビット数を数える(N1,X). 整数の下位16ビット中の1のビット数を数える(N,X) :- 1 is N mod 2, N1 is N // 2, 整数の下位16ビット中の1のビット数を数える(N1,Y), X is Y + 1. 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度) :- last(Codes,Code), Code >= 256, 整数の下位16ビット中の1のビット数を数える(N,_頻度),!. 'Codesの下位16ビット中の1のビット数を数える'(Codes,_頻度) :- last(Codes,Code), Code < 256, append(_,[A,B],Codes), N is (A * 256 + B) mod 65536, 整数の下位16ビット中の1のビット数を数える(N,_頻度),!. 'Codesの下位16ビット中の1のビット数を数える'([Code],_頻度) :- 整数の下位16ビット中の1のビット数を数える(Code,_頻度),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/421 # # [1] 授業単元: プログラム言語 # [2] 問題文(含コード&リンク): # 10 人の成績を入力し,その順位を成績と共に表示したい。以下の考え方に基づいた # プログラムを作成せよ。 # 1 ? # 2次元配列s[10][2] を用意する。 # 2 ? # i=0〜9 のfor 文を用いてs[i][0] に成績を入力する。 # 3 ? # s[0][0] とs[j][0],j=0〜9 を比較し,s[0][0] より大きい数値の個数n を数え #  る。その個数+1 が成績順位になるので,s[0][1] にn+1 を代入する。 # 4 ? # 同様の操作をs[i][0],i=0〜9 に対して行なえば,その成績順位がs[i][1] とし #  て求められるので,あとは成績と共に表示すればよい。 # # '10 人の成績を入力し,その順位を成績と共に表示する' :- '要素数10の変数ならびを二本用意する'(L1,L2), 'L1に成績を入力する'(L1), 'L1の先頭から順位を対応するL2の位置にセット'(1,10,L1,L2), 二本のならびを順に表示(L1,L2). '要素数10の変数ならびを二本用意する'(L1,L2) :- length(L1,10),length(L2,10). 'L1に成績を入力する'(L1) :- for(1,N,10),get_integer(_点数),list_nth(N,L1,_点数),N=10,!. 'L1の先頭から順位を対応するL2の位置にセット'(N,M,L1,L2) :- N > M,!. 'L1の先頭から順位を対応するL2の位置にセット'(N,M,L1,L2) :- list_nth(N,L1,_点数),list_nth(N,L2,_順位), count((member(_点数1,L1),_点数1 > _点数),_成績上位者数),_順位 is _成績上位者数 + 1, N2 is N + 1, 'L1の先頭から順位を対応するL2の位置にセット'(N2,M,L1,L2). 二本のならびを順に表示(L1,L2) :- for(1,N,10), list_nth(N,L1,A),list_nth(N,L2,B), write_formatted('%t,%t位\n',[A,B]), N=10. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1266565626/675 # # ../test/read.cgi/tech/1266565626/673 # ・とあるディレクトリd0以下に存在する全てのディレクトリをなぞる。 # # ・このとき、今位置するディレクトリdnの相対的な深さをdとして、 #  d個のピリオドをディレクトリdnの名前の前に足した文字列> をファイルFに出力する。 # # ・また、このとき、今位置するディレクトリdnにテキストファイルがあれば、 #  d+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列 をファイルFに出力する。 # ・さらに、そのテキストファイルtnの内容をそのままファイルFに出力する。 #  テキストファイルtnの内容の各行頭には、ピリオドはつけない。 #  テキストファイルtnの内容のとある行頭にピリオドがある場合は、ピリオドの前に半角空白を入れる。 # # このような仕様です # # # ../test/read.cgi/tech/1266565626/674 # ありがとうございます # # まったくの期待通りですが、 # ピリオドの数が合わない部分がありました # # 下のようなディレクトリで試しました # ttp://www1.axfc.net/uploader/Sc/so/128829.zip # ウイルスチェックはしましたが、念のためもう一度お願いします # 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_出力ファイル,_階層_1,_とあるディレクトリ) :- ディレクトリ配下の情報を得る(_とあるディレクトリ,_ファイルディレクトリ情報ならび), このディレクトリ配下のファイルを順に表示する(_出力ファイル,_階層_1,_とあるディレクトリ,_ファイルディレクトリ情報ならび), 配下のディレクトリを取り出す(_とあるディレクトリ,_フィルディレクトリ情報ならび,_階層_1,_階層_2,_デレクトリ_2), 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_出力ファイル,_階層_2,_ディレクトリ_2). 'とあるディレクトリd0以下に存在する全てのディレクトリをなぞる'(_,_,_). ディレクトリ配下の情報を得る(_とあるディレクトリ,_ファイルディレクトリ情報ならび) :- atomic_list_concat(['ls -l ',_とあるディレクトリ],S), sh(S,_ファイルディレクトリ情報ならび). このディレクトリ配下のファイルを順に表示する(_出力ファイル,_階層_1,_ディレクトリ,_ファイルディレクトリ情報ならび) :- 配下のファイルを取り出す(_ファイルディレクトリ情報ならび,_テキストファイル,_入力ファイル), テキストファイルtnの内容をそのままファイルFに出力する(_階層_1,_入力ファイル,_テキストファイル,_出力ファイル), fail. このディレクトリ配下のファイルを順に表示する(_,_,_,_). 配下のファイルを取り出す(_ファイルディレクトリ情報ならび,_テキストファイル,_入力ファイル) :- append(_,[[A|R1]|R],_ファイルディレクトリ情報ならび), sub_atom(A,0,1,_,'-'), last(R1,_テキストファイル), atomic_list_concat([_ディレクトリ,'/',_テキストファイル],__入力ファイル). 配下のディレクトリを取り出す(_とあるディレクトリ,_フィルディレクトリ情報ならび,_階層_1,_階層_2,_デレクトリ_2) :- append(_,[[A|R1]|R],L), sub_atom(A,0,1,_,d), last(R1,_ディレクトリ), atomic_list_concat([_とあるディレクトリ,'/',_ディレクトリ],_ディレクトリ_2), _階層_2 is _階層_1 + 1. '今位置するディレクトリdnの相対的な深さをdとして、d個のピリオドをディレクトリdnの名前の前に足した文字列'(_相対位置,_今位置するディレクトリ,_ピリオドを名前の前に足した文字列) :- n個の同じ文字で構成される文字列(_相対位置,'.',S), atomic_list_concat([S,_今位置するディレクトリ],_ピリオドを名前の前に足した文字列). テキストファイルtnの内容をそのままファイルFに出力する(_階層,_入力ファイル,_テキストファイル,_出力ファイル) :- 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列を出力ファイルの先頭に書く'(_階層,_テキストファイル,_出力ファイル,Output), open(_入力ファイル,read,Input), get_char(Input,C), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C). 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列を出力ファイルの先頭に書く'(_階層,_テキストファイル,_出力ファイル,Output) :- open(_出力ファイル,write,Output), 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列'(_階層,_テキストファイル,_文字列), write_formatted(Output,'%t\n',[_文字列]). 'd+1個のピリオドをテキストファイルtnの名前の前に足し、拡張子.txtを除いた文字列'(_d,_テキストファイル,_文字列) :- _d_1 is _d + 1, n個の同じ文字で構成される文字列(_d_1,'.',_ピリオド文字列), atomic_list_concat([_ピリオド文字列,_テキストファイル],_ファイル_1), sub_atom(_ファイル_1,_開始点_1,4,0,'.txt'), sub_atom(_ファイル_1,0,_開始点_1,_,_文字列),!. テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,end_of_file) :- 'Input,Outputの終了'(Input,Output). テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,'\n') :- 改行処理(Input,Output,C2), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C2). テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C) :- 改行以外の処理(Input,Output,C,C2), テキストファイルtnの内容をそのままファイルFに出力する(Input,Output,C2). 'Input,Outputの終了'(Input,Output) :- close(Input), close(Output). 改行処理(Input,Output,C2) :- put_char(Output,'\n'), get_char(Input,C2), 行頭の特殊事情(Output,C2). 行頭の特殊事情(Output,'.') :- put_char(Output,' '),!. 行頭の特殊事情(_,_) :- !. 改行以外の処理(Input,Output,C,C2) :- put_char(Output,C), get_char(Input,C2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 全て同じ文字で構成される文字列(_文字列) :- atom_chars(_文字列,Chars), all(Chars,_). n個の同じ文字で構成される文字列(N,_文字,_文字列) :- 'Nが変数ではない時'(N,_文字,_文字列). n個の同じ文字で構成される文字列(N,_文字,_文字列) :- 'Nが変数の時'(N,_文字,_文字列). 'Nが変数ではない時'(N,_文字,_文字列) :- \+(var(N)), length(Chars,N), all(Chars,_文字), atom_chars(_文字列,Chars),!. 'Nが変数の時'(N,_文字,_文字列) :- var(N), atom_chars(_文字列,Chars), length(Chars,N), all(Chars,_文字). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/357 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10767.txt # # 登録番号(int no)と名前(char *name)と年齢(int age)を含む構造体person型のポインタ変数を宣言し, # 登録人数分だけの動的メモリ確保をせよ. そして, データをファイルから入力せよ. (malloc関数を使用すること) # ファイルの形式は, 先頭に登録する人数とし, そのあとに人数分のデータを登録番号, 名前, 年齢の順に書いていく # (下の例を参照. 登録番号は入力順に1,2,3,4,5, …とする. そして, 入力した全員データを表示せよ. # # (ファイルの例) # 3 # 1 田中 20 # 2 大田 40 # 3 井上 35 % Prolog データファイルを作ることも問題のうちなのかな。例によってポインター云々は無視。 ファイル作成(_ファイル名) :- write('作成するデータ数を入力してください : '), get_integer(N), tell(_ファイル名), for(1,M,N), write('名前と年齢をカンマまたはスペース区切りで入力してください : '), get_split_line([',',' '],[_名前,_年齢]), write_formatted(人物('%q,%q,%q).\n',[N,_名前,_年齢]), M = N, told. ファイルから読み取ったデータを登録する(_ファイル名) :- consult(_ファイル名). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ファイル作成(_ファイル名) :- write('作成するデータ数を入力してください : '), get_integer(N), tell(_ファイル名), write_formatted('%t\n',[N]), for(1,M,N), write('名前と年齢をカンマまたはスペース区切りで入力してください : '), get_split_line([',',' '],[_名前,_年齢]), write_formatted('%t %t %t\n',[N,_名前,_年齢]), M = N, told. ファイルから読み取ったデータを登録する(_ファイル名) :- get_split_lines(_ファイル名,[' '],LL), LL = [_|LL2], 'この場合、要素数(構造体の数)はいらないから', append(_,[[_登録番号,_名前,_年齢]|R],LL2), assertz(人物(_登録番号,_名前,_年齢)), R = []. 'この場合、要素数(構造体の数)はいらないから'. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/861 # # [1] 授業単元:ファイル操作、2分探索法 # [2] 問題文:学生の身長、体重のデータを読み込みある学籍番号を入力した # ときにその学生の学籍番号、身長、体重を2分探索法により求め、出力しなさい。 # 学生のデータは、txtファイルでxx yyy zzという風に記載されています。 # (例)出力結果 # 学生番号:xx # 身長:yyy (cm) # 体重:zz (kg) # 学生の身長、体重のデータを読み込む(_テキストファイル) :- get_split_lines(_テキストファイル,[' '],LL), 二分木を育てる(LL). ある学籍番号を入力したときにその学生の学籍番号、身長、体重を2分探索法により求める(_学籍番号,_身長,_体重) :- 二分木の根(_根), 葉まで辿る([_学籍番号,_身長,_体重],_根). 二分木を育てる([A|R]) :- assertz(二分木(A,_,_)), assertz(二分木の根(A)), 二分木を育てる(L,_根). 二分木を育てる([],_) :- !. 二分木を育てる([A|R],_根) :- 根・葉の成長(A,_根), 二分木を育てる(R,_根). 葉まで辿る(_値,_値) :- 二分木(_値,_左,_右). 葉まで辿る(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@<,_値,_根), \+(var(_左)), 葉まで辿る(_値,_左). 葉まで辿る(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@>=,_値,_根), \+(var(_右)), 葉まで辿る(_値,_右). 根・葉の成長(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@<,_値,_根), \+(var(_左)), 根・葉の成長(_値,_左). 根・葉の成長(_値,_根) :- 二分木(_根,_左,_右), 変数を含む値を較べる(@>=,_値,_根), \+(var(_右)), 根・葉の成長(_値,_右). 根・葉の成長(_値,_根) :- retract(二分木(_根,_左,_右1)), 根・葉の成長(_値,_根,_左,_右1),!. 根・葉の成長(_値,_根,_左,_右1) :- 変数を含む値を較べる(@<,_値,_根), var(_左), assertz(二分木(_根,_値,_右1)), assertz(二分木(_値,_,_)),!. 根・葉の成長(_値,_根,_左,_右1) :- 変数を含む値を較べる(@>=,_値,_根), var(_右), assertz(二分木(_根,_左,_値)), assertz(二分木(_値,_,_)),!. 変数を含む値を較べる(@<,[V|R1],[_|R2]) :- var(V), 変数を含む値を較べる(@<,R1,R2),!. 変数を含む値を較べる(@<,[A|R1],[B|R2]) :- \+(var(A)), A @< B,!. 変数を含む値を較べる(@>=,[],[]) :- !. 変数を含む値を較べる(@>=,[V|R1],[_|R2]) :- var(V), 変数を含む値を較べる(@>=,R1,R2),!. 変数を含む値を較べる(@>=,[A|R1],[B|R2]) :- \+(var(A)), A @> B,!. 変数を含む値を較べる(@>=,[A|R1],[A|R2]) :- \+(var(A)), 変数を含む値を較べる(@>=,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/286 # # [1] プログラミング1 # [2] 現在のインターネットを実現しているTCP/IP通信プロトコルでは主にIPv4 #   を用いており、コンピュータを一意に識別するために32ビットのIPアドレスを #   用いている。これを踏まえ、IPアドレスの4つの数字を入力させ、これらを32ビットの #   データ型であるunsigned int型の変数にIPアドレスを示す2進数の数値として保存せよ。 #   保存したIPアドレスがunsigned intの整数値として解釈するといくつとなるか表示する #   プログラムを作成せよ。 # 'IPアドレスを32ビットの符号付き整数データとして保持する'([A1,A2,A3,A4],_アドレス) :- var(A1),var(A2),var(A3),var(A4),_アドレス >= 0, A1 is _アドレス // 16777216,M1 is _アドレス mod 16777216, A2 is M1 // 65536,M2 is M1 mod 65536, A3 is M2 // 256, A4 is M2 mod 256,!. 'IPアドレスを32ビットの符号付き整数データとして保持する'([A1,A2,A3,A4],_アドレス) :- var(A11),var(A22),var(A33),var(A44),_アドレス < 0, A11 is _アドレス // -16777216,M1 is _アドレス mod -16777216, A22 is M1 // -65536,M2 is M1 mod -65536, A33 is M2 // ((-1) * 256), A44 is M2 mod 256, A1 is 255 - A11,A2 is 255 - A22,A3 is 255 - A33,A4 is A44 + 256.!. 'IPアドレスを32ビットの符号付き整数データとして保持する'([A1,A2,A3,A4],_アドレス) :- A1 > 127,A11 is A1 - 256, _アドレス is truncate(A11 * 256 * 256 * 256 + A2 * 256 * 256 + A3 * 256 + A4),!. 'IPアドレスを32ビットの符号付き整数データとして保持する'([A1,A2,A3,A4],_アドレス) :- A1 < 128, _アドレス is truncate(A1 * 256 * 256 * 256 + A2 * 256 * 256 + A3 * 256 + A4),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1276810079/138 # # 1] 授業単元:システムコール # [2] 問題文(含コード&リンク): # コマンドライン引数で指定された文字列のいずれかと一致する名前の環境変数についてのみ、 # #include <stdio.h> # #include <stdlib.h> # extern char **environ; # main() # { # char **p; # for (p = environ; *p != NULL; p ++) { # printf("%s\n", *p);} # return 0;} # や # #include <stdio.h> # #include <stdlib.h> # main(int argc, char *argv[], char *envp[]) # { # char **p; # for (p = envp; *p != NULL; p ++) { # printf("%s\n", *p);} # return 0;} # のように変数名と値を表示するプログラムを書け。 # ただし、コマンドライン引数に重複があっても、対応する環境変数について複数回表示してはならない #  [3.2] コンパイラ名とバージョン:gcc 3.4 #  [3.3] 言語:C # [4] 期限:2010年5月24日12:59まで # [5] その他の制限:特になし # よろしくお願いします # # program :- user_parameters(L), append(_,[_環境変数名|R],L), 環境変数の表示(_環境変数名), R = []. 環境変数の表示(_環境変数名) :- getenv(_環境変数名,_値), write_formatted('%t=%t\n',[_環境変数名,_値]),!. 環境変数の表示(_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/880 # # [1] 授業単元:計算機とアルゴリズム # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10699.txt # # 問題2 # # 整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定するプログラムを作成しなさい。 # 例として、2000年の場合と1900年の場合の実行結果例を示す。 # # 実行結果(2000年の場合) # # 2000 年がうるう年かどうか判定します # うるう年です # # # 実行結果(1900年)の場合 # # 1900 年がうるう年かどうか判定します # うるう年ではありません # :- op(750,xf,年がうるう年かどうか判定します). _year 年がうるう年かどうか判定します :- integer(_year), うるう年(_year), write('うるう年です\n'),!. _year 年がうるう年かどうか判定します :- integer(_year), write('うるう年ではありません\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定する' 催促付き整数入力('西暦の値を入力してください : ',_year), うるう年(_year), write('うるう年です\n'),!. '整数変数 year に西暦の値を収め、そのときがうるう年かどうか判定する' :- write('うるう年ではありません\n'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4),fail. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1274827528/686 # # 【質問テンプレ】 # [1] 授業単元: プログラム実験 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10676.txt # # # 【問題1-02】 30点 配列要素の添字参照とポインタによるアドレス参照 [第1-1章 第09,10節] # # int型の配列 arr[] において、添字位置 n1 から n2 までの部分列を逆順にする関数 arr_rev() を考える。 # 例えば、arr = {0,1,2,3,4,5} のとき、2 と 4 の間を逆順にすると、{0,1,4,3,2,5} となる。 # 配列と添字 n1,n2を引数とし、配列要素の添字参照として実装する arr_rev1() と、 # 配列要素のアドレスを与え、ポインタ走査で実装する arr_rev2() の効率性を比較する。 # 後者は、arr_rev2(&arr[n1], &arr[n2]) として呼び出す。 # # void arr_rev1(int arr[], int n1, int n2) # void arr_rev2(int *p1, int *p2) # # 逆順にする算法自体は、左端と右端の要素を交換を、両端を1つずつ狭めながら繰り返し、範囲が0または1になったら終了する。 # 左右の2つの反復変数を用いる。詳細は、情報数学の教科書や、オンラインのC言語ハンドブックを参照せよ。 # # 配列の添字による要素参照 arr[k] は、arrの先頭番地 + 要素型サイズ × k の計算を行っている。 # ポインタ p の移動 p++ とポインタ先の参照 *p の方が直接的で速い。 # 関数の引数においても、arr_rev2() では、起点となる配列の先頭番地 arr が不要となる。 # 有効長の小さい配列で、プログラムの正当性を検証し、有効長を大きくして、計算時間の変化を調べよ。 arr_rev(L1,N1,N2,L2) :- N11 is N1 - 1, length(L11,N11), length(L12,N2), append(L12,R,L1), append(L11,L13,L12), reverse(L13,L14), append(L11,L14,R,L2),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% arr_rev([A|R1],M,N1,N2,[A|R2]) :- M < N1,M2 is M + 1,arr_rev(R1,M2,N1,N2,R2). arr_rev(L1,N1,N1,N2,L) :- arr_rev_p(L1,N1,N2,[],L2,R), append(L2,R,L),!. arr_rev_p(R,M,N2,L,L,R) :- M > N2,!. arr_rev_p([A|R1],M,N2,L1,L2,R) :- M2 is M + 1, arr_rev_p(R1,M2,N2,[A|L1],L2,R). % 以下のサイトは 89:デフォルトの名無しさん:2010/06/05(土) 17:58:44 >>46 % Prolog 蛾(ごまだらきこけが,ひとりが科). 開帳(ごまだらきこけが,成虫,'23~32mm'). 色(ごまだらきこけが,成虫,体と翅,赤味がかった黄色). 斑点(ごまだらきこけが,成虫,体と翅,前翅,'15個'). 分布(ごまだらきこけが,本邦広くアジアにひろがっている). 食性(ごまだらきこけが,幼虫,コケ類). 長い毛(ごまだらきこけが,幼虫). 青い点(ごまだらきこけが,幼虫,背中に2列). 色(ごまだらきこけが,幼虫,灰色). 90:デフォルトの名無しさん:2010/06/05(土) 19:41:39 >>46 % Prolog (_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが). 開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが). 色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが). 斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが). 分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが). 食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが). 長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが). 青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが). 色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが). 91:デフォルトの名無しさん:2010/06/05(土) 19:44:04 >>46 % Prolog 書き直し 蛾(_ごまだらきこけが,ひとりが科) :- ごまだらきこけが(_ごまだらきこけが). 開帳(_ごまだらきこけが,成虫,'23~32mm') :- ごまだらきこけが(_ごまだらきこけが). 色(_ごまだらきこけが,成虫,体と翅,赤味がかった黄色) :- ごまだらきこけが(_ごまだらきこけが). 斑点(_ごまだらきこけが,成虫,体と翅,前翅,'15個') :- ごまだらきこけが(_ごまだらきこけが). 分布(_ごまだらきこけが,本邦広くアジアにひろがっている) :- ごまだらきこけが(_ごまだらきこけが). 食性(_ごまだらきこけが,幼虫,コケ類) :- ごまだらきこけが(_ごまだらきこけが). 長い毛(_ごまだらきこけが,幼虫) :- ごまだらきこけが(_ごまだらきこけが). 青い点(_ごまだらきこけが,幼虫,背中に2列) :- ごまだらきこけが(_ごまだらきこけが). 色(_ごまだらきこけが,幼虫,灰色) :- ごまだらきこけが(_ごまだらきこけが). 92:デフォルトの名無しさん:2010/06/05(土) 19:49:08 >>91 たとえば、 あるものの幼虫はコケ類を食べる。そういうあるもののひとつは、ごまだらきこけがだ。 と読めばよいと思う。 93:デフォルトの名無しさん:2010/06/05(土) 20:53:07 出題者ではありませんが、勝手に批評します。 >>89 同じ項構造で他の生物にも適用できるよう、項: 蛾/2 は以下の方が 命題として適切ではないかと考えます。  種(ごまだらきこけが, 蛾). % ごまだらきこけがの種は蛾である。  科(ごまだらきこけが, ひとりが). % ごまだらきこけがの科はひとりがである。 項: 色/2 と 色/3 で混在していますが、どちらかに統一すべきだと考えます。  色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色).  色(ごまだらきこけが, 幼虫, 灰色). または  色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色).  色(ごまだらきこけが, 幼虫, 全体, 灰色). >>90 ごまだらきこけが以外の蛾も多数登録されているものとして、 食性について問い合わせる場合を考えます。  ?- 食性(_蛾, _, コケ類) % コケ類を食べる蛾は何か?  _蛾=ごまだらきこけが >>90では、変数 _蛾 がアトムにならず変数のままですから、この問い合わせには 回答できていません。従って、解答としては>>89のほうが適切ではないかと考えます。 94:93:2010/06/05(土) 21:23:38 >>93を自己訂正 >項: 色/3 と 色/4 で混在していますが、どちらかに統一すべきだと考えます。 > > 色(ごまだらきこけが, 成虫の体と翅, 赤味がかった黄色). % 色/3 で統一 > 色(ごまだらきこけが, 幼虫, 灰色). > >または > > 色(ごまだらきこけが, 成虫, 体と翅, 赤味がかった黄色). % 色/4 で統一 > 色(ごまだらきこけが, 幼虫, 全体, 灰色). 95:デフォルトの名無しさん:2010/06/05(土) 22:14:49 >>93 適切な批評をいただき感謝します。 色のアリティが二種類になっているのは好ましくないですね。 種、科については、可能な限り、仕様(ここでは問題文)の文面から 述語名や変数名を拾うことを旨としているので、出てきませんでした。 とはいえ、私も「食べる」を「食性」に置き換えたりしていますが、 言語、概念による補強は必要だし、そうすることで述語として「強く」 なることも事実ですね。 >>90については、途中で端折りますが、以下のようなら自然でしょうか。 ごまだらきこけが(_ごまだらきこけが) :-     色(_ごまだらきこけが,幼虫,全体,灰色),     色(_ごまだらきこけが,成虫,赤味がかった黄色). 色(ごまだらきこけが,幼虫,全体,灰色), 色(ごまだらきこけが,成虫,赤味がかった黄色). 食性(ごまだらきこけが,幼虫,コケ類). 96:93:2010/06/05(土) 23:11:54 >>95 >>>90については、途中で端折りますが、以下のようなら自然でしょうか。 いいえ、不自然です。この問題(仕様)はすべてファクト(事実)から構成されています。 出題者の意図(文脈)は知りませんが、単純なのにわざわざ複雑なルール(推論)を組み込むのは、 解答として適切であるとは思えません。 もし納得できないようでしたら、いったんPrologプログラミングから離れて 数学の命題論理(初等数理論理学の一部)を勉強されることをお勧めします。 97:デフォルトの名無しさん:2010/06/06(日) 13:11:46 本質に迫るツッコミktkr 98:デフォルトの名無しさん:2010/06/06(日) 16:58:56 >>96 確かに。命題論理の勉強をします。カツオの定義など支離滅裂ですね。 私はPrologの核は単位節データベースであって、実際宿題スレでもデータベース板SQLの質問から 多数問題を採用してきました。一方、 このスレと「いろんな言語で宿題」スレに共通して、 親子(為義,義朝). 親子(義朝,頼朝). 先祖(A,B) :- 親子(A,B). 先祖(A,B) :- 親子(A,C),先祖(C,B). という定義に於いて、先祖/2はルールなのに、親子/2はなぜ事実なの?親子もルールで 書いていくとどうなるの?という疑問に対して、何らかの答えだすという試みもして きました。 よく分かっていないことは事実とせず、これからそれについてはルールが来るのだ、 今のところまだ未定義だけどね、というのが指摘いただいた箇所の意図であり、 奇妙な表現に拘る言い訳ということになります。 99:93:2010/06/06(日) 21:12:22 >>98 Prologの単位節は「関係の存在」というファクト(事実)を表現しています。 以下は源一族の家系の一部をファクトだけで表現した一例(の一部)です。  親_子(為義, 義朝). % 為義と義朝の間には親-子という関係が存在する。  先祖_子孫(為義, 頼朝). % 為義と義朝の間には先祖-子孫という関係が存在する。 家系が「ファクトだけで表現できる」のが分かるかと思います。 同様にごまだらきこけが(あるいは蛾という生物系)についてもファクトだけで表現できます。 ですから、単位節だけで表現できる課題(仕様)については、それだけで解答すべきであると考えます。 また、複数のファクトから新たな「関係の存在」を表現したのがルール(規則)です。  先祖_子孫(A, B) :- 親_子(A, B).   % ある人物AとBについて、AとBの間に親-子という関係が存在するならば、   % AとBの間には先祖-子孫という関係が存在する。  先祖_子孫(A, B) :- 親_子(A, C), 親_子(C, B),.   % ある人物AとBとCについて、AとCの間に親-子という関係が存在し、かつCとBの間に   % 親-子という関係が存在するならば、AとBの間には先祖-子孫という関係が存在する。 ファクト(事実)とルール(規則)は、どちらも「関係の存在」を表現しています。 Prologで記述した場合、その項の名前は関係の名前を指します。 ここで、>>90,91,95における項「ごまだらきこけが(_)」について、  **** ごまだらきこけがは関係ではありません!! **** ですから、これらの解答は明らかに不自然です。 100:93:2010/06/07(月) 00:50:12 >>99に間違いがあったので、訂正します。 > 先祖_子孫(A, B) :- 親_子(A, C), 先祖_子孫(C, B),. >  % ある人物AとBとCについて、AとCの間に親-子という関係が存在し、かつCとBの間に >  % 先祖-子孫という関係が存在するならば、AとBの間には先祖-子孫という関係が存在する。 101:デフォルトの名無しさん:2010/06/07(月) 08:46:50 >>95 こんな定義ならどうなんだ。 確信度(_ごまだらきこけが,ごまだらきこけが,60) :-     色(_ごまだらきこけが,_,幼虫,全体,灰色),     色(_ごまだらきこけが,_,成虫,赤味がかった黄色),     食性(_ごまだらきこけが,_,幼虫,コケ類). 色(_,ごまだらきこけが,幼虫,全体,灰色), 色(_,ごまだらきこけが,成虫,赤味がかった黄色). 食性(_,ごまだらきこけが,幼虫,コケ類). 102:デフォルトの名無しさん:2010/06/07(月) 08:54:28 >>99 それから、>>95 のごまだらきこけが は関係ではなく、クラスを表現しようとしているのではないかな。 103:93:2010/06/07(月) 17:19:35 あまり頭ごなしに不自然だ!!ばかりを言うのもアレなので....。 >>98 >先祖/2はルールなのに、親子/2はなぜ事実なの? >親子もルールで書いていくとどうなるの?という疑問に対して、 >何らかの答えだすという試みもしてきました。 「親-子」という関係は原始的な(これ以上は分解できない)ファクトだから、 ルールとして書くことは(私には)無理ですが、「親-子の関係」や「先祖-子孫の関係」という 関係そのものを扱えるファクト/ルールを書くことは可能です。たとえば 「AとBにはどんな関係があるか?(= AとBとの間に存在する関係は何か?)」という 問い合わせに答えることの可能な知識ベースです。 まず説明の前に、>>99では  ファクトとルールは、どちらも「関係の存在」を表現している と書きました。それを以下のように訂正します。  ファクトとルールは、どちらも「エンティティ(物)の存在」あるいは  「エンティティ間にある関係の存在」を表現している エンティティとは関係の対象となるオブジェクトを意味し、 たとえば「ごまだらきこけが」や「為義」を指します。 (長いので続く) 104:93:2010/06/07(月) 17:21:16 (>>103の続き) では、以降からは知識ベースの記述を始めます。まず基礎のファクトを書きます。  人物(為義).      % 為義という人物が存在する。  人物(義朝).      % 義朝という人物が存在する。  人物(頼朝).      % 頼朝という人物が存在する。 ここで、「親-子」と「先祖-子孫」を(関係ではなく)エンティティとして認識した上で、 ファクトとして書いてみます。  関係(親_子).       % 親-子という関係が存在する。  関係(先祖_子孫).     % 先祖-子孫という関係が存在する。  関係(親_子, 為義, 義朝). % 為義と義朝の間には親-子という関係が存在する。  関係(親_子, 義朝, 頼朝). % 義朝と頼朝の間には親-子という関係が存在する。 これらファクトを前提にルールを書きます。  関係(先祖_子孫, A, B) :- 人物(A), 人物(B), A\=B, 関係(親_子, A, B).   % あるA, Bについて、AおよびBという人物が存在し、   % かつAとBの間に親-子という関係が存在するならば、   % AとBの間には先祖-子孫という関係が存在する。  関係(先祖_子孫, A, B) :-     人物(A), 人物(B), 人物(C), A \= B, B \= C, A \= C,     関係(親_子, A, C), 関係(先祖_子孫, C, B).   % あるA, Bについて、A、BおよびCという人物が存在し、   % かつAとCの間に親-子という関係が存在し、   % かつCとBの間に先祖-子孫という関係が存在するならば、   % AとBの間にも先祖-子孫という関係が存在する。 (まだ続く) 105:93:2010/06/07(月) 17:33:51 (>>104の続き) 以下は、SWI-Prologでの実行例です。  為義と義朝は親子か?   ?- 関係(親_子, 為義, 義朝).   true .  % はい。  為義の子は誰か?   ?- 関係(親_子, 為義, X).   X = '義朝' ;  % 義朝です。   false.  為義の子孫は誰か?   ?- 関係(先祖_子孫, 為義, X).   X = '義朝' ;   X = '頼朝' ;  % 義朝と頼朝です。   false.  為義と義朝にはどんな関係があるか?   ?- 関係(R, 為義, 義朝).   R = '親_子' ;   R = '先祖_子孫' ;  % 親-子と先祖-子孫という関係があります。   false.  為義と頼朝にはどんな関係があるか?   ?- 関係(R, 義朝, 頼朝).   R = '先祖_子孫' ;  % 先祖-子孫という関係があります。   false. (まだ続く。次で終わり。) 106:93:2010/06/07(月) 17:36:21 (>>105の続き)  すべての関係を挙げよ。   ?- 関係(R, A, B).   R = '親_子',   A = '為義',   B = '義朝' ;  % 為義と義朝の間に親-子という関係が存在する。   R = '親_子',   A = '義朝',   B = '頼朝' ;  % 為義と頼朝の間に親-子という関係が存在する。   R = '先祖_子孫',   A = '為義',   B = '義朝' ;  % 為義と頼朝の間に先祖-子孫という関係が存在する。   R = '先祖_子孫',   A = '義朝',   B = '頼朝' ;  % 義朝と頼朝の間に先祖-子孫という関係が存在する。   R = '先祖_子孫',   A = '為義',   B = '頼朝' ;  % 為義と頼朝の間に先祖-子孫という関係が存在する。   false. (これで終わり。長レス失礼。) 107:93:2010/06/07(月) 18:08:39 >>102 では、オブジェクト指向(あるいはフレーム理論やオントロジーのような)知識を一般化する 枠組み(フレームワーク)を>>103-106で書いた知識ベースに導入してみます。  オブジェクト(昆虫).       % 昆虫はオブジェクトである。  オブジェクト(蛾).        % 蛾はオブジェクトである。  オブジェクト(ごまだらきこけが). % ごまだらきこけがはオブジェクトである。  関係(スーパークラス_サブクラス, 昆虫, 蛾).    % 蛾は昆虫のサブクラスである。  関係(クラス_インスタンス, 蛾, ごまだらきこけが). % ごまだらきこけがは蛾のインスタンスである。 オブジェクト指向という枠組みの導入によって、これまで「....が存在する」と解釈していたのを、 「....である」という解釈に進化させたことに注目してください。 オブジェクト指向におけるクラスという概念は「スーパークラス-サブクラス」および 「クラス-インスタンス」という関係で表現できます。これらはそれぞれ「is-a関係(またはkind-of関係)」と 「instance-of関係」と呼ばれることもあり、知識表現レベルではどちらも関係の特別なケース(クラス)です。 以上のように、(源氏の)家系や(蛾の)体系といった比較的単純な知識表現であれば、明解な解答が得られます。 不自然な解釈や小賢しい技法(テクニック)は必要ありません。命題論理と一階述語論理の守備範囲です。 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1273368706/397 # # 質問です。 # # 例文 # # int a; # # printf("値をいれてください:"); # scanf("%d",&a); # # if(a<0&&a<9) # { # printf("値が違います!!"); # } # # # とこういう文があったとして、aにたとえば10を入力するとエラーメッセージを出してもう一度 # 入力させる処理に戻りたいんですがなにを付け加えればいいですか? # 範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :- write('整数を入力してください : '), get_line(_行), atom_to_term(_行,_入力データ,_), 範囲検査(_入力データ),!. 範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :- write_formatted('値が範囲を外れています\n'), 範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ). % 上の定義ではエラーメッセージに入力した値を含ませることができない。バックトラックして第二節が % 選択される時には論理変数 _行 や _入力データ は束縛が解かれてしまっている。一般的には以下のような定義となる 範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :- write('整数を入力してください : '), get_line(_行), atom_to_term(_行,_入力データ,_), 範囲検査(_入力データ),!. 範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ) :- 範囲外の入力があった場合エラーメッセージを出してもう一度入力させる処理に戻る(_入力データ). 範囲検査(_入力データ) :- integer(_入力データ),_入力データ > 0,_入力データ < 9,!. 範囲検査(_入力データ) :- integer(_入力データ),write_formatted('値%tは範囲を外れています\n',[_入力データ]),!,fail. 範囲検査(_入力データ) :- \+(integer(_入力データ)),write('整数が入力されませんでした\n'),!,fail. % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/php/1251989472/378 # # ----------input.txt- # 1 2 3 # 4 5 6 # 7 8 9 # ------------------- # ---------------output.txt- # 左上の数字は1です # 中上の数字は2です #    ・ #    ・ #    ・ # --------------- # input.txt->output.txtのようなprogramの書き方を教えてください # できれば、input.txtを空白で区切った値をそれぞれ$a_1,$a_2といった変数にしてしまいたいのですが 位置と値を組み合わせて表示する :- get_split_lines('input.txt',[' '],LL), tell('output.txt'), 位置と値を組み合わせて行表示する([上,中,下],[左,中,右],LL), told. 位置と値を組み合わせて行表示する(_,_,[]) :- !. 位置と値を組み合わせて行表示する([_行表現|R1],L1,[L2|R2]) :- 位置と値を組み合わせて列表示する(_行表現,L1,L2), 位置と値を組み合わせて行表示する(R1,L1,R2). 位置と値を組み合わせて列表示する(_,[],[]) :- !. 位置と値を組み合わせて列表示する(_行表現,[_列表現|R1],[N|R2]) :- 位置表現を構成する(_行表現,_列表現,_表示文字列), write_formatted('%tの数字は%tです\n',[_表示文字列,N]), 位置と値を組み合わせて列表示する(_行表現,R1,R2). 位置表現を構成する(中,中,まん中) :- !. 位置表現を構成する(_行表現,_列表現,_表示文字列) :- concat_atom([_列表現,_行表現],_表示文字列). % 以下のサイトは # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/944 # # num0からnum50までの連番でフィールドがあるのですが、 # この中で、レコードの値が0より大きいものをSELECTするにはどうしたらいいでしょうか? # ワイルドカード的な書き方はないのでしょうか? 'num0からnum50までの連番でフィールドの中で0より大きいものを選択'(L) :- フィールド名の連番を作る(_フィールド名ならび), 選択項を変数引数で構成し(_選択項,_引数ならび), call(P), findall([_フィールド名,_値], フィールドの中で0より大きいもの(_フィールド名ならび,_引数ならび,_フィールド名,_値), L). フィールドの中で0より大きいもの(_フィールド名ならび,L2,_フィールド名,_値) :- for(1,M,51), list_nth(M,L2,_値), _値 > 0, list_nth(M,_フィールド名ならび,_フィールド名). フィールド名の連番を作る(_フィールド名ならび) :- findall(S,(for(0,N,50),concat_atom([num,N],S)),_フィールド名ならび). 選択項を変数引数で構成し(_選択項,_変数ならび) :- length(_変数ならび,51), _選択項 =.. [テーブル|_変数ならび]. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/801 # # [1] 授業単元:プログラミング演習 # [2] 問題文: # テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上 # 実行例 # # 84         <--キーボードから点数入力 # 84点        <--入力した点数を表示 # 95 # 95点 # 48 # 48点 # 66 # 66点 # 80 # 80点 # 999     <--データの終わり(999点とは表示しない) # 合計点=373点 # 平均点=74.6点 # 受験者数=5名 # 合格者数=4名 # キーボードから点数入力 テストの点数を入力し合計点、平均点、受験者数、合格者数を表示するプログラムを作成しなさい。ただし、データの終わりの999(999点と表示しない)合格者は60点以上 :- 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび), 合計点(_点数ならび,_合計点), 受験者数(_点数ならび,_受験者数), 合格者数(_点数ならび,_合格者数), 表示する('合計点=%t\n平均点=%t点\n受験者数=%t\n合格者数=%t\n',[_合計点,_平均点,_受験者数,合格者数]). 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数ならび) :- キーボードから点数入力('点数を入力してください(データの終わりの999) : ',_点数), 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,_点数ならび). 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[]) :- 'ただし、データの終わりの999(999点と表示しない)'(_点数),!. 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_点数,[_点数|R]) :- 入力した点数を表示(_点数), キーボードから点数入力(_次の点数), 'テストの点数を入力し、ただし、データの終わりの999(999点と表示しない)'(_次の点数,R). キーボードから点数入力('点数を入力してください(データの終わりの999) : ',_点数) :- 催促付き整数入力('点数を入力してください(データの終わりの999) : ',_点数). キーボードから点数入力(_点数) :- get_integer(_点数). 入力した点数を表示(_点数) :- write_formatted('%t点\n',[_点数]). 'ただし、データの終わりの999(999点と表示しない)'(999). 合計点(_点数ならび,_合計点) :- 加算(_点数ならび,_合計点_浮動小数点),_合計点 is truncate(_合計点_浮動小数点数), 平均点(_点数ならび,_平均点) :- 平均(_点数ならび,_平均点). 受験者数(_点数ならび,_受験者数) :- length(_点数ならび,_受験者数). 合格者数(_点数ならび,_合格者数) :- 度数((member(_点数,_点数ならび),_点数>=60),_合格者数). 表示する(Format,_値ならび) :- write_formatted(Format,_値ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 加算(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 = 0,!. 加算([],L) :- \+(var(L)), 加算の変数に零をおく(L),!. 加算([L|R],SL) :- ならび(L), 転置([L|R],L1), 加算_2(L1,SL),!. 加算(X,S) :- 加算_1(X,0.0e+00,S). 全て整数([]) :- !. 全て整数([N|R]) :- integer(N),全て整数(R). 平均(L,Avg) :- list(L),findavg(A,member(A,L),Avg). 度数(A,[],0). 度数(A,[A|R],X) :- 度数(A,R,Y),X is Y + 1. 度数(A,[_|R],X) :- 度数(A,R,X). 度数(P,N) :- findsum(1,P,F),N is truncate(F). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), 加算(_値ならび,_合計値), list_length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 合計は原則として浮動小数点数. % 合計は原則として整数. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/686 # # [1] 授業単元: プログラム演習 # [2] 問題文(含コード&リンク): # 配列を用いて連立一次方程式を解くプログラムを実装し、以下の連立一次方程式の解を求めなさい。 # a + 2b -5c + 4d = 2 # 2a - 4b + 2c + 3d = 18 # 4a + 15b - 32c + 3d = -116 # 5a + 15b - 32c + d = -129 # 拡大係数行列を既約ガウス行列に変形して連立一次方程式の解を得る(_変数名ならび,_拡大係数行列,_解ならび) :- 既約ガウス行列に変形(_拡大係数行列,_既約ガウス行列), 解の収集(_変数名ならび,_既約ガウス行列,_解ならび). 解の収集([],[],[]) :- !. 解の収集([_変数名|R1],[_行|R2],[_変数名=X|R3]) :- last(_行,X), 解の収集(R1,R2,R3). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/605 # # キーボードから int 型変数aに値を入力し、aの値を 2 進数に変換して画面に表示するプログ # ラムを作成せよ。 # ただし、aに負の値が入力された場合には、再入力させるものとする。 # 実行例: () の部分が入力である。 # Input a: (-4) # Input a: (-3) # Input a: (10) # a(decimal)=10 # a(binary) =1010 # # # 'キーボードから int 型変数aに値を入力し、aの値を 2 進数に変換して画面に表示する(ただし、aに負の値が入力された場合には、再入力させるものとする。 ' :- repeat, get_integer(_a), _a >= 0, 二進数(_a,_二進数ならび), append(_,[0|R],_二進数ならび), 二進数表示文字列(_二進数ならび,_二進数表示文字列), write_formatted('a(decimal)=%t\na(binary) =%t\n',[_a,_二進数表示文字列]),!. 二進数(_10進数,L) :- length(L,32), 二進数(_10進数,[],X), append(L1,X,L), all(L1,0). 二進数(J,Y,[J|Y]) :- J < 2. 二進数(J,Y,X) :- J >= 2,J2 is J // 2,M is J mod 2,二進数(J2,[M|Y],X). 二進数表示文字列(L,_二進数表示文字列) :- 二進数表示文字列_2(L1,L2), concat_atom(L2,_二進数表示文字列). 二進数表示文字列_2([],[]) :- !. 二進数表示文字列_2([1|R1],['1'|R2]) :- 二進数表示文字列_2(R1,R2). 二進数表示文字列_2([0|R1],['0'|R2]) :- 二進数表示文字列_2(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1269438098/312 # # [1] 授業単元: Introduction to C++ # [2] 問題文: ユーザーにサイズN(最大で100000)を入力させ、そのサイズのArrayを1〜100までのランダムな数字で埋めた後、N個のランダムな数字を数字1、数字2、数字3・・・という具合にカウントするプログラムを書きなさい # (元の文が英文なのですが、約した際に何かしら抜け落ちている点が在るかもしれないので一応原文も記載しておきます) # Write a program that asks user to enter a size, N. (The maximum is 100000). Write a # function that generates random numbers in range of 1 ~ 100 and fill an array of size N. # You also need to count how many 1’s, 2’s, 3’s, # 4’s, 5’s, …, 100’s. If the random number function does it job perfectly, the distribution to # each number should be equal. But they might be slightly off. # ライン([A,B,C,2],[2,E,F,G],[G,H,B,1],[1,C,E,3]). '空いている○の中に4~12の数字を入れ、5つある線上の合計が等しくなるようにした場合、あまる数字は何と何か?なお、同じ数字は使えません。'(_あまる数字ならび) :- ライン(L1,L2,L3,L4), flat([L1,L2,L3,L4],L), 未知数はいくつあるか(L,[],_重複しない変数ならび,_未知数の数), findall(M,for(4,M,12),_候補数値ならび), 順列(_候補数値ならび,_未知数の数,_重複しない変数ならび), 加算(L1,X),加算(L2,X),加算(L3,X),加算(L4,X), 差集合(_候補数値ならび,VL,_あまる数字ならび). 未知数はいくつあるか([],L,L,N) :- length(L,N),!. 未知数はいくつあるか([V|R],L,VL,X) :- var(V), \+memberV(V,L), 未知数はいくつあるか(R,[V|L],VL,X),!. 未知数はいくつあるか([V|R],L,VL,X) :- var(V), memberV(V,L), 未知数はいくつあるか(R,L,VL,X),!. 未知数はいくつあるか([_|R],L,VL,X) :- 未知数はいくつあるか(R,L,VL,X),!. memberV(V1,[V2|R]) :- V1==V2,!. memberV(V,[_|R]) :- memberV(V,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/920 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 1.fgets関数を用いてpgmファイルの始めの2行(添付ファイルの場合, P2, 304, # 322)をそれぞれ、変数header, width, heightに格納するプログラム # 2.上記で記憶したheader, width, heightを別ファイルに書き出すプログラム # 1.と2.をそれぞれ作成せよ。 pgmファイルヘッダの読み取り(_pgmファイル,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル) :- open(_pgmファイル,read,Input,[type(binary)]), pgmヘッダ(Input,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル), close(Input),!. pgmファイルヘッダ(Input,_マジックナンバー,_画像の幅方向サイズ,_画像の高さサイズ,画像の最大階調レベル) :- マジックナンバー(Input,_マジックナンバー), 画像の幅方向サイズ(Input,_画像の幅方向サイズ), 画像の幅方向サイズ(Input,_画像の幅方向サイズ), 画像の高さサイズ(Input,_画像の高さサイズ),!. マジックナンバー(Input,_マジックナンバー) :- findall(Y,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;char_code(Y,X))),L), concat_atom(L,_マジックナンバー),!. 画像の幅方向サイズ(Input,_画像の幅方向サイズ) :- findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L), number_codes(_画像の幅方向サイズ,L),!. 画像の高さサイズ(Input,_画像の高さサイズ) :- findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L), number_codes(_画像の高さサイズ,L),!. 画像の最大階調レベル(Input,_画像の最大階調レベル) :- findall(X,(repeat,get_byte(Input,X),('Whitespace'(X),!,fail;true)),L), number_codes(_画像の最大階調レベル,L),!. 'Whitespace'(X) :- X < 48. 'Whitespace'(X) :- X > 57. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/555 # # [2] キーボードから3つの整数を受け取り大きさの小さい順に出力するプログラムを作りなさい。 # 但しmain関数内ではint変数一つだけが使えるものとします。またmain関数の再帰呼び出しも # 出来ません。(main関数の引数、argc,argvをint変数として使用することも勿論禁止します) # main関数のみで構成されるプログラムとして下さい。 # 入力される数は1から10までの範囲にあることを常にチェックし、それ以外の入力の場合は # 再入力を促して下さい。 # make :- write('main :-\n'), write(' write(''1-10の整数を空白で区切り3個入力してください : ''),\n'), write(' get_line(Line),(\n'), for(1,N1,10),for(1,N2,10),for(1,N3,10), quicksort([N1,N2,N3],L2), concat_atom(L2,' ',S), write_formatted(' Line=\'%t %t %t\',write(\'%t\\n\')',[N1,N2,N3,S]), make_1(N1,N2,N3), N3=10,N2=10,N1=10, write(' )),!.\n'), write('main :-\n'), write(' write(\'入力された数値範囲を検査してください\\n\'),'), write('\n main.\n'),!. make_1(10,10,10) :- write('\n'),!. make_1(_,_,_) :- write(';\n'),!. main :- write('1-10の整数を空白で区切り3個入力してください\n'), get_line(Line),( Line='1 1 1',write('1 1 1\n'); Line='1 1 2',write('1 1 2\n'); Line='1 1 3',write('1 1 3\n'); Line='1 1 4',write('1 1 4\n'); Line='1 1 5',write('1 1 5\n'); Line='1 1 6',write('1 1 6\n'); Line='1 1 7',write('1 1 7\n'); Line='1 1 8',write('1 1 8\n'); Line='1 1 9',write('1 1 9\n'); Line='1 1 10',write('1 1 10\n'); Line='1 2 1',write('1 1 2\n'); Line='1 2 2',write('1 2 2\n'); Line='1 2 3',write('1 2 3\n'); Line='1 2 4',write('1 2 4\n'); Line='1 2 5',write('1 2 5\n'); Line='1 2 6',write('1 2 6\n'); Line='1 2 7',write('1 2 7\n'); Line='1 2 8',write('1 2 8\n'); Line='1 2 9',write('1 2 9\n'); Line='1 2 10',write('1 2 10\n'); Line='1 3 1',write('1 1 3\n'); Line='1 3 2',write('1 2 3\n'); Line='1 3 3',write('1 3 3\n'); Line='1 3 4',write('1 3 4\n'); Line='1 3 5',write('1 3 5\n'); Line='1 3 6',write('1 3 6\n'); Line='1 3 7',write('1 3 7\n'); Line='1 3 8',write('1 3 8\n'); Line='1 3 9',write('1 3 9\n'); Line='1 3 10',write('1 3 10\n'); Line='1 4 1',write('1 1 4\n'); Line='1 4 2',write('1 2 4\n'); Line='1 4 3',write('1 3 4\n'); Line='1 4 4',write('1 4 4\n'); Line='1 4 5',write('1 4 5\n'); Line='1 4 6',write('1 4 6\n'); Line='1 4 7',write('1 4 7\n'); Line='1 4 8',write('1 4 8\n'); Line='1 4 9',write('1 4 9\n'); Line='1 4 10',write('1 4 10\n'); Line='1 5 1',write('1 1 5\n'); Line='1 5 2',write('1 2 5\n'); Line='1 5 3',write('1 3 5\n'); Line='1 5 4',write('1 4 5\n'); Line='1 5 5',write('1 5 5\n'); Line='1 5 6',write('1 5 6\n'); Line='1 5 7',write('1 5 7\n'); Line='1 5 8',write('1 5 8\n'); Line='1 5 9',write('1 5 9\n'); Line='1 5 10',write('1 5 10\n'); Line='1 6 1',write('1 1 6\n'); Line='1 6 2',write('1 2 6\n'); Line='1 6 3',write('1 3 6\n'); Line='1 6 4',write('1 4 6\n'); Line='1 6 5',write('1 5 6\n'); Line='1 6 6',write('1 6 6\n'); Line='1 6 7',write('1 6 7\n'); Line='1 6 8',write('1 6 8\n'); Line='1 6 9',write('1 6 9\n'); Line='1 6 10',write('1 6 10\n'); Line='1 7 1',write('1 1 7\n'); Line='1 7 2',write('1 2 7\n'); Line='1 7 3',write('1 3 7\n'); Line='1 7 4',write('1 4 7\n'); Line='1 7 5',write('1 5 7\n'); Line='1 7 6',write('1 6 7\n'); Line='1 7 7',write('1 7 7\n'); Line='1 7 8',write('1 7 8\n'); Line='1 7 9',write('1 7 9\n'); Line='1 7 10',write('1 7 10\n'); Line='1 8 1',write('1 1 8\n'); Line='1 8 2',write('1 2 8\n'); Line='1 8 3',write('1 3 8\n'); Line='1 8 4',write('1 4 8\n'); Line='1 8 5',write('1 5 8\n'); Line='1 8 6',write('1 6 8\n'); Line='1 8 7',write('1 7 8\n'); Line='1 8 8',write('1 8 8\n'); Line='1 8 9',write('1 8 9\n'); Line='1 8 10',write('1 8 10\n'); Line='1 9 1',write('1 1 9\n'); Line='1 9 2',write('1 2 9\n'); Line='1 9 3',write('1 3 9\n'); Line='1 9 4',write('1 4 9\n'); Line='1 9 5',write('1 5 9\n'); Line='1 9 6',write('1 6 9\n'); Line='1 9 7',write('1 7 9\n'); Line='1 9 8',write('1 8 9\n'); Line='1 9 9',write('1 9 9\n'); Line='1 9 10',write('1 9 10\n'); Line='1 10 1',write('1 1 10\n'); Line='1 10 2',write('1 2 10\n'); Line='1 10 3',write('1 3 10\n'); Line='1 10 4',write('1 4 10\n'); Line='1 10 5',write('1 5 10\n'); Line='1 10 6',write('1 6 10\n'); Line='1 10 7',write('1 7 10\n'); Line='1 10 8',write('1 8 10\n'); Line='1 10 9',write('1 9 10\n'); Line='1 10 10',write('1 10 10\n'); Line='2 1 1',write('1 1 2\n'); Line='2 1 2',write('1 2 2\n'); Line='2 1 3',write('1 2 3\n'); Line='2 1 4',write('1 2 4\n'); Line='2 1 5',write('1 2 5\n'); Line='2 1 6',write('1 2 6\n'); Line='2 1 7',write('1 2 7\n'); Line='2 1 8',write('1 2 8\n'); Line='2 1 9',write('1 2 9\n'); Line='2 1 10',write('1 2 10\n'); Line='2 2 1',write('1 2 2\n'); Line='2 2 2',write('2 2 2\n'); Line='2 2 3',write('2 2 3\n'); Line='2 2 4',write('2 2 4\n'); Line='2 2 5',write('2 2 5\n'); Line='2 2 6',write('2 2 6\n'); Line='2 2 7',write('2 2 7\n'); Line='2 2 8',write('2 2 8\n'); Line='2 2 9',write('2 2 9\n'); Line='2 2 10',write('2 2 10\n'); Line='2 3 1',write('1 2 3\n'); Line='2 3 2',write('2 2 3\n'); Line='2 3 3',write('2 3 3\n'); Line='2 3 4',write('2 3 4\n'); Line='2 3 5',write('2 3 5\n'); Line='2 3 6',write('2 3 6\n'); Line='2 3 7',write('2 3 7\n'); Line='2 3 8',write('2 3 8\n'); Line='2 3 9',write('2 3 9\n'); Line='2 3 10',write('2 3 10\n'); Line='2 4 1',write('1 2 4\n'); Line='2 4 2',write('2 2 4\n'); Line='2 4 3',write('2 3 4\n'); Line='2 4 4',write('2 4 4\n'); Line='2 4 5',write('2 4 5\n'); Line='2 4 6',write('2 4 6\n'); Line='2 4 7',write('2 4 7\n'); Line='2 4 8',write('2 4 8\n'); Line='2 4 9',write('2 4 9\n'); Line='2 4 10',write('2 4 10\n'); Line='2 5 1',write('1 2 5\n'); Line='2 5 2',write('2 2 5\n'); Line='2 5 3',write('2 3 5\n'); Line='2 5 4',write('2 4 5\n'); Line='2 5 5',write('2 5 5\n'); Line='2 5 6',write('2 5 6\n'); Line='2 5 7',write('2 5 7\n'); Line='2 5 8',write('2 5 8\n'); Line='2 5 9',write('2 5 9\n'); Line='2 5 10',write('2 5 10\n'); Line='2 6 1',write('1 2 6\n'); Line='2 6 2',write('2 2 6\n'); Line='2 6 3',write('2 3 6\n'); Line='2 6 4',write('2 4 6\n'); Line='2 6 5',write('2 5 6\n'); Line='2 6 6',write('2 6 6\n'); Line='2 6 7',write('2 6 7\n'); Line='2 6 8',write('2 6 8\n'); Line='2 6 9',write('2 6 9\n'); Line='2 6 10',write('2 6 10\n'); Line='2 7 1',write('1 2 7\n'); Line='2 7 2',write('2 2 7\n'); Line='2 7 3',write('2 3 7\n'); Line='2 7 4',write('2 4 7\n'); Line='2 7 5',write('2 5 7\n'); Line='2 7 6',write('2 6 7\n'); Line='2 7 7',write('2 7 7\n'); Line='2 7 8',write('2 7 8\n'); Line='2 7 9',write('2 7 9\n'); Line='2 7 10',write('2 7 10\n'); Line='2 8 1',write('1 2 8\n'); Line='2 8 2',write('2 2 8\n'); Line='2 8 3',write('2 3 8\n'); Line='2 8 4',write('2 4 8\n'); Line='2 8 5',write('2 5 8\n'); Line='2 8 6',write('2 6 8\n'); Line='2 8 7',write('2 7 8\n'); Line='2 8 8',write('2 8 8\n'); Line='2 8 9',write('2 8 9\n'); Line='2 8 10',write('2 8 10\n'); Line='2 9 1',write('1 2 9\n'); Line='2 9 2',write('2 2 9\n'); Line='2 9 3',write('2 3 9\n'); Line='2 9 4',write('2 4 9\n'); Line='2 9 5',write('2 5 9\n'); Line='2 9 6',write('2 6 9\n'); Line='2 9 7',write('2 7 9\n'); Line='2 9 8',write('2 8 9\n'); Line='2 9 9',write('2 9 9\n'); Line='2 9 10',write('2 9 10\n'); Line='2 10 1',write('1 2 10\n'); Line='2 10 2',write('2 2 10\n'); Line='2 10 3',write('2 3 10\n'); Line='2 10 4',write('2 4 10\n'); Line='2 10 5',write('2 5 10\n'); Line='2 10 6',write('2 6 10\n'); Line='2 10 7',write('2 7 10\n'); Line='2 10 8',write('2 8 10\n'); Line='2 10 9',write('2 9 10\n'); Line='2 10 10',write('2 10 10\n'); Line='3 1 1',write('1 1 3\n'); Line='3 1 2',write('1 2 3\n'); Line='3 1 3',write('1 3 3\n'); Line='3 1 4',write('1 3 4\n'); Line='3 1 5',write('1 3 5\n'); Line='3 1 6',write('1 3 6\n'); Line='3 1 7',write('1 3 7\n'); Line='3 1 8',write('1 3 8\n'); Line='3 1 9',write('1 3 9\n'); Line='3 1 10',write('1 3 10\n'); Line='3 2 1',write('1 2 3\n'); Line='3 2 2',write('2 2 3\n'); Line='3 2 3',write('2 3 3\n'); Line='3 2 4',write('2 3 4\n'); Line='3 2 5',write('2 3 5\n'); Line='3 2 6',write('2 3 6\n'); Line='3 2 7',write('2 3 7\n'); Line='3 2 8',write('2 3 8\n'); Line='3 2 9',write('2 3 9\n'); Line='3 2 10',write('2 3 10\n'); Line='3 3 1',write('1 3 3\n'); Line='3 3 2',write('2 3 3\n'); Line='3 3 3',write('3 3 3\n'); Line='3 3 4',write('3 3 4\n'); Line='3 3 5',write('3 3 5\n'); Line='3 3 6',write('3 3 6\n'); Line='3 3 7',write('3 3 7\n'); Line='3 3 8',write('3 3 8\n'); Line='3 3 9',write('3 3 9\n'); Line='3 3 10',write('3 3 10\n'); Line='3 4 1',write('1 3 4\n'); Line='3 4 2',write('2 3 4\n'); Line='3 4 3',write('3 3 4\n'); Line='3 4 4',write('3 4 4\n'); Line='3 4 5',write('3 4 5\n'); Line='3 4 6',write('3 4 6\n'); Line='3 4 7',write('3 4 7\n'); Line='3 4 8',write('3 4 8\n'); Line='3 4 9',write('3 4 9\n'); Line='3 4 10',write('3 4 10\n'); Line='3 5 1',write('1 3 5\n'); Line='3 5 2',write('2 3 5\n'); Line='3 5 3',write('3 3 5\n'); Line='3 5 4',write('3 4 5\n'); Line='3 5 5',write('3 5 5\n'); Line='3 5 6',write('3 5 6\n'); Line='3 5 7',write('3 5 7\n'); Line='3 5 8',write('3 5 8\n'); Line='3 5 9',write('3 5 9\n'); Line='3 5 10',write('3 5 10\n'); Line='3 6 1',write('1 3 6\n'); Line='3 6 2',write('2 3 6\n'); Line='3 6 3',write('3 3 6\n'); Line='3 6 4',write('3 4 6\n'); Line='3 6 5',write('3 5 6\n'); Line='3 6 6',write('3 6 6\n'); Line='3 6 7',write('3 6 7\n'); Line='3 6 8',write('3 6 8\n'); Line='3 6 9',write('3 6 9\n'); Line='3 6 10',write('3 6 10\n'); Line='3 7 1',write('1 3 7\n'); Line='3 7 2',write('2 3 7\n'); Line='3 7 3',write('3 3 7\n'); Line='3 7 4',write('3 4 7\n'); Line='3 7 5',write('3 5 7\n'); Line='3 7 6',write('3 6 7\n'); Line='3 7 7',write('3 7 7\n'); Line='3 7 8',write('3 7 8\n'); Line='3 7 9',write('3 7 9\n'); Line='3 7 10',write('3 7 10\n'); Line='3 8 1',write('1 3 8\n'); Line='3 8 2',write('2 3 8\n'); Line='3 8 3',write('3 3 8\n'); Line='3 8 4',write('3 4 8\n'); Line='3 8 5',write('3 5 8\n'); Line='3 8 6',write('3 6 8\n'); Line='3 8 7',write('3 7 8\n'); Line='3 8 8',write('3 8 8\n'); Line='3 8 9',write('3 8 9\n'); Line='3 8 10',write('3 8 10\n'); Line='3 9 1',write('1 3 9\n'); Line='3 9 2',write('2 3 9\n'); Line='3 9 3',write('3 3 9\n'); Line='3 9 4',write('3 4 9\n'); Line='3 9 5',write('3 5 9\n'); Line='3 9 6',write('3 6 9\n'); Line='3 9 7',write('3 7 9\n'); Line='3 9 8',write('3 8 9\n'); Line='3 9 9',write('3 9 9\n'); Line='3 9 10',write('3 9 10\n'); Line='3 10 1',write('1 3 10\n'); Line='3 10 2',write('2 3 10\n'); Line='3 10 3',write('3 3 10\n'); Line='3 10 4',write('3 4 10\n'); Line='3 10 5',write('3 5 10\n'); Line='3 10 6',write('3 6 10\n'); Line='3 10 7',write('3 7 10\n'); Line='3 10 8',write('3 8 10\n'); Line='3 10 9',write('3 9 10\n'); Line='3 10 10',write('3 10 10\n'); Line='4 1 1',write('1 1 4\n'); Line='4 1 2',write('1 2 4\n'); Line='4 1 3',write('1 3 4\n'); Line='4 1 4',write('1 4 4\n'); Line='4 1 5',write('1 4 5\n'); Line='4 1 6',write('1 4 6\n'); Line='4 1 7',write('1 4 7\n'); Line='4 1 8',write('1 4 8\n'); Line='4 1 9',write('1 4 9\n'); Line='4 1 10',write('1 4 10\n'); Line='4 2 1',write('1 2 4\n'); Line='4 2 2',write('2 2 4\n'); Line='4 2 3',write('2 3 4\n'); Line='4 2 4',write('2 4 4\n'); Line='4 2 5',write('2 4 5\n'); Line='4 2 6',write('2 4 6\n'); Line='4 2 7',write('2 4 7\n'); Line='4 2 8',write('2 4 8\n'); Line='4 2 9',write('2 4 9\n'); Line='4 2 10',write('2 4 10\n'); Line='4 3 1',write('1 3 4\n'); Line='4 3 2',write('2 3 4\n'); Line='4 3 3',write('3 3 4\n'); Line='4 3 4',write('3 4 4\n'); Line='4 3 5',write('3 4 5\n'); Line='4 3 6',write('3 4 6\n'); Line='4 3 7',write('3 4 7\n'); Line='4 3 8',write('3 4 8\n'); Line='4 3 9',write('3 4 9\n'); Line='4 3 10',write('3 4 10\n'); Line='4 4 1',write('1 4 4\n'); Line='4 4 2',write('2 4 4\n'); Line='4 4 3',write('3 4 4\n'); Line='4 4 4',write('4 4 4\n'); Line='4 4 5',write('4 4 5\n'); Line='4 4 6',write('4 4 6\n'); Line='4 4 7',write('4 4 7\n'); Line='4 4 8',write('4 4 8\n'); Line='4 4 9',write('4 4 9\n'); Line='4 4 10',write('4 4 10\n'); Line='4 5 1',write('1 4 5\n'); Line='4 5 2',write('2 4 5\n'); Line='4 5 3',write('3 4 5\n'); Line='4 5 4',write('4 4 5\n'); Line='4 5 5',write('4 5 5\n'); Line='4 5 6',write('4 5 6\n'); Line='4 5 7',write('4 5 7\n'); Line='4 5 8',write('4 5 8\n'); Line='4 5 9',write('4 5 9\n'); Line='4 5 10',write('4 5 10\n'); Line='4 6 1',write('1 4 6\n'); Line='4 6 2',write('2 4 6\n'); Line='4 6 3',write('3 4 6\n'); Line='4 6 4',write('4 4 6\n'); Line='4 6 5',write('4 5 6\n'); Line='4 6 6',write('4 6 6\n'); Line='4 6 7',write('4 6 7\n'); Line='4 6 8',write('4 6 8\n'); Line='4 6 9',write('4 6 9\n'); Line='4 6 10',write('4 6 10\n'); Line='4 7 1',write('1 4 7\n'); Line='4 7 2',write('2 4 7\n'); Line='4 7 3',write('3 4 7\n'); Line='4 7 4',write('4 4 7\n'); Line='4 7 5',write('4 5 7\n'); Line='4 7 6',write('4 6 7\n'); Line='4 7 7',write('4 7 7\n'); Line='4 7 8',write('4 7 8\n'); Line='4 7 9',write('4 7 9\n'); Line='4 7 10',write('4 7 10\n'); Line='4 8 1',write('1 4 8\n'); Line='4 8 2',write('2 4 8\n'); Line='4 8 3',write('3 4 8\n'); Line='4 8 4',write('4 4 8\n'); Line='4 8 5',write('4 5 8\n'); Line='4 8 6',write('4 6 8\n'); Line='4 8 7',write('4 7 8\n'); Line='4 8 8',write('4 8 8\n'); Line='4 8 9',write('4 8 9\n'); Line='4 8 10',write('4 8 10\n'); Line='4 9 1',write('1 4 9\n'); Line='4 9 2',write('2 4 9\n'); Line='4 9 3',write('3 4 9\n'); Line='4 9 4',write('4 4 9\n'); Line='4 9 5',write('4 5 9\n'); Line='4 9 6',write('4 6 9\n'); Line='4 9 7',write('4 7 9\n'); Line='4 9 8',write('4 8 9\n'); Line='4 9 9',write('4 9 9\n'); Line='4 9 10',write('4 9 10\n'); Line='4 10 1',write('1 4 10\n'); Line='4 10 2',write('2 4 10\n'); Line='4 10 3',write('3 4 10\n'); Line='4 10 4',write('4 4 10\n'); Line='4 10 5',write('4 5 10\n'); Line='4 10 6',write('4 6 10\n'); Line='4 10 7',write('4 7 10\n'); Line='4 10 8',write('4 8 10\n'); Line='4 10 9',write('4 9 10\n'); Line='4 10 10',write('4 10 10\n'); Line='5 1 1',write('1 1 5\n'); Line='5 1 2',write('1 2 5\n'); Line='5 1 3',write('1 3 5\n'); Line='5 1 4',write('1 4 5\n'); Line='5 1 5',write('1 5 5\n'); Line='5 1 6',write('1 5 6\n'); Line='5 1 7',write('1 5 7\n'); Line='5 1 8',write('1 5 8\n'); Line='5 1 9',write('1 5 9\n'); Line='5 1 10',write('1 5 10\n'); Line='5 2 1',write('1 2 5\n'); Line='5 2 2',write('2 2 5\n'); Line='5 2 3',write('2 3 5\n'); Line='5 2 4',write('2 4 5\n'); Line='5 2 5',write('2 5 5\n'); Line='5 2 6',write('2 5 6\n'); Line='5 2 7',write('2 5 7\n'); Line='5 2 8',write('2 5 8\n'); Line='5 2 9',write('2 5 9\n'); Line='5 2 10',write('2 5 10\n'); Line='5 3 1',write('1 3 5\n'); Line='5 3 2',write('2 3 5\n'); Line='5 3 3',write('3 3 5\n'); Line='5 3 4',write('3 4 5\n'); Line='5 3 5',write('3 5 5\n'); Line='5 3 6',write('3 5 6\n'); Line='5 3 7',write('3 5 7\n'); Line='5 3 8',write('3 5 8\n'); Line='5 3 9',write('3 5 9\n'); Line='5 3 10',write('3 5 10\n'); Line='5 4 1',write('1 4 5\n'); Line='5 4 2',write('2 4 5\n'); Line='5 4 3',write('3 4 5\n'); Line='5 4 4',write('4 4 5\n'); Line='5 4 5',write('4 5 5\n'); Line='5 4 6',write('4 5 6\n'); Line='5 4 7',write('4 5 7\n'); Line='5 4 8',write('4 5 8\n'); Line='5 4 9',write('4 5 9\n'); Line='5 4 10',write('4 5 10\n'); Line='5 5 1',write('1 5 5\n'); Line='5 5 2',write('2 5 5\n'); Line='5 5 3',write('3 5 5\n'); Line='5 5 4',write('4 5 5\n'); Line='5 5 5',write('5 5 5\n'); Line='5 5 6',write('5 5 6\n'); Line='5 5 7',write('5 5 7\n'); Line='5 5 8',write('5 5 8\n'); Line='5 5 9',write('5 5 9\n'); Line='5 5 10',write('5 5 10\n'); Line='5 6 1',write('1 5 6\n'); Line='5 6 2',write('2 5 6\n'); Line='5 6 3',write('3 5 6\n'); Line='5 6 4',write('4 5 6\n'); Line='5 6 5',write('5 5 6\n'); Line='5 6 6',write('5 6 6\n'); Line='5 6 7',write('5 6 7\n'); Line='5 6 8',write('5 6 8\n'); Line='5 6 9',write('5 6 9\n'); Line='5 6 10',write('5 6 10\n'); Line='5 7 1',write('1 5 7\n'); Line='5 7 2',write('2 5 7\n'); Line='5 7 3',write('3 5 7\n'); Line='5 7 4',write('4 5 7\n'); Line='5 7 5',write('5 5 7\n'); Line='5 7 6',write('5 6 7\n'); Line='5 7 7',write('5 7 7\n'); Line='5 7 8',write('5 7 8\n'); Line='5 7 9',write('5 7 9\n'); Line='5 7 10',write('5 7 10\n'); Line='5 8 1',write('1 5 8\n'); Line='5 8 2',write('2 5 8\n'); Line='5 8 3',write('3 5 8\n'); Line='5 8 4',write('4 5 8\n'); Line='5 8 5',write('5 5 8\n'); Line='5 8 6',write('5 6 8\n'); Line='5 8 7',write('5 7 8\n'); Line='5 8 8',write('5 8 8\n'); Line='5 8 9',write('5 8 9\n'); Line='5 8 10',write('5 8 10\n'); Line='5 9 1',write('1 5 9\n'); Line='5 9 2',write('2 5 9\n'); Line='5 9 3',write('3 5 9\n'); Line='5 9 4',write('4 5 9\n'); Line='5 9 5',write('5 5 9\n'); Line='5 9 6',write('5 6 9\n'); Line='5 9 7',write('5 7 9\n'); Line='5 9 8',write('5 8 9\n'); Line='5 9 9',write('5 9 9\n'); Line='5 9 10',write('5 9 10\n'); Line='5 10 1',write('1 5 10\n'); Line='5 10 2',write('2 5 10\n'); Line='5 10 3',write('3 5 10\n'); Line='5 10 4',write('4 5 10\n'); Line='5 10 5',write('5 5 10\n'); Line='5 10 6',write('5 6 10\n'); Line='5 10 7',write('5 7 10\n'); Line='5 10 8',write('5 8 10\n'); Line='5 10 9',write('5 9 10\n'); Line='5 10 10',write('5 10 10\n'); Line='6 1 1',write('1 1 6\n'); Line='6 1 2',write('1 2 6\n'); Line='6 1 3',write('1 3 6\n'); Line='6 1 4',write('1 4 6\n'); Line='6 1 5',write('1 5 6\n'); Line='6 1 6',write('1 6 6\n'); Line='6 1 7',write('1 6 7\n'); Line='6 1 8',write('1 6 8\n'); Line='6 1 9',write('1 6 9\n'); Line='6 1 10',write('1 6 10\n'); Line='6 2 1',write('1 2 6\n'); Line='6 2 2',write('2 2 6\n'); Line='6 2 3',write('2 3 6\n'); Line='6 2 4',write('2 4 6\n'); Line='6 2 5',write('2 5 6\n'); Line='6 2 6',write('2 6 6\n'); Line='6 2 7',write('2 6 7\n'); Line='6 2 8',write('2 6 8\n'); Line='6 2 9',write('2 6 9\n'); Line='6 2 10',write('2 6 10\n'); Line='6 3 1',write('1 3 6\n'); Line='6 3 2',write('2 3 6\n'); Line='6 3 3',write('3 3 6\n'); Line='6 3 4',write('3 4 6\n'); Line='6 3 5',write('3 5 6\n'); Line='6 3 6',write('3 6 6\n'); Line='6 3 7',write('3 6 7\n'); Line='6 3 8',write('3 6 8\n'); Line='6 3 9',write('3 6 9\n'); Line='6 3 10',write('3 6 10\n'); Line='6 4 1',write('1 4 6\n'); Line='6 4 2',write('2 4 6\n'); Line='6 4 3',write('3 4 6\n'); Line='6 4 4',write('4 4 6\n'); Line='6 4 5',write('4 5 6\n'); Line='6 4 6',write('4 6 6\n'); Line='6 4 7',write('4 6 7\n'); Line='6 4 8',write('4 6 8\n'); Line='6 4 9',write('4 6 9\n'); Line='6 4 10',write('4 6 10\n'); Line='6 5 1',write('1 5 6\n'); Line='6 5 2',write('2 5 6\n'); Line='6 5 3',write('3 5 6\n'); Line='6 5 4',write('4 5 6\n'); Line='6 5 5',write('5 5 6\n'); Line='6 5 6',write('5 6 6\n'); Line='6 5 7',write('5 6 7\n'); Line='6 5 8',write('5 6 8\n'); Line='6 5 9',write('5 6 9\n'); Line='6 5 10',write('5 6 10\n'); Line='6 6 1',write('1 6 6\n'); Line='6 6 2',write('2 6 6\n'); Line='6 6 3',write('3 6 6\n'); Line='6 6 4',write('4 6 6\n'); Line='6 6 5',write('5 6 6\n'); Line='6 6 6',write('6 6 6\n'); Line='6 6 7',write('6 6 7\n'); Line='6 6 8',write('6 6 8\n'); Line='6 6 9',write('6 6 9\n'); Line='6 6 10',write('6 6 10\n'); Line='6 7 1',write('1 6 7\n'); Line='6 7 2',write('2 6 7\n'); Line='6 7 3',write('3 6 7\n'); Line='6 7 4',write('4 6 7\n'); Line='6 7 5',write('5 6 7\n'); Line='6 7 6',write('6 6 7\n'); Line='6 7 7',write('6 7 7\n'); Line='6 7 8',write('6 7 8\n'); Line='6 7 9',write('6 7 9\n'); Line='6 7 10',write('6 7 10\n'); Line='6 8 1',write('1 6 8\n'); Line='6 8 2',write('2 6 8\n'); Line='6 8 3',write('3 6 8\n'); Line='6 8 4',write('4 6 8\n'); Line='6 8 5',write('5 6 8\n'); Line='6 8 6',write('6 6 8\n'); Line='6 8 7',write('6 7 8\n'); Line='6 8 8',write('6 8 8\n'); Line='6 8 9',write('6 8 9\n'); Line='6 8 10',write('6 8 10\n'); Line='6 9 1',write('1 6 9\n'); Line='6 9 2',write('2 6 9\n'); Line='6 9 3',write('3 6 9\n'); Line='6 9 4',write('4 6 9\n'); Line='6 9 5',write('5 6 9\n'); Line='6 9 6',write('6 6 9\n'); Line='6 9 7',write('6 7 9\n'); Line='6 9 8',write('6 8 9\n'); Line='6 9 9',write('6 9 9\n'); Line='6 9 10',write('6 9 10\n'); Line='6 10 1',write('1 6 10\n'); Line='6 10 2',write('2 6 10\n'); Line='6 10 3',write('3 6 10\n'); Line='6 10 4',write('4 6 10\n'); Line='6 10 5',write('5 6 10\n'); Line='6 10 6',write('6 6 10\n'); Line='6 10 7',write('6 7 10\n'); Line='6 10 8',write('6 8 10\n'); Line='6 10 9',write('6 9 10\n'); Line='6 10 10',write('6 10 10\n'); Line='7 1 1',write('1 1 7\n'); Line='7 1 2',write('1 2 7\n'); Line='7 1 3',write('1 3 7\n'); Line='7 1 4',write('1 4 7\n'); Line='7 1 5',write('1 5 7\n'); Line='7 1 6',write('1 6 7\n'); Line='7 1 7',write('1 7 7\n'); Line='7 1 8',write('1 7 8\n'); Line='7 1 9',write('1 7 9\n'); Line='7 1 10',write('1 7 10\n'); Line='7 2 1',write('1 2 7\n'); Line='7 2 2',write('2 2 7\n'); Line='7 2 3',write('2 3 7\n'); Line='7 2 4',write('2 4 7\n'); Line='7 2 5',write('2 5 7\n'); Line='7 2 6',write('2 6 7\n'); Line='7 2 7',write('2 7 7\n'); Line='7 2 8',write('2 7 8\n'); Line='7 2 9',write('2 7 9\n'); Line='7 2 10',write('2 7 10\n'); Line='7 3 1',write('1 3 7\n'); Line='7 3 2',write('2 3 7\n'); Line='7 3 3',write('3 3 7\n'); Line='7 3 4',write('3 4 7\n'); Line='7 3 5',write('3 5 7\n'); Line='7 3 6',write('3 6 7\n'); Line='7 3 7',write('3 7 7\n'); Line='7 3 8',write('3 7 8\n'); Line='7 3 9',write('3 7 9\n'); Line='7 3 10',write('3 7 10\n'); Line='7 4 1',write('1 4 7\n'); Line='7 4 2',write('2 4 7\n'); Line='7 4 3',write('3 4 7\n'); Line='7 4 4',write('4 4 7\n'); Line='7 4 5',write('4 5 7\n'); Line='7 4 6',write('4 6 7\n'); Line='7 4 7',write('4 7 7\n'); Line='7 4 8',write('4 7 8\n'); Line='7 4 9',write('4 7 9\n'); Line='7 4 10',write('4 7 10\n'); Line='7 5 1',write('1 5 7\n'); Line='7 5 2',write('2 5 7\n'); Line='7 5 3',write('3 5 7\n'); Line='7 5 4',write('4 5 7\n'); Line='7 5 5',write('5 5 7\n'); Line='7 5 6',write('5 6 7\n'); Line='7 5 7',write('5 7 7\n'); Line='7 5 8',write('5 7 8\n'); Line='7 5 9',write('5 7 9\n'); Line='7 5 10',write('5 7 10\n'); Line='7 6 1',write('1 6 7\n'); Line='7 6 2',write('2 6 7\n'); Line='7 6 3',write('3 6 7\n'); Line='7 6 4',write('4 6 7\n'); Line='7 6 5',write('5 6 7\n'); Line='7 6 6',write('6 6 7\n'); Line='7 6 7',write('6 7 7\n'); Line='7 6 8',write('6 7 8\n'); Line='7 6 9',write('6 7 9\n'); Line='7 6 10',write('6 7 10\n'); Line='7 7 1',write('1 7 7\n'); Line='7 7 2',write('2 7 7\n'); Line='7 7 3',write('3 7 7\n'); Line='7 7 4',write('4 7 7\n'); Line='7 7 5',write('5 7 7\n'); Line='7 7 6',write('6 7 7\n'); Line='7 7 7',write('7 7 7\n'); Line='7 7 8',write('7 7 8\n'); Line='7 7 9',write('7 7 9\n'); Line='7 7 10',write('7 7 10\n'); Line='7 8 1',write('1 7 8\n'); Line='7 8 2',write('2 7 8\n'); Line='7 8 3',write('3 7 8\n'); Line='7 8 4',write('4 7 8\n'); Line='7 8 5',write('5 7 8\n'); Line='7 8 6',write('6 7 8\n'); Line='7 8 7',write('7 7 8\n'); Line='7 8 8',write('7 8 8\n'); Line='7 8 9',write('7 8 9\n'); Line='7 8 10',write('7 8 10\n'); Line='7 9 1',write('1 7 9\n'); Line='7 9 2',write('2 7 9\n'); Line='7 9 3',write('3 7 9\n'); Line='7 9 4',write('4 7 9\n'); Line='7 9 5',write('5 7 9\n'); Line='7 9 6',write('6 7 9\n'); Line='7 9 7',write('7 7 9\n'); Line='7 9 8',write('7 8 9\n'); Line='7 9 9',write('7 9 9\n'); Line='7 9 10',write('7 9 10\n'); Line='7 10 1',write('1 7 10\n'); Line='7 10 2',write('2 7 10\n'); Line='7 10 3',write('3 7 10\n'); Line='7 10 4',write('4 7 10\n'); Line='7 10 5',write('5 7 10\n'); Line='7 10 6',write('6 7 10\n'); Line='7 10 7',write('7 7 10\n'); Line='7 10 8',write('7 8 10\n'); Line='7 10 9',write('7 9 10\n'); Line='7 10 10',write('7 10 10\n'); Line='8 1 1',write('1 1 8\n'); Line='8 1 2',write('1 2 8\n'); Line='8 1 3',write('1 3 8\n'); Line='8 1 4',write('1 4 8\n'); Line='8 1 5',write('1 5 8\n'); Line='8 1 6',write('1 6 8\n'); Line='8 1 7',write('1 7 8\n'); Line='8 1 8',write('1 8 8\n'); Line='8 1 9',write('1 8 9\n'); Line='8 1 10',write('1 8 10\n'); Line='8 2 1',write('1 2 8\n'); Line='8 2 2',write('2 2 8\n'); Line='8 2 3',write('2 3 8\n'); Line='8 2 4',write('2 4 8\n'); Line='8 2 5',write('2 5 8\n'); Line='8 2 6',write('2 6 8\n'); Line='8 2 7',write('2 7 8\n'); Line='8 2 8',write('2 8 8\n'); Line='8 2 9',write('2 8 9\n'); Line='8 2 10',write('2 8 10\n'); Line='8 3 1',write('1 3 8\n'); Line='8 3 2',write('2 3 8\n'); Line='8 3 3',write('3 3 8\n'); Line='8 3 4',write('3 4 8\n'); Line='8 3 5',write('3 5 8\n'); Line='8 3 6',write('3 6 8\n'); Line='8 3 7',write('3 7 8\n'); Line='8 3 8',write('3 8 8\n'); Line='8 3 9',write('3 8 9\n'); Line='8 3 10',write('3 8 10\n'); Line='8 4 1',write('1 4 8\n'); Line='8 4 2',write('2 4 8\n'); Line='8 4 3',write('3 4 8\n'); Line='8 4 4',write('4 4 8\n'); Line='8 4 5',write('4 5 8\n'); Line='8 4 6',write('4 6 8\n'); Line='8 4 7',write('4 7 8\n'); Line='8 4 8',write('4 8 8\n'); Line='8 4 9',write('4 8 9\n'); Line='8 4 10',write('4 8 10\n'); Line='8 5 1',write('1 5 8\n'); Line='8 5 2',write('2 5 8\n'); Line='8 5 3',write('3 5 8\n'); Line='8 5 4',write('4 5 8\n'); Line='8 5 5',write('5 5 8\n'); Line='8 5 6',write('5 6 8\n'); Line='8 5 7',write('5 7 8\n'); Line='8 5 8',write('5 8 8\n'); Line='8 5 9',write('5 8 9\n'); Line='8 5 10',write('5 8 10\n'); Line='8 6 1',write('1 6 8\n'); Line='8 6 2',write('2 6 8\n'); Line='8 6 3',write('3 6 8\n'); Line='8 6 4',write('4 6 8\n'); Line='8 6 5',write('5 6 8\n'); Line='8 6 6',write('6 6 8\n'); Line='8 6 7',write('6 7 8\n'); Line='8 6 8',write('6 8 8\n'); Line='8 6 9',write('6 8 9\n'); Line='8 6 10',write('6 8 10\n'); Line='8 7 1',write('1 7 8\n'); Line='8 7 2',write('2 7 8\n'); Line='8 7 3',write('3 7 8\n'); Line='8 7 4',write('4 7 8\n'); Line='8 7 5',write('5 7 8\n'); Line='8 7 6',write('6 7 8\n'); Line='8 7 7',write('7 7 8\n'); Line='8 7 8',write('7 8 8\n'); Line='8 7 9',write('7 8 9\n'); Line='8 7 10',write('7 8 10\n'); Line='8 8 1',write('1 8 8\n'); Line='8 8 2',write('2 8 8\n'); Line='8 8 3',write('3 8 8\n'); Line='8 8 4',write('4 8 8\n'); Line='8 8 5',write('5 8 8\n'); Line='8 8 6',write('6 8 8\n'); Line='8 8 7',write('7 8 8\n'); Line='8 8 8',write('8 8 8\n'); Line='8 8 9',write('8 8 9\n'); Line='8 8 10',write('8 8 10\n'); Line='8 9 1',write('1 8 9\n'); Line='8 9 2',write('2 8 9\n'); Line='8 9 3',write('3 8 9\n'); Line='8 9 4',write('4 8 9\n'); Line='8 9 5',write('5 8 9\n'); Line='8 9 6',write('6 8 9\n'); Line='8 9 7',write('7 8 9\n'); Line='8 9 8',write('8 8 9\n'); Line='8 9 9',write('8 9 9\n'); Line='8 9 10',write('8 9 10\n'); Line='8 10 1',write('1 8 10\n'); Line='8 10 2',write('2 8 10\n'); Line='8 10 3',write('3 8 10\n'); Line='8 10 4',write('4 8 10\n'); Line='8 10 5',write('5 8 10\n'); Line='8 10 6',write('6 8 10\n'); Line='8 10 7',write('7 8 10\n'); Line='8 10 8',write('8 8 10\n'); Line='8 10 9',write('8 9 10\n'); Line='8 10 10',write('8 10 10\n'); Line='9 1 1',write('1 1 9\n'); Line='9 1 2',write('1 2 9\n'); Line='9 1 3',write('1 3 9\n'); Line='9 1 4',write('1 4 9\n'); Line='9 1 5',write('1 5 9\n'); Line='9 1 6',write('1 6 9\n'); Line='9 1 7',write('1 7 9\n'); Line='9 1 8',write('1 8 9\n'); Line='9 1 9',write('1 9 9\n'); Line='9 1 10',write('1 9 10\n'); Line='9 2 1',write('1 2 9\n'); Line='9 2 2',write('2 2 9\n'); Line='9 2 3',write('2 3 9\n'); Line='9 2 4',write('2 4 9\n'); Line='9 2 5',write('2 5 9\n'); Line='9 2 6',write('2 6 9\n'); Line='9 2 7',write('2 7 9\n'); Line='9 2 8',write('2 8 9\n'); Line='9 2 9',write('2 9 9\n'); Line='9 2 10',write('2 9 10\n'); Line='9 3 1',write('1 3 9\n'); Line='9 3 2',write('2 3 9\n'); Line='9 3 3',write('3 3 9\n'); Line='9 3 4',write('3 4 9\n'); Line='9 3 5',write('3 5 9\n'); Line='9 3 6',write('3 6 9\n'); Line='9 3 7',write('3 7 9\n'); Line='9 3 8',write('3 8 9\n'); Line='9 3 9',write('3 9 9\n'); Line='9 3 10',write('3 9 10\n'); Line='9 4 1',write('1 4 9\n'); Line='9 4 2',write('2 4 9\n'); Line='9 4 3',write('3 4 9\n'); Line='9 4 4',write('4 4 9\n'); Line='9 4 5',write('4 5 9\n'); Line='9 4 6',write('4 6 9\n'); Line='9 4 7',write('4 7 9\n'); Line='9 4 8',write('4 8 9\n'); Line='9 4 9',write('4 9 9\n'); Line='9 4 10',write('4 9 10\n'); Line='9 5 1',write('1 5 9\n'); Line='9 5 2',write('2 5 9\n'); Line='9 5 3',write('3 5 9\n'); Line='9 5 4',write('4 5 9\n'); Line='9 5 5',write('5 5 9\n'); Line='9 5 6',write('5 6 9\n'); Line='9 5 7',write('5 7 9\n'); Line='9 5 8',write('5 8 9\n'); Line='9 5 9',write('5 9 9\n'); Line='9 5 10',write('5 9 10\n'); Line='9 6 1',write('1 6 9\n'); Line='9 6 2',write('2 6 9\n'); Line='9 6 3',write('3 6 9\n'); Line='9 6 4',write('4 6 9\n'); Line='9 6 5',write('5 6 9\n'); Line='9 6 6',write('6 6 9\n'); Line='9 6 7',write('6 7 9\n'); Line='9 6 8',write('6 8 9\n'); Line='9 6 9',write('6 9 9\n'); Line='9 6 10',write('6 9 10\n'); Line='9 7 1',write('1 7 9\n'); Line='9 7 2',write('2 7 9\n'); Line='9 7 3',write('3 7 9\n'); Line='9 7 4',write('4 7 9\n'); Line='9 7 5',write('5 7 9\n'); Line='9 7 6',write('6 7 9\n'); Line='9 7 7',write('7 7 9\n'); Line='9 7 8',write('7 8 9\n'); Line='9 7 9',write('7 9 9\n'); Line='9 7 10',write('7 9 10\n'); Line='9 8 1',write('1 8 9\n'); Line='9 8 2',write('2 8 9\n'); Line='9 8 3',write('3 8 9\n'); Line='9 8 4',write('4 8 9\n'); Line='9 8 5',write('5 8 9\n'); Line='9 8 6',write('6 8 9\n'); Line='9 8 7',write('7 8 9\n'); Line='9 8 8',write('8 8 9\n'); Line='9 8 9',write('8 9 9\n'); Line='9 8 10',write('8 9 10\n'); Line='9 9 1',write('1 9 9\n'); Line='9 9 2',write('2 9 9\n'); Line='9 9 3',write('3 9 9\n'); Line='9 9 4',write('4 9 9\n'); Line='9 9 5',write('5 9 9\n'); Line='9 9 6',write('6 9 9\n'); Line='9 9 7',write('7 9 9\n'); Line='9 9 8',write('8 9 9\n'); Line='9 9 9',write('9 9 9\n'); Line='9 9 10',write('9 9 10\n'); Line='9 10 1',write('1 9 10\n'); Line='9 10 2',write('2 9 10\n'); Line='9 10 3',write('3 9 10\n'); Line='9 10 4',write('4 9 10\n'); Line='9 10 5',write('5 9 10\n'); Line='9 10 6',write('6 9 10\n'); Line='9 10 7',write('7 9 10\n'); Line='9 10 8',write('8 9 10\n'); Line='9 10 9',write('9 9 10\n'); Line='9 10 10',write('9 10 10\n'); Line='10 1 1',write('1 1 10\n'); Line='10 1 2',write('1 2 10\n'); Line='10 1 3',write('1 3 10\n'); Line='10 1 4',write('1 4 10\n'); Line='10 1 5',write('1 5 10\n'); Line='10 1 6',write('1 6 10\n'); Line='10 1 7',write('1 7 10\n'); Line='10 1 8',write('1 8 10\n'); Line='10 1 9',write('1 9 10\n'); Line='10 1 10',write('1 10 10\n'); Line='10 2 1',write('1 2 10\n'); Line='10 2 2',write('2 2 10\n'); Line='10 2 3',write('2 3 10\n'); Line='10 2 4',write('2 4 10\n'); Line='10 2 5',write('2 5 10\n'); Line='10 2 6',write('2 6 10\n'); Line='10 2 7',write('2 7 10\n'); Line='10 2 8',write('2 8 10\n'); Line='10 2 9',write('2 9 10\n'); Line='10 2 10',write('2 10 10\n'); Line='10 3 1',write('1 3 10\n'); Line='10 3 2',write('2 3 10\n'); Line='10 3 3',write('3 3 10\n'); Line='10 3 4',write('3 4 10\n'); Line='10 3 5',write('3 5 10\n'); Line='10 3 6',write('3 6 10\n'); Line='10 3 7',write('3 7 10\n'); Line='10 3 8',write('3 8 10\n'); Line='10 3 9',write('3 9 10\n'); Line='10 3 10',write('3 10 10\n'); Line='10 4 1',write('1 4 10\n'); Line='10 4 2',write('2 4 10\n'); Line='10 4 3',write('3 4 10\n'); Line='10 4 4',write('4 4 10\n'); Line='10 4 5',write('4 5 10\n'); Line='10 4 6',write('4 6 10\n'); Line='10 4 7',write('4 7 10\n'); Line='10 4 8',write('4 8 10\n'); Line='10 4 9',write('4 9 10\n'); Line='10 4 10',write('4 10 10\n'); Line='10 5 1',write('1 5 10\n'); Line='10 5 2',write('2 5 10\n'); Line='10 5 3',write('3 5 10\n'); Line='10 5 4',write('4 5 10\n'); Line='10 5 5',write('5 5 10\n'); Line='10 5 6',write('5 6 10\n'); Line='10 5 7',write('5 7 10\n'); Line='10 5 8',write('5 8 10\n'); Line='10 5 9',write('5 9 10\n'); Line='10 5 10',write('5 10 10\n'); Line='10 6 1',write('1 6 10\n'); Line='10 6 2',write('2 6 10\n'); Line='10 6 3',write('3 6 10\n'); Line='10 6 4',write('4 6 10\n'); Line='10 6 5',write('5 6 10\n'); Line='10 6 6',write('6 6 10\n'); Line='10 6 7',write('6 7 10\n'); Line='10 6 8',write('6 8 10\n'); Line='10 6 9',write('6 9 10\n'); Line='10 6 10',write('6 10 10\n'); Line='10 7 1',write('1 7 10\n'); Line='10 7 2',write('2 7 10\n'); Line='10 7 3',write('3 7 10\n'); Line='10 7 4',write('4 7 10\n'); Line='10 7 5',write('5 7 10\n'); Line='10 7 6',write('6 7 10\n'); Line='10 7 7',write('7 7 10\n'); Line='10 7 8',write('7 8 10\n'); Line='10 7 9',write('7 9 10\n'); Line='10 7 10',write('7 10 10\n'); Line='10 8 1',write('1 8 10\n'); Line='10 8 2',write('2 8 10\n'); Line='10 8 3',write('3 8 10\n'); Line='10 8 4',write('4 8 10\n'); Line='10 8 5',write('5 8 10\n'); Line='10 8 6',write('6 8 10\n'); Line='10 8 7',write('7 8 10\n'); Line='10 8 8',write('8 8 10\n'); Line='10 8 9',write('8 9 10\n'); Line='10 8 10',write('8 10 10\n'); Line='10 9 1',write('1 9 10\n'); Line='10 9 2',write('2 9 10\n'); Line='10 9 3',write('3 9 10\n'); Line='10 9 4',write('4 9 10\n'); Line='10 9 5',write('5 9 10\n'); Line='10 9 6',write('6 9 10\n'); Line='10 9 7',write('7 9 10\n'); Line='10 9 8',write('8 9 10\n'); Line='10 9 9',write('9 9 10\n'); Line='10 9 10',write('9 10 10\n'); Line='10 10 1',write('1 10 10\n'); Line='10 10 2',write('2 10 10\n'); Line='10 10 3',write('3 10 10\n'); Line='10 10 4',write('4 10 10\n'); Line='10 10 5',write('5 10 10\n'); Line='10 10 6',write('6 10 10\n'); Line='10 10 7',write('7 10 10\n'); Line='10 10 8',write('8 10 10\n'); Line='10 10 9',write('9 10 10\n'); Line='10 10 10',write('10 10 10\n')). main :- write('入力された数値範囲を検査してください\n'), main. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/483 # # [1] C言語プログラミング初歩(専門学校) # [2] int型の配列変数A[64][32]をB[32][64]に代入する. # 次の対応があるようにすること # A[0][0] -> A[0][1] -> A[0][31] ->A[1][0] ->....->A[63][31] # B[0][0] -> B[0][1]-> B[0][31] -> B[0][32]->....->B[31][63] # (上の段と下の段が一致) # A[m][n]には値 (m+n) % 31が入っているものとする。 # [3] Windows Vista /Visual studio 2008/C言語 # [4] 2/15迄 # [5] 1月開講です。ポインタはまだ習ってません # # 'A[m][n]には値 (m+n) % 31が入っているものとする。'([],[]) :- !. 'A[m][n]には値 (m+n) % 31が入っているものとする。'(M,N,Y,X) :- N > 31, M2 is M + 1, 'A[m][n]には値 (m+n) % 31が入っているものとする。'(M,N,Y,X). 'A[m][n]には値 (m+n) % 31が入っているものとする。'(M,N,[],[]) :- !. ならびを2要素ごとに纏める([],[]) :- !. ならびを2要素ごとに纏める([L1,L2|R1],[L3|R2]) :-   append(L1,L2,L3),   ならびを2要素ごとに纏める(R1,R2). 'A[m][n]には値 (m+n) % 31が入っている'(A) :-   'A[m][n]には値 (m+n) % 31が入っている'(0,A),!. 'A[m][n]には値 (m+n) % 31が入っている'(M,[]) :- M > 31,!. 'A[m][n]には値 (m+n) % 31が入っている'(M,[L|R]) :-   'A[m][n]には値 (m+n) % 31が入っている'(M,0,L),   M2 is M + 1,   'A[m][n]には値 (m+n) % 31が入っている'(M2,R). 'A[m][n]には値 (m+n) % 31が入っている'(M,N,[]) :- N > 63,!. 'A[m][n]には値 (m+n) % 31が入っている'(M,N,[X|R]) :-   X is (M + N) mod 31,   N2 is N + 1,   'A[m][n]には値 (m+n) % 31が入っている'(M,N2,R),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/483 # # [1] C言語プログラミング初歩(専門学校) # [2] int型の配列変数A[64][32]をB[32][64]に代入する. # 次の対応があるようにすること # A[0][0] -> A[0][1] -> A[0][31] ->A[1][0] ->....->A[63][31] # B[0][0] -> B[0][1]-> B[0][31] -> B[0][32]->....->B[31][63] # (上の段と下の段が一致) # A[m][n]には値 (m+n) % 31が入っているものとする。 # [3] Windows Vista /Visual studio 2008/C言語 # [4] 2/15迄 # [5] 1月開講です。ポインタはまだ習ってません # # ならびを2要素ごとに纏める([],[]) :- !. ならびを2要素ごとに纏める([L1,L2|R1],[L3|R2]) :- append(L1,L2,L3), ならびを2要素ごとに纏める(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/307 # # [1] Cプログラミング入門: # [2] http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10460.txt # 'ソート方法 A を用いて配列 COM,MAN の要素をそれぞれ小さい順に並べる'(L1,L2) :- ソート方法A(L1,L2). ソート方法A(L1,L2) :- '作業用のならびとして、要素が100 個の変数であるならびWorkを用意する'(Work), 'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'(L1,Work), '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(0,L1,L2). '作業用のならびとして、要素が100 個の変数であるならびWorkを用意する'(Work) :- length(Work,100). 'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'([],Work) :- !. 'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'([N|R1],Work) :- M is N + 1, list_nth(M,Work,1), 'ソートしたいならびLの要素を順番に読んで、Work[ その値 ] を1に単一化する'(R1,Work),!. '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(_,[],[]) :- !. '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(N,[A|R1],[N|R2]) :- \+(var(A)), N2 is N + 1, '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(N2,R1,R2),!. '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(N,[V|R1],L2) :- var(V), N2 is N + 1, '全てのLの要素について行った後、変数でないWorkの要素を先頭からならびL2にコピー'(N2,R1,L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/245 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): # キーボードから正の整数nを入力し、n!を計算して画面表示するプログラムを # 作成せよ。ただし、階乗を計算する関数のプロトタイプを「void kaiyo(int , int *)」 # とし、第1引数にnを、第2引数に計算結果を格納する変数のポインタを指定すること。 # kaijo(0,1) :- !. kaijo(N,X) :- N1 is N - 1, kaijo(N1,Y), X is N * Y. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/309 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt # ●基本課題 2b(数式の値の計算) # # 課題 2a のプログラムに,算術式の値を計算して表示する機能を追加せよ. # ただし,変数の値は全て1であるとして,式の値を求めること. # # 例えば,入力が (2*3) と (x+(y+z)) の場合,次のような出力をすればよい. # show: に続いて入力された算術式を,eval: に続いて算術式の値を表示している. # # (2*3) ←入力 # show: (2*3) # eval: 6 # # (x+(y+z)) ←入力 # show: (x+(y+z)) # eval: 3 # # まず,算術式の値を求める関数 eval_exp()(exp.c にある)を完成させる. # 十分な数の検査データを使って動作の正しさを確かめよ. # 算術式の値を計算して表示 :-   get_line(Line),   算術式解析(Line,_,1,_,_式),   write_formatted('show:%t\n',[_式]),   X is _式,   write_formatted('eval:%t\n',[X]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/309 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10297.txt # ●基本課題 2a(数式の読み込みと表示) # # 課題 2a と 2b では,算術式を読み,表示し,値を求めるプログラムを作る. # # 限られた時間内で数式処理の本質部分を効率よく学ぶために, # 入力できる算術式の構文を,次の BNF で定めるものに限る. # # 定数 ::= 0 | 1 | … | 9 # 変数 ::= a | b | … | z | A | B | … | Z # 算術式 ::= 定数 # | 変数 # | (算術式+算術式) # | (算術式*算術式) # # つまり,1桁の定数や1文字の変数の和や積からなる式が入力である. # # 入力された算術式を読み込み,2分木データとして格納し,そのデータをもとに # 入力と同じ算術式を表示する,という処理(下図)を繰り返すプログラムを作れ. # 算術式解析(_文,_残りの文,_初期節番号,_終了節番号,_式) :- atom_chars(_文,Chars), 算術式(_初期節番号,_終了節番号,Chars,R,_式), atom_chars(_残りの文,R),!. 定数(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']),!. 変数(A) :- member(A,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]),!. 変数(A) :- member(A,['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']),!. 算術式(N1,N2,[A|R],R,B) :- 定数(A), atom_to_term(A,B,_), assertz(算術式構文木(N1,[],[],B)), N2 is N1 + 1,!. 算術式(N1,N2,[A|R],R,A) :- 変数(A), assertz(算術式構文木(N1,[],[],A)), N2 is N1 + 1,!. 算術式(N1,N2,L,R,'+'(S1,S2)) :- append(['('|L1],[')'|R],L),append(L2,['+'|L3],L1), N3 is N1 + 1, 算術式(N3,N4,L2,_,S1),算術式(N4,N2,L3,_,S2), assertz(算術式構文木(N1,N3,N4,'+')),!. 算術式(N1,N2,L,R,'*'(S1,S2)) :- append(['('|L1],[')'|R],L),append(L2,['*'|L3],L1), N3 is N1 + 1, 算術式(N3,N4,L2,_,S1),算術式(N4,N2,L3,_,S2), assertz(算術式構文木(N1,N3,N4,'*')),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/2 # # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10259.txt # # ●基本課題 1a (2分木データの生成と表示) # 2分木の節を格納するためのデータ構造(Tree 型)を,次のように定義する. # # typedef struct _tree { # char node; /* 節のデータ (1文字) */ # struct _tree *left; /* 左の子へのポインタ */ # struct _tree *right; /* 右の子へのポインタ */ # } Tree; # # 2分木の枝と葉のデータを生成するための次の2つの関数を作れ. # # Tree *branch(char x, Tree *l, Tree *r); # 節を格納する記憶領域を確保 # 節を初期化(節データを x,左右の子へのポインタを l, r に設定) # 生成した Tree 型データへのポインタを戻り値として返す # # Tree *leaf(char x); # 節を格納する記憶領域を確保 # 節を初期化(節データを x,左右の子へのポインタを NULL に設定) # 生成した Tree 型データへのポインタを戻り値として返す # 関数 branch() と leaf() を使って,算術式を表す2分木のデータを生成し, # 各2分木の根へのポインタを,Tree * 型の変数に格納せよ. # ●基本課題 1b (2分木を扱う再帰関数の作成) # # 2分木の「高さ」を求める関数 height() を作れ. # また,十分な数の検査データを作り,動作の正しさを検証せよ. branch(X,TreeL,TreeR,Tree,L1,L2) :- get_node_no(No), assertz('Tree'(No,X,TreeL,TreeR)), L2 = [No|L1]. leaf(X,Tree,L1,L2) :- get_node_no(No), assertz('Tree'(No,X,[],[])), L2 = [No|L1]. 算術式二分木の生成(_算術式,Tree) :- retract('Tree'(_)), 算術式の開始点(_開始点), 算術式二分木(_算術式,Tree,[],L2), asserta('Tree'(Tree)). 算術式二分木(Atom,Tree,L1,L2) :- atom(Atom), leaf(Atom,Tree,L1,L2),!. 算術式二分木((_式1,_式2),Tree,L1,L4) :- 算術式二分木(_式1,Tree1,L1,L2), 算術式二分木(_式2,tree2,L2,L3), branch(',',Tree1,Tree2,Tree,L3,L4),!. 算術式二分木(_式,Tree,L1,L4) :- function(_式,_関数,2), arg(1,_式,_式1), arg(2,_式,_式2), 算術式二分木(_式1,Tree1,L1,L2), 算術式二分木(_式2,Tree2,L2,L3),), branch(_関数,Tree1,Tree2,Tree,L3,L4),!. get_node_no(L,No) :- repeat, No is randam mod 3711219, \+(member(No,L)),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/949 # # # /* オリジナル関数calc */ # /* calc(入力データ、計算結果のアドレスを格納するポインタ) */ # int calc(double input_data, double * data_ptr) # { # /*ポインタを使って、呼び出し元のデータ格納場所に値を設定 */ # *data_ptr = input_data * 2; # return0; /* 正常終了 */ # } # # 上記プログラムを参考に、 # 二つの入力データの変数(倍精度実数型) # double input_data1, input_data2; # に対しての、四則演算(+、−、*、/)の結果を、それぞれ # double plus_data, minus_data, multiply_data, divide_data; # の4変数に設定する機能を持つ、オリジナル関数calcを作成せよ。 # ただし、main関数上でのcalc関数の呼び出し方法は、以下のようにすること。 # calc(inpt_data1, input_data2, &plus_data, &minus_data, &multiply_data, _data); # 最後に、main関数上で上記4変数に格納された計算結果を画面に出力せよ。 # 以上の仕様のプログラムを、calc.cという名前で作成せよ。 # calc.cをVisual Studioで実行して、実行結果をcalc.c内の文末に「コメント行」として記載せよ 。 # program :- user_parameters([Atom1,Atom2]), atom_to_term(Atom1,Input_data1,_), atom_to_term(Atom2,Input_data2,_), calc(Input_data1,Input_data2,Plus_data,Minus_data,Multiply_data,Divide_data), write_formatted('%t + %t = %t\n',[Input_data1,Input_data2,Plus_data]), write_formatted('%t - %t = %t\n',[Input_data1,Input_data2,Minus_data]), write_formatted('%t * %t = %t\n',[Input_data1,Input_data2,Multiply_data]), write_formatted('%t / %t = %t\n',[Input_data1,Input_data2,Divide_data]). calc(Input_data1,Input_data2,Plus_data,Minus_data,Multiply_data,Divide_data) :- Plus_data is Input_data1 + Input_data2, Minus_data is Input_data1 - Input_data2, Multiply_data is Input_data1 * Input_data2, Divide_data is Input_data1 / Input_data2. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/584 # # 【 課題 】 http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/main.htm の857です # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI  】指定なし # 【 期限 】12/11 # 【 Ver  】1.6.0_16 # # よろしくお願いします # # # 以下の2文を同一と認識できるようなプログラムを作成せよ # ?が先頭の単語は変数とする # # ・?x is ?y and ?x name(?x) # ・Rose is rose and ?y name(Rose) # '2文を同一と認識'(_文1,_文2) :-   'SPLIT'(_文1,[' ','(',')'],L1),delete_space(L1,L11),   'SPLIT'(_文2,[' ','(',')'],L2),delete_space(L2,L22),    変数置換(L11,L22,X,Y),    X = Y. delete_space(L1,L2) :- findall(A,(member(A,L1),\+(A=' ')),L2). 変数置換(L1,L2,VL1,VL2) :-   length(L1,Len),length(VL1,Len),length(VL2,Len),   append(L1,L2,L3),   変数置換の二(X,L3,L4),   append(VL1,VL2,L4). 変数置換の二(_,[],[]) :- !. 変数置換の二(X,[A1|R1],[X|R2]) :-   \+(var(A1)),atom(A1),   sub_atom(A1,0,2,_,'?x'),   変数置換の二(X,R1,R2),!. 変数置換の二(X,[A1|R1],[_|R2]) :-   \+(var(A1)),atom(A1),   sub_atom(A1,0,2,_,'?y'),   変数置換の二(X,R1,R2),!. 変数置換の二(X,[A|R1],[A|R2]) :-   変数置換の二(X,R1,R2),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/841 # # [1] 授業単元: C言語演習編 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10252.txt # # 問題1: # 文字列(128文字未満)を読み込み、その長さを表示するプログラムを作成せよ。 # ただし、文字列の走査には、ポインタ変数を使用すること。文字列操作関数を用いないこと。 # # 問題2: # 問題1の読み込み部分をファイル処理に変更せよ。 fgetc()関数を使用すること。 # コマンドラインにファイル名が指定できること。ただし、ファイル名を指定しない場合は標準入力とすること。 '文字列(128文字未満)を読み込み、その長さを表示する' :- get_char(C), '文字列(128文字未満)を読み込む'(C,L), length(L,N), write_formatted('%t文字です\n',[N]). '文字列(128文字未満)を読み込む'('\n',[]) :- !. '文字列(128文字未満)を読み込む'(C,[C|R]) :- get_char(C2), '文字列(128文字未満)を読み込む'(C2,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% program :- user_parameters([_ファイル名]), open(_ファイル名,read,Instream), get_char(Instream,C), '文字列(128文字未満)を読み込む'(Instream,C,L), length(L,N), write_formatted('%t文字です\n',[N]), close(Instream). '文字列(128文字未満)を読み込む'(_,'\n',[]) :- !. '文字列(128文字未満)を読み込む'(Instream,C,[C|R]) :- get_char(Instream,C2), '文字列(128文字未満)を読み込む'(Instream,C2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1222224721/610 # # # 鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか # を表示する。(ヒント:頭の数と足の数を変数として,鶴の数と亀の数について # 連立方程式を作り,解を与える式の値を表示させればよい) # %%%%%%%%%%%%%%%%%%% 第一案 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :- 催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計), 催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計), findall(N,for(0,N,_鶴と亀の頭の数の合計),L), 重複順列(L,2,[A,B]), _鶴と亀の頭の数の合計 is A + B, _鶴と亀の足の数の合計 is 2 * A + 4 * B, writef('鶴が%t羽、亀が%t匹。\n',[A,B]). %%%%%%%%%%%%%%%%%%% 第二案 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか :- 催促付き整数入力('鶴と亀の頭の数合計 : ',_鶴と亀の頭の数の合計), 催促付き整数入力('鶴と亀の足の数の合計 : ',_鶴と亀の足の数の合計), 既約ガウス行列に変形([[1,1,_鶴と亀の頭の数の合計],[2,4,_鶴と亀の足の数の合計]],[[_,_,_鶴何羽],[_,_,_亀何匹]]), write_formatted('鶴が%t羽、亀が%t匹\n',[_鶴何羽,_亀何匹]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 鶴亀算(_鶴と亀の頭の数の合計,_鶴と亀の足の数の合計,_鶴が何羽,_亀が何匹) :- 既約ガウス行列に変形([[1,1,_鶴と亀の頭の数の合計],[2,4,_鶴と亀の足の数の合計]],[[_,_,_鶴が何羽],[_,_,_亀が何匹]]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 本来の鶴亀算 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 一羽の鶴の足の数(2). 一匹の亀の足の数(4). 鶴亀算(_鶴と亀の頭の数の合計,_鶴と亀の足の数の合計,_鶴が何羽,_亀が何匹) :- 仮に全部鶴だったらどうなるか考えよう(_鶴と亀の頭の数の合計,_仮の鶴と亀の足の数の合計), 実際の鶴と亀の足の数の合計は仮の鶴と亀の足の数の合計より多いことを確認しよう(_仮の鶴と亀の足の数の合計,_鶴と亀の足の数の合計), 実際の鶴と亀の足の数の合計との差は(_仮の鶴と亀の足の数の合計,_鶴と亀の足の数の合計,_実際の鶴と亀の足の合計との差), この差が生じたのは亀が鶴に混じるとその分足の数も多くなるからであり, 亀の数の分だけ一匹の亀の足が一羽の鶴よりも多い分だけの差が生じている考えられる, ということは, 亀の数は(_実際の鶴と亀の足の合計との差,_亀が何匹), 鶴の数は頭の合計から亀の数を引けばよい(_鶴と亀の頭の数の合計,_亀が何匹,_鶴が何羽). 仮に全部鶴だったらどうなるか考えよう(_鶴と亀の頭の数の合計,_仮に全部鶴だとした場合の足の数の合計) :- 一羽の鶴の足の数(_一羽の鶴の足の数), _仮に全部鶴だとした場合の足の数の合計 is _一羽の鶴の足の数 * _鶴と亀の頭の数の合計. 実際の鶴と亀の足の数の合計は仮の鶴と亀の足の数の合計より多いことを確認しよう(_仮の鶴と亀の足の数の合計,_鶴と亀の足の数の合計) :- _鶴と亀の足の数の合計 > _仮の鶴と亀の足の数の合計. 実際の鶴と亀の足の数の合計との差は(_仮に全部鶴だとした場合の足の数の合計,_鶴と亀の足の数の合計,_実際の鶴と亀の足の合計との差) :- _実際の鶴と亀の足の合計との差 is _鶴と亀の足の数の合計 - _仮に全部鶴だとした場合の足の数の合計. 亀の数は(_実際の鶴と亀の足の合計との差,_亀が何匹) :- 一羽の鶴の足の数(_一羽の鶴の足の数), 一匹の亀の足の数(_一匹の亀の足の数), _亀が何匹 is _実際の鶴と亀の足の合計との差 // (_一匹の亀の足の数 - _一羽の鶴の足の数). 鶴の数は頭の合計から亀の数を引けばよい(_鶴と亀の頭の数の合計,_亀が何匹,_鶴が何羽) :- _鶴が何羽 is _鶴と亀の頭の数の合計 - _亀が何匹. この差が生じたのは亀が鶴に混じるとその分足の数も多くなるからであり. 亀の数の分だけ一匹の亀の足が一羽の鶴よりも多い分だけの差が生じている考えられる. ということは. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 鶴亀算でどうしても課題として残ることは、最初に鶴に着目して考え始めるか % そうではなくて亀なのか。ここら辺りの曖昧さ、恣意性をどう表現するかだろう。 % /* 最初に、鶴か亀に着眼する(鶴) :- 0 is random mod 2,!. 最初に、鶴か亀に着眼する(亀). 鶴と亀とどちらが足が多いか(亀) :- 一羽の鶴の足の数(_鶴の足の数), 一匹の亀の足の数(_亀の足の数), _亀の足の数 > _鶴の足の数,!. 鶴と亀とどちらが足が多いか(鶴). */ % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/664 # # [1] C言語 # [2] 問題文(含コード&リンク): # 問題2 double型の配列とint型の引数を持ち, double型の戻値を持つ関 # 数を考える。第一引数のdouble型の配列の要素数が第二引数で # 与えられるとして, 第一引数のdouble 型の配列に格納されてい # る値のうち最大のものを戻値として返す関数 max_d_array() を # 作成し, 動作確認できるプログラムとして作成して rep08.c と # して提出せよ。 # ただし, max_d_array() 内部ではいかなる関数も呼んではな # らず, 制御構文としては while()文, if()文, return文のみを # 用いて実装しなければならない。do-while()文, for()文, # switch-case文, goto文, 条件式(三項演算子?:)は使ってはなら # ない。三項演算子以外の各種演算子と変数は自由に使って良い。 max_d_list(L,N,Max) :- max_d_list([D|R],N,D,Max). max_d_list([],_,Max,Max) :- !. max_d_list(_,0,Max,Max) :- !. max_d_list([D|R],N,Max1,Max) :-   Max1 >= D,   N1 is N - 1,   max_d_list(R,N1,Max1,Max). max_d_list([D|R],N,Max1,Max) :-   Max1 < D,   N1 is N - 1,   max_d_list(R,N1,D,Max). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/589 # # [1]C言語入門 # [2] 3つの整数x,y,zを入力し、これらを引数として、大きい順に入れ替えて返す関数をつくれ。ただしポインタ変数を用いること。 # main関数は整数の入力と結果の表示のみにする。 # '3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,X,Y,Z) :- X >= Y,Y >= Z. '3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,X,Z,Y) :- X >= Z,Z >= Y. '3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,Y,X,Z) :- Y >= X,X >= Z. '3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,Y,Z,X) :- Y >= Z,Z >= X. '3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,Z,X,Y) :- Z >= X,X >= Y. '3つの整数x,y,zを引数として、大きい順に入れ替えて返す'(X,Y,Z,Z,Y,X) :- Z >= Y,Y >= X. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :-   データファイルの読み出し(_ファイル名,N,_価格ならび,_重さならび),   findall(M,for(1,M,N),_1からNまで),   findmax(_合計価格,詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格),_詰めることのできる最高合計金額). データファイルの読み出し(_ファイル名,N,_重さならび,_価格ならび) :-   see(_ファイル名),get_integer(N),get_integers(L1),seen,   length(L2,N),length(L3,N),   append(_重さならび,_価格ならび,L1),!. 詰め物の作成(N,_1からNまで,_許容最大重量,_重さならび,_価格ならび,_合計価格) :-   for(1,M,N),   組合せ(_1からNまで,M,L),   findsum(Wi,(member(A,L),list_nth(A,_重さならび,Wi)),_合計重量),   _合計重量 =< _許容最大重量,   findsum(Pi,(member(A,L),list_nth(A,_価格ならび,Pi)),_合計金額). get_integers(L) :-   findall(I,(get_line(Line),(Line=end_of_file,!,fail;atom_to_term(Line,I,_))),L),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/438 # # 1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10181.txt # # 〜課題2〜 # 変数nを入力すると、以下の図のような表示を行うプログラムをそれぞれ作成せよ。ただし、図はn=5の場合である。 # 1つのプログラムとして作成せよ。 # # *   #     *** # ***** # ******* # ********* ピラミッド(N) :- length(L1,N), all(L1,' '), ピラミッド(L1,[*]). ピラミッド([],HL) :- concat_atom(HL,S),write_formatted('%t\n',[S]). ピラミッド([_|L1],HL) :- append(L1,HL,L1,L2), concat_atom(L2,S), write_formatted('%t\n',[S]), ピラミッド(L1,['**'|HL]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/438 # # 1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10181.txt # # 〜課題1〜 # 変数a,b,cへ値を読み込み、方程式ax2(axの二乗)+bx+c=0の会を出力するプログラムを作成せよ。ただし、a=/0(aノット0)の場合の判別式はD=b2-4acで与えられるものとし、 # 解の公式は-b+-4ac/2aで与えられるものとする。虚数解となる場合はたとえばx=3+5i,x=3-5iのように実数部と虚数部がわかるように出力せよ。すべての場合を見落とさず考えよ。 # ルートの関数はsqrt関数を使う。たとえば√2.5を求める場合、 # double a; # a=sqrt(2.5); /*√2.5をaに代入*/ # のように書く。ただし、sqrtの()内に与えられる数(変数も指定できる)は正の実数(double型)でなければならない。 # :- op(250,xf,i). 二次方程式の解(0,B,C,X) :- X is (-1) * C / B. 二次方程式の解(A,B,C,X) :-   0.0 is B^2 - 4 * A * C,   X is ((-1) * B) / (2 * A). 二次方程式の解(A,B,C,X) :-   U is B^2 - 4 * A * C,   U > 0.0,   X is ((-1) * B) + sqrt(U)) / (2 * A). 二次方程式の解(A,B,C,X) :-   U is B^2 - 4 * A * C,   U > 0.0,   X is ((-1) * B) - sqrt(U)) / (2 * A). 二次方程式の解(A,B,C,(D+Ei)) :-   U is B^2 - 4 * A * C,   U < 0.0,   D is ((-1) * B) / (2 * A),   E is U / (2 * A). 二次方程式の解(A,B,C,(D-Ei)) :-   U is B^2 - 4 * A * C,   U < 0.0,   D is ((-1) * B) / (2 * A),   E is U / (2 * A). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/368 # # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10180.txt # # 〜課題5〜 # 次の要領でテストの点数を入力し、それぞれの点数代の人数が何人いるか求めるプログラムを作成しなさい。 # # 1、テストの点数を入力するガイダンスを用いて次のように出力しなさい:点数を入力しなさい、終了条件:eあるいはE # 2、fget()を用いて、テストの点数を文字列として入力しなさい # 3、1で入力した文字列がeあるいはEであるとき、処理2〜5の処理を終了して6の処理を行いなさい # 4、文字列で入力した点数をint型変数に変換しなさい(atoiを使用しなさい) # 5、4で変換したint型の点数が0点以上100点以下なら、次のそれぞれの点数代の人数を数えなさい。 # 6,5の結果を表示しなさい。 テストの点数を入力し、それぞれの点数代の人数が何人いるか求める :- get_line(Line), テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,[0,0,0,0,0,0,0,0,0,0,0],L), それぞれの点数台の人数が何人いるか表示(L). それぞれの点数台の人数が何人いるか表示(L) :- append(L1,[M|L2],L), length(L1,N), write_formatted('%2d~%2d点台は%t人です。\n',[N*10,N*10+9,M]), N = 9, last(L,M11), write_formatted(' 100点は%t人です。\n',[M11]). テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(e,L,L). テストの点数を入力し、それぞれの点数代の人数が何人いるか求める('E',L,L). テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,L1,L) :- atom_to_term(Line,N,_), 点数台集計に加算(N,L1,L2), get_line(Line2), テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line2,L2,L). 点数台集計に加算(N,L1,L2) :- N1 is N // 10, length(L0,N1), append(L0,[M|L3],L1), M2 is M + 1, append(L0,[M2|L3],L2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/354 # # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク): # (1)http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10174.txt # 次のように各0番目の列要素にテストの点数を初期設定にしてある大きさ # 10×2の配列がある。この配列の1番目の列要素に点数の高い順から順位を格納するプログラムを作成しなさい。 # #   [0] [1] # [0] 67 # [1] 43 # [2] 56 # [3] 97 # [4] 30 # [5] 88 # [6] 76 # [7] 55 # [8] 66 # [9] 78 配列([[67,_],[43,_],[56,_],[97,_],[30,_],[88,_],[76,_],[55,_],[66,_],[78,_]]). 配列の1番目の列要素に点数の高い順から順位を格納する(L) :-   配列(L),   順位付け(L,[],_順位ならび),   第二要素に順位をセット(L,_順位ならび). 順位付け([],X,X). 順位付け([[A,_]|R1],Y1,X) :- 挿入(A,Y1,Y2),順位付け(R1,Y2,X). 挿入(A,[],[A]). 挿入(A,[B|R],[A,B|R]) :- A > B,!. 挿入(A,[B|R1],[B|R2]) :- A =< B,挿入(A,R1,R2). 第二要素に順位をセット([[A|V]|R],_順位ならび) :-   list_nth(V,_順位ならび,A),   第二要素に順位をセット(R,_順位ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/330 # # [1] 授業単元:プログラム # [2]問題文 # 次の要領でテストの点数を入力し、それぞれの点数代の人数が何人いるか求めるプログラム # 1.テストの点数を入力するガイダンスを用いて次のように出力 :点数の入力 終了条件:eあるいはE # 2.fgets()を用いて、テストの点数を文字列として入力 # 3.2で入力した文字列が'e'または'E'ならば処理2〜5の処理を終了して6の処理を行う # 4.文字列で入力した点数をint型変数に変換(atoiを使用する) # 5.4で変換したint型の点数が0点以上100点以下なら、それぞれの点数代の人数を数える。 # 6.5の結果の表示 テストの点数を入力し、それぞれの点数代の人数が何人いるか求める :-   write(':点数の入力 終了条件:eあるいはE '),get_line(Line),   テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,[0,0,0,0,0,0,0,0,0,0],_10点ごと出現頻度ならび),   for(1,N,10),   list_nth(N,_10点ごと出現頻度ならび,M),   write_formatted('%t~%t %t人\n',[(N-1) * 10,N * 10 - 1,M]),   N = 10. テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(e,L,L) :- !. テストの点数を入力し、それぞれの点数代の人数が何人いるか求める('E',L,L) :- !. テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line,L1,L) :-   atom_to_term(Line,N,_),N >= 0,N =< 100,   M is (N // 10) + 1,   出現頻度ならびをカウントアップ(N,L1,L2),   write(':点数の入力 終了条件:eあるいはE '),get_line(Line2),   テストの点数を入力し、それぞれの点数代の人数が何人いるか求める(Line2,L2,L). 出現頻度ならびをカウントアップ(C,[],[1,C]) :- !. 出現頻度ならびをカウントアップ(C,[[N,C]|R1],[[N2,C]|R1]) :- N2 is N + 1,!. 出現頻度ならびをカウントアップ(C,[[N,C1]|R1],[[N,C1]|R2]) :- 出現頻度ならびをカウントアップ(C,R1,R2). % 以下のサイトは # 次の手順に従って,入力された値の最大値を求めるプログラムを作成せよ. # # 1. 空のリストを変数intlistにセットする. # 2. キーボードから整数を1つ読み込み, # * 整数が負の値だったら,読み込みは終了して3.へ進む. # * それ以外だったら,intlistの最後にその数を追加して2.を繰り返す. # 3. 最大値を覚える変数maxnumを用意し,初期値として適切な値(各自で考えること)を代入する. # 4. リストに入っている整数を順に変数iに代入しながら,リストの値がなくなるまで次の操作を繰り返す. # * maxnumとiの値を比較し,iの方が大きければ,maxnumの値をiで置き換える. # 5. 最後にmaxnumに入っている値が最大値なので,それを表示する. # 示された手順に従って入力された値の最大値を表示する :- get_integer(N), 読み込み(N,[],L), L = [A|R], 最大値の表示(A,R). 読み込み(N,L,L) :- N < 0. 読み込み(N,L1,L) :- N >= 0, append(L1,[N],L2), get_integer(N2), 読み込み(N2,L2,L). 最大値の表示(A,[]) :- write(A). 最大値の表示(A,[B|R]) :- A < B, 最大値の表示(B,R). 最大値の表示(A,[B|R]) :- A >= B, 最大値の表示(A,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/949 # # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10114.txt # 以下のプログラムを作成せよ # # 9個のマスがあり、1〜9の数字が一個だけ入るとする。 # このとき、符号なし整数1つでマスにまだ入れられていない数字を記録したい。 # そこで、下位ビットから9ビット目までで1〜9がマスに入っているかどうかを表すこととする。 # 空白のマスは0で表示する。 # # 例:132584090→下位9ビット:001100000 # この場合、6もしくは7がマスに入っていないため、6ビット目と7ビット目に1が立っていることとなる。 # # 課題プログラムを実行すると、in.txtから9個の文字データを読み込み、上記のような変換をして9ビットのデータのビット列を表示する。 # 例えば132584090とin.txtに記録されていた場合、下位9ビットは # 001100000と表示される # # 手順 # 1..ビット列を記録する変数を宣言し、0で初期化する。 # 2..9個の数字を9個の変数に ファイルから読み込む # 3..各変数には0〜9の数字が入っているが、0以外の場合に対応する桁に1を立てる # 4..ビット列の 0と1を反転させる # 5..下位9ビットをprintf関数で表示する # # 6..in.txtの値をいろいろ変化させて、プログラムが正しいことを確認せよ # # 発展課題: # in.txtに9x9の以下のような数字列を入れておく. # 縦と横に必ず1から9までの数字が並ぶとする。ここで各行、各列の空白(空白は0で表す)に入りうる数字をビット列で表せ。 # # 9行、9列なので、18個の整数データとなる。 # # 次に、空白があれば、どのように処理すれば、空白に入る数字を決めることができるか、考えよ。 # # 1 2 3 4 0 6 0 8 9 # 2 3 4 5 6 7 8 9 1 # 3 4 5 0 7 0 9 1 2 # 0 5 6 7 8 9 1 2 3 # 5 6 7 8 9 1 2 3 4 # 6 7 0 9 0 2 3 4 5 # 7 8 9 1 2 3 4 5 6 # 8 0 1 2 3 4 5 0 7 # 9 1 2 3 4 5 6 7 8 # # 1行目-> 001010000 # 5列目-> 000010001 c2_949 :- get_lines('in.txt',L), findall(L2,(member(A,L),split(A,[' '],L2)),L3), findall([N,L5],(member(L4,L3),欠落した番号ビット(L4,L5)),L6), c2_949_表示(L6). 欠落した番号ビット(L1,L2) :- length(L2,9), findall(N,(for(1,N,9),\+(member(N,L1)),L3), 欠落した番号ビット(9,L3,L2). 欠落した番号ビット(N,_,[]) :- N < 1. 欠落した番号ビット(N,L,[0|R]) :-. \+(member(N,L)), N1 is N - 1, 欠落した番号ビット(N1,L,R). 欠落した番号ビット(N,L,[1|R]) :-. member(N,L), N1 is N - 1, 欠落した番号ビット(N1,L,R). c2_949_表示([]) :- !. c2_949_表示([[N,L]|R]) :- concat_atom(L,' ',S), write_formatted('%t 行目: %t\n',[S]), c2_949_表示(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/821 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10090.txt # # 1. # 2次方程式の解:1次元変数c[2]を関数polyに送り、c[0]x^2+c[1]x+c[2]=0の二つの解(実部と虚部:xre[2],xim[2])をpolyから受け取って、2つの解を表示するプログラムを作れ(引数は、c,xre,ximとなる) # # 2. # 以下のa[2][2],b[2][2],c[2][2],d[2][2]を関数conにて作成し、a*b*c*dの行列の積を計算して表示するプログラムを作れ # (ヒント:a,b,c,dは式で成分を与え、またmatを使えば行列の積は簡単にできる。) # a[i][j]=2 0 # 0 2 # b[i][j]=5 10 # 10 15 # c[i][j]=0 1 # -1 0 # d[i][j]=-0.2 0.1 # -0.3 0.2 # % 以下のサイトは :- op(700,xfx,は). % *** user: 'ABC分析パラメータ' / 3 *** 'ABC分析パラメータ'('A',0.0e+00,0.7). 'ABC分析パラメータ'('B',0.7,0.9). 'ABC分析パラメータ'('C',9.0,1.0). 'ABC分析'(X,A,B,C) :- '加算'(X,[_,S]), findall([U,L1],(append(L1,L2,X) , '加算'(L1,[_,D]) , U is D / S , U < 0.7),L), max(L,A), A = [W1,L3], append(L3,L4,X), findall([V,L5],(append(L5,L6,L4) , '加算'(L5,[_,E]) , V is E / S , V < 0.2),L7), max(L7,B), B = [W2,L8], append(L8,L9,L4), W3 is 1 - W1 - W2, C = [W3,L9], !. % *** user: 'ABC分析' / 7 *** 'ABC分析'(X,PerA,PerB,PerC,A,B,C) :- '加算'(X,[_,S]), 'ABC分析パラメータ'('A',Ap1,Ap2), 'ABC分析の二'(X,S,Ap1,Ap2,PerA,A), append(A,L2,X), 'ABC分析パラメータ'('B',Bp1,Bp2), 'ABC分析の二'(L2,S,0.0e+00,Bp2 - PerA,PerB,B), append(B,C,L2), PerC is 1 - PerA - PerB, !. % *** user: 'ABC分析の二' / 6 *** 'ABC分析の二'(L,S,Per1,Per2,PerX,X) :- findall([U,L1],(append(L1,_,L) , '加算'(L1,[_,D]) , U is D / S , U > Per1 , U =< Per2),L2), max(L2,Y), Y = [PerX,X], !. % *** 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), m_trans([L|R],L1), '加算_2'(L1,SL), !. '加算'(X,S) :- '加算_1'(X,0.0e+00,S) . % *** user: ('は') / 2 *** _項 'は' (_ネットワーク :: _式) :- _ネットワーク :: _項 'は' _式, !. _評価項 'は' N : L :- M 'は' N, L1 'は' L, list_nth(M,L1,_評価項), !. _評価項 'は' prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 'は' [X|{P}] :- findall(X,P,_評価値), !. _評価項 'は' ` _値 :- !, _評価項 = _値, !. _項 'は' _式 :- var(_式), _項 = _式, !. _項 'は' _式 :- error_protect('一時関数定義'(_式,_項),fail) . _項 'は' _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, !. _項 'は' _式 :- '二項組込み関数'(_式), '二項組込み関数の評価'(_式,_項) . _項 'は' _式 :- '二項組込み関数'(_式), !, fail . _項 'は' _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y 'は' Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, !. _項 'は' _式 :- atom(_式), error_protect(get_global(_式,_項),fail), !. _項 'は' _式 :- real(_式), _項 = _式, !. _項 'は' _式 :- real(_式), !, fail . _項 'は' _式 :- list(_式), findall(X,(member(U,_式) , X 'は' U),_項) . _項 'は' _式 :- list(_式), !, fail . _項 'は' _erlang_module : _erlang関数 :- 'erlang関数評価'(_erlang_module : _erlang関数,_項), !. _項 'は' _式 :- '関数定義'(_式,_項), !. _項 'は' _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), '関数評価に於いて引数部分の関数評価'(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 'は' _評価関数 :- error_protect(_項 is _評価関数,fail), !. _評価項 'は' prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail), !. _項 'は' _評価項 :- '述語評価が可能'(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), '関数評価に於いて引数部分の関数評価'(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 'は' _評価項 :- \+('述語評価が可能'(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 'は' _評価項 :- \+('述語評価が可能'(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項, !. _項 'は' _式 :- atomic(_式), \+('述語評価が可能'(_式,_関数,_次数,_次数足す一)), _項 = _式, !. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/463 # # 【課題】 # http://ime.nu/www51.tok2.com/home/rg550/cgi-bin/hosoku/img0047.zip # 【課題1】 # 実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納 # した後、整列し(順番はどちらでもかまいません)、出力するプログラムを # 作成しなさい。 # 【課題2】 # 0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと # 値で出力するプログラムを作成しなさい。また、100個の乱数の平均値も合わせて # 出力しなさい。 # ただし、0から9 それぞれの個数を数えるための変数に必ず配列を用いてください。 # (出現個数カウント用の変数を10個用意してはいけません。) 例えば、出現個数 # カウント用の配列 count[] を用意すると、 count[0] に0が出現した回数が # 格納される。もし0が10回出現した場合、count[0]=10となる。) % 課題1 '実行例のようにキーボードから文字列を読み込み、文字型の配列に一文字づつ格納した 後、整列し(順番はどちらでもかまいません)、出力する' :- get_chars(_文字ならび), sort(_文字ならび,_整列した文字ならび), atom_chars(_整列した文字列,_整列した文字ならび), write_formatted('%t\n',[_整列した文字列]). % 課題2 '0から9までの整数乱数を100個発生させ、実行例のようにその出現分布を棒グラフと値 で出力する' :- findall([N,0,[]],for(0,N,9),_出現個数カウント用ならび), '0から9までの整数乱数を100個発生させ'(1,L1), 'その出現分布を棒グラフと値で出力する'(L1,_出現個数カウント用ならび). '0から9までの整数乱数を100個発生させ'(N,[]) :- N > 100,!. '0から9までの整数乱数を100個発生させ'(N,[_乱整数|R]) :- _乱整数 is random mod 10, N2 is N + 1, '0から9までの整数乱数を100個発生させ'(N2,R). 'その出現分布を棒グラフと値で出力する'([],L) :- 'グラフと値で出力'(L),!. 'その出現分布を棒グラフと値で出力する'([N|R],L) :- member([N,_カウント,L1],L), _カウント2 is _カウント + 1, ならびの置換([N,_カウント,L1],[N,_カウント2,[_|L1]],L,L2), 'その出現分布を棒グラフと値で出力する'(R,L2). グラフと値で出力([]). グラフと値で出力([[N,C,L]|R]) :- all(L,'*'), write_formatted(' %t: %t %t\n',[N,L,C]), グラフと値で出力(R). % 以下のサイトは # 出典:: http://sum2cha.blogpico.com/archives/2017 レス番号606 # [1] 授業単元: プログラミング [2] 問題文(含コード&リンク): # 3.以下のプログラムを作成 # 3x3マスのマルバツゲームのボードを作成 # ○側と×側が交互に2次元座標上の位置を入力 # 入力後、毎回ボードを表示する # たて、よこ、斜めのいずれかに○か×が3つ並んだ # 時点でプログラムを終了 マルバツゲーム(L) :- length(L1,3), length(L2,3), length(L3,3), L = [L1,L2,L3], マルバツゲーム(まる,L). マルバツゲーム(_,L) :- 変数がない(L),!. マルバツゲーム(_,L) :- 三つならびがある(L),!. マルバツゲーム(まる,L) :- ランダムに着手する(まる,L), マルバツゲーム(ばつ,L). マルバツゲーム(ばつ,L) :- ランダムに着手する(ばつ,L), マルバツゲーム(まる,L). ランダムに着手する(_種類,L) :- A is random // 9, _行 is // 3, _列 is mod 3, 着手(_種類,_行,_列,L). ランダムに着手する(_種類,_行,_列) :- ランダムに着手する(_種類,_行,_列). 着手(_種類,_行,_列,L) :- list_nth(_行,L,L1), list_nth(_列,L1,X), var(X), _種類=X,!. 変数がない(L) :- flat(L,L1),member(A,L1),\+(var(A)),!,fail. 変数がない(_). 全てがまる([]) :- !. 全てがまる([A|R]) :- A==まる,全てがまる(R). 全てがばつ([]) :- !. 全てがばつ([A|R]) :- A==まる,全てがまる(R). 三つ並びがある(L) :- for(1,N,3),list_nth(N,L,L1),list_nth(N,L1,X),X==まる,!. 三つ並びがある(L) :- for(1,N,3),list_nth(N,L,L1),list_nth(N,L1,X),X==ばつ,!. 三つ並びがある(L) :- member([M,N],[[1,3],[2,2],[3,1]]),list_nth(M,L,L1),list_nth(N,L1,X),X==まる,!. 三つ並びがある(L) :- member([M,N],[[1,3],[2,2],[3,1]]),list_nth(M,L,L1),list_nth(N,L1,X),X==ばつ,!. 三つ並びがある(L) :- for(1,N,3),list_nth(N,L,L1),全てがまる(L1),!. 三つ並びがある(L) :- for(1,N,3),list_nth(N,L,L1),全てがばつ(L1),,!. 三つ並びがある(L) :- ならびの転置(L,L1),三つ並びがあるの二(L1). 三つ並びがあるの二(L) :- for(1,N,3),list_nth(N,L,L1),全てがまる(L1),!. 三つ並びがあるの二(L) :- for(1,N,3),list_nth(N,L,L1),全てがばつ(L1),!. % 以下のサイトは # 出典:: http://yomi.mobi/read.cgi/pc11/pc11_tech_1215986178 (レス番号55) # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # 次の説明を読んで、プログラムを作成しなさい。 # # 小数で入力される気温のデータを5℃単位の整数に丸めたい。 # キーボードからdouble型変数kに気温を入力し、 # 丸めた数値はint型変数gに求め、gを画面に出力する。 # # ただし入力データに負の気温はないものとする。 t902 :- write('気温データを浮動小数点数値として入力してください : '), get_line(Line), atom_to_term(Line,_小数,_), '五度単位の丸め'(_小数,_丸めた整数), write('五度単位で丸めると %t となります\n',[_丸めた整数]). '五度単位で丸め'(_小数,_丸めた整数) :- _丸めた整数 is truncate(floor(_小数 / 5.0) * 5.0). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/131 # # C++です。 # #   x[0] = rand()%6; #   x[1] = rand()%6; #   x[2] = rand()%6; #   y =x[0] + x[1] + x[2]; #   z[y] = z[y]+1; # # 変数がわかりにくくてすみません。 # xの配列に0〜5の値を保存して合計してyに入れます。 # それからzの配列(15こぶん)に入れたいのですが、うまくできません。 '1-15の乱数ごとに出現度数を取る'(_試行回数,_z) :- !. length(_z_1,15), all(_z_1,0), '1-15の乱数ごとに出現度数を取る'(_試行回数,_z_1,_z). '1-15の乱数ごとに出現度数を取る'(0,_z,_z) :- !. '1-15の乱数ごとに出現度数を取る'(_n,_z_1,_z) :- 'xの配列に0〜5の値を保存して合計してyに入れます。'(_n,_n_1,_y), 'それからzの配列(15こぶん)に入れたい。'(_y,_z_1,_z_2), '1-15の乱数ごとに出現度数を取る'(_n_1,_z_2,_z). 'xの配列に0〜5の値を保存して合計してyに入れます。'(_n,_n_1,_y) :- _n_1 is _n - 1, X_0 is random(6), X_1 is random(6), X_2 is random(6), _y is X_0 + X_1 + X_2 + 1. 'それからzの配列(15こぶん)に入れたい。'(_y,_z_1,_z_2) :- nth1(_y,_z_1,_yの度数_1), _yの度数_2 is _yの度数_1 + 1, ならびの位置指定置換(_y,_yの度数_2,_z_1,_z_2). ならびの位置指定置換(1,A,[_|R],[A|R]) :- !. ならびの位置指定置換(N,A,[B|R1],[B|R2]) :- N1 is N - 1, ならびの位置指定置換(N1,A,R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/55 # # [1] 授業単元:プログラム言語論 # [2] 問題文(含コード&リンク): # # 設問1.C言語、またはC++言語で、割り算を計算するdev(int x,int y)関数(*)を作成しなさい。 # ただし、不変表明(assert)を使って、0で除算を実行した場合にエラーを出力するようにすること。 # (*)関数devは、int型の返値を持ち、x/yを計算するものとする。 :- op(700,xfx,は). 関数定義(div(X,Y),Z) :- div(X,Y,Z). div(X,Y,Z) :- length(L1,X), length(L2,Y), div(L1,L2,DIV,MOD), length(DIV,Z). div(_,[],_,_) :- write('0除算エラー\n'),!. div(L1,L2,[_|D],MOD) :- append(L2,L3,L1), div(L3,L2,D,MOD). div(L1,L2,[],L1) :- \+(append(L2,L3,L1)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(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) . 加算_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) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. % 以下のサイトは :- nonotify. :- op(850,fx,(^)). ( ^ P) :- wr('%%/%q. ',[P]). pswr(G,X) :- pswr_2(G,X),!. pswr(P) :- functor(P,F,A), pswr_1(1,A,P,L1,L2), ( L1=[], G0=''; not(L1=[]), concat_atom(L1,' ',G0) ), concat_atom([G0,' ',F,'\n'],G1), pswr_2(G1,L2),!. pswr_1(N,A,_,[],[]) :- N>A,!. pswr_1(N,E,P,['%t'|R1],[X|R2]) :- arg(N,P,X), M is N+1, pswr_1(M,E,P,R1,R2). pswr_2(G,L) :- telling(user), e_printf(G,L),!. pswr_2(G,L) :- telling(screen), fopen('temp.ps','a+',F), sprintf(G,L,S), fputs(S,F), fclose(F),!. pswr_2(G,L) :- write_formatted(G,L). pstell(F) :- slush_op(F,F1), tell(F1), write('%!'), write('Adobe-PS'),nl,!. acroread実行ファイル('/usr/local/Adobe/Acrobat7.0/bin/acroread'). newpath :- pswr(newpath),!. xpos(Y) :- Y1 は Y, pswr('/xpos %d def\n',[Y1]),!. ypos(Y) :- Y1 は Y, pswr('/ypos %d def\n',[Y1]),!. image(_スキャン長,_スキャンライン数,_ビット数,_変換配列,_16進数ならび文字列) :- sprintf('[%t %t %t %t %t %t]',_変換配列,_変換配列文字列), sprintf(' %t %t %t %t {<%t>} image ',[_スキャン長,_スキャンライン数,_ビット数,_変換配列文字列,_16進数ならび文字列],S), pswr(S),!. scale(X,Y) :- X1 は X, Y1 は Y, pswr(scale(X,Y)),!. translate(X,Y) :- X1 は X, Y1 は Y, pswr(translate(X1,Y1)),!. rotate(R) :- R1 は R, pswr(rotate(R1)),!. p_point(X,Y) :- X1 は X, Y1 は Y, moveto(X1,Y1), rlineto(1,0), stroke,!. helvetica(Style) :- asciiフォント名変換(helvetica,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . times(Style) :- asciiフォント名変換(times,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . courier(Style) :- asciiフォント名変換(courier,Style,_フォント名) , 一時asciiフォント名(_フォント名) , (!) . asciiフォント名変換(Name,[],_フォント名) :- atomic_length(Name,Len1) , Len2 is Len1 - 1 , subatomic(Name,1,1,A1) , subatomic(Name,2,Len2,A2) , to_upper(A1,A11), concat([A11,A2],_フォント名) , (!) . asciiフォント名変換(Name,Style,_フォント名) :- atomic_length(Name,Len1) , Len2 is Len1 - 1 , atomic_length(Style,Len3) , Len4 is Len3 - 1 , subatomic(Name,1,1,A1) , subatomic(Name,2,Len2,A2) , subatomic(Style,1,1,B1) , subatomic(Style,2,Len4,B2) , to_upper(A1,A11), to_upper(B1,B11), concat([A11,A2,(-),B11,B2],_フォント名) , (!) . to_upper(A,B) :- atomic_length(A,Len), findall(Y, ( for(1,N,Len), subatomic(A,N,1,X), char_code(X,C), ( ( C > 96, C < 123 ), C2 is C-32, char_code(Y,C2); ((C<97);(C>122)), char_code(Y,C) ) ),L), concat_atom(L,B),!. 明朝 :- 一時全角フォント名(明朝), 一時半角フォント名(明朝),!. ゴチック :- 一時全角フォント名(ゴチック), 一時半角フォント名(ゴチック), 一時asciiフォント名('Helvetica-Bold'),!. 一時全角フォント名(明朝) :- get_global(印刷端末文字コード,euc), pswr('/tzfont { /%t } def\n',['Ryumin-Light-78-EUC-H']),!. 一時全角フォント名(明朝) :- get_global(印刷端末文字コード,sjis), pswr('/tzfont { /%t } def\n',['Ryumin-Light-83pv-RKSJ-H']),!. 一時全角フォント名(ゴチック) :- get_global(印刷端末文字コード,euc), pswr('/tzfont { /%t } def\n',['GothicBBB-Medium-78-EUC-H']),!. 一時全角フォント名(ゴチック) :- get_global(印刷端末文字コード,sjis), pswr('/tzfont { /%t } def\n',['GothicBBB-Medium-83pv-RKSJ-H']),!. 一時全角フォント名(_フォント名) :- pswr('/tzfont { /%t } def\n',[_フォント名]),!. 一時半角フォント名(明朝) :- pswr('/thfont { /%t } def\n',['Ryumin-Light.Hankaku']),!. 一時半角フォント名(ゴチック) :- pswr('/thfont { /%t } def\n',['GothicBBB-Medium.Hankaku']),!. 一時半角フォント名(_フォント名) :- pswr('/thfont { /%t } def\n',[_フォント名]),!. 一時asciiフォント名('Times-Roman') :- pswr('/tafont { /%t } def\n',['Times-Roman']),!. 一時asciiフォント名(_フォント名) :- pswr('/tafont { /%t } def\n',[_フォント名]),!. 一時改行定義(_改行名) :- pswr('/tnl { %t } def\n',[_改行名]),!. 一時全角定義(_サイズ) :- integer(_サイズ), concat([zenkaku,_サイズ],_全角定義名), pswr('/%t { tzfont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_全角定義名,_サイズ]), pswr('/tz { %t } def\n',[_全角定義名]),!. 一時半角定義(_サイズ) :- integer(_サイズ), concat([hankaku,_サイズ],_半角定義名), pswr('/%t { thfont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_半角定義名,_サイズ]), pswr('/th { %t } def\n',[_半角定義名]),!. 一時ascii定義(_サイズ) :- integer(_サイズ), concat([ascii,_サイズ],_ascii定義名), pswr('/%t { tafont findfont %d scalefont setfont 0 0 3 2 roll lscape-test} def\n',[_ascii定義名,_サイズ]), pswr('/ta { %t } def\n',[_ascii定義名]),!. 一時全角定義(_全角定義名) :- not(integer(_全角定義名)), pswr('/tz { %t } def\n',[_全角定義名]),!. 一時半角定義(_半角定義名) :- not(integer(_半角定義名)), pswr('/th { %t } def\n',[_半角定義名]),!. 一時ascii定義(_ascii定義名) :- not(integer(_ascii定義名)), pswr('/ta { %t } def\n',[_ascii定義名]),!. 一時定義(_サイズ) :- 一時全角定義(_サイズ), 一時半角定義(_サイズ), 一時ascii定義(_サイズ),!. 改行定義(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名) :- get_global(印刷形式,ポートレート), ( 書式定義(標準改行名,_,_改行名);true), ( 書式定義(固定軸座標,ポートレート,_X座標);true), ( 書式定義(文字開始変位,ポートレート,_文字開始変位);true), ( 書式定義(行間隔,ポートレート,_行間隔);true), ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(標準破線名,_,_破線名);true), 改行定義の二(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名),!. 改行定義(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名) :- get_global(印刷形式,ランドスケープ), ( 書式定義(標準改行名,_,_改行名);true), ( 書式定義(固定軸座標,ランドスケープ,_Y座標);true), ( 書式定義(文字開始変位,ランドスケープ,_文字開始変位);true), ( 書式定義(行間隔,ランドスケープ,_行間隔);true), ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(標準破線名,_,_破線名);true), 改行定義の二(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名),!. 改行定義の二(_改行名,ポートレート,_X座標,_文字開始変位,_行間隔,_下線名,_破線名) :- concat([_下線名,'-offset'],_下線変位名), concat([_破線名,'-def'],_破線宣言名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t\n',['/',_改行名,'{',_X座標,ypos,_下線変位名,'sub moveto',_破線名,'1 eq {',_破線宣言名,' } if',_下線名,'1 eq {',_下線宣言名,'stroke} if /ypos ypos',_行間隔,'sub def',_X座標,_文字開始変位,'add ypos moveto} def']),!. 改行定義の二(_改行名,ランドスケープ,_Y座標,_文字開始変位,_行間隔,_下線名,_破線名) :- concat([_下線名,'-offset'],_下線変位名), concat([_破線名,'-def'],_破線宣言名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t %t\n',['/',_改行名,'{','gsave xpos ',_下線変位名,'add',_Y座標,moveto,_破線名,'1 eq {',_破線宣言名,' } if',_下線名,'1 eq { 90 rotate',_下線宣言名,'stroke} if grestore /xpos xpos',_行間隔,'add def',xpos,_Y座標,_文字開始変位,'add moveto} def']),!. 行間隔(_行間隔) :- 改行定義(_,_,_,_,_行間隔,_,_),!. ypos保存定義 :- pswr('/ypos-save {currentpoint pop /ypos exch def} def\n'),!. 白抜きフォント定義(_フォント名,_フォント範疇,_フォント,_ポイント) :- ( 書式定義(標準フォント名,_フォント範疇,_フォント名);true), ( 書式定義(標準フォント,_フォント範疇,_フォント);true), ( 書式定義(ポイント,_,_ポイント);true), pswr('%t%t %t%t %t %t %t\n',['/',_フォント名,'{ /',_フォント,findfont,_ポイント,'scalefont setfont outline-show} def']),!. フォント定義(_フォント名,_フォント範疇,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白) :- ( 書式定義(標準フォント名,_フォント範疇,_フォント名);true), ( 書式定義(標準フォント,_フォント範疇,_フォント);true), ( 書式定義(ポイント,_,_ポイント);true), ( 書式定義(x軸文字間空白,_,_x軸文字間空白);true), ( 書式定義(y軸文字間空白,_,_y軸文字間空白);true), フォント定義の二(_フォント名,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白),!. フォント定義の二(_フォント名,_フォント,_ポイント,_x軸文字間空白,_y軸文字間空白) :- pswr('%t%t %t%t %t %d %t %d %d %t\n',['/',_フォント名,'{ /',_フォント,findfont,_ポイント,'scalefont setfont',_x軸文字間空白,_y軸文字間空白,'3 2 roll lscape-test} def']),!. zenkaku_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,全角,_,_ポイント,0,0),!. hankaku_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,半角,_,_ポイント,0,0),!. ascii_font(_ポイント,_行間隔) :- retract(書式定義(行間隔,_,_)), asserta(書式定義(行間隔,_,_ポイント)), 改行定義(newline,_,_,_,_行間隔,_,_), フォント定義(zenkaku,ascii,_,_ポイント,0,0),!. ポストスクリプト矩形(_左上x座標,_左上y座標,_右下x座標,_右下y座標,_線幅,_オプション) :- moveto(_左上x座標,_左上y座標), _幅 は _右下x座標 - _左上x座標, _高さ は _左上y座標-_右下y座標, _幅マイナス は -_幅, _高さマイナス は -_高さ, rlineto(_幅,0), rlineto(0,_高さマイナス), rlineto(_幅マイナス,0), rlineto(0,_高さ), closepath, setlinewidth(_線幅), _オプション,!. ポストスクリプト矩形角丸め(_左上X座標,_左上Y座標,_右下X座標,_右下Y座標,_線幅,_オプション,_丸め幅) :- setlinewidth(_線幅), X2 is _左上X座標 + _丸め幅, moveto(X2,_左上Y座標), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_右下X座標,_左上Y座標,_右下X座標,_右下Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_右下X座標,_右下Y座標,_左上X座標,_右下Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_左上X座標,_右下Y座標,_左上X座標,_左上Y座標,_丸め幅]), wr('%t %t %t %t %t arcto 4 {pop} repeat\n',[_左上X座標,_左上Y座標,_右下X座標,_左上Y座標,_丸め幅]), closepath, setlinewidth(_線幅), call(_オプション),!. ポストスクリプト罫線(_,_左上y座標,_,_右下y座標,0,_y軸方向間隔,_) :- Y は _左上y座標 - _y軸方向間隔, Y =< _右下y座標,!. ポストスクリプト罫線(_左上x座標,_左上y座標,_右下x座標,_右下y座標,0,_y軸方向間隔,_線幅) :- Len は _右下x座標 - _左上x座標, Y は _左上y座標 - _y軸方向間隔, moveto(_左上x座標,Y), setlinewidth(_線幅), rlineto(Len,0), stroke, ポストスクリプト罫線(_左上x座標,Y,_右下x座標,_右下y座標,0,_y軸方向間隔,_線幅),!. ポストスクリプト罫線(_左上x座標,_,_右下x座標,_,_x軸方向間隔,0,_) :- X は _左上x座標 + _x軸方向間隔, X >= _右下x座標,!. ポストスクリプト罫線(_左上x座標,_左上y座標,_右下x座標,_右下y座標,_x軸方向間隔,0,_線幅) :- Len は _左上y座標 - _右下y座標, X は _左上x座標 + _x軸方向間隔, moveto(X,_右下y座標), setlinewidth(_線幅), rlineto(0,Len), stroke, ポストスクリプト罫線(X,_左上y座標,_右下x座標,_右下y座標,_x軸方向間隔,0,_線幅),!. arc(_中心X座標,_中心Y座標,_半径,_開始角度,_弧角度) :- _中心X座標の二 は _中心X座標, _中心Y座標の二 は _中心Y座標, stroke, pswr(arc(_中心X座標の二,_中心Y座標の二,_半径,_開始角度,_弧角度)),!. save :- pswr(' /saveobj save def\n'),!. restore :- pswr(' saveobj restore\n'),!. stroke :- pswr(stroke),!. closepath :- pswr(closepath),!. setrgbcolor(Red,Green,Blue) :- pswr(setrgbcolor(Red,Green,Blue)),!. sethsbcolor(Hue,Saturation,Brightness) :- pswr(sethsbcolor(Hue,Saturation,Brightness)),!. setlinewidth(N) :- pswr(setlinewidth(N)),!. rlineto(X,Y) :- X1 は X, Y1 は Y, pswr(rlineto(X1,Y1)),!. lineto(X,Y) :- X1 は X, Y1 は Y, pswr(lineto(X1,Y1)),!. curveto([]) :- !. curveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t curveto\n',[L]),!. curveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- curveto(X1,Y1,X2,Y2,X3,Y3), curveto(R),!. curveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), curveto(L),!. curveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(curveto(X1,Y1,X2,Y2,X3,Y3)),!. rcurveto([]) :- !. rcurveto([A|R]) :- not(list(A)), concat([A|R],' ',L), wr(' %t rcurveto\n',[L]),!. rcurveto([[X1,Y1,X2,Y2,X3,Y3]|R]) :- rcurveto(X1,Y1,X2,Y2,X3,Y3), rcurveto(R),!. rcurveto([[X1,Y1]|R]) :- flat([[X1,Y1]|R],L), rcurveto(L),!. rcurveto(X1,Y1,X2,Y2,X3,Y3) :- pswr(rcurveto(X1,Y1,X2,Y2,X3,Y3)),!. ベジェ曲線(T,_刻み_,_,_,_,_,_,_,_,[]) :- T > 1.0,!. ベジェ曲線(T,_刻み,X1,Y1,X2,Y2,X3,Y3,X4,Y4,[[X,Y]|R]) :- T2 is T + _刻み, X is (1-T) * (1-T) * (1-T) * X1 + 3 * (1-T) * (1-T) * T * X2 + 3 * (1-T) * T * T * X3 + T * T * T + X4, Y is (1-T) * (1-T) * (1-T) * Y1 + 3 * (1-T) * (1-T) * T * Y2 + 3 * (1-T) * T * T * Y3 + T * T * T * Y4, ベジェ曲線(T2,_刻み,X1,Y1,X2,Y2,X3,Y3,X4,Y4,R). setdash([],Y) :- pswr(setdash([],Y)),!. setdash([A|R],Y) :- concat([A|R],' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setdash(X,Y) :- pswr(setdash(X,Y)),!. setlinecap(X) :- pswr(setlinecap(X)),!. setlinejoin(X) :- pswr(setlinejoin(X)),!. matrix :- pswr(matrix),!. setmatrix(Matrix) :- flat(Matrix,FlatMatrix), concat(FlatMatrix,' ',X0), concat(['[',X0,']'],X), pswr(setdash(X,Y)),!. setscreen(Frequency,Angle,Proc) :- pswr(setscreen(Frequency,Angle,Proc)),!. stroke :- pswr(stroke),!. fill :- pswr(fill),!. setgray(0) :- pswr(setgray('.0')),!. setgray(F) :- sprintf('%1.2f',[F],S), subatomic(S,2,3,S1), pswr(setgray(S)),!. pvector([],[]) :- stroke,!. pvector([],[[_X座標位置,_Y座標位置,_ベクター長|_オプション]|_R],_線幅,_破線形式,_白色度) :- 線属性(_オプション,_線幅,_破線形式,_白色度), moveto(_X座標位置,_Y座標位置), rlineto(0,_ベクター長), 線属性の二(_オプション,[_線幅,_破線形式,_白色度]), pvector([],R,_線幅,_破線形式,_白色度),!. pvector([[_X座標位置,_Y座標位置,_ベクター長|_オプション]|_R],R1,_線幅,_破線形式,_白色度) :- 線属性の一(_オプション,[_線幅,_破線形式,_白色度]), moveto(_X座標位置,_Y座標位置), rlineto(_ベクター長,0), 線属性の二(_オプション,[_線幅,_破線形式,_白色度]), pvector(R,R1,_線幅,_破線形式,_白色度),!. 下線定義(_下線名,_印刷形式,_下線変位,_下線長,_下線幅) :- ( 書式定義(標準下線名,_,_下線名);true), ( 書式定義(下線変位,_,_下線変位);true), ( 書式定義(下線長,_印刷形式,_下線長);true), ( 書式定義(下線幅,_,_下線幅);true), 下線定義の二(_下線名,_下線変位,_下線長,_下線幅),!. us :- 下線定義(_,_,_,_,0). us(N) :- 下線定義(_,_,_,_,N). 下線 :- us,!. 下線定義の二(_下線名,_下線変位,_下線長,_下線幅) :- concat([_下線名,'-offset'],_下線変位名), concat([_下線名,'-length'],_下線長名), concat([_下線名,'-width'],_下線幅名), concat([_下線名,'-def'],_下線宣言名), pswr('%t%t %t\n',['/',_下線名,'1 def']), pswr('%t%t %t %t\n',['/',_下線長名,_下線長,def]), pswr('%t%t %t %t\n',['/',_下線幅名,_下線幅,def]), pswr('%t%t %t %t\n',['/',_下線変位名,_下線変位,def]), pswr('%t%t %t %t %t %t %t\n',['/',_下線宣言名,'{',_下線長名,'0 rlineto',_下線幅名,'setlinewidth} def']),!. 下線解除(_下線名) :- ( 書式定義(標準下線名,_,_下線名);true), pswr('%t%t %t\n',['/',_下線名,'0 def']),!. 破線定義(_破線名,_破線形式,_破線開始変位,_破線幅) :- ( 書式定義(標準破線名,_,_破線名);true), ( 書式定義(破線形式,_,_破線形式);true), ( 書式定義(破線開始変位,_,_破線開始変位);true), ( 書式定義(破線幅,_,_破線幅);true), 破線定義の二(_破線名,_破線形式,_破線開始変位,_破線幅),!. 破線定義の二(_破線名,_破線形式,_破線開始変位,_破線幅) :- concat([_破線名,'-type'],_破線形式名), concat([_破線名,'-startpos'],_破線変位名), concat([_破線名,'-width'],_破線幅名), concat(_破線形式,' ',_破線形式の二), concat(['[',_破線形式の二,']'],_破線形式の三), concat([_破線名,'-def'],_破線宣言名), pswr('%t%t %t\n',['/',_破線名,'1 def']), pswr('%t%t %t %t\n',['/',_破線形式名,_破線形式の三,def]), pswr('%t%t %t %t\n',['/',_破線変位名,_破線開始変位,def]), pswr('%t%t %t %t\n',['/',_破線幅名,_破線幅,def]), pswr('%t%t %t %t %t %t %t %t\n',['/',_破線宣言名,'{',_破線形式名,_破線変位名,'setdash',_破線幅名,'setlinewidth } def']),!. 破線解除(_破線名) :- ( 書式定義(標準破線名,_,_破線名);true), pswr('%t%t %t\n',['/',_破線名,'0 def']),!. 破線描画定義(_名,_破線パターン,_破線パターン開始位置,_線幅) :- 破線パターン文字列(_破線パターン,_破線パターン文字列), pswr('%t%t %t %t %t %t %t %t %t\n',['/',_名,'{ [,_破線パターン文字列',']',_破線パターン開始位置,setdash,_線幅,'setlinewidth} def']),!. 破線パターン文字列(L,L1) :- concat(L,' ',L1),!. ランドスケープ表示定義 :- pswr('/lscape-show { gsave 90 rotate ashow ypos-save grestore xpos ypos moveto} def\n'),!. ランドスケープ検査定義 :- pswr('/lscape-test {lscape 1 eq {lscape-show} {ashow} ifelse} def\n'),!. ランドスケープ :- set_global(印刷形式,ランドスケープ), pswr('/lscape 1 def\n /portlate 0 def\n'),!. ポートレート :- set_global(印刷形式,ポートレート), pswr('/portlate 1 def\n/lscape 0 def\n'),!. 肖像画 :- set_global(印刷形式,ポートレート), !. 風景画 :- set_global(印刷形式,ランドスケープ), !. moveto(X+X1,Y+Y1) :- var(X), var(Y), integer(X1), integer(Y1), pswr('currentpoint exch \n'), concat([X1,' add exch'],S), pswr(S), concat([Y1,' add moveto\n'],S2), pswr(S2),!. moveto(X+X1,Y) :- var(X), integer(X1), var(Y), pswr('currentpoint exch \n'), concat([X1,' add exch moveto'],S), pswr(S),!. moveto(X,Y+Y1) :- var(X), integer(Y1), var(Y), pswr('currentpoint \n'), concat([Y1,' add moveto'],S), pswr(S),!. moveto(X,Y) :- var(X), Y1 は Y, pswr('currentpoint pop \n'), pswr(moveto(Y1)),!. moveto(X,Y) :- var(Y), X1 は X, concat([X1,' exch moveto'],S), pswr('currentpoint exch pop \n'), pswr(S),!. moveto(X,Y) :- X1 は X, Y1 は Y, pswr(moveto(X1,Y1)),!. showpage :- pswr(showpage), get_global(印刷形式,_印刷形式), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), moveto(_初期x座標,_初期y座標),!. copypage :- pswr(copypage),!. erasepage :- pswr(erasepage),!. 文字開始位置(ポートレート,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) :- _文字開始y座標 は _初期y座標, _文字開始x座標 は _初期x座標 + _文字開始変位,!. 文字開始位置(ランドスケープ,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) :- _文字開始x座標 は _初期x座標, _文字開始y座標 は _初期y座標 + _文字開始変位,!. 背景色なし :- retract(書式定義(背景色,_,_)), assertz(書式定義(背景色,_, (-1))),!. ポストスクリプト背景 :- 書式定義(背景色,_, -1),!. ポストスクリプト背景 :- get_global(印刷形式,_印刷形式), 書式定義(背景色,_,_白色度), 書式定義(下線長,_,_下線長), 書式定義(行間隔,_,_行間隔), 書式定義(制限行数,_印刷形式,_制限行数), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), setgray(_白色度), X4 は _初期x座標 + _下線長, Y40 は '*'(_行間隔,_制限行数), Y4 は _初期y座標 - Y40, Y1 は _初期y座標 + _行間隔, ポストスクリプト矩形(_初期x座標,Y1,X4,Y4,0,fill), setgray(0),!. ポストスクリプト汎用定義 :- get_global(印刷形式,_印刷形式), ypos保存定義, call(_印刷形式), ランドスケープ表示定義, ランドスケープ検査定義, 下線定義(_,_印刷形式,_,_,_), 破線定義(_,_,_,_), 改行定義(_改行名,_印刷形式,_,_,_,_,_), 一時改行定義(_改行名), retract(書式定義(標準改行名,_,_)), asserta(書式定義(標準改行名,_,tnl)), フォント定義(_,全角,_,_,4,0), フォント定義(_,半角,_,_,2,0), フォント定義(_,ascii,_,_,2,0),!. 適用業務標準設定(_印刷形式,_初期x座標,_初期y座標,_文字開始変位,_制限行数,_文字名ならび) :- get_global(印刷形式,_印刷形式), 書式定義(初期x座標,_印刷形式,_初期x座標), 書式定義(初期y座標,_印刷形式,_初期y座標), 書式定義(文字開始変位,_,_文字開始変位), 書式定義(制限行数,_印刷形式,_制限行数), 書式定義(標準フォント名,ascii,_asciiフォント名), 書式定義(標準フォント名,全角,_全角フォント名), 書式定義(標準フォント名,半角,_半角フォント名), 一時全角定義(_全角フォント名), 一時半角定義(_半角フォント名), 一時ascii定義(_asciiフォント名), (retract(書式定義(標準フォント名,_,_)),fail;true), asserta(書式定義(標準フォント名,ascii,ta)), asserta(書式定義(標準フォント名,全角,tz)), asserta(書式定義(標準フォント名,半角,th)), _文字名ならび = [ta,tz,th], !. ポストスクリプト見出し(1,_,_初期化情報) :- midashi, call(_初期化情報),!. ポストスクリプト見出し(_,_,_). setup(F) :- seeing(FILE), see(F), repeat, get0(X), ( X = -1;put(X),fail), seen, see(FILE),!. ail3(FILE) :- seeing(CurrentFile), see(FILE), repeat, reads(X), ( X=end_of_file; ail3_1(X) ), seen, see(CurrentFile),!. ail3_1(X) :- subatomic(X,1,2,'%%'), !,fail. ail3_1(X) :- subatomic(X,1,5,gsave), atomic_length(X,N), M is N-7, subatomic(X,M,8,showpage), !,fail. ail3_1(X) :- wr('%t\n',[X]), fail. % *** user: p_print / 7 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令,FO,TTY) :- r_consult(P_DEFAULT), p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI), open(P_DEF,read,Input_1) , repeat , read(Input_1,P) , ( P = end_of_file ; P = (書式定義(ARG1,ARG2,ARG3) :- T) , retract((書式定義(ARG1,ARG2,_) :- T)) , asserta((書式定義(ARG1,ARG2,ARG3) :- T)) , fail ; not P = (書式定義(ARG1,ARG2,ARG3) :- _) , P = 書式定義(ARG1,ARG2,ARG3) , retract((書式定義(ARG1,ARG2,_) :- _)) , asserta(書式定義(ARG1,ARG2,ARG3)) , fail ) , close(Input_1), r_consult(MIDASHI), slush_op(FI,FI_2), ( atom(FO), not(FO=user_output), tell(FO); not(atom(FO)), tmpnam(FO), tell(FO); FO=user_output ), ( atom(FI_2), not(FI_2=user_input), see(FI_2); atom(FI_2), FI_2=user_input ), wr '%%!\n', '一時全角フォント名'('明朝'), '一時半角フォント名'('ゴチック'), '一時asciiフォント名'('Times-Roman'), 'ポストスクリプト汎用定義', '適用業務標準設定'(_印刷形式,_初期x座標,_初期y座標,_文字開始変位,_制限行数,_文字名ならび), set_global('制限行数',_制限行数), get_global('印刷端末文字コード',_文字コード), 'p_print_フォント定義'(_文字コード), ( '書式定義'('下線幅',_,-1), '書式定義'('標準下線名',_,_標準下線名), '下線解除'(_標準下線名) ; true ), call(_制御命令), set_global(page,1), repeat, xpos(_初期x座標), ypos(_初期y座標), ( _印刷形式=ポートレート, _仮x座標 is _初期x座標 + _文字開始変位, _仮y座標 = _初期y座標; _印刷形式=ランドスケープ, _仮x座標 = _初期x座標, _仮y座標 is _初期y座標 + _文字開始変位 ), moveto(_仮x座標,_仮y座標), newpath, 'ポストスクリプト背景', set_global('頁換え',off), p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X), X = end_of_file, seen, told, ! . % *** user: p_print / 5 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令) :- tty(TTY_1), concat(['/usr2/',TTY_1,'.pst'],SaveSystem), save_system(SaveSystem), 印刷端末(_印刷端末), p_print(FI,P_DEFAULT,P_DEF,MIDASHI,_制御命令,FO,TTY), '印刷制御'(_印刷端末,FO,_), ! . % *** user: p_print / 4 *** p_print(FI,P_DEFAULT,P_DEF,MIDASHI) :- slush_op(FI,FI_2), p_print(FI_2,P_DEFAULT,P_DEF,MIDASHI,true), ! . % *** user: p_print / 2 *** p_print(FI,_制御命令) :- slush_op(FI,FI_2), p_print(FI_2,'p_default.pro','p_def.pro','midashi.pro',_制御命令), ! . % *** user: p_print / 1 *** p_print(Network :: FI) :- hosts(_,Network,_,sjis), tmpnam(F), tmpnam(F2), cp(Network :: FI,F), concat(['sjtoeuc ',F,' >',F2],S), system(S), p_print(F2), unlink(F), unlink(F2), ! . p_print(FI) :- slush_op(FI,FI_2), p_print(FI_2,'p_default.pro','p_def.pro','midashi.pro',true), ! . p_print_フォント定義(euc) :- 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-78-EUC-H',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,'Courier',30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Medium-78-EUC-H',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Medium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Medium-78-EUC-H',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-78-EUC-H',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkaku16,全角,'Ryumin-Light-78-EUC-H',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-78-EUC-H',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-78-EUC-H',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Medium.Hankaku',30,0,0),!. p_print_フォント定義(sjis) :- 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-83pv-RKSJ-H',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,'Courier',30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Medium-83pv-RKSJ-H',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Medium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Medium-83pv-RKSJ-H',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-83pv-RKSJ-H',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkakuG8,全角,'GothicBBB-Medium-83pv-RKSJ-H',8,0,0), フォント定義(asciiG8,ascii,'Helvetica-Bold',8,0,0), フォント定義(hankakuG8,半角,'GothicBBB-Medium.Hankaku',8,0,0), フォント定義(zenkaku12,全角,'GothicBBB-Medium-83pv-RKSJ-H',12,0,0), フォント定義(ascii12,ascii,'Helvetica-Bold',12,0,0), フォント定義(hankaku12,半角,'Gothic-Medium.Hankaku',12,0,0), /* フォント定義(zenkaku16,全角,'Ryumin-Light-83pv-RKSJ-H',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), */ フォント定義(zenkaku16,全角,'GothicBBB-Medium-83pv-RKSJ-H',16,0,0), フォント定義(ascii16,ascii,'Helvetica-Bold',16,0,0), フォント定義(hankaku16,半角,'Gothic-Medium.Hankaku',16,0,0), フォント定義(ascii20,ascii,'Times-Roman',20,0,0), フォント定義(zenkaku20,全角,'Ryumin-Light-83pv-RKSJ-H',20,0,0), フォント定義(hankaku20,半角,'GothicBBB-Medium.Hankaku',20,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-83pv-RKSJ-H',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-83pv-RKSJ-H',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Medium.Hankaku',30,0,0),!. /* 白抜きフォント定義(zenkaku4,全角,'Ryumin-Light-KL',30), 白抜きフォント定義(hankaku4,半角,'Ryumin-Light.Hankaku',30), 白抜きフォント定義('ascii-code4',ascii,Courier,30), フォント定義(ascii7,ascii,'Times-Roman',7,0,0), フォント定義(zenkaku7,全角,'GothicBBB-Midium',7,0,0), フォント定義(hankaku7,半角,'GothicBBB-Midium.Hankaku',7,0,0), フォント定義(ascii8,ascii,'Times-Roman',8,0,0), フォント定義(zenkaku8,全角,'GothicBBB-Midium',8,0,0), フォント定義(hankaku8,半角,'GothicBBB-Midium.Hankaku',8,0,0), フォント定義(zenkaku6,全角,'Ryumin-Light-KL',6,0,0), フォント定義(hankaku6,半角,'Ryumin-Light.Hankaku',6,0,0), フォント定義(ascii6,ascii,'Times-Roman',6,0,0), フォント定義(zenkaku16,全角,'Ryumin-Light-KL',16,0,0), フォント定義(ascii16,ascii,'Times-Roman',16,0,0), フォント定義(hankaku16,半角,'Ryumin-Light.Hankaku',16,0,0), フォント定義(zenkaku25,全角,'Ryumin-Light-KL',25,0,0), フォント定義(ascii25,ascii,'Times-Roman',25,0,0), フォント定義(hankaku25,半角,'Ryumin-Light.Hankaku',25,0,0), フォント定義(ascii30,ascii,'Times-Roman',30,0,0), フォント定義(zenkaku30,全角,'Ryumin-Light-KL',30,0,0), フォント定義(hankaku30,半角,'GothicBBB-Midium.Hankaku',30,0,0),!. */ p_print_4(ttyz02,_一時ファイル) :- cp(_一時ファイル,ttyz02 :: prn), unlink(_一時ファイル),!. p_print_4(ttyz03,_一時ファイル) :- cp(_一時ファイル,ttyz03 :: prn), unlink(_一時ファイル),!. p_print_4(_印刷端末,_印刷端末) :- !. p_print_4(_印刷端末,_一時ファイル) :- cp(_一時ファイル,_印刷端末 :: prn), unlink(_一時ファイル), !. p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI) :- ( 変数(P_DEFAULT), P_DEFAULT = 'p_default.pro'; 変数(P_DEF), P_DEF = 'p_def.pro'; 変数(MIDASHI), MIDASHI = 'midashi.pro' ), p_print_def(FI,P_DEFAULT,P_DEF,MIDASHI),!. p_print_def(_,_,_,_). 印刷端末取得(xview,_一時ファイル) :- get_global(印刷端末,xview), tmpnam(_一時ファイル),!. 印刷端末取得(_印刷端末,_一時ファイル) :- get_global(印刷端末,_印刷端末), subatomic(_印刷端末,1,3,tty), tmpnam(_一時ファイル),!. 印刷端末取得(_印刷端末,_印刷端末) :- get_global(印刷端末,_印刷端末). p_print_copy(F,F1) :- tmpnam(F1), tell(F1), see(F), repeat, reads(X), ( X=end_of_file; atomic_length(X,LEN), p_print_copy_2(X,LEN), fail ), seen, told,!. p_print_copy_2(X,LEN) :- get_global(印刷形式,ポートレート), 書式定義(初期x座標,ポートレート,_初期x座標), 書式定義(文字開始変位,_,_文字開始変位), 書式定義(ポイント,_,_ポイント), 書式定義(下線長,ポートレート,_下線長), N は '-'(_下線長,'*'(_文字開始変位,2)), LEN2 は (_下線長 / _ポイント), p_print_copy_3(X,LEN,LEN2),!. p_print_copy_3(X,LEN,LEN2) :- LEN>=LEN2, write(X),nl,!. p_print_copy_3(X,LEN,LEN2) :- eucsubstr(X,1,LEN2,Y), write(Y),nl, LEN3 は LEN2-LEN, N3 は LEN2 + 1, eucsubstr(X,N3,LEN3,Z), write(Z),nl,!. % *** user: p_print_0 / 9 *** p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X) :- char_code(A,12), /* set_global('制限行数',_制限行数), */ pct_for(1,N), reads(X), ( X = end_of_file, N = 1 ; X = end_of_file, \+(N = 1), 'pct_頁表示', showpage ; N = 1, ( subatomic(X,1,1,A), subatomic(X,2,2,'%/'), SP1 = 4 ; subatomic(X,1,11,'%/showpage.'), subatomic(X,13,2,'%/'), SP1 = 15 ), error_protect(parse_atom(X,SP1,_,T,_,_),fail), ( \+(T = end_of_file), \+(T = []), error_protect(T,fail) ; T = end_of_file ), fail ; \+(N = 1), ( subatomic(X,1,1,A), SP2 = 2 ; subatomic(X,1,11,'%/showpage.'), SP2 = 13 ), get_global('制限行数',_制限行数の二), \+(0 is N mod _制限行数の二), !, 'pct_頁表示', showpage, subatomic(X,SP2,2,'%/'), SP3 is SP2 + 2, error_protect(parse_atom(X,SP3,_,T,_,_),fail), ( \+(T = end_of_file), error_protect(T,fail) ; T = end_of_file ), !, fail ; get_global('制限行数',_制限行数の二), 'ポストスクリプト見出し'(N,_制限行数の二,(xpos(_初期x座標) , ypos(_初期y座標) , setdash('[1 0]',0) , '文字開始位置'(_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) , moveto(_文字開始x座標,_文字開始y座標))), setgray(0), concat([X,'\n'],Y), 'ポストスクリプト文字列'(_文字名ならび,_,Y,Z), wr('%t\n',[Z]), 0 'は' N mod _制限行数の二, 'pct_頁表示', showpage ), ! . /* p_print_0(_制限行数,_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標,_文字名ならび,X) :- char_code(A,12) , set_global(制限行数,_制限行数) , pct_for(1,N) , ( N=1, moveto(_文字開始x座標,_文字開始y座標); not(N=1) ), reads(X) , ( X = end_of_file , N = 1 ; X = end_of_file , not N = 1 , pct_頁表示 , showpage ; N = 1 , ( subatomic(X,1,1,A), subatomic(X,2,2,'%/'), SP1=4; subatomic(X,1,11,'%/showpage.'), subatomic(X,13,2,'%/'), SP1=15 ), moveto(_文字開始x座標,_文字開始y座標), error_protect(parse_atom(X,SP1,_,T,_,_),fail), ( not T = end_of_file , not(T = []), error_protect(T,fail) ; T = end_of_file ) , fail ; not N = 1 , ( subatomic(X,1,1,A), SP2=2, moveto(_文字開始x座標,_文字開始y座標); subatomic(X,1,11,'%/showpage.'), SP2=13, moveto(_文字開始x座標,_文字開始y座標) ), get_global(制限行数,_制限行数の二), not(0 is N mod _制限行数の二), pct_頁表示, showpage, subatomic(X,SP2,2,'%/'), SP3 is SP2+2, error_protect(parse_atom(X,SP3,_,T,_,_),fail), ( not T = end_of_file , error_protect(T,fail) ; T = end_of_file ) , (!) , fail ; get_global(制限行数,_制限行数の二) , ポストスクリプト見出し(N,_制限行数の二,(xpos(_初期x座標) , ypos(_初期y座標) , setdash('[1 0]',0) , 文字開始位置(_印刷形式,_文字開始変位,_初期x座標,_初期y座標,_文字開始x座標,_文字開始y座標) , moveto(_文字開始x座標,_文字開始y座標))) , setgray(0) , concat([X,'\n'],Y) , ポストスクリプト文字列(_文字名ならび,_,Y,Z) , wr('%t\n',[Z]), 0 は N mod _制限行数の二 , pct_頁表示 , showpage ) , (!) . */ pct_頁表示 :- get_global(頁表示,off),!. pct_頁表示 :- get_global(印刷形式,ポートレート), get_global(page,PAGE), PAGE1 is PAGE+1, set_global(page,PAGE1), /* atoi(Page,PAGE), */ lpad(PAGE,2,' ',Page), moveto(300,60), ポストスクリプト文字列(['ascii-code',zenkaku,hankaku],_,Page,W2), wr('%t\n',[W2]),!. pct_頁表示 :- get_global(印刷形式,ランドスケープ), get_global(page,PAGE), PAGE1 is PAGE+1, set_global(page,PAGE1), /* atoi(Page,PAGE), */ lpad(PAGE,2,' ',Page), moveto(565,416), ポストスクリプト文字列(['ascii-code',zenkaku,hankaku],_,Page,W2), wr('%t\n',[W2]),!. pct_for(A,_) :- get_global(制限行数,_制限行数), _制限行数 < A,!,fail. pct_for(A,A). pct_for(A,B) :- A2 is A+1, pct_for(A2,B). %/実線,下線定義(_,_,_,_,0). 実線 :- retract(書式定義(破線形式,_,_)), asserta(書式定義(破線形式,_,[1,0])). 行数(_行数) :- set_global(制限行数,_行数). 印刷制御(アクロバット,FO,_保護ファイル) :- ペーパーサイズ(PAPERSIZE), 印刷制御保護ファイル(FO4,FO40,FO43,FO44), concat(['ps2pdf -sPAPERSIZE=',PAPERSIZE,' ',FO,' ',FO44],S), system(S), cp(FO44,FO43), set_global(html,jump),!. 印刷制御(_印刷端末,FO,_) :- concat(['lpr -P',_印刷端末,' ',FO],SYSTEM), system(SYSTEM), !. 印刷制御保護ファイル(FO4,FO40,FO43,FO44) :- subatomic(FO4,1,5,'/tmp/'), replace_all(FO4,'/tmp/','',FO40), concat(['/tmp/',FO40,'.pdf'],FO43), set_global(tmpnam,FO43), concat(['/home/takao/tmp/',FO40,'.pdf'],FO44),!. 印刷制御保護ファイル(FO4,FO40,FO43,FO44) :- not(subatomic(FO4,1,5,'/tmp/')), make_list(FO4,['/'],L), last(L,FO40), concat(['/tmp/',FO40,'.pdf'],FO43), set_global(tmpnam,FO43), concat(['/home/takao/tmp/',FO40,'.pdf'],FO44),!. ローカル印刷端末(ttyz06) :- !. ペーパーサイズ(a4). ペーパーサイズ(_旧,_新) :- ペーパーサイズ(_旧), retract(ペーパーサイズ(_旧)), assertz(ペーパーサイズ(_新)),!. 印刷制御_acrobat_server_待ち合わせ(F) :- アクロバットサーバー(AcrobatServer), atomic_length(F,Len), for(1,N,30), sleep(1), anonymousdir(AcrobatServer,'/out',X), member(A,X), atom_suffix(A,Len,F), split(A,[' '],[_,_,_,_,Size,Mon,Day,_,_]), ( \+(Size = 0), sleep(2); Size = 0, sleep(5) ), N < 10,!. 大域変数を取得(Key,Value) :- error_protect(get_global(Key,Value),fail). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/696 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9968.txt # 1. # a[i][j]=0 1 2 # 10 11 12 # 20 21 22 # と、x[3](成分1,5,10)の積を表示するプログラム # # 2. # 3*3の単位行列と # x[3](成分1,5,10)の積を表示するプログラム # # 3. # 2次方程式の解:1次元変数c[2]を入力し、 # c[0]x^2+c[1]x+c[2]=0の二つの解(実数部と虚数部:xre[2],xim[2])を # 表示するプログラム t745(1) :- 行列の積([[0,1,2],[10,11,12],[20,21,22]],[[1],[5],[10]],X), writef('行列の積は %t\n',[X]). t745(2) :- 単位行列(3,_単位行列), 行列の積(_単位行列,[[1],[5],[10]],X), writef('単位行列との積は %t\n',[X]). % t242 % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/567 # # すみません。 # # c言語がまだ初心者すぎてわからないのでどうかお願いします! # # ■プログラム1: # # りんごが30個中、腐っていたりんごが10個あったとき、 # 腐っていないりんごを3人で分けると、 # 一人当たりのりんごの個数は何個になるか、計算し、 # "一人あたりのりんごの個数"と"残ったりんごの個数"を # 出力するプログラム。 # # ■プログラム2: # # 上記プログラム1 のリンゴの個数などの数を scanfを使ってキーボードから # 入力することで、任意の個数に対して計算できるように改良したプログラム。 # # ただし両プログラムの変数名は、最初のりんごの個数をapple、 # 腐っていたりんごの個数を bad_apple、人数をpersons、 # 一人当たりのりんごの個数を apple_for_one、余りをrest とすること。 # # お願いします! # # # t714_プログラム1 :- 一人当たりのりんごの個数(_apple_for_one), 残ったりんごの個数(_rest), write_formatted('一人当たりのりんごの個数は %t個\n残りは %t個です\n',[_apple_for_one,_rest]). りんご(30). 腐ったりんご(10). 人数(3). 腐っていないりんごの個数(_not_bad_apple) :- りんご(_apple), 腐ったりんご(_bad_apple), _not_bad_apple is _apple - _bad_apple. 一人当たりのりんごの個数(_apple_for_one) :- 腐っていないりんごの個数(_not_bad_apple), 人数(_persons), _apple_for_one is _not_bad_apple // _persons. 残ったりんごの個数(_rest) :- 腐っていないりんごの個数(_not_bad_apple), 人数(_persons), _rest is _not_bad_apple mod _persons. t714_プログラム2 :- write('りんごの個数を入れてください : '), get_integer(_apple), write('腐ったりんごの個数を入れてください : '), get_integer(_bad_apple), write('人数を入れてください : '), get_integer(_persons), abolish(りんご/1), abolish(腐ったりんご/1), aoblish(人数/1), assertz(りんご(_apple)), assertz(腐ったりんご(_bad_apple)), assertz(人数(_persons)), t714_プログラム1. % 以下のサイトは %文字列置換 %
%このディレクトリの索引

% *** user: '文字列置換' / 5 ***
'文字列置換'(_文字列,_置換述語,_要素変数,_置換変数,_置換された文字列) :-
    atom_chars(_文字列,_ならび),
    '全要素に適用して置換'(_ならび,_置換述語,_要素変数,_置換変数,_置換ならび),
    concat_atom(_置換ならび,_置換された文字列),
    ! .

% *** user: '文字列置換' / 4 ***
'文字列置換'(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列) :-
    replace(_対象文字列,_置換される副文字列,_置換する副文字列,_置換された文字列),
    ! .

% *** user: replace_all / 4 ***
replace_all('',A,B,'') :-
    ! .
replace_all(String,S1,'',X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    replace_31(StringL,S1L,Y),
    concat_atom(Y,X),
    ! .
replace_all(String,S1,S2,X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    atom_chars(S2,S2L),
    replace_41(StringL,S1L,S2L,Y),
    concat_atom(Y,X),
    ! .

% *** user: replace / 4 ***
replace(String,S1,'',X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    replace_3(StringL,S1L,Y),
    concat_atom(Y,X),
    ! .
replace(String,S1,S2,X) :-
    atom_chars(String,StringL),
    atom_chars(S1,S1L),
    atom_chars(S2,S2L),
    replace_4(StringL,S1L,S2L,Y),
    concat_atom(Y,X),
    ! .

% *** user: replace_3 / 3 ***
replace_3(L,L1,R) :-
    append(L1,R,L),
    ! .
replace_3([A|R],L1,[A|R2]) :-
    replace_3(R,L1,R2) .
% *** user: replace_4 / 4 ***
replace_4(L,L1,L2,R2) :-
    append(L1,R,L),
    append(L2,R,R2),
    ! .
replace_4([A|R],L1,L2,[A|R2]) :-
    replace_4(R,L1,L2,R2) .

% *** user: replace_31 / 3 ***
replace_31([],_,[]) :-
    ! .
replace_31(L,L1,Y) :-
    append(L1,R,L),
    replace_31(R,L1,Y),
    ! .
replace_31([A|R],L1,[A|R2]) :-
    replace_31(R,L1,R2) .

% *** user: replace_41 / 4 ***
replace_41([],_,_,[]) :-
    ! .
replace_41(L,L1,L2,R2) :-
    append(L1,R,L),
    replace_41(R,L1,L2,R3),
    append(L2,R3,R2),
    ! .
replace_41([A|R],L1,L2,[A|R2]) :-
    replace_41(R,L1,L2,R2) .

% *** user: '全要素に適用して置換' / 5 ***
'全要素に適用して置換'(L,P,Element,_置換変数,X) :-
    length(L,Len),
    findall(U,(for(1,N,Len) , list_nth(N,L,A,Element,C) , (error_protect(P,fail) , U = _置換変数 ; \+(error_protect(P,fail)) , U = Element)),X) .

% *** user: 'split' / 3 ***
split(_文,_区切り語ならび,_区切られた語ならび) :-
    区切り語ならびの変形(_区切り語ならび,SeparatersL),
    atom_chars(_文,_文字ならび),
    split_1(_文字ならび,SeparatersL,_区切られた語ならび).

% *** user: 'split_1' / 3 ***
split_1([],SeparatersL,[]).
split_1(L1,SeparatersL,[A|R]) :-
    \+(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    \+(L2=[]),
    atom_chars(A,L2),
    split_1(R2,SeparatersL,R).
split_1(L1,SeparatersL,X) :-
    \+(L1=[]),
    split_2(L1,SeparatersL,L2,R2),
    L2=[],
    split_1(R2,SeparatersL,X).

% *** user: 'split_2' / 4 ***
split_2([],_,[],[]).
split_2(L1,SeparatersL,[],R) :-
    member(L2,SeparatersL),
    append(L2,R,L1).
split_2([A|R1],SeparatersL,[A|R2],R) :-
    \+((member(L2,SeparatersL),append(L2,_,[A|R1]))),
    split_2(R1,SeparatersL,R2,R).

% *** user: '区切り語ならびの変形' / 2 ***
区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :-
    sort(_区切り語ならび,_昇順の区切り語ならび),
    reverse(_昇順の区切り語ならび,_降順の区切り語ならび),
    atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび).

% *** user: 'atomList2charsList' / 2 ***
atomList2charsList([],[]) :- !.
atomList2charsList([A|R1],[L|R2]) :-
    atom_chars(A,L),
    atomList2charsList(R1,R2).

%
% % 以下のサイトは # 出典:: 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),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/416 # # 【質問テンプレ】 # [1] 二次元配列 # [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9944.txt # 二次元配列 奇数偶数 魔方陣 # 入力した数字の法人に対して1〜11までの値をある法則通りに格納し、 # 縦横斜めどのれつの合計値もすべて同じになる奇数魔方陣を作成する。 # ただし以下のことを法則とする。 # 奇数魔方陣の作り方 # 初期値(1)は真ん中の列の最上位置に格納すること。 # 数値は1ずつ加算する。加算ごとに右上に格納する # 右側へはみ出した場合、はみ出した行の最左端セルへいく # 上にはみ出した場合、はみ出した同列の最下位セルにいく # 格納するセルがすでに埋まっていた場合ははみ出したセルの一つしたに格納する # 下側にはみだしたらはみ出した列の最上位セルへいく # ・偶数魔方陣も作成すること (法則はネットに書いてあるのでいいっぽいです。対角線上のやつ?) # ・12以上の数字が入力された場合は再入力を求める。 奇数魔方陣(_サイズ,_魔方陣行列) :- 奇数(_サイズ), X起点 is _サイズ // 2 + 1, 変数正方行列の生成(_サイズ,_魔方陣行列), 変数正方行列を埋めていく(1,_サイズ,X起点,1,_魔方陣行列). 変数正方行列の生成(_サイズ,_変数正方行列) :- findall(L1,(for(1,N,_サイズ),findall(U,length(U,_サイズ),L1)),_変数正方行列),!. 変数正方行列を埋めていく(M,_サイズ,_,_,_魔方陣行列) :- M > _サイズ * _サイズ,!. 変数正方行列を埋めていく(M,_サイズ,X1,Y1,_魔方陣行列) :- X1 >= 1,X1 =< _サイズ,Y1 >= 1,Y1 =< _サイズ, \+(はみ出したセルの一つ下にいく(_サイズ,_魔方陣行列,X1,Y1,X,Y)), 行列変数に値を入れる(X1,Y1,M,_魔方陣行列), 斜め上方に移動(X1,Y1,X2,Y2), M2 is M + 1, 変数正方行列を埋めていく(M2,_サイズ,X2,Y2,_魔方陣行列). 変数正方行列を埋めていく(M,_サイズ,X1,Y1,_魔方陣行列) :- X1 >= 1,X1 =< _サイズ,Y1 >= 1,Y1 =< _サイズ, はみ出したセルの一つ下にいく(_サイズ,_魔方陣行列,X1,Y1,X2,Y2), 変数正方行列を埋めていく(M,_サイズ,X2,Y2,_魔方陣行列). 変数正方行列を埋めていく(M,_サイズ,_魔方陣行列) :- はみ出した行の最左端セルへいく(_サイズ,X1,Y1,X2,Y2), 変数正方行列を埋めていく(M,_サイズ,X2,Y2,_魔方陣行列),!. 変数正方行列を埋めていく(M,_サイズ,X1,Y1,_魔方陣行列) :- はみ出した同列の最上位セルにいく(_サイズ,X1,Y1,X2,Y2), 変数正方行列を埋めていく(M,_サイズ,X2,Y2,_魔方陣行列),!. 変数正方行列を埋めていく(M,_サイズ,_魔方陣行列) :- はみ出した同列の最下位セルにいく(_サイズ,X1,Y1,X2,Y2), 変数正方行列を埋めていく(M,_サイズ,X2,Y2,_魔方陣行列),!. はみ出したセルの一つ下にいく(_サイズ,_魔方陣行列,X1,Y1,X1,Y2) :- 格納するセルがすでに埋まっていた場合(_サイズ,_魔方陣行列,X1,Y1), Y2 is Y1 + 1,!. 格納するセルがすでに埋まっていた場合(_サイズ,X1,Y1,_魔方陣行列) :- list_nth(Y1,_魔方陣行列,_行), list_nth(X1,_行,V), \+(var(V)),!. はみ出した行の最左端セルへいく(_サイズ,X1,Y1,1,Y1) :- 右側へはみ出した場合(_サイズ,X1,Y1),!. はみ出した同列の最下位セルにいく(_サイズ,X1,Y1,X1,_サイズ) :- 上側にはみ出した場合(_サイズ,X1,Y1),!. はみ出した列の最上位セルへいく(_サイズ,X1,Y1,X1,1) :- 下側にはみ出した場合(_サイズ,X1,Y1). 右側へはみ出した場合(_サイズ,X,Y) :- X > _サイズ,!. 上側にはみ出した場合(_サイズ,X,0) :- !. 下側にはみ出した場合(_サイズ,X,Y) :- Y > _サイズ,!. 行列変数に値を入れる(X1,Y1,M,_魔方陣行列) :- list_nth(Y1,_魔方陣行列,_行), list_nth(X1,_行,M),!. 斜め上方に移動(X1,Y1,X2,Y2) :- X2 is X1 + 1, Y2 is Y1 - 1. 奇数(N) :- 1 is N mod 2. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1250204272/412 # # [1] 授業単元:C言語・基礎応用 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9940.txt # //プロトタイプの宣言// # void DataSave(void); # void DataLoad(void); # # //グローバル変数の宣言// # g_aData[20] = {1,1,1,1,1,1,2,2,2,2,2,2,2,3,3,3,3,3,4,4}; # # グローバル変数に格納された配列の数字列を読み込んで # ランレングス符号化を行い、バイナリデータとして # 圧縮・解凍するプログラムを作成せよ。 ランレングス符号化圧縮([],[]) :- !. ランレングス符号化圧縮(L1,[A,Len|R]) :- 先頭から同一要素(L1,[A|R1],R2), length([A|R1],Len), ランレングス符号化圧縮(R2,R). ランレングス符号化解凍([],[]) :- !. ランレングス符号化解凍([A,Len|R1],L) :- ランレングス符号化解凍の二(L,Len,A,R2), ランレングス符号化解凍(R1,R2). 先頭から同一要素([],[],[]) :- !. 先頭から同一要素([A,A|R],[A|R2],R3) :- 先頭から同一要素([A|R],R2,R3),!. 先頭から同一要素([A|R],[A],R) :- not([A|_]=R),!. ランレングス符号化解凍の二([A|R],1,A,R) :- !. ランレングス符号化解凍の二([A|R1],M,A,R) :- M1 is M - 1, ランレングス符号化解凍の二(R1,M1,A,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1153585095/918 # # 所謂覆面算で # 英字一文字が一桁の数字(0-9)で表されるとき # one # + nine # + twenty # + fifty # = eighty # となる組み合わせを検索してください # 各行の先頭の文字は0以外です # % 'one + nine + twenty + fifty = eighty' 覆面算(S,LX) :- 覆面算(S,_文字数,_先頭文字ならび,_左項式,_右項式), 順列([0,1,2,3,4,5,6,7,8,9],_文字数,LX2), 変数を対応させる(_先頭文字ならび,LX2,LX), A is _右項式, B is _左項式, A = B. 覆面算(S,_文字数,_先頭文字ならび,_左項式,_右項式) :- split(S,['+',' '],L), 各項の先頭文字(L,_先頭文字ならび), append(L1,LX,L), concat_atom(L,S1), atom_chars(S1,L2), 各文字に変数を割り当てる(L2,[],LV), length(LV,_文字数), 式を構成する(L1,LV,_左項式), 式を構成する(L2,LV,_右項式). 各文字に変数を割り当てる([],X,X). 各文字に変数を割り当てる([A|R1],Y,X) :- member(A,[A=_,Y]), 各文字に変数を割り当てる(R1,Y,X). 各文字に変数を割り当てる([A|R1],Y,X) :- not(member([A=_,Y])), 各文字に変数を割り当てる(R1,[A=_|Y],X). 式を構成する([],_,0). 式を構成する([A|R1],LV,_式 + Y) :- atom_chars(A,Chars), length(Chars,Len), 覆面数値式(Len,LV,Chars,_式), 式を構成する(R1,LV,Y). 覆面数値式(0,_,_,0) :- !. 覆面数値式(N,LV,[A|R1],B + C) :- member(A=V,LV), B = ((10 ^ (N-1)) * V), N2 is N - 1, 覆面数値式(N2,LV,R1,C). 変数を対応させる(_,[],[]) :- !. 変数を対応させる(_先頭文字ならび,[A|R1],[B=A|R2]) :- member(B,_先頭文字ならび),!, not(A=0), 変数を対応させる(_先頭文字ならび,R1,R2). 変数を対応させる(_先頭文字ならび,[A|R1],[B=A|R2]) :- not(member(B,_先頭文字ならび)), 変数を対応させる(_先頭文字ならび,R1,R2). 各項の先頭文字(L,_先頭文字ならび) :- findall(C,(member(A,L),sub_atom(A,0,1,_,C)),_先頭文字ならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/303 # # [1] 授業単元: # インタラクティブッコミュニケーション # [2] 問題文(含コード&リンク): # 外部変数を使用せずに、main()から関数を呼び出し、円をドルとユーロに換算し、 # main()内のprintf()で結果を出力するプログラムを作成せよ。 # 但し、1ドル = 118円, 1ユーロ = 160円とする。また、プログラムは # 負の値が入力されるまで繰り返されるものとする。 # # http://www.ncc-1701.jp/kakei/InteractiveComm/Class10/InteractiveComm_10.html # の一番下の演習。 # 最終的にはこの形に # http://www.ncc-1701.jp/kakei/InteractiveComm/Class10/exercise10.gif '外部変数を使用せずに、main()から関数を呼び出し、円をドルとユーロに換算し、main()内のprintf()で結果を出力するプログラムを作成せよ。但し、1ドル = 118円, 1ユーロ = 160円とする。また、プログラムは負の値が入力されるまで繰り返されるものとする。' :- repeat, write('換算する円金額を入れてください(終了するときは-1)\n'), get_line(Line), atom_to_term(Line,_円金額,_), レート換算表示(_円金額), _円金額 = -1. レート換算表示(_円金額) :- _円金額 < 0.0,!. レート換算表示(_円金額) :- 円レート(ドル,USD), 円レート(ユーロ,EUR), _ドル換算金額 is _円金額 / USD, _ユーロ換算金額 is _円金額 / EUR, write_formatted('換算した金額は %tドル %tユーロになります\n',[_ドル換算金額,_ユーロ換算金額]),!. 円レート(_通貨,_円レート) :- '通貨略号'(_通貨,_通貨略号), concat_atom(['http://stocks.finance.yahoo.co.jp/stocks/detail/?code=',_通貨略号,'JPY=X'],URL), w3c(URL,L), member(A,L), char_code(C1,60),char_code(C2,62), /* ブラウザでS1,S2を表示させるため止むを得ず */ concat_atom([C1,'span class="yjFL"',C2],S1), concat_atom([C1,'/span',C2],S2), split(A,[S1],[U1,U2]), split(U2,[S2],[_円レート|_]),!. 通貨略号(ユーロ,'EUR'). 通貨略号(ドル,'USD'). 通貨略号('アメリカドル','USD'). 通貨略号('イギリス ポンド','GBP'). 通貨略号('インド ルピー','INR'). 通貨略号('インドネシア ルピア','IDR'). 通貨略号('エクアドル スクレ','ECS'). 通貨略号('エジプト ポンド','EGP'). 通貨略号('オーストラリア ドル','AUD'). 通貨略号('カナダ ドル','CAD'). 通貨略号('韓国 ウォン','KRW'). 通貨略号('クウェート ディナール','KWD'). 通貨略号('コロンビア ペソ','COP'). 通貨略号('サウジ リアル','SAR'). 通貨略号('シンガポール ドル','SGD'). 通貨略号('スイス フラン','CHF'). 通貨略号('スウェーデン クローナ','SEK'). 通貨略号('タイ バーツ','THB'). 通貨略号('台湾 ドル','TWD'). 通貨略号('中国 元','CNY'). 通貨略号('チリ ペソ','CLP'). 通貨略号('デンマーク クローネ','DKK'). 通貨略号('トルコ リラ','TRY'). 通貨略号('日本 円','JPY'). 通貨略号('ニュージーランド ドル','NZD'). 通貨略号('ノルウェー クローネ','NOK'). 通貨略号('パラグアイ グァラニ','PYG'). 通貨略号('フィリピン ペソ','PHP'). 通貨略号('ブラジル リアル','BRL'). 通貨略号('ベネズエラ ボリバル・フエルテ','VEF'). 通貨略号('ペルー ソル','PEN'). 通貨略号('香港 ドル','HKD'). 通貨略号('マレーシア リンギ','MYR'). 通貨略号('南アフリカ ランド','ZAR'). 通貨略号('メキシコ ペソ','MXN'). 通貨略号('UAE ダーハム','AED'). 通貨略号('欧州 ユーロ','EUR'). 通貨略号('ヨルダン ディナール','JOD'). 通貨略号('ルーマニア レウ','RON'). 通貨略号('レバノン ポンド','LBP'). 通貨略号('ロシアン ルーブル','RUB'). w3c(URL,X) :- w3ctimeout(Timeout), concat(['w3c -timeout ',Timeout,' -n "',URL,'"'],W3c), shs(W3c,X),!. w3ctimeout(60). shs(Command,X) :- tmpnam(TMPNAM), open(TMPNAM,write,Output), system(Command,user_input,Output), close(Output), open(TMPNAM,read,Input), findall(S,(repeat , stream_reads(Input,S) , (S = end_of_file , (!) , fail ; true)),X), close(Input), unlink(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(6,L), concat_atom(L,A), concat_atom(['/tmp/file',A],TMPNAM), not(exists(TMPNAM,read)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). tmpnam(0,[]) :- !. tmpnam(N,[A|R]) :- M is (random mod 122) + 1, ( M >=48,M=<57,M1 = M; M >=65,M=<90,M1 = M; M >=97,M=<122,M1 = M; M >=0,M=<26,M1 is M + 65; M >=27,M=<47,M1 is M + 38; M >=58,M=<64,M1 is M + 10; M >=91,M=<96,M1 is M + 6 ), char_code(A,M1), N2 is N - 1, tmpnam(N2,R),!. unlink(F) :- concat_atom(['rm -f ',F],S), system(S). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/291 # # [1] 授業単元:コンピュータリテラシー # [2] 問題文(含コード&リンク):問題文と参考は以下です #   http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9806.txt # ・試験の過程を記録 # 1,番号、得点を入力したあと平均点を計算 # 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする) # 3,番号、得点、平均との差を出力 # 以上のプログラムを作成 成績を記録する :- write('番号と得点をスペースで区切って一行で入力してください\n'), get_line(_行), 成績を記録する(_行). 成績を記録する(end_of_file) :- !. 成績を記録する(_行) :- split(_行,[' '],[_番号,_得点]), assertz(成績(_番号,_得点)), get_line(_次の行), 成績を記録する(_次の行). 平均点(_平均点) :- findavg(_得点,成績(_,_得点),_平均点). 番号順に並べ直し(_番号順成績ならび) :- findall([_番号,_得点],成績(_番号,_得点),_成績ならび), quicksort(_成績ならび,_番号順成績ならび). 得点順に並べ直し(_得点順成績ならび) :- findall([_得点,番号],成績(_番号,_得点),_得点・番号成績ならび), quicksort(_得点・番号成績ならび,_整列した得点・番号ならび), 項目位置を元に戻す(_整列した得点・番号ならび,_得点順成績ならび). 項目位置を元に戻す([],[]). 項目位置を元に戻す([[A,B]|R1],[[B,A]|R2]) :- 項目位置を元に戻す(R1,R2). 番号、得点、平均との差の出力 :- 平均点(_平均点), write('番号 得点 平均との差\n'), 成績(_番号,_得点), _平均との差 is _得点 - _平均点, write_formatted('%t %t %t\n',[_番号,_得点,_平均との差]), fail. 番号、得点、平均との差の出力. quicksort([],[]) :- !. quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Gigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). partition([],Y,[],[]) :- !. partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs). %%%%%%%% findavg/3 加算/2 他 %%%%%%%%%%%%%%%%%%%% :- op(A,B,は). findavg(_集約項,_項,_算術平均) :- findall(_集約項,_項,_値ならび), '加算'(_値ならび,_合計値), length(_値ならび,_ならびの長さ), _算術平均 is _合計値 / _ならびの長さ,!. 加算(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) . 加算_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) . 加算_2([],[]) :- !. 加算_2([L|R],[S|R2]) :- 加算(L,S), 加算_2(R,R2). 加算の変数に零をおく([]) :- !. 加算の変数に零をおく([A|R]) :- 変数(A), A = 0.0e+00, 加算の変数に零をおく(R),!. とからりすと(A,[A]) :- atomic(A),!. とからりすと(A と B,C) :- とからりすと(A,A1), とからりすと(B,B1), append(A1,B1,C). 変数(_変数) :- var(_変数). ならび([_|_]). _項 は (_ネットワーク :: _式) :- _ネットワーク :: _項 は _式, ! . _評価項 は N : L :- M は N, L1 は L, list_nth(M,L1,_評価項), ! . _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail) . _評価値 は [X|{P}] :- findall(X,P,_評価値), ! . _評価項 は ` _値 :- !, _評価項 = _値, ! . _項 は _式 :- var(_式), _項 = _式, ! . _項 は _式 :- error_protect(一時関数定義(_式,_項),fail) . _項 は _式 :- atom(_式), member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]), !, _項 is _式, ! . _項 は _式 :- 二項組込み関数(_式), 二項組込み関数の評価(_式,_項) . _項 は _式 :- 二項組込み関数(_式), !, fail . _項 は _式 :- functor(_式,Functor,1), arg(1,_式,Arg), Y は Arg, functor(_式_1,Functor,1), arg(1,_式_1,Y), member(Functor,[atom,real,integer,var,float,list]), !, error_protect(_式_1,fail), _項 = Y, ! . _項 は _式 :- atom(_式), error_protect(get_global(_式,_項),fail), ! . _項 は _式 :- real(_式), _項 = _式, ! . _項 は _式 :- real(_式), !, fail . _項 は _式 :- list(_式), findall(X,(member(U,_式) , X は U),_項) . _項 は _式 :- list(_式), !, fail. _項 は _erlang_module : _erlang関数 :- erlang関数評価(_erlang_module : _erlang関数,_項),!. _項 は _式 :- 関数定義(_式,_項),!. _項 は _式 :- functor(_式,_関数,_次数), function(_関数,_次数), findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), _式の二 =.. [_関数|L2], error_protect(_項 is _式の二,fail) . _項 は _評価関数 :- error_protect(_項 is _評価関数,fail),!. _評価項 は prolog(_評価項) :- functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), !, error_protect(_評価項,fail),!. _項 は _評価項 :- 述語評価が可能(_評価項,_関数,_次数,_次数足す一), _評価項 =.. _評価項の項分解ならび, findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L), 関数評価に於いて引数部分の関数評価(L,L2), append(L2,[_],_変数を付加した引数ならび), _解付き評価項 =.. [_関数|_変数を付加した引数ならび], error_protect(_解付き評価項,fail), arg(_次数足す一,_解付き評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), error_protect(_評価項,fail), arg(Arg,_評価項,_項) . _項 は _評価項 :- \+(述語評価が可能(_評価項,_関数,_次数,_次数足す一)), functor(_評価項,F,Arg), \+(predicate_type(F,Arg,undefined)), \+(error_protect(_評価項,fail)), _評価項 = _項,!. _項 は _式 :- atomic(_式), \+(述語評価が可能(_式,_関数,_次数,_次数足す一)), _項 = _式,!. 述語評価が可能(_評価項,_関数,_次数,_次数足す一) :- functor(_評価項,_関数,_次数), _次数足す一 is _次数 + 1, \+(predicate_type(_関数,_次数足す一,undefined)),!. 関数評価に於いて引数部分の関数評価([],[]). 関数評価に於いて引数部分の関数評価([L|R1],[L2|R2]) :- list(L), !, 関数評価に於いて引数部分の関数評価(L,L2), 関数評価に於いて引数部分の関数評価(R1,R2), ! . 関数評価に於いて引数部分の関数評価([F|R1],[F|R2]) :- \+(error_protect(F2 は F,fail)), !, 関数評価に於いて引数部分の関数評価(R1,R2) . 関数評価に於いて引数部分の関数評価([F|R1],[F2|R2]) :- error_protect(F2 は F,fail), 関数評価に於いて引数部分の関数評価(R1,R2) . erlang関数評価(os : cmd(Command),_項) :- erlang :: (os : cmd(Command) -> _項_1), _項 は string2atom(_項_1),!. erlang関数評価(_erlang_module : _erlang関数,_項) :- erlang :: (_erlang_module : _erlang関数 -> _項),!. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, number(_値の一), _値の二 は _項の二, number(_値の二), _値 is _値の一 + _値の二, !. 関数定義(_項の一 + _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 + _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, list(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),LY), concat_list(LY,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atom(_値の一), _値の二 は _項の二, integer(_値の二), findall(_値の一,for(1,_,_値の二),L), concat_atom(L,_値), !. 関数定義(_項の一 * _項の二,_値) :- _値の一 は _項の一, atomic(_値の一), _値の二 は _項の二, atomic(_値の二), concat_atom([_値の一,_値の二],_値), !. 関数定義(_ならびの一 * _ならびの二,_値) :- ( 変数(_ならびの一) ; _ならびの一 == [] ; list(_ならびの一) ; 変数(_ならびの二) ; _ならびの二 == [] ; list(_ならびの二) ), !, append(_ならびの一,_ならびの二,_値) . 関数定義(` _値,_値) :- !. 関数定義(@ _式,_値) :- _値 は _式,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _値の二 >= 0.0e+00, _四捨五入後の値 is floor(_値の二 + 0.5) * 1.0,!. 関数定義(四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 is ceil(_値の二 - 0.5),!. 関数定義(切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二) * 1.0,!. 関数定義(切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二),!. 関数定義(十円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 10 + 0.5) * 10,!. 関数定義(十円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は trunc(_値の二 / 10) * 10,!. 関数定義(十円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 10) * 10,!. 関数定義(百円未満四捨五入(_値),_四捨五入後の値) :- _値の二 は _値, _四捨五入後の値 は floor(_値の二 / 100 + 0.5) * 100,!. 関数定義(百円未満切り上げ(_値),_切り上げ後の値) :- _値の二 は _値, _切り上げ後の値 は ceil(_値の二 / 100) * 100,!. 関数定義(百円未満切り捨て(_値),_切り捨て後の値) :- _値の二 は _値, _切り捨て後の値 は floor(_値の二 / 100) * 100,!. 関数定義(整数化(_値),_整数化された値) :- _値の二 は _値, _整数化された値 is trunc(_値の二),!. 関数定義(char_code(_項),_値) :- ( atom(_項), atomic_length(_項,1), char_code(_項,_値) ; integer(_項), char_code(_値,_項) ; 複合項(_項), _項の一 は _項, _値 は char_code(_項の一) ), !. 関数定義($ _大域変数名,_値) :- atom(_大域変数名), get_global(_大域変数名,_値の一), _値 は _値の一,!. 関数定義(S,E) :- functor(S,select,1), to(S,E),!. 関数定義(setq(A,B),E) :- atom(A), B1 は B, set_global(A,B1), E = B1,!. 関数定義(++ A,X) :- A1 は A, list(A1), 加算(A1,X),!. 関数定義(A ++ B,X) :- C is B / A, X = A + C + B,!. 関数定義(car(A),E) :- A1 は A, A1 = [E|_],!. 関数定義(cdr(A),E) :- A1 は A, A1 = [_|E],!. 関数定義(cons(A,B),E) :- A1 は A, B1 は B, E = [A1|B1],!. 関数定義(length(A),E) :- A1 は A, list(A1), length(A1,E),!. 関数定義(decode(A,B,C,D),E) :- A1 は A, B1 は B, A1 = B1, E は C,!. 関数定義(decode(A,B,C,D),E) :- E は D,!. 関数定義(decompcons(A),E) :- A1 は A, decompcons(A1,E),!. 関数定義(substr(A,B,C),E) :- 関数定義(subatomic(A,B,C),E),!. 関数定義(subatomic(A,B,C),E) :- A1 は A, B1 は B, C1 は C, subatomic(A1,B1,C1,E),!. 関数定義(concat(A),E) :- A1 は A, concat(A1,E),!. 関数定義(concat(A,B),E) :- A1 は A, B1 は B, concat(A1,B1,E),!. 関数定義(append(A,B),E) :- A1 は A, B1 は B, append(A1,B1,E),!. 関数定義(reverse(A),E) :- A1 は A, reverse(A1,E),!. 関数定義(string2atom(A),E) :- A2 は A, flat(A2,B), atom_codes(E,B),!. 関数定義(P,E) :- functor(P,greatest,Arg), P =.. [greatest|L], findall(B,(member(A,L) , B は A),L2), max(L2,E),!. 関数定義(P,E) :- functor(P,least,Arg), P =.. [least|L], findall(B,(member(A,L) , B は A),L2), min(L2,E),!. 関数定義(cel(_列数,_行数,_行列),_解) :- _関数評価された行数 は _行数, _関数評価された列数 は _列数, list_nth(_関数評価された行数,_行列,_行), list_nth(_関数評価された列数,_行,_解),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1153585095/904 # # [課題] # ・23本のマッチ棒からなる山があり,2人のプレーヤが山から交互にマッチ棒を # 取り除く # ・一度に取ることのできるマッチ棒は1から3本 # ・山を空にしたプレーヤが勝ち # 人間2人でこのゲームを行なうプログラムを作成せよ. # # プログラムでは各プレーヤの手がルールに反していないかどうかのチェックと, # 勝負がついたかどうかのチェックを行なうこと。 # また,最初に山にある本数と,各回に取ることができる最大の本数をプログラムの # 最初に変数にセットしておき,そこを変えるだけで本数の変化に対応できるような # プログラムにすること。 プレーヤ(1,山下). プレーヤ(2,太田). プレーヤのデバイス(1,入力,'/dev/tty1'). プレーヤのデバイス(2,入力,'/dev/tty2'). プレーヤのデバイス(1,出力,'/var/tmp/player1'). プレーヤのデバイス(2,出力,'/var/tmp/player2'). マッチ棒の山([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]). マッチ棒('|'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% マッチ棒の山崩し :- プレーヤ(1,_プレーヤ1), プレーヤ(2,_プレーヤ2), マッチ棒の山(L), デバイスを開く(Instream1,Instream2,Outstream1,Outstream2), ゲームの案内(Outstream1,Outstream2), マッチ棒の山崩し(_プレーヤ1,_プレーヤ2,Instream1,Instream2,Outstream1,Outstream2,L), デバイスを閉じる(Insteam1,Instream2,Outstream1,Outstream2). マッチ棒の山崩し(_,_プレーヤ,_,_,OutstreamA,OutstreamB,[]) :- concat_atom([_プレーヤ,さんの勝ちです,'\n'],S), 同報(OutstreamA,OutstreamB,S),!. マッチ棒の山崩し(_プレーヤA,_プレーヤB,InstreamA,InstreamB,OutstreamA,OutstreamB,L) :- 取り棒の案内(_マッチ棒,L,_取り棒の案内), write_formatted(OutstreamA,'君の番だよ( %t ) : ',[_取り棒の案内]), マッチ棒を取る(InstreamA,OutstreamA,L,L1,L2), マッチ棒の山の変化を同報する(OutstreamA,OutstreamB,L,L1,L2), マッチ棒の山崩し(_プレーヤB,_プレーヤA,InstreamB,InstreamA,OutstreamB,OutstreamA,L2),!. マッチ棒を取る(Instream,_,L,L1,L2) :- get_line(Instream,S), 変数ならびに変換(S,L1), 取ったマッチ棒の診断(L,L1,L2),!. マッチ棒を取る(Instream,Outstream,L,L1,L2) :- マッチ棒を取る(Instream,Outstream,L,L1,L2). 取ったマッチ棒の診断(L,L1,L2) :- append(L1,L2,L2),!. 取ったマッチ棒の診断(L,L1,L2) :- 取り棒の案内(L,_取り棒の案内), write(Outstream,'入力形式が正しくありません。\n'), write(Outstream,'(%t) : ',[_取り棒の案内]), fail. 変数ならびに変換(S,L) :- マッチ棒(_マッチ棒), 変数ならびに変換(_マッチ棒,Chars,L), atom_chars(S,Chars). 変数ならびに変換(_マッチ棒,[_マッチ棒],[_]). 変数ならびに変換(_マッチ棒,[_マッチ棒|R1],[_|R2]) :- 変数ならびに変換(_マッチ棒,R1,R2). 取り棒の案内(L,_取り棒の案内) :- マッチ棒(_マッチ棒), 取り棒の案内(_マッチ棒,L,_取り棒の案内). 取り棒の案内(_マッチ棒,[_],_マッチ棒). 取り棒の案内(_マッチ棒,[_,_],S) :- concat_atom([_マッチ棒,' or ',_マッチ棒],S). 取り棒の案内(_マッチ棒,[_,_,_|_],S) :- concat_atom([_マッチ棒,' or ',_マッチ棒,' or ',_マッチ棒],S). マッチ棒の山の変化を同報する(Outstream1,Outstream2,L0,L1,L) :- マッチ棒(_マッチ棒), all(L0,_マッチ棒),concat_atom(L0,' ',S0), all(L1,_マッチ棒),concat_atom(L1,' ',S1), all(L,_マッチ棒),concat_atom(L,' ',S), concat_atom([S1,'\n','↑\n',S,'\n現在の山は ',S,'\n'],S2), 同報(Outstream1,Outstream2,S2), fail. マッチ棒の山の変化を同報する(_,_,_,_,_). all([],_). all([V|R],V) :- all(R,V). ゲームの案内(Outstream1,Outstream2) :- 同報(Outstream1,Outstream2,'マッチの本数の入力は\n1本 -> |<改行>\n'), 同報(Outstream1,Outstream2,'2本 -> ||<改行>\n'), 同報(Outstream1,Outstream2,'3本 -> |||<改行> という表現でお願いします\n'). 同報(Outsteam1,Outstream2,_項) :- write(Outstream1,_項), write(Outstream2,_項),!. デバイスを開く(Instream1,Instream2,Outstream1,Outstream2) :- プレーヤのデバイス(1,入力,Indevice1), プレーヤのデバイス(2,入力,Indevice2), プレーヤのデバイス(1,出力,Outdevice1), プレーヤのデバイス(2,出力,Outdevice2), open(Indevice1,read,Instream1), open(Outdevice1,append,Outstream1), open(Indevice2,read,Instream2), open(Outdevice2,append,Outstream2),!. デバイスを閉じる(Instream1,Instream2,Outstream1,Outstream2) :- close(Insteam1), close(Outstream1), close(Instream2), close(Outstream2),!. マッチ棒の山の初期状態の設定(N) :- integer(N), retract(マッチ棒の山(_)), length(L,N), asserta(マッチ棒の山(L)). プレーヤの入出力デバイスの設定(_プレーヤ1の入力デバイス,_プレーヤ2の入力デバイス,_プレーヤ1の出力デバイス,_プレーヤ2の出力デバイス) :- abolish(プレーヤのデバイス/3), assertz(プレーヤのデバイス(1,入力,_プレーヤ1の入力デバイス)), assertz(プレーヤのデバイス(2,入力,_プレーヤ2の入力デバイス)), assertz(プレーヤのデバイス(1,出力,_プレーヤ1の出力デバイス)), assertz(プレーヤのデバイス(2,出力,_プレーヤ2の出力デバイス)),!. プレーヤの設定(_プレーヤ1,_プレーヤ2) :- abolish(プレーヤ/2), assertz(プレーヤ(1,_プレーヤ1)), assertz(プレーヤ(2,_プレーヤ2)),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/160 # # [1]プログラミング # [2] 課題 # 言語: C もしくは C++ 言語 # # (1)以下のプログラムを作成しなさい(数当てゲーム) # # *画面上に「好きな数字を入力してください」と表示して、キーボードからの入力を # 待つ。 # 変数aを定義して、10までの乱数を発生させて変数aに代入する。 # キーボードからの入力があれば、先に発生させた乱数と一致しているならば # 「あたり!!」と表示する。 # 一致していなければ「残念乱数はxxです」と表示する(xxには変数aの中身を # 表示する) 数当てゲーム :- repeat, _a is ramdom mod 10 + 1, write('好きな数字を入力してください '), get_line(Line), atom_to_term(Line,N,_), 数当てゲーム診断(_a,N), Line = end_of_file. 数当てゲーム診断(A,A) :- write('あたり!!\n'). 数当てゲーム診断(_,B) :- not(integer(B)), write('入力されたのは整数ではありません\n'). 数当てゲーム診断(A,N) :- not(A == N), write_formatted('残念乱数は%tです\n',[A]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/424 # # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9644.txtにある # 50コのデータを利用して # 最大値と最小値を取り出すプログラムを以下の1,2の関数を用いて2つ作れ # 1 return文を用いたケース # 2 グローバル変数を用いたケース # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9644.txtの # ポインタは使用不可です #ファイル名はseiseki.txtでお願いします # 70 56 66 45 88 # 66 85 68 55 73 # 55 65 53 67 55 # 85 72 76 58 65 # 92 70 45 73 55 # 56 57 52 62 82 # 72 62 33 85 95 # 46 95 48 72 34 # 83 42 88 92 56 # 68 65 91 82 66 整数要素ファイルの最小値・最大値(_ファイル,_最小値,_最大値) :- get_chars(_ファイル,Chars), concat_atom(Chars,Atom), split(Atom,['\n',' '],[A|L]), ならびの中の最小値・最大値(L,A,A,_最小値,_最大値). ならびの中の最小値・最大値([],X,Y,X,Y) :- !. ならびの中の最小値・最大値([A|R],Min,Max,_最小値,_最大値) :- A < Min, ならびの中の最小値・最大値(R,A,Max,_最小値,_最大値). ならびの中の最小値・最大値([A|R],Min,Max,_最小値,_最大値) :- A > Max, ならびの中の最小値・最大値(R,Min,A,_最小値,_最大値). ならびの中の最小値・最大値([_|R],Min,Max,_最小値,_最大値) :- ならびの中の最小値・最大値(R,Min,Max,_最小値,_最大値). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1242876647/369 # # 次の各プログラムを作成 # # 1.線分の長さを求める #  -両端点の座標値(浮動小数点)を入力 #  -線分の長さを計算、表示 # # 2.三角形の面積を求める #  -3頂点の座標軸(浮動小数点)を入力 #  -面積を計算、表示 # # 2では1つの点を原点に移動させてあとはS=1/2|ad-bc|でお願いします # # 補足でこれがありました # ◆ 平方根を求める関数 # # double型の関数 sqrt() を使います.仮引数もdouble型です. # # 例えばdouble型の変数 len の平方根を求める場合には,次のように呼び出 # します. # # sqrt(len) # # 関数sqrt()を使用するソースプログラムをコンパイルするときには, # # gcc -lm ***.c # # のように,コンパイルオプション「-lm」が必要です. # # # # ・main関数の座標値読み込み部分を省略したものは以下の通りです 線分の長さ(X1,Y1,X2,Y2,_線分の長さ) :- _線分の長さ is sqrt((X2-X1)^2 + (Y2-Y1)^2). 三角形の面積(X1,Y1,X2,Y2,X3,Y3,_三角形の面積) :- 一角を原点へ移動(X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33), _三角形の面積 is abs(X22 * Y33 - Y22 * X33) / 2. 一角を原点へ移動((X1,Y1,X2,Y2,X3,Y3,0,0,X22,Y22,X33,Y33) :- X22 is X2 - X1, Y22 is Y2 - Y1, X33 is X3 - X1, Y33 is Y3 - X1. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/607 # # 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で 考えてください. #   (住所録,商品の在庫,図書,ワールドカップの勝敗....) #  以下の要件を示します. # # 1. ファイルからデータを読み込む機能をつけること. # 2. データは4つ以上の項目を保持させること. #  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上) # 3. 並び替えの機能をつけること.また並び替える項目が指定できること. # 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わ せることができること. #  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始ま る 等) # 5. データは半角英数字(英語やローマ字)で扱ってよい # 6. データの追加ができること. # 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に 合致したデータを削除できること. # 8. 追加・削除した結果をファイルに保存できること. 鍵項目位置(書籍名,prolog関連書籍(_書籍名,_,_,_,_,_,_,_),_書籍名). 鍵項目位置(副書籍名,prolog関連書籍(_,_副書籍名,_,_,_,_,_,_),_副書籍名). 鍵項目位置(著者名,prolog関連書籍(_,_,_著者名,_,_,_,_,_),_著者名). 鍵項目位置(翻訳者名,prolog関連書籍(_,_,_,_翻訳者名,_,_,_,_),_翻訳者名). 鍵項目位置(発行年月日,prolog関連書籍(_,_,_,_,_発行年月日,_,_,_),_発行年月日). 鍵項目位置(出版社名,prolog関連書籍(_,_,_,_,_,_出版社名,_),_出版社名), 鍵項目位置(書籍コード,prolog関連書籍(_,_,_,_,_,_,_書籍コード),_書籍コード). 項目名を指定しての参照(_述語名/_引数の数,_項目名ならび,_値ならび) :- length(L,_引数の数), P =.. [_述語名|L], findall(_項目値,( call(P), member(_項目名,_項目名ならび), 鍵項目位置(_項目名,P,_項目値)),_値ならび). 項目名を指定して節構造ならびの参照(_項目名ならび,_節構造ならび,_値ならび) :- member([_頭部,_本体],_節構造ならび), findall(_項目値,( call(_本体), /* このアサーションを実行するかが大問題 */ member(_項目名,_項目名ならび), 鍵項目位置(_項目名,_頭部,_項目値)),_値ならび). データベースへの登録(_ファイル) :- reconsult(_ファイル). データベースへの追加(_項) :- assertz(_項). データベースからの削除(_項) :- retract(_項). データベースの保存(_述語名/_引数の数,_保存ファイル名) :- tell(_保存ファイル名), listing(_述語名/_引数の数), told. 節定義の並べ替え(_述語名/_引数の数,_鍵項目,上昇順) :- 上昇順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), ( member([H,B],_上昇順に整列された節構造ならび), assertz((H :- B)), fail; true ). 節定義の並べ替え(_述語名/_引数の数,_鍵項目,下降順) :- 下降順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), ( member([H,B],_上昇順に整列された節構造ならび), assertz((H :- B)), fail; true ). 上昇順節構造(_述語名/_引数の数, _鍵項目, _上昇順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび, _節構造ならび, _鍵付加き節構造ならび), 上昇順整列(_鍵付加き節構造ならび, _上昇順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_上昇順に整列された鍵付き節構造ならび, _上昇順に整列された節構造ならび),!. 下降順節構造(_述語名/_引数の数,_鍵項目,_下降順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび, _節構造ならび, _鍵付加き節構造ならび), 下降順整列(_鍵付加き節構造ならび, _下降順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_下降順に整列された鍵付き節構造ならび, _下降順に整列された節構造ならび),!. 節構造ならびの取得(_述語名/_引数の数,_節構造ならび) :- length(L,_引数の数), H =.. [_述語名|L], findall([H,B],clause(H,B),_節構造ならび),!. ならびの先頭に鍵項目を付加(_,[],[]) :- !. ならびの先頭に鍵項目を付加(_鍵項目ならび, [[_頭部,_本体]|R1], [_鍵付き節構造|R2]) :- findall(_値,(member(_鍵,_鍵項目ならび),鍵項目位置(_鍵,_頭部,_値)),L), append(L,[_頭部,_本体],_鍵付き節構造), ならびの先頭の鍵項目を除去(_鍵項目ならび,_鍵付き節構造ならび,_節構造ならび) :- length(_鍵項目ならび,_除去する項数), ならびの先頭N個の鍵項目を除去(N,_鍵付き節構造ならび,_節構造ならび). ならびの先頭N個の鍵項目を除去(N,[L1|R1],[L2|R2]) :- append(L0,L2,L1), length(L0,N), ならびの先頭N個の鍵項目を除去(N,R1,R2). 上昇順に整列(L1,L2) :- 整列(上昇,L1,L2). 下降順に整列(L1,L2) :- 整列(下降,L1,L2). 整列(_,[],[]) :- !. 整列(_上昇または下降,[X|Xs],Ys) :- 配分(_上昇または下降,Xs,X,Littles,Gigs), 整列(_上昇または下降,Littles,Ls), 整列(_上昇または下降,Bigs,Bs), append(Ls,[X|Bs],Ys). 配分(_,[],Y,[],[]) :- !. 配分(上昇,[X|Xs],Y,[X|Ls],Bs) :- X @=< Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(上昇,[X|Xs],Y,Ls,[X|Bs]) :- X @> Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,[X|Ls],Bs) :- X @>= Y,!,配分(下降,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,Ls,[X|Bs]) :- X @< Y,!,配分(下降,Xs,Y,Ls,Bs). 鍵項目位置定義(述語名,_項目名ならび) :- length(_項目名ならび,Len), for(1,N,Len), list_nth(N,_項目名ならび,_項目名), 変数文字列の生成(Len,N,項目名,_項目変数文字列,_変数文字列), concat_atom(['鍵項目位置(',_項目名,述語名,'(',_変数文字列,')', _項目変数文字列,')'],S), parse_atom(S,1,P,V), assertz_with_names(P,V), N = Len,!. 変数文字列の生成(N,Len,項目名,_項目変数文字列,_変数文字列) :- M is N - 1, length(L1,M), all(L1,'_'), M2 is Len - N, length(L2,M2), all(L2,'_'), atom_concat('_',項目名,_項目変数文字列), append(L1,[_項目変数文字列|L2],L), concat_atom(L,',',_変数文字列). all([],_). all([A|R],V) :- all(R,V). % 以下のサイトは # 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(1,1) :- !. sum1toN(N,X) :- M is N - 1,sum1toN(M,Y),X is N + Y. % (2) pi(3.14159). circle(_半径,_円周,_面積) :-   pi(PI),   _円周 is 2 * _半径 * PI,   _面積 is _半径 ^ 2 * PI. % (3) t357_3 :- 右にシフト(2,[1,2,3,4,5,6,7,8],_シフトされたならび), 表示(1,_シフトされたならび). 表示(_,[]) :- !. 表示(N,[A|R]) :- M is N - 1, write('a[%t]=%t',[M,C]), N2 is N + 1, 表示(N2,R). 右にシフト(0,X,X) :- !. 右にシフト(N,L,X) :- append(Y,[_],[0|L]), M is N - 1, 右にシフト(M,Y,X).    % (4) 最大の文字コード(_文字列,_最大の文字コード) :-   atom_codes(_文字列,[C|R]),   最大の文字コード(R,C,_最大の文字コード). 最大の文字コード([],X,X) :- !. 最大の文字コード([C|R],_現在の最大コード,_最大の文字コード) :-   C > _現在の最大コード,   最大の文字コード(R,C,_最大の文字コード),!. 最大の文字コード([C|R],_現在の最大コード,_最大の文字コード) :-   C =< _現在の最大コード,   最大の文字コード(R,_現在の最大コード,_最大の文字コード),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/244 # # 〔1〕授業単元:C言語 # 〔2〕問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9601.txt # ・2つの整数型の変数を入れ替える関数 swapを定義して、それを用いて配列中の数字をランダムに入れ替えるプログラムを作りなさい。 # 1から52までの数が順番に入った配列を用意し、十分に入れ替えた結果を表示すること。 # これができた人は、次のように表示を変更しなさい。 # ・ 52個の数字を1〜13、14〜26、27〜39、40〜52の4組に分けて考える # ・ それぞれ1番目から13番目の数字を、A、2、3、4、5、6、7、8、9、T、J、Q、K と表示する(TはTenのT) # 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,2,0,21,22,… # ↓ # A,2,3,4,5,6,7,8,9,T,J,Q,K,A,2,3,4,5,6,7,8,9,T,… # ?これができた人は、次のように表示を変更しなさい。 # ・トランプの4つのスートをアルファベットで表示することにする(スペードは s, ハート #  はh、ダイヤはd、 クラブはc) # ・ 1〜13はスペード(s)、14〜26はハート(h)、27〜39はダイヤ(d)、40〜52はクラブ(c)とする # ・ それぞれの数字をA〜Kとshdcの組合せで表示する # ・ 例:1ならAs(スペードのA)、52ならKc(クラブのK) # As,2s,…..,Ks,Ah,2h,……,Kh,Ad,2d,……,Kd,Ac,2c,…..,Kc swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. t319_2(X) :- findall(U,( between(1,52,N), t319_2_1(N,U)),X). t319_2_1(N,U) :- M is N mod 13, '数字カード・絵カード'(M,U). '数字カード・絵カード'(1,'A') :- !. '数字カード・絵カード'(10,'T') :- !. '数字カード・絵カード'(11,'J') :- !. '数字カード・絵カード'(12,'Q') :- !. '数字カード・絵カード'(0,'K') :- !. '数字カード・絵カード'(N,N). トランプの準備(X) :- findall(U,( between(1,52,N), 一枚のカードを作る(N,U)),_整列したカード), トランプを切る(100,_整列したカード,X). 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), atom_concat(U1,U2,U). カードの種類(0,s). カードの種類(1,h). カードの種類(2,d). カードの種類(3,c). トランプを切る(0,L,L) :- !. トランプを切る(N,L,X) :- M1 is random(52) + 1, M2 is random(52) + 1, swap_nth(M1,M2,L,L1), N2 is N - 1,!, トランプを切る(N2,L1,X). swap_nth(M,N,L1,L2) :- nth1(M,L1,A), nth1(N,L1,B), swap(A,B,L1,L2),!. swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは '対角要素は変数、対角要素より下はすべて_値1、上はすべて_値2であるようなN次の正方行列'(N,_値1,_値2,_対角以外値が埋め込まれた正方行列,_対角要素の変数ならび) :- integer(N), length(L,N), '一行づつ_値1+_変数+_値2のならびを構成していく'(L,_値1,_値2,LY), 正方行列と変数ならびに分離(LY,_対角以外値が埋め込まれた正方行列,_対角要素の変数ならび). '一行づつ_値1+_変数+_値2のならびを構成していく'(L,_値1,_値2,LY) :- findall([_列ならび,_対角部分の変数],( 一行取り出す(L1,A,L2,L), '_値1+_変数+_値2となる行を構成'(L1,L2,_値1,_値2,_列ならび,_対角部分の変数)), LY). 一行取り出す(L,L1,A,L2) :- append(L1,[A|L2],L). '_値1+_変数+_値2となる行を構成'(L1,L2,_値1,_値2,_列ならび,A) :- length(L1,N1),length(L11,N1), length(L2,N2),length(L22,N2), all(L11,_値1),all(L22,_値2), append(L11,[A|L22],_列ならび),!. 正方行列と変数ならびに分離([],[],[]) :- !. 正方行列と変数ならびに分離([[L,V]|R1],[L|R2],[V|R3]) :- 正方行列と変数ならびに分離(R1,R2,R3). 対角要素(M,N,_,[]) :- M > N,!. 対角要素(M,N,_行列,[_要素|R]) :- list_nth(M,_行列,_行), list_length(_行,N), list_nth(M,_行,_要素), M2 is M + 1, 対角要素(M2,N,_行列,R). 対角要素(_行列,_対角要素) :- length(_行列,N), 対角要素(1,N,_行列,_対角要素). % 以下のサイトは % *** user: '暫定税率版軽油引取税' / 5 *** 暫定税率版軽油引取税(_顧客番号,_日付下限,_日付上限,_軽油数量合計,_軽油引取税) :- 日付範囲に変数が来たら出荷日と単一化([_日付下限,_日付上限],_出荷日), findsum(_数量,( 日付範囲の暫定税率に対応する軽油数量を得る(_日付下限,_日付上限,_数量)),_軽油数量合計), '1L当たり軽油引取税'(_出荷日,_1L当たり軽油引取税), 暫定税率版軽油引取税計算(_顧客番号,_軽油数量合計,_1L当たり軽油引取税,_軽油引取税). 暫定税率版軽油引取税(_顧客番号,_日付下限,_日付上限,0.0,0.0). 日付範囲の暫定税率に対応する軽油数量を得る(_日付下限,_日付上限,_数量) :- 売上('A','1',_出荷日,_顧客番号,_商品番号,_数量,_単価,_金額,_入力時刻), '出荷日は日付範囲内であり、かつ暫定税率期間範囲内'(_日付下限,_日付上限,_出荷日), member(_商品番号,['0004','0014']). '出荷日は日付範囲内であり、かつ暫定税率期間範囲内'(_日付下限,_日付上限,_出荷日) :- _出荷日 @>= _日付下限, _出荷日 @=< _日付上限, 暫定税率適用期間(_出荷日). 暫定税率版軽油引取税計算(_顧客番号,_軽油数量合計,_1L当たり軽油引取税,_軽油引取税) :- 軽油引取税切り捨て計算顧客(_顧客番号), _軽油引取税 は 切り捨て(_軽油数量合計 * _1L当たり軽油引取税). 暫定税率版軽油引取税計算(_顧客番号,_軽油数量合計,_1L当たり軽油引取税,_軽油引取税) :- \+(軽油引取税切り捨て計算顧客(_顧客番号)), _軽油引取税 は 四捨五入(_軽油数量合計 * _1L当たり軽油引取税). 暫定税率適用期間(_日付) :- _日付 @< '20080401',!. 暫定税率適用期間(_日付) :- _日付 @> '20080430',!. '1L当たり軽油引取税'(_日付,32.1) :- _日付 @>= '19931201'. '1L当たり軽油引取税'(_日付,25.3) :- _日付 @=< '19931130'. 日付範囲に変数が来たら出荷日と単一化([],_) :- !. 日付範囲に変数が来たら出荷日と単一化([A|R],_出荷日) :- var(A), A=_出荷日, 日付範囲に変数が来たら出荷日と単一化(R,_出荷日). 日付範囲に変数が来たら出荷日と単一化([A|R],_出荷日) :- \+(var(A)), 日付範囲に変数が来たら出荷日と単一化(R,_出荷日). find_sum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 入力件数nをキーボードより入力し、n人分のテストデータを入力する。 # その際、合計点、最高点、最低点を求め、最後に平均点を計算しそれぞれを出力するプログラムを作成せよ。 # ただし、平均点は実数型とし小数点第2位まで出力する。 # 平均点以外の変数は整数型とする。 # # 問?棒グラフ出力プログラム # 値2つを入力し、*を横に並べて棒グラフ状に出力するプログラム。 # 大きい値の方の棒グラフが上に来るようにすること。 # (値として0〜50までしか入力されないものとする) '値2つを入力し(値として0〜50までしか入力されないものとする)、*を横に並べて棒グラフ状に出力するプログラム。大きい値の方の棒グラフが上に来るようにすること。' :- '値2つを入力し(値として0〜50までしか入力されないものとする)'(_値1,_値2), '大きい順に*を横に並べて棒グラフ状に'(_値1,_値2,_星文字列1,_星文字列2), 出力する(_星文字列1,_星文字列2). '値2つを入力し(値として0〜50までしか入力されないものとする)'(_値1,_値2) :- 整数を得る('整数(0-50)',between(0,50,_値1),_値1), 整数を得る('整数(0-50)',between(0,50,_値2),_値2). '大きい順に*を横に並べて棒グラフ状に'(_値1,_値2,_星文字列1,_星文字列2) :- _値1 >= _値2, 二つの星表示文字列(_値1,_値2,_星文字列1,_星文字列2). '大きい順に*を横に並べて棒グラフ状に'(_値1,_値2,_星文字列1,_星文字列2) :- _値1 < _値2, 二つの星表示文字列(_値2,_値1,_星文字列1,_星文字列2). 二つの星表示文字列(_等しいか大きい値,_小さい値,_星文字列1,_星文字列2) :- 星表示文字列(_等しいか大きい値,_星文字列1), 星表示文字列(_小さい値,_星文字列2). 星表示文字列(_値,_星文字列) :- findall(*,between(1,_値,_),_星ならび), atomic_list_concat(_星ならび,_星文字列). 出力する(_星文字列1,_星文字列2) :- writef('%t\n%t\n',[_星文字列1,_星文字列2]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 縦方向に棒グラフ状出力(A,B) :- 星ならびを得る(50,A,B,L), 棒グラフ状に印字(L). 星ならびを得る(0,_,_,[]). 星ならびを得る(N,A,B,[[X1,X2]|R]) :- 空白か星か(N,A,B,X1,X2), N2 is N - 1, 星ならびを得る(N2,A,B,R). 空白か星か(N,A,B,' ',' ') :- N > A, N > B. 空白か星か(N,A,B,' ','*') :- N > A, N =< B. 空白か星か(N,A,B,'*',' ') :- N =< A, N > B. 空白か星か(N,A,B,'*','*') :- N =< A, N =< B. 棒グラフ状に印字([]). 棒グラフ状に印字([L|R]) :- writef(' %t %t\n',L), 棒グラフ状に印字(R). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/615 # # [1] 授業単元: C初心者コース # [2] 問題文(含コード&リンク):試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する # プログラムを作れ90〜100A+80〜89A70〜79B60〜69C0〜59Fそれ以外error # [3] 環境 # [3.1]linux # [3.2] gcc # [3.3]C # [4]6月19日 # [5]if文(gotoは論外)while do while for等 ループ文を使ってはいけないそうです 評価値(_点数,'A+') :- _点数>=90,_点数=<100. 評価値(_点数,'A') :- _点数>=80,_点数=<89. 評価値(_点数,'B') :- _点数>=70,_点数=<79. 評価値(_点数,'C') :- _点数>=60,_点数=<69. 評価値(_点数,'F') :- _点数>=0,_点数=<59. 評価値(_,error). '試験の点数(100点満点)を入力すると、評価値(A+,A,B,C,F)を表示する' :- '試験の点数(100点満点)を入力すると'(_試験の点数), 評価値を表示する(_試験の点数). '試験の点数(100点満点)を入力すると'(_試験の点数) :- write('試験の点数を入力してください : '), 行入力(_行), '試験の点数(100点満点)を入力診断'(_行,_試験の点数),!. '試験の点数(100点満点)を入力すると'(_試験の点数) :- '試験の点数(100点満点)を入力すると'(_試験の点数). '試験の点数(100点満点)を入力診断'(_行,_試験の点数) :- atom_to_term(_行,_試験の点数,_), 試験の点数は整数で0点以上100点以下(_試験の点数),!. '試験の点数(100点満点)を入力診断'(_行,_試験の点数) :- writef('入力された %t からは適切な試験の点数が得られません。再入力をお願いします。\n',[_行]), fail. 試験の点数は整数で0点以上100点以下(_試験の点数) :- integer(_試験の点数), _試験の点数>=0, _試験の点数=<100,!. 評価値を表示する(_試験の点数) :- 評価値(_試験の点数,_評価値), writef('入力した試験の点数は %t,その評価値は %t です\n',[_試験の点数,_評価値]). % 鍵値が範囲指定のときは、鍵の引数は変数にして置く。同時に二つ以上の具体的な値は表現できない。 % 評価値は英大文字から始まっているので変数と区別するためシングルクォーツで囲う。 % 一般に入力は不適切な文字列が入力されることも考慮する。ここでは、適切な入力が得られるまで、 % 繰り返し入力を促す例を示した。これが一般的な対応。 % read/1を使わないのは、入力の最後にピリオドが必要になるから。実務では受け入れられない。 % 文字列から整数を得るのにはatom_to_term/3を使う。第三引数は使わないためアンダースコアになっている。 行入力(_行) :- get_char(_文字), 行末まで読み込む(_文字,_行末までの文字ならび), atom_chars(_行,_行末までの文字ならび). 行末まで読み込む(end_of_file,[]) :- !. 行末まで読み込む('\n',[]) :- !. 行末まで読み込む(_文字,[_文字|R]) :- get_char(_次の文字), 行末まで読み込む(_次の文字,R). % 以下のサイトは % 課題1 ターミナルから日本円の金額を読み込み,これをドルとユーロに変換して表示するプログラムを作成しなさい.  %    作成にあたっては,下図の構造体を用い,為替レートは図に示された初期値を用いなさい. % % struct rate { // 外国為替レート % double to_yen; // 対円 % double to_dollar; // 対ドル % double to_euro; // 対ユーロ % }; % % struct rate yen = {1.0, 0.0104, 0.007347,}; % /* 1$=96.15円, 1EURO=136.11円の場合の,各国通貨に対する円の為替レート */ % % % % 課題2 ターミナルから一文字を読み込み,それが'e'の場合は英語の国名を出力し,'f'の場合はフランス語で国名を出力する %    プログラムを作成しなさい.ただし,国名を格納した変数は下図に示すものを用いること. % % #define SLENGTH 20 % #define COUNTRIES 5 % % struct nation { % char en[SLENGTH]; /* 国名(英語) */ % char fr[SLENGTH]; /* 国名(仏語) */ % }; % % struct nation country[COUNTRIES] = { /* 国名の初期化 */ % {"Japan", "Japon", }, // 日本 % {"France", "France",}, // フランス % {"Germany", "Allemagne",}, // ドイツ % {"Spain", "Espagne",}, // スペイン % {"Italy", "Italie",}, // イタリア % }; % % % 課題3 氏名,身長,体重を収めるリストを構造体で作成し,BMI指数により標準体型と見なされる人の氏名とBMI指数を出力する %    プログラムを作成せよ. % %     ・登録できる人数の上限を16人とし,登録者数を入力してから,各人のデータを入力する. %     ・構造体の各要素は,name(氏名),height(身長),weight(体重)とする. %     ・氏名は,30文字以内とし,スペースを含まない. %     ・身長の単位は[cm],体重の単位は[Kg]とする. %     ・各項目は<スペース>で区切られて入力される. %     ・各項目は<スペース>で区切られて出力される. % % 課題1 対円レート(1.0, 0.0104, 0.007347). 外国為替レート(_円,_ドル,_ユーロ) :- 対円レート(_, _対ドル, _対ユーロ), not(var(_円)), _ドル is _円 * _対ドル, _ユーロ is _円 * _対ユーロ. % 課題2 課題2 :- read(X), 課題2_1(X). 課題2_1(e) :- country(L), member([Country,_],L), write(Country),nl, fail. 課題2_1(f) :- country(L), member([_,Country],L), write(Country),nl, fail. 課題2_1(_). country([['Japan', 'Japon'], % 日本 ['France', 'France'], % フランス ['Germany', 'Allemagne'], % ドイツ ['Spain', 'Espagne'], % スペイン ['Italy', 'Italie']]). % イタリア % 課題3 データ入力 :- abolish(個人データ/0), 構造体生成(_構造体1), read(X), split(X,[' '],[_名前,_身長,_体重]), データ入力(_名前,_身長,_体重,_構造体1,_構造体2), assertz(個人データ(_構造体2)), 'BMI標準メンバーの表示. 'BMI標準メンバーの表示' :- 個人データ(_構造体), member([_名前1,_身長1,_体重1],_構造体), 'BMI判定'(_身長1,_体重1,BMI,普通です), wr('%t %t %t %t\n',[_名前1,_身長1,_体重1,BMI]), fail; true. データ入力(end_of_file,_構造体,_構造体) :- !. データ入力(_入力行,_構造体1,_構造体) :- split(_入力行,[' '],[_名前,_身長,_体重]), sub_atom(_名前,0,30,_,_名前1), 構造体更新(_氏名,_身長1,_体重,_構造体1,_構造体2), read(X), データ入力(X,_構造体2,_構造体). 構造体生成([]). 構造体更新(_名前,_身長,_体重,_更新前,_更新後) :- length(_更新前,Len), Len < 16, _更新後=[[名前(_名前),身長(_身長),体重(_体重)]|_更新前]. 構造体更新(_名前,_身長,_体重,_,_) :- write('登録者がすでに16名います\n追加できません\n'). 'BMI判定'(_身長,_体重,BMI,_判定) :- BMI is _体重/_身長/_身長*10000, 'BMI判定'(BMI,_判定). 'BMI判定'(BMI,やせてます) :- BMI =< 18.5. 'BMI判定'(BMI,普通です) :- BMI > 18.5,BMI < 25.0. 'BMI判定'(BMI,レッツエクササイズ!) :- BMI >= 25.0. % 以下のサイトは %% 1.0 剰余算 を核とするFizzBuzz %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz_2(M,S), writef('%w ',[S]), N = N. fizzbuzz_2(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5,!. fizzbuzz_2(N,'Fizz') :- 0 is N mod 3,!. fizzbuzz_2(N,N,'Buzz') :- 0 is N mod 5,!. fizzbuzz_2(N,N). %% 1.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz(M,X), writef('%w ',[X]), M = N. fizzbuzz(N,'Fizz') :- 0 is N mod 3,\+(0 is N mod 3). fizzbuzz(N,'Buzz') :- 0 is N mod 5,\+(0 is N mod 5). fizzbuzz(N,'FizzBuzz') :- 0 is N mod 3,0 is N mod 5. fizzbuzz(N,N) :- \+(0 is N mod 3),\+(0 is N mod 5). %% 1.2 再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(0) :- !. fizzbuzz(N) :- fizzbuzz(N,X), N_1 is N - 1, fizzbuzz(N_1), writef('%w ',[X]). fizzbuzz(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz(M,M). %% 1.3 再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @viperlikeさんのツイートを見てそこで示されている形式の再帰がまだないことに気がついた。 % fizzbuzz(N) :- fizzbuzz(N,[],L), write_fizzbuzz(L). fizzbuzz(0,L,L) :- !. fizzbuzz(N,L1,L) :- fizzbuzz(N,S), succ(N_1,N), fizzbuzz(N_1,[S|L1],L). fizzbuzz(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz(M,M). write_fizzbuzz(L) :- atomic_list_concat(L,' ',S), writef('%w\n',[S]). %% 1.4 末尾再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz_2(M,X), writef('%w ',[X]), M_2 is M + 1, fizzbuzz(M_2,N). fizzbuzz_2(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz_2(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz_2(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz_2(M,M). %% 1.5 forall/2とbetween/3を使用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- forall(( between(1,N,M), fizzbuzz_2(M,S), writef('%w ',[S])), true). fizzbuzz_2(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz_2(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz_2(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz_2(M,M). %% 1.6 findsols/4とnth1/3を使用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,( nth1(M,_,_), fizzbuzz_2(M)),_),!. fizzbuzz_2(M) :- fizzbuzz_3(M,S), writef('%w ',[S]),!. fizzbuzz_3(M,'FizzBuzz') :- 0 is M mod 15. fizzbuzz_3(M,'Fizz') :- 0 is M mod 3. fizzbuzz_3(M,N,'Buzz') :- 0 is M mod 5. fizzbuzz_3(M,M). %% 1.7 between/3とfindall/3を使用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz(M,[[1,M],[3,'Fizz'],[5,'Buzz']],L2), fizzbuzz_2(L2,S), writef('%w ',[S]), N = M. fizzbuzz(M,L1,L2) :- findall(S,( member([U,S],L1), 0 is M mod U), L2). fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %% 1.8 末尾再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz表示(M), M_2 is M + 1, fizzbuzz(M_2,N). fizzbuzz表示(M) :- fizzbuzz表示(M,_表示), writef('%w ',[_表示]). fizzbuzz表示(M,'FizzBuzz') :- 0 is M mod 3, 0 is M mod 5,!. fizzbuzz表示(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz表示(M,'Buzz') :- 0 is M mod 5,!. fizzbuzz表示(M,M). %% 1.9 剰余情報をリストに持つ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,_n), findall(A,( member([_m,A],[[1,_n],[3,'Fizz'],[5,'Buzz']]), 0 is _n mod _m), L), fizzbuzz_2(L,S), writef('%w ',[S]), N = _n. fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %% 1.10 剰余情報をリストに持ち、findnsols/4とbetween/3で制御 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,( nth1(M,_,_), findall(S,( member([U,S],[[1,M],[3,'Fizz'],[5,'Buzz']]), 0 is M mod U),L2), fizzbuzz_2(L2,S), writef('%w ',[S])),_),!. fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %% 1.11 末尾再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(N,Max) :- N > Max. fizzbuzz(N,Max) :- fizzbuzz_2(N,C), nth0(C,[N,'Fizz','Buzz','FizzBuzz'],X), writef('%w ',[X]), N_2 is N + 1, fizzbuzz(N_2,Max). fizzbuzz_2(N,C) :- 0 is N mod 3 -> A=1;A=0. 0 is N mod 5 -> B=1;B=0, C is A + 2 * B. %% 2.0 FizzBuzzの変位をリストのパターンとして表現 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzに置換する(L,L1), buzzに置換する(L1,L2), 表示する(L2),!. fizzに置換する([_1,_2,_3|R1],[_1,_2,fizz|R2]) :- fizzに置換する(R1,R2). fizzに置換する(L,L). buzzに置換する([_1,_2,_3,_4,fizz|R1],[_1,_2,_3,_4,fizzbuzz|R2]) :- buzzに置換する(R1,R2). buzzに置換する([_1,_2,_3,_4,_5|R1],[_1,_2,_3,_4,buzz|R2]) :- buzzに置換する(R1,R2). buzzに置換する(L,L). 表示する(L) :- atomic_list_concat(L,' ',_表示文字列), writef('%w\n',[_表示文字列]). %% 2.1 リストのシフトで割り算を表現 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(N,_fizzbuzzならび), fizzbuzzならびを表示する(_fizzbuzzならび),!. fizzbuzz(N,L2) :- 最初に自然数ならびを作り(N,_自然数ならび), fizzに置換する(_自然数ならび,L1), buzzに置換する(L1,L2). 最初に自然数ならびを作り(N,_自然数ならび) :- findall(M,between(1,N,M),_自然数ならび). fizzに置換する([_1,_2,_3|R1],[_1,_2,fizz|R2]) :- fizzに置換する(R1,R2). fizzに置換する(L,L). buzzに置換する(L1,L2) :- fizzbuzzも考慮しつつbuzzに置換する(L1,L2). buzzに置換する(L,L). fizzbuzzも考慮しつつbuzzに置換する([_1,_2,_3,_4,fizz|R1],[_1,_2,_3,_4,fizzbuzz|R2]) :- buzzに置換する(R1,R2). fizzbuzzも考慮しつつbuzzに置換する([_1,_2,_3,_4,_5|R1],[_1,_2,_3,_4,buzz|R2]) :- buzzに置換する(R1,R2). fizzbuzzならびを表示する(_fizzbuzzならび) :- atomic_list_concat(_fizzbuzzならび,' ',_表示文字列), writef('%w\n',[_表示文字列]). %% 2.2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- length(L0,N), fizzbuzz([_],[_|L0],[_,_,_],[_,_,_,_,_]). fizzbuzz(Lm,Lm,_,_). fizzbuzz(L0,Lm,L1,L2) :- fizzbuzz(L0,L1,L2,L3,L4,_正解), writef('%w ',[_正解]), fizzbuzz([_|L0],Lm,L3,L4). fizzbuzz(_,[_],[_],[_,_,_],[_,_,_,_,_],'FizzBuzz'). fizzbuzz(_,[_],[_|L2],[_,_,_],L2,'Fizz'). fizzbuzz(_,[_|L1],[_],L1,[_,_,_,_,_],'Buzz'). fizzbuzz(L,[_|L1],[_|L2],L1,L2,N) :- length(L,N). %% 2.3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz(_,_,[]) :- !. fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%w ',[A]), fizzbuzz([_|L1],[_|L2],R). %% 2.4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_,_,_],[_,_,_,_,_],L). fizzbuzz(_,_,[]) :- !. fizzbuzz([],[],[_|R]) :- fizzbuzz([_,_,_],[_,_,_,_,_],['FizzBuzz'|R]). fizzbuzz([],L2,[_|R]) :- fizzbuzz([_,_,_],L2,['Fizz'|R]). fizzbuzz(L1,[],[_|R]) :- fizzbuzz(L1,[_,_,_,_,_],['Buzz'|R]). fizzbuzz([_|L1],[_|L2],[A|R]) :- writef('%w ',[A]), fizzbuzz(L1,L2,R). %% 2.5 リストのシフトで割り算 空文字を使いfizzbuzzを表示させない技法 %%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w ',[C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,C) :- atom_concat(A,B,C). %% 2.6 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz(['','','Fizz'],['','','','','Buzz'],L). fizzbuzz(_,_,[]). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w ',[C]), append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,C) :- atom_concat(A,B,C). %% 2.7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w%w%w',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N). fizzbuzz(A,B,_,' '). %% 2.8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w%w%w ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). %% 2.9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']),!. fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,L1,L2) :- fizzbuzz_1([_|Ln],L1,L2,S), writef('%w ',[S]), fizzbuzz_2(L1,L2,L1_2,L2_2), fizzbuzz([_|Ln],N,L1_2,L2_2). fizzbuzz_1([_|Ln],[''|_],[''|_],N) :- length([_|Ln],N). fizzbuzz_1(_,[A|_],[B|_],S) :- atomic_list_concat([A,B],S). fizzbuzz_2([A|R1],[B|R2],L1_2,L2_2) :- append(R1,[A],L1_2), append(R2,[B],L2_2). %% 2.10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],['','','',fizz],['','','','',buzz],Lnx), length(Lnx,N). fizzbuzz(Ln,[A|R1],[B|R2],Ln) :- 表示(Ln,A,B). fizzbuzz(Ln,[A|R1],[B|R2],Lnx) :- 回転([A|R1],[B|R2],L1,L2), fizzbuzz([_|Ln],L1_2,L2_2,Lnx). 回転([A|R1],[B|R2],L1,L2) :- append(R1,[A],L1), append(R2,[B],L2). 表示(Ln,A,B) :- 表示項(Ln,A,B,X), writef('%w '[X]). 表示項(Ln,'','',N) :- length(Ln,N),!. 表示項(_,A,B,C) :- atom_concat([A,B],C). %% 2.11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(L,N,_,_) :- length(L,N),!. fizzbuzz(Ln,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- fizzbuzz_1(_31,_51,Ln,A), writef('%w%w%w ',[_31,_51,A]), fizzbuzz([_|Ln],N,[_32,_33,_31],[_52,_53,_54,_55,_51]). fizzbuzz_1('','',Ln,M) :- length([_|Ln],M),!. fizzbuzz_1(_,_,_,''). %% 2.12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],[_,_],[_,_,_,_],Ln,X), writef('%w',[X]), length(Ln,N),!. fizzbuzz(L1,L2,L3,Ln,X) :- fizzbuzz_1(L1,L2,L3,L2_1,L3_1,Y), fizzbuzz_2(L1,L2_1,L3_1,Y,Ln,X). fizzbuzz_2(L1,L2,L3,X,L1,X). fizzbuzz_2(L1,L2,L3,_,Ln,X) :- fizzbuzz([_|L1],L2,L3,Ln,X). fizzbuzz_1(R1,[],[],[_,_],[_,_,_,_],'FizzBuzz '). fizzbuzz_1(R1,[],[_|R3],[_,_],R3,'Fizz '). fizzbuzz_1(R1,[_|R2],[],R2,[_,_,_,_],'Buzz '). fizzbuzz_1(R1,[_|R2],[_|R3],R2,R3,N) :- length(R1,N). %% 2.13 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Nth,X) :- fizzbuzz([_],[_,_],[_,_,_,_],Nth,X). fizzbuzz(L1,L2,L3,Nth,X) :- length(L1,Nth_1), fizzbuzz_1(Nth_1,L2,L3,L2_1,L3_1,Y), fizzbuzz_2(L1,L2_1,L3_1,Nth_1,Nth,Y,X). fizzbuzz_2(L1,L2,L3,Nth,Nth,X,X). fizzbuzz_2(L1,L2,L3,_,Nth,_,X) :- fizzbuzz([_|L1],L2,L3,Nth,X). fizzbuzz_1(_,[],[],[_,_],[_,_,_,_],'FizzBuzz'). fizzbuzz_1(_,[],[_|R3],[_,_],R3,'Fizz'). fizzbuzz_1(_,[_|R2],[],R2,[_,_,_,_],'Buzz'). fizzbuzz_1(N,[_|R2],[_|R3],R2,R3,N). %% 2.14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- fizzbuzz(M,[_],[_,_,_],[_,_,_,_,_]). fizzbuzz(M,[_|L],_,_) :- length(L,M),!. fizzbuzz(M,L,L1,L2) :- fizzbuzz(L,L1,L2,L_1,L1_1,L2_1,S), writef('%w ',[S]), fizzbuzz(M,L_1,L1_1,L2_1). fizzbuzz(L,L,L,[_|L],[_,_,_|L],[_,_,_,_,_|L],fizzbuzz) :- !. fizzbuzz(L,L,L2,[_|L],[_,_,_|L],L2,fizz) :- !. fizzbuzz(L,L1,L,[_|L],L1,[_,_,_,_,_|L],buzz). fizzbuzz(L,L1,L2,[_|L],L1,L2,N) :- length(L,N). %% 2.15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % PrologというのはFizzBuzz問題向きなのだろうか。 % fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%w ',[A]), fizzbuzz([_|L1],[_|L2],R). fizzbuzz(_,_,[]). %% 2.16 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizbuzz(1,N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(M,N,_,_) :- M > N,!. fizzbuzz(M,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- 出力情報(_31,_51,M,_N), writef('%w%w%w ',[_31,_51,_N]), fizzbuzz(M,N,[_32,_33,_31],[_52,_53,_54,_55,_51]). 出力情報('','',_N,_N) :- !. 出力情報(_,_,_,''). %% 2.17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w%w%w ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). %% 3.0 ペアノ数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- s(S,M), fizzbuzz(S,s(0),s(s(s(0))),s(s(s(s(s(0)))))). fizzbuzz(S,s(S),_,_) :- !. fizzbuzz(MS,S,S1,S2) :- fizzbuzz(S,S1,S2,S_1,S1_1,S2_1,A), writef('%w ',[A]), fizzbuzz(MS,S_1,S1_1,S2_1). fizzbuzz(S,S,S,s(S),s(s(s(S))),s(s(s(s(s(S))))),fizzbuzz) :- !. fizzbuzz(S,S,S2,s(S),s(s(s(S))),S2,fizz) :- !. fizzbuzz(S,S1,S,s(S),S1,s(s(s(s(s(S))))),buzz). fizzbuzz(S,S1,S2,s(S),S1,S2,N) :- s(S,N). s(0,0) :- !. s(s(S),N) :- var(N), s(S,N_1), succ(N_1,N). s(s(S),N) :- integer(N), succ(N_1,N), s(S,N_1). %% 4.0 FizzBuzz整数の15個パターンの利用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% finzzbuzz(N) :- fizzbuzz([],N,['FizzBuzz',_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_],[]). fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,Ln2,[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]) :- fizzbuzz(Ln,N,Ln2,[]). fizzbuzz(Ln,N,Ln2,L) :- append(_,[A|L],Ln2), fizzbuzz_2(Ln,A,B), writef('%w ',[B]), fizzbuzz([_|Ln],N,Ln2,[_|L]). fizzbuzz_2(Ln,A,A) :- atom(A). fizzbuzz_2(Ln,A,N) :- length([_|Ln],N). %% 4.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz(L,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). fizzbuzz([],_) :- !. fizzbuzz(L,[]) :- fizzbuzz(L,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). fizzbuzz([A|R1],[B|R2]) :- var(B), writef('%w ',[A]), fizzbuzz(R1,R2). fizzbuzz([A|R1],[B|R2]) :- atomic(B), writef('%w ',[B]), fizzbuzz(R1,R2). %% 4.2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'FizzBuzz'(N) :- findall(M,between(1,N,M),L1), 'FizzBuzz置換パターン'(L1,L2), atomic_list_concat(L2,' ',S), writef('%w\n',[S]). 'FizzBuzz置換パターン'([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15|R1],[_1,_2,'Fizz',_4,'Buzz','Fizz',_7,_8,'Fizz','Buzz',_11,'Fizz',_13,_14,'FizzBuzz'|R2]) :- 'FizzBuzz置換パターン'(R1,R2). 'FizzBuzz置換パターン'(L,R) :- length(L,Len), length(R,Len), append(L,_,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15]), append(R,_,[_1,_2,'Fizz',_4,'Buzz','Fizz',_7,_8,'Fizz','Buzz',_11,'Fizz',_13,_14,'FizzBuzz']). %% 4.3 nth1/3とfindall/3とflatten/2を利用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 置換パターンならびを生成(_置換パターンならび), nth1(_nth1,_置換パターンならび,A), fizzbuzz_2(_nth1,A), _nth1 = N. 置換パターンならびを生成(_置換パターンならび) :- U is (N // 15) + 1, findall([_,_,'Fizz',_,'Buzz',_,_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,U,_),LL), flatten(LL,_置換パターンならび). fizzbuzz_2(_nth1,A) :- var(A), writef('%w ',[_nth1]). fizzbuzz_2(_,A) :- atom(A), writef('%w ',[A]). %% 4.4 findall/3とforall/2を使う %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- M is N // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,M,_),LL), flatten(LL,L), forall(( append(L0,[A|R],L), length([_|L0],N_1), ( N_1 > Max,!,fail; fizzbuzz_2(A,N_1,B))), writef('%w ',[B])). fizzbuzz_2(A,N,N) :- var(A),!. fizzbuzz_2(A,N,A). %% 4.5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L), 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数) :- nth1(_nth1,L,A), 表示項の選択(_nth1,A,_表示項), writef('%w ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,_nth1,_nth1) :- !. 表示項の選択(_nth1,A,A). %% 4.6 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%w ',[A])). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を埋める(N,L1,L2) :- findall(U,( nth1(_nth1,L1,U), _nth1 =< N, (U=_nth1;atom(U))), L2). %% 4.7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%w ',[A])). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を埋める(M,N,L) :- M > N,!. 変数だけ要素位置番号を埋める(M,N,[M|R]) :- M_2 is M + 1, 変数だけ要素位置番号を埋める(M_2,N,R). 変数だけ要素位置番号を埋める(M,N,[_|R]) :- M_2 is M + 1, 変数だけ要素位置番号を埋める(M_2,N,R). %% 4.8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を表示する(N,L1). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を表示する(N,L1) :- forall((nth1(_nth1,L1,U),_nth1 =< N,(U=_nth1;atom(U))),writef('%w ',[U])). %% 4.9 情報の持ち方が独特 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(0,N),!. fizzbuzz(N,M) :- append(L0,[A|R],[1,2,[3,fizz],4,[5,buzz],[6,fizz],7,8,[9,fizz],[10,buzz],11,[12,fizz],13,14,[15,fizzbuzz]]), 表示値(N,A,N3,_表示値), fizzbuzz_2(N,M,R,N3,_表示値). fizzbuzz_2(N,M,R,N3,_表示値) :- N3 > M. fizzbuzz_2(N,M,R,N3,_表示値) :- writef('%w ',[_表示値]), R = [], N4 is N + 15, fizzbuzz(N4,M). 表示値(N1,[N2,A],N3,A) :- N3 is N1 + N2,!. 表示値(N1,N2,N3,N3) :- N3 is N1 + N2. %% 4.10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L1), forall((nth1(_nth1,L1,U),_nth1 =< N,(var(U),U=_nth1;atom(U))),writef('%w ',[U])). %% 4.11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,(fizzbuzz_2(B),writef('%w ',[B])),_),!. fizzbuzz_2(B) :- nth0(I,_,_), member(A,[1,2,'Fizz',4,'Buzz','Fizz',7,8,'Fizz','Buzz',11,'Fizz',13,14,'FizzBuzz']), fizzbuzz_3(A,I,B). fizzbuzz_3(A,_,A) :- atom(A). fizzbuzz_3(A,I,B) :- integer(A), B is 15 * I + A. %% 4.12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,(nth0(I,_,_),fizzbuzz_2(I,B)),_),!. fizzbuzz_2(I,B) :- member(A,[1,2,'Fizz',4,'Buzz','Fizz',7,8,'Fizz','Buzz',11,'Fizz',13,14,'FizzBuzz']), fizzbuzz_3(A,I,B), writef('%w ',[B]). fizzbuzz_3(A,_,A) :- atom(A). fizzbuzz_3(A,I,B) :- integer(A), B is 15 * I + A. %% 4.13 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,fizzbuzz_2(B),_),!. fizzbuzz_2(B) :- nth0(I,_,_), member(A,[1,2,'Fizz',4,'Buzz','Fizz',7,8,'Fizz','Buzz',11,'Fizz',13,14,'FizzBuzz']), fizzbuzz_3(A,I,B), writef('%w ',[B]). fizzbuzz_3(A,_,A) :- atom(A). fizzbuzz_3(A,I,B) :- integer(A), B is 15 * I + A. %% 4.14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,fizz_buzz_numberを表示する,_),!. fizz_buzz_numberを表示する :- fizz_buzz_numberを得る(A), writef('%w ',[A]). fizz_buzz_numberを得る(A) :- nth0(_順目,_,_), nth1(_位置,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],A), 変数には番号を埋める(_順目,_位置,A). 変数には番号を埋める(_,_,A) :- atom(A). 変数には番号を埋める(_順目,_位置,A) :- A is 15 * _順目 + _位置. %% 4.15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'N個の変数かfizzbuzzならび'(N,L), 'N個の変数かfizzbuzzならびを変数に順序数を埋めながら表示する'(L),!. 'N個の変数かfizzbuzzならび'(N,L) :- findnsols(N,A,変数かfizzbuzzか(A),L). 変数かfizzbuzzか(A) :- repeat, member(A,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). 'N個の変数かfizzbuzzならびを変数に順序数を埋めながら表示する'(L) :- forall(fizzbuzz表示情報(L,A),writef('%w ',[A])). fizzbuzz表示情報(L,A) :- nth1(_位置,L,A), 'Aはfizzbuzzか_位置'(_位置,A). 'Aはfizzbuzzか_位置'(_位置,A) :- atom(A). 'Aはfizzbuzzか_位置'(_位置,_位置). %% 4.16 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]), M=N,!. fizzbuzz(M_1,M,L,[]) :- fizzbuzz(M_1,M,L,L). fizzbuzz(M,M,L,[A|R]) :- writef('%w ',[A]). fizzbuzz(M_1,M,L,[_|R]) :- succ(M_1,M_2), fizzbuzz(M_2,M,L,R). %% 4.16 (書き直し) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]),M = N,!. fizzbuzz(I,J,L,[]) :- fizzbuzz(I,J,L,L). fizzbuzz(I,I,L,[A|R]) :- writef('%w ',[A]). fizzbuzz(I,J,L,[_|R]) :- succ(I,K), fizzbuzz(K,J,L,R). %% 4.17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]),M = N,!. fizzbuzz(Ln,I,L,[]) :- fizzbuzz(Ln,I,L,L). fizzbuzz(Ln,I,L,[A|R]) :- length(Ln,I), writef('%w ',[A]). fizzbuzz(Ln,I,L,[_|R]) :- fizzbuzz([_|Ln],I,L,R). %% 4.18 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Max) :- fizzbuzz(M,A),writef('%w ',[A]),Max = M,!. fizzbuzz(M,A) :- fizzbuzz([_],M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[],A). fizzbuzz(Ln,I,L,[],A) :- fizzbuzz(Ln,I,L,L,A). fizzbuzz(Ln,I,L,[A|R],A) :- length(Ln,I). fizzbuzz(Ln,I,L,[_|R],A) :- fizzbuzz([_|Ln],I,L,R,A). %% 4.19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Max) :- findnsols(Max,A,fizzbuzz([_],M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[],A),L), atomic_list_concat(L,' ',W), writef('%w\n',[W]),!. fizzbuzz(Ln,I,L,[],A) :- fizzbuzz(Ln,I,L,L,A). fizzbuzz(Ln,I,L,[A|R],A) :- length(Ln,I). fizzbuzz(Ln,I,L,[_|R],A) :- fizzbuzz([_|Ln],I,L,R,A). %% 4.20 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Max) :- findnsols(Max,A,fizzbuzz([_],M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[],A),Y,['\n']), atomic_list_concat(Y,' ',FizzBuzz), write(FizzBuzz),!. fizzbuzz(Ln,I,L,[],A) :- fizzbuzz(Ln,I,L,L,A). fizzbuzz(Ln,I,L,[A|R],A) :- length(Ln,I). fizzbuzz(Ln,I,L,[_|R],A) :- fizzbuzz([_|Ln],I,L,R,A). %% 4.21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],M,A,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]), M=N,!. fizzbuzz(Ln,M,A,L,[A|R]) :- 表示する(Ln,M,A). fizzbuzz(Ln,M,A,L,[_|R]) :- fizzbuzz([_|Ln],M,A,L,R). fizzbuzz(Ln,M,A,L,[]) :- fizzbuzz(Ln,M,A,L,L). 表示する(Ln,M,A) :- length(Ln,M), writef('%w ',[A]). %% 4.22 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,_,[A|_],[_,_,fizz,_,buzz,fizz,_,_,fizz,buzz,_,fizz,_,_,fizzbuzz],M), (A = M; atom(A)), writef('%w ',[A]), M = N,!. fizzbuzz(M,[],L,L,M). fizzbuzz(M,[A|L1],L2,[A|L3],N) :- M_2 is M + 1, append(L3,[A],L4), fizzbuzz(M_2,L1,L2,L4,N). %% 5.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L_f,L_b), 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L_f,L_b,_順序数). 'fizzbuzzパターンの形成'(N,L_f,L_b) :- N_f is (N - 1) // 3 + 1, findall(['','','Fizz'],between(1,N_f,_),LL_f), flatten(LL_f,L_f), N_b is (N - 1) // 5 + 1, findall(['','','','','Buzz'],between(1,N_b,_),LL_b), flatten(LL_b,L_b). 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数) :- nth1(_nth1,L_f,F), nth1(_nth1,L_b,B), 表示項の選択(_nth1,F,B,_表示項), writef('%w ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,'','',_nth1) :- !. 表示項の選択(_,A,B,_表示項) :- atomic_list_concat([A,B],_表示項). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # 'FizzBuzzhoge' :- 'FizzBuzzhoge'([],['','','Fizz'],['','','','','','','Buzz'],['','','','','','','','','','','','','hoge']). 'FizzBuzzhoge'(Ln,_,_,_) :- length(Ln,100),!. 'FizzBuzzhoge'(Ln,L1,L2,L3) :- 'FizzBuzzhoge'([_|Ln],L1,L2,L3,_表示情報), writef('%w\n',[_表示情報]), 三つのリストの左シフト(L1,L2,L3,L1_2,L2_2,L3_2), 'FizzBuzzhoge'([_|Ln],L1_2,L2_2,L3_2). 'FizzBuzzhoge'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. 'FizzBuzzhoge'(Ln,[A|_],[B|_],[C|_],_FizzBuzzhoge文字列) :- atomic_list_concat([A,B,C],_FizzBuzzhoge文字列). 三つのリストの左シフト([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(_まで) :- fizzbuzz([],_まで,あとふたつ,あとよっつ). fizzbuzz(L1,_まで,_,_) :- length(L1,_まで),!. fizzbuzz(L1,_まで,_Fizzまであといくつ_1,_Buzzまであといくつ_1) :- fizzbuzz_1([_|L1],_Fizzまであといくつ_1,_Buzzまであといくつ_1,_Fizzまであといくつ_2,_Buzzまであといくつ_2,Y), writef('%w ',[Y]), fizzbuzz([_|L1],_まで,_Fizzまであといくつ_2,_Buzzまであといくつ_2). fizzbuzz_1(_,ないよ,ないよ,あとふたつ,あとよっつ,'FizzBuzz'). fizzbuzz_1(_,ないよ,_Buzzまであといくつ_1,あとふたつ,_Buzzまであといくつ_2,'Fizz') :- ひとつ減らすよ(_Buzzまであといくつ_1,_Buzzまであといくつ_2). fizzbuzz_1(_,_Fizzまであといくつ_1,ないよ,_Fizzまであといくつ_2,あとよっつ,'Buzz') :- ひとつ減らすよ(_Fizzまであといくつ_1,_Fizzまであといくつ_2). fizzbuzz_1(L1,_Fizzまであといくつ_1,_Buzzまであといくつ_1,_Fizzまであといくつ_2,_Buzzまであといくつ_2,N) :- ひとつ減らすよ(_Fizzまであといくつ_1,_Fizzまであといくつ_2), ひとつ減らすよ(_Buzzまであといくつ_1,_Buzzまであといくつ_2), length(L1,N). ひとつ減らすよ(あとよっつ,あとみっつ). ひとつ減らすよ(あとみっつ,あとふたつ). ひとつ減らすよ(あとふたつ,あとひとつ). ひとつ減らすよ(あとひとつ,ないよ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 佑(_丈) :- 校([],_丈,碩,漁). 校(_里,_丈,_,_) :- length(_里,_丈),!. 校(_里,_丈,_部,_寓) :- 乾([_|_里],_部,_寓,_料,_勘,_公), writef('%w ',[_公]), 校([_|_里],_丈,_料,_勘). 乾(_,建,建,碩,漁,'FizzBuzz'). 乾(_,建,_寓,碩,_勘,'Fizz') :- 装(_寓,_勘). 乾(_,_発,建,_塔,漁,'Buzz') :- 装(_発,_塔). 乾(_里,_発,_寓,_塔,_勘,_論) :- 装(_発,_塔), 装(_寓,_勘), length(_里,_論). 装(漁,宜). 装(宜,碩). 装(碩,週). 装(週,建). % % 述語名、変数からシンボル性を除去した述語定義。 % 一つ上のFizzBuzz定義の述語名と変数名を無作為に全角漢字を % 引いてきて置き換えた。プログラミングにはこういう一面が常に % 多少はある。 % %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(1) %%%%%%%%%%% fizzbuzz(M) :- fizzbuzz(0,M,[_,_],[_,_,_,_],L), atomic_list_concat(L,A), write(A). fizzbuzz(M,M,_,_,[]). fizzbuzz(N,M,L1,L2,[A|R3]) :- succ(N,N_2), dt(N_2,L1,L2,R1,R2,A), fizzbuzz(N_2,M,R1,R2,R3). dt(_,[],[],[_,_],[_,_,_,_],'FIZZBUZZ') :- !. dt(_,[],[_|R],[_,_],R,fizz) :- !. dt(_,[_|R],[],R,[_,_,_,_],buzz) :- !. dt(N,[_|R1],[_|R2],R1,R2,N). %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(2) %%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'fizz',_,'buzz','fizz',_,_,'fizz','buzz',_,'fizz',_,_,'FIZZBUZZ'],between(1,N_1,_),LL), flatten(LL,L1), forall((nth1(_nth1,L1,U),_nth1 =< N,(_nth1=U;atom(U))),writef('%w',[U])). %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(3) %%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'fizz',_,'buzz','fizz',_,_,'fizz','buzz',_,'fizz',_,_,'FIZZBUZZ'],between(1,N_1,_),LL), flatten(LL,L), 表示(N,L). 表示(N,L) :- nth1(_nth1,L,U), 表示選択(_nth1,U), writef('%w',[U]), _nth1=N. 表示選択(_nth1,_nth1). 表示選択(_,U) :- atom(U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 最小文字数を競ってみよう(現在 147字) % fizzbuzz(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 述語名fizzbuzzをfにして良いなら 140字 (twitterの1twit限度文字数) % f(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % IF/Prolog (for/3,if/3 を使って) % % 述語名fizzbuzzをfにして良いなら 82字 % f(M):-for(1,N,M),nl,if((1>N mod 3,A=fizz;1>N mod 5,A=buzz),write(A),write(N)),MN mod 3,A=fizz;1>N mod 5,A=buzz),write(A))->write(N)),M