このディレクトリの索引

% 以下のサイトは # 出典 :: twitter_by_@TakaoOzaki_20160715 否定の否定(_目標) :- \+(\+(_目標)). ?- 否定の否定(true). true. ?- 否定の否定(member(A,[1,2,3])). true. % 引数は返らなくなりますね。単にfailの否定ですから。 % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- '連続文字列は4文字以上で_或る文字だけからなり、_前文字列の最後の文字と_後文字列の最初の文字はこの文字とは異なる。'(_文字列,_前文字列,_連続文字列,_後文字列,_或る文字を3回連続した文字列), '後文字列の同じ文字の4回以上の繰り返しを3回に処理して、その前に_前文字列と_或る文字を3回連続した文字列を付加する'(_前文字列,_連続文字列,_後文字列,_或る文字を3回連続した文字列,_置換した文字列),!. 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_文字列). '後文字列の同じ文字の4回以上の繰り返しを3回に処理して、その前に_前文字列と_或る文字を3回連続した文字列を付加する'(_前文字列,_連続文字列,_後文字列,_或る文字を3回連続した文字列,_置換した文字列) :- 同じ文字の4回以上の繰り返しを3回にしたい(_後文字列,_後文字列を置換した文字列), 'その前に_前文字列と_或る文字を3回連続した文字列を付加する'(_前文字列,_或る文字を3回連続した文字列,_後文字列を置換した文字列,_置換した文字列). 'その前に_前文字列と_或る文字を3回連続した文字列を付加する'(_前文字列,_或る文字を3回連続した文字列,_後文字列を置換した文字列,_置換した文字列) :- atomic_list_concat([_前文字列,_或る文字を3回連続した文字列,_後文字列を置換した文字列],_置換した文字列). '連続文字列は4文字以上で_或る文字だけからなり、_前文字列の最後の文字と_後文字列の最初の文字はこの文字とは異なる。'(_文字列,_前文字列,_連続文字列,_後文字列,_或る文字を3回連続した文字列) :- 連続文字列は4文字以上で_或る文字だけからなり(_文字列,_或る文字,_前文字列,_連続文字列,_後文字列), '_前文字列の最後の文字と_後文字列の最初の文字はこの文字とは異なる。'(_或る文字,_前文字列,_後文字列), 或る文字を3回連続した文字列(_或る文字,_或る文字を3回連続した文字列). 連続文字列は4文字以上で_或る文字だけからなり(_文字列,_或る文字,_前文字列,_連続文字列,_後文字列) :- 連続文字列は(_文字列,_前文字列,_連続文字列,_後文字列), '4文字以上で_或る文字だけからなり'(_連続文字列,_或る文字). 連続文字列は(_文字列,_前文字列,_連続文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_連続文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '4文字以上で_或る文字だけからなり'(_連続文字列,_或る文字) :- atom_chars(_連続文字列,[_或る文字,_或る文字,_或る文字,_或る文字|_]), forall(sub_atom(_連続文字列,_,1,_,_文字),_文字 = _或る文字). '_前文字列の最後の文字と_後文字列の最初の文字はこの文字とは異なる。'(_或る文字,_前文字列,_後文字列) :- '_前文字列の最後の文字は或る文字と異なる'(_前文字列,_或る文字), '_後文字列の最後の文字は或る文字と異なる'(_後文字列,_或る文字). '_前文字列の最後の文字は或る文字と異なる'(_前文字列,_或る文字) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)). '_後文字列の最後の文字は或る文字と異なる'(_後文字列,_或る文字) :- \+(sub_atom(_後文字列,0,1,_,_或る文字)). 或る文字を3回連続した文字列(_或る文字,_或る文字を3回連続した文字列) :- atom_chars(_或る文字を3回連続した文字列,[_或る文字,_或る文字,_或る文字]). % 以下のサイトは '言語(*a*a*a)*を受理する非決定性有限オートマトン'(_入力記号ならび) :- '言語(*a*a*a)*初期状態'(_状態), '言語(*a*a*a)*を受理する非決定性有限オートマトン'(_状態,_入力記号ならび). '言語(*a*a*a)*を受理する非決定性有限オートマトン'(_状態,[_記号|R_1]) :- '言語(*a*a*a)*'(_状態集合,_記号,_状態集合_1), 状態集合(_状態集合,_状態), 状態集合(_状態集合_1,_状態_1), '言語(*a*a*a)*を受理する非決定性有限オートマトン'(_状態_1,R_1),!. '言語(*a*a*a)*を受理する非決定性有限オートマトン'(_状態,[]) :- '言語(*a*a*a)*受理状態'(_状態). '言語(*a*a*a)*初期状態'(0). '言語(*a*a*a)*受理状態'(0). '言語(*a*a*a)*'(状態集合_0,a,状態集合_1). '言語(*a*a*a)*'(状態集合_0,X,状態集合_3) :- \+(X = a). '言語(*a*a*a)*'(状態集合_1,a,状態集合_2). '言語(*a*a*a)*'(状態集合_1,X,状態集合_4) :- \+(X = a). '言語(*a*a*a)*'(状態集合_2,a,状態集合_0). '言語(*a*a*a)*'(状態集合_1,X,状態集合_5) :- \+(X = a). '言語(*a*a*a)*'(状態集合_3,X,状態集合_3) :- \+(X = a). '言語(*a*a*a)*'(状態集合_3,a,状態集合_1). '言語(*a*a*a)*'(状態集合_4,X,状態集合_4) :- \+(X = a). '言語(*a*a*a)*'(状態集合_4,a,状態集合_2). '言語(*a*a*a)*'(状態集合_5,X,状態集合_5) :- \+(X = a). '言語(*a*a*a)*'(状態集合_5,a,状態集合_0). 状態集合(状態集合_0,0). 状態集合(状態集合_1,1). 状態集合(状態集合_2,2). 状態集合(状態集合_3,3). 状態集合(状態集合_4,4). 状態集合(状態集合_5,5). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #72 # [1]授業単元:プログラミング演習 # [2] 1から100000までの数を列挙する。 # nまで書き終わった時点でそれぞれの数字dがtimes[d] (0<=d<=9)回使われていたとする。 # times[d]が小さい順にdを並べて順列を作る。(同じ回数の場合dが大きいほうが後)この順列が最初からそれまでに累積何回変わったか # nが1000の倍数毎に表にして出力(100000まで) # 回数と順位を要素とする構造体配列を使うこと # 整数の文字表現が増えると累計順位が変化する(_n個まで,_順位交代回数) :- 整数の文字表現が増えると累計順位が変化する(1,100000,[[0,'0'],[1,'1'],[0,'2'],[0,'3'],[0,'4'],[0,'5'],[0,'6'],[0,'7'],[0,'8'],[0,'9']],['0','2','3','4','5','6','7','8','9','1'],0,_n個まで,_順位交代回数). 整数の文字表現が増えると累計順位が変化する(Max,Max,_,_,_順位交代回数,Max,_順位交代回数) :- !. 整数の文字表現が増えると累計順位が変化する(N,Max,_,_,_順位交代回数,N,_順位交代回数) :- 0 is N mod 1000. 整数の文字表現が増えると累計順位が変化する(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数) :- 整数の文字表現が増えると累計順位が変化して行く(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数). 整数の文字表現が増えると累計順位が変化して行く(N,Max,LL1,_順位ならび_1,_順位交代回数_1,_n個まで,_順位交代回数) :- 整数の文字表現が増えると(N,N_2,_次の数字ならび), 最新の順位ならび(_次の数字ならび,LL1,LL2,_順位ならび_2), 累計順位が変化して行く(N_2,Max,LL2,_順位ならび_1,_順位ならび_2,_順位交代回数_1,_n個まで,_順位交代回数). 整数の文字表現が増えると(N,N_2,_次の数字ならび) :- succ(N,N_2), number_chars(N_2,_次の数字ならび). 最新の順位ならび(_次の数字ならび,LL1,LL2,_順位ならび_2) :- 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(_次の数字ならび,LL1,LL2), 順位ならび(LL2,_順位ならび_2). 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'([],LL,LL). 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(_標本値ならび,LL1,LL) :- 'select/4で鍵管理して標本値の出現度数を加算して行く(但し、[_度数,_標本値]の順に管理される)'(_標本値ならび,LL1,LL). 'select/4で鍵管理して標本値の出現度数を加算して行く(但し、[_度数,_標本値]の順に管理される)'([_標本値|R],LL1,LL) :- 'select/4で鍵管理して標本値の出現度数を加算(但し、[_度数,_標本値]の順に管理される)'(_標本値,LL1,LL2), 'select/4を使った標本値の出現度数加算(但し、[_度数,_標本値]の順に管理される)'(R,LL2,LL). 'select/4で鍵管理して標本値の出現度数を加算(但し、[_度数,_標本値]の順に管理される)'(_標本値,LL1,LL2) :- select([_度数_1,_標本値],LL1,[_度数_2,_標本値],LL2), succ(_度数_1,_度数_2). 順位ならび(_度数標本値ならび,_順位ならび) :- '度数・標本値順に整列する'(_度数標本値ならび,_整列した度数標本値ならび), 整列された度数標本値ならびから標本値の順位を取り出す(_整列した度数標本値ならび,_順位ならび). '度数・標本値順に整列する'(_度数標本値ならび,_整列した度数標本ならび) :- sort(_度数標本値ならび,_整列した度数標本ならび). 整列された度数標本値ならびから標本値の順位を取り出す(_整列した度数標本値ならび,_順位ならび) :- findall(_標本値,member([_,_標本値],_整列した度数標本値ならび),_順位ならび). 累計順位が変化して行く(N_2,Max,LL2,_順位ならび_1,_順位ならび_2,_順位交代回数_1,_n個まで,_順位交代回数) :- 順位に変化があった場合だけ順位交代回数を更新する(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2), 整数の文字表現が増えると累計順位が変化する(N_2,Max,LL2,_順位ならび_2,_順位交代回数_2,_n個まで,_順位交代回数). 順位に変化があった場合だけ順位交代回数を更新する(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2) :- '順位に変化があった場合、交代回数が更新される'(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2),!. 順位に変化があった場合だけ順位交代回数を更新する(_,_,_順位交代回数,_順位交代回数). '順位に変化があった場合、交代回数が更新される'(_順位ならび_1,_順位ならび_2,_順位交代回数_1,_順位交代回数_2) :- '順位に変化があった場合、'(_順位ならび_1,_順位ならび_2), 交代回数が変化する(_順位交代回数_1,_順位交代回数_2). '順位に変化があった場合、'(_順位ならび_1,_順位ならび_2) :- \+(sort(_順位ならび_1,_順位ならび_2)). 交代回数が変化する(_順位交代回数_1,_順位交代回数_2) :- succ(_順位交代回数_1,_順位交代回数_2). % 以下のサイトは 日付曜日を遡る(_今日,_今日の曜日,_遡った日付,_遡った曜日) :- 連続日(_前日,_前日の曜日,_今日,_今日の曜日), 前日から更に遡る(_前日,_前日の曜日,_遡った日付,_遡った曜日). 前日から更に遡る(_遡った日付,_遡った曜日,_遡った日付,_遡った曜日). 前日から更に遡る(_前日,_前日の曜日,_遡った日付,_遡った曜日) :- 日付曜日を遡る(_前日,_前日の曜日,_遡った日付,_遡った曜日). 連続日(_前の日の年/_前の日の月/_前の日の日,_前の日の曜日,_後の日の年/_後の日の月/_後の日の日,_後の日の曜日) :- 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 曜日連鎖(_前の日の曜日,_後の日の曜日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- succ(_月,_翌日の月),'十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月). '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(2). 小の月(4). 小の月(6). 小の月(9). 小の月(11). 大の月(1). 大の月(3). 大の月(5). 大の月(7). 大の月(8). 大の月(10). 大の月(12). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 曜日連鎖(日曜,月曜). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). % 以下のサイトは 連続日(_前の日の年/_前の日の月/_前の日の日,_前の日の曜日,_後の日の年/_後の日の月/_後の日の日,_後の日の曜日) :- 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 曜日連鎖(_前の日の曜日,_後の日の曜日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- succ(_月,_翌日の月),'十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月). '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(2). 小の月(4). 小の月(6). 小の月(9). 小の月(11). 大の月(1). 大の月(3). 大の月(5). 大の月(7). 大の月(8). 大の月(10). 大の月(12). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 曜日連鎖(日曜,月曜). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). % 以下のサイトは ことば溜まり(かまきり). ことば溜まり(くり). ことば溜まり(りす). ことば溜まり(すいか). しりとり(_最初の言葉,_しりとりならび) :- しりとり(_最初の言葉,[_最初の言葉],_しりとりならび). しりとり(_前の言葉,_しりとりならび_1,_しりとりならび) :- 前の言葉の最後の文字と後の言葉の最初の文字が同じになるようにまだ使われていない言葉を後の言葉として取り出す(_しりとりならび_1,_前の言葉,_後の言葉), 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび). 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび) :- reverse([_後の言葉|_しりとりならび_1],_しりとりならび). 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび) :- しりとり(_後の言葉,[_後の言葉|_しりとりならび_1],_しりとりならび). 前の言葉の最後の文字と後の言葉の最初の文字が同じになるようにまだ使われていない言葉を後の言葉として取り出す(_しりとりならび_1,_前の言葉,_後の言葉) :- 前の言葉の最後の文字と後の言葉の最初の文字が同じになるように(_前の言葉,_後の言葉), まだ使われていない言葉を後の言葉として取り出す(_しりとりならび_1,_後の言葉). 前の言葉の最後の文字と後の言葉の最初の文字が同じになるように(_前の言葉,_後の言葉) :- 前の言葉の最後の文字(_前の言葉,_文字), 後の言葉の最初の文字(_後の言葉,_文字). 前の言葉の最後の文字(_前の言葉,_最後の文字) :- sub_atom(_前の言葉,_,1,0,_最後の文字). 後の言葉の最初の文字(_後の言葉,_最初の文字) :- freeze(_後の言葉,sub_atom(_後の言葉,0,1,_,_最初の文字)). まだ使われていない言葉を後の言葉として取り出す(_しりとりならび_1,_後の言葉) :- まだ使われていない(_しりとりならび_1,_後の言葉), 言葉を後の言葉として取り出す(_後の言葉). まだ使われていない(_しりとりならび_1,_後の言葉) :- freeze(_後の言葉,\+(member(_後の言葉,_しりとりならび_1))). 言葉を後の言葉として取り出す(_後の言葉) :- ことば溜まり(_後の言葉). % 以下のサイトは '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる データが標準入力で与えられた際、結果を標準出力に出力する' :- データが標準入力で与えられた際(_与えられた数字), '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる'(_与えられた数字,_いくつ), 結果を標準出力に出力する(_いくつ). データが標準入力で与えられた際(_与えられた数字) :- write('数字を入力してください : '), read_line_to_codes(current_input,Codes), number_codes(_与えられた数字,Codes). '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる'(_与えられた数字,_いくつ) :- '与えられた数字よりも小さい数字の中で'(_与えられた数字,_与えられた数字よりも小さい数字のならび), 素数がいくつあるか調べる(_与えられた数字よりも小さい数字のならび,_いくつ). '与えられた数字よりも小さい数字の中で'(_与えられた数字,_与えられた数字よりも小さい数字のならび) :- succ(_与えられた数字_1,_与えられた数字), findall(N,between(2,_与えられた数字_1,N),_与えられた数字よりも小さい数字のならび). 素数がいくつあるか調べる(_与えられた数字よりも小さい数字のならび,_いくつ) :- 度数(非決定性のエラトステネスの篩(_与えられた数字よりも小さい数字のならび,_素数),_いくつ). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(N,L1,_素数). 先頭の素数を網として篩に掛けて行く(N,L1,_素数) :- 'L1の要素でNで割り切れないものを篩に掛ける'(N,L1,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素でNで割り切れないものを篩に掛ける'(N,L1,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), 'Nで割り切れないものを篩に掛ける'(_要素,N)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). 'Nで割り切れないものを篩に掛ける'(_要素,N) :- \+(0 is _要素 mod N). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). 結果を標準出力に出力する(_いくつ) :- writef('結果は %w\n',[_いくつ]). :- '与えられた数字よりも小さい数字の中で、素数がいくつあるか調べる データが標準入力で与えられた際、結果を標準出力に出力する',halt. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_適合文字列,_後文字列), '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列). '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列) :- 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列). 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列) :- findall(_ギャップではない文字, 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字),_ギャップではない文字ならび), atomic_list_concat(_ギャップではない文字ならび,'CGUU'). 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字) :- sub_atom(_適合文字列,_,1,_,_ギャップではない文字), \+(_ギャップではない文字 = '-'). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # # プログラム14.14: 言語(*a*bcd)* を受理するNDFA # # # \+(a) # ------------ # | | # | | # | v a # ---- 状態集合_5 {5} ---------- # | # ^ | # \+(a) | | # | v # a \+(b) \+(b) # 状態集合_0 {0} ---------> 状態集合_1 {1} ---------> 状態集合_4 {4} --------- # | # ^ | | ^ | # | | | | | # | | b | b -------------- # d | | | # | | | # | v | # | # 状態集合_3 {3} <--------- 状態集合_2 {2} <------------ # c # # 図14.5: 非決定性有限オートマトン # '言語(*a*bcd)*を受理する非決定性有限オートマトン'(_入力記号ならび) :- '言語(*a*bcd)*初期状態'(_状態), '言語(*a*bcd)*を受理する非決定性有限オートマトン'(_状態,_入力記号ならび). '言語(*a*bcd)*を受理する非決定性有限オートマトン'(_状態,[_記号|R_1]) :- '言語(*a*bcd)*'(_状態集合,_記号,_状態集合_1), 状態集合(_状態集合,_状態), 状態集合(_状態集合_1,_状態_1), '言語(*a*bcd)*を受理する非決定性有限オートマトン'(_状態_1,R_1),!. '言語(*a*bcd)*を受理する非決定性有限オートマトン'(_状態,[]) :- '言語(*a*bcd)*受理状態'(_状態). '言語(*a*bcd)*初期状態'(0). '言語(*a*bcd)*受理状態'(0). '言語(*a*bcd)*'(状態集合_0,a,状態集合_1). '言語(*a*bcd)*'(状態集合_0,X,状態集合_5) :- \+(X = a). '言語(*a*bcd)*'(状態集合_1,b,状態集合_2). '言語(*a*bcd)*'(状態集合_1,X,状態集合_4) :- \+(X = b). '言語(*a*bcd)*'(状態集合_2,c,状態集合_3). '言語(*a*bcd)*'(状態集合_3,d,状態集合_0). '言語(*a*bcd)*'(状態集合_4,b,状態集合_2). '言語(*a*bcd)*'(状態集合_4,X,状態集合_4) :- \+(X = b). '言語(*a*bcd)*'(状態集合_5,a,状態集合_1). '言語(*a*bcd)*'(状態集合_5,X,状態集合_5) :- \+(X = a). 状態集合(状態集合_0,0). 状態集合(状態集合_1,1). 状態集合(状態集合_2,2). 状態集合(状態集合_3,3). 状態集合(状態集合_4,4). 状態集合(状態集合_5,5). % 以下のサイトは # # プログラム14.14: 言語(a*bcd)* を受理するNDFA # # # a \+(b) \+(b) # 状態集合_0 {0} --------------> 状態集合_1 {1} ---------> 状態集合_4 {4} --------- # | # ^ | | ^ | # | | | | | # | | b | b -------------- # d | | | # | | | # | v | # | # 状態集合_3 {3} <-------------- 状態集合_2 {2} <------------ # c # # 図14.5: 非決定性有限オートマトン # '言語(a*bcd)*を受理する非決定性有限オートマトン'(_入力記号ならび) :- '言語(a*bcd)*初期状態'(_状態), '言語(a*bcd)*を受理する非決定性有限オートマトン'(_状態,_入力記号ならび). '言語(a*bcd)*を受理する非決定性有限オートマトン'(_状態,[_記号|R_1]) :- '言語(a*bcd)*'(_状態集合,_記号,_状態集合_1), 状態集合(_状態集合,_状態), 状態集合(_状態集合_1,_状態_1), '言語(a*bcd)*を受理する非決定性有限オートマトン'(_状態_1,R_1),!. '言語(a*bcd)*を受理する非決定性有限オートマトン'(_状態,[]) :- '言語(a*bcd)*受理状態'(_状態). '言語(a*bcd)*初期状態'(0). '言語(a*bcd)*受理状態'(0). '言語(a*bcd)*'(状態集合_0,a,状態集合_1). '言語(a*bcd)*'(状態集合_1,b,状態集合_2). '言語(a*bcd)*'(状態集合_1,X,状態集合_4) :- \+(X = b). '言語(a*bcd)*'(状態集合_2,c,状態集合_3). '言語(a*bcd)*'(状態集合_3,d,状態集合_0). '言語(a*bcd)*'(状態集合_4,b,状態集合_2). '言語(a*bcd)*'(状態集合_4,X,状態集合_4) :- \+(X = b). 状態集合(状態集合_0,0). 状態集合(状態集合_1,1). 状態集合(状態集合_2,2). 状態集合(状態集合_3,3). 状態集合(状態集合_4,4). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- 同じ文字の4回以上の繰り返しを(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), '3回にしたい'(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列,_置換した文字列),!. 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_文字列). 同じ文字の4回以上の繰り返しを(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 同一文字からなる限界副文字列(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), _文字列長 >= 4. '3回にしたい'(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列,_置換した文字列) :- atomic_list_concat([_同一文字,_同一文字,_同一文字],_同一三文字), 同じ文字の4回以上の繰り返しを3回にしたい(_後文字列,_後文字列を置換した文字列), atomic_list_concat([_前文字列,_同一三文字,_後文字列を置換した文字列],_置換した文字列),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 同一文字からなる限界副文字列(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 同一文字からなる限界副文字列候補(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列). 同一文字からなる限界副文字列候補(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 副文字列は同一文字からなる(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列). 副文字列は同一文字からなる(_文字列,_同一文字,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 副文字列は(_文字列,_限界副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), 同一文字からなる文字列(_同一文字からなる限界副文字列,_同一文字). 副文字列は(_文字列,_副文字列の文字列長,_前文字列,_副文字列,_後文字列) :- sub_atom(_文字列,S,_副文字列の文字列長,E,_副文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). 同一文字からなる文字列(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字), forall(sub_atom(_文字列,_,1,_,A),A = _同一文字). 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列) :- 前文字列の最後に同一文字が来ない(_同一文字,_前文字列), 後文字列の最後に同一文字が来ない(_同一文字,_後文字列). 前文字列の最後に同一文字が来ない(_同一文字,_前文字列) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). 後文字列の最後に同一文字が来ない(_同一文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). % 以下のサイトは 同一文字からなる限界副文字列(_文字列,_同一文字,_副文字列の文字列長,_同一文字からなる限界副文字列) :- 同一文字からなる限界副文字列(_文字列,_同一文字,_副文字列の文字列長,_,_同一文字からなる限界副文字列,_). 同一文字からなる限界副文字列(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列) :- 同一文字からなる副文字列(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる限界副文字列,_後文字列), 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列). 同一文字からなる副文字列(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列) :- 副文字列は同一文字からなる(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列). 副文字列は同一文字からなる(_文字列,_同一文字,_副文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列) :- 副文字列は(_文字列,_副文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列), 同一文字からなる文字列(_同一文字からなる副文字列,_同一文字). 副文字列は(_文字列,_副文字列の文字列長,_前文字列,_副文字列,_後文字列) :- sub_atom(_文字列,S,_副文字列の文字列長,E,_副文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). 同一文字からなる文字列(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字), forall(sub_atom(_文字列,_,1,_,A),A = _同一文字). 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列) :- 前文字列の最後に同一文字が来ない(_同一文字,_前文字列), 後文字列の最後に同一文字が来ない(_同一文字,_後文字列). 前文字列の最後に同一文字が来ない(_同一文字,_前文字列) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). 後文字列の最後に同一文字が来ない(_同一文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). % 以下のサイトは 同一文字からなる限界文字列(_文字列,_同一文字,_文字列長,_同一文字からなる限界文字列) :- 同一文字からなる限界文字列(_文字列,_同一文字,_文字列長,_,_同一文字からなる限界文字列,_). 同一文字からなる限界文字列(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界文字列,_後文字列) :- 同一文字からなる副文字列(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる限界文字列,_後文字列), 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列). 同一文字からなる副文字列(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる副文字列,_後文字列) :- 副文字列は同一文字からなる(_文字列,_同一文字,_文字列長,_前文字列,_同一文字からなる副文字列,_後文字列). 副文字列は同一文字からなる(_文字列,_同一文字,_同一文字からなる副文字列長,_前文字列,_同一文字からなる副文字列,_後文字列) :- 副文字列は(_文字列,_同一文字からなる限界文字列の文字列長,_前文字列,_同一文字からなる副文字列,_後文字列), 同一文字からなる文字列(_同一文字からなる副文字列,_同一文字). 副文字列は(_文字列,_副文字列の文字列長,_前文字列,_副文字列,_後文字列) :- sub_atom(_文字列,S,_副文字列の文字列長,E,_副文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). 同一文字からなる文字列(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字), forall(sub_atom(_文字列,_,1,_,A),A = _同一文字). 前文字列の最後と後文字列の最初に同一文字が来ない(_同一文字,_前文字列,_後文字列) :- 前文字列の最後に同一文字が来ない(_同一文字,_前文字列), 後文字列の最後に同一文字が来ない(_同一文字,_後文字列). 前文字列の最後に同一文字が来ない(_同一文字,_前文字列) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). 後文字列の最後に同一文字が来ない(_同一文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). % 以下のサイトは 先頭から同一要素の最長ならび(_対象ならび,_先頭から同一要素の最長ならび,_残りならび) :- 先頭から同一要素の最長ならび(_対象ならび,_同一要素,_先頭から同一要素の最長ならび,_残りならび), 残りならびの先頭要素は同一要素と異なる(_残りならび,_同一要素). 先頭から同一要素の(_対象ならび,_同一要素,_先頭から同一要素の最長ならび,_残りならび) :- append(_先頭から同一要素の最長ならび,_残りならび,_対象ならび), 全て同一要素(_先頭から同一要素の最長ならび,_同一要素). 全て同一要素([V],V). 全て同一要素([V|R],V) :- 全て同一要素(R,V). 残りならびの先頭要素は同一要素と異なる(_残りならび,_同一要素). \+(_残りならび = [_同一要素|_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 先頭から同一要素の最長ならび([_先頭要素|R],_先頭から同一要素の最長ならび,_残りならび) :- append(_先頭から同一要素の最長ならび,_残りならび,[_先頭要素|R]), forall(member(A,_先頭から同一要素の最長ならび),A = _先頭要素), \+(_残りならび = [_先頭要素|_]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 先頭から同一要素の最長ならび([_先頭要素|R],_先頭から同一要素の最長ならび,_残りならび) :- 先頭から同一要素の最長ならび(R,_先頭要素,L2,_残りならび), _先頭から同一要素の最長ならび = [_先頭要素|L2]. 先頭から同一要素の最長ならび([_先頭要素|R],_先頭要素,[_先頭要素|R2],_残りならび) :- 先頭から同一要素の最長ならび(R,_先頭要素,R2,_残りならび),!. 先頭から同一要素の最長ならび(_残りならび,_先頭要素,[],_残りならび). % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_最大値,_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_最大値,_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- 次の範囲下限(_区切り,_範囲下限_1,_次の範囲下限), 次の範囲上限(_最大値,_区切り,_範囲上限_1,_次の範囲上限). 次の範囲下限(_区切り,_範囲下限_1,_次の範囲下限) :- _次の範囲下限 is _範囲下限_1 + _区切り. 次の範囲上限(_最大値,_区切り,_範囲上限_1,_最大値) :- _最大値 < _範囲上限_1 + _区切り,!. 次の範囲上限(_最大値,_区切り,_範囲上限_1,_次の範囲上限) :- _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは ことば溜まり(かまきり). ことば溜まり(くり). ことば溜まり(りす). ことば溜まり(すいか). しりとり(_最初の言葉,_しりとりならび) :- しりとり(_最初の言葉,[_最初の言葉],_しりとりならび). しりとり(_前の言葉,_しりとりならび_1,_しりとりならび) :- 前の言葉の最後の文字と後の言葉の最初の文字が同じまだ使われていない言葉を取り出す(_しりとりならび_1,_前の言葉,_後の言葉), 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび). 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,[_後の言葉|_しりとりならび_1]). 後の言葉をスタックに積む(_後の言葉,_しりとりならび_1,_しりとりならび) :- しりとり(_後の言葉,[_後の言葉|_しりとりならび_1],_しりとりならび). 前の言葉の最後の文字と後の言葉の最初の文字が同じまだ使われていない言葉を取り出す(_しりとりならび_1,_前の言葉,_後の言葉) :- まだ使われていない後の言葉を取り出す(_しりとりならび_1,_後の言葉), 前の言葉の最後の文字と後の言葉の最初の文字が同じ(_前の言葉,_後の言葉). まだ使われていない後の言葉を取り出す(_しりとりならび_1,_後の言葉) :- まだ使われていない(_しりとりならび_1,_後の言葉), 後の言葉を取り出す(_後の言葉). まだ使われていない(_しりとりならび_1,_後の言葉) :- freeze(_後の言葉,\+(member(_後の言葉,_しりとりならび_1))). 後の言葉を取り出す(_後のことば) :- ことば溜まり(_後の言葉). 前の言葉の最後の文字と後の言葉の最初の文字が同じ(_前の言葉,_後の言葉) :- 前の言葉の最後の文字(_前の言葉,_文字), 後の言葉の最初の文字(_後の言葉,_文字). 前の言葉の最後の文字(_前の言葉,_最後の文字) :- sub_atom(_前の言葉,_,1,0,_最後の文字). 後の言葉の最初の文字(_後の言葉,_最初の文字) :- sub_atom(_後の言葉,0,1,_,_最初の文字). % 以下のサイトは ことば集(かまきり). ことば集(くり). ことば集(りす). ことば集(すいか). しりとり(_最初の言葉,_しりとりならび) :- しりとり(_最初の言葉,[_最初の言葉],_しりとりならび). しりとり(_前の言葉,_しりとりならび_1,_しりとりならび) :- 前の言葉の最後の文字と後の言葉の最初の文字が同じ既出ではない言葉を取り出す(_しりとりならび_1,_前の言葉,_後の言葉), しりとり_1(_後の言葉,_しりとりならび_1,_しりとりならび). しりとり_1(_後の言葉,_しりとりならび_1,[_後の言葉|_しりとりならび_1]). しりとり_1(_後の言葉,_しりとりならび_1,_しりとりならび) :- しりとり(_後の言葉,[_後の言葉|_しりとりならび_1],_しりとりならび). 前の言葉の最後の文字と後の言葉の最初の文字が同じ既出ではない言葉を取り出す(_しりとりならび_1,_前の言葉,_後の言葉) :- 既出ではない後の言葉を取り出す(_しりとりならび_1,_後の言葉), 前の言葉の最後の文字と後の言葉の最初の文字が同じ(_前の言葉,_後の言葉). 既出ではない後の言葉を取り出す(_しりとりならび_1,_後の言葉) :- ことば集(_後の言葉), \+(member(_後の言葉,_しりとりならび_1)). 前の言葉の最後の文字と後の言葉の最初の文字が同じ(_前の言葉,_後の言葉) :- 前の言葉の最後の文字(_前の言葉,_文字), 後の言葉の最初の文字(_後の言葉,_文字). 前の言葉の最後の文字(_前の言葉,_最後の文字) :- sub_atom(_前の言葉,_,1,0,_最後の文字). 後の言葉の最初の文字(_後の言葉,_最初の文字) :- sub_atom(_後の言葉,0,1,_,_最初の文字). % 以下のサイトは # 出典 :: プログラミングのお題スレ Part8?2ch.net # お題:nで始まる最小の素数を求める # n=4 -> 41 # n=777 -> 77711 # n=403 -> 40343 nで始まる最小の素数を求める(_n,_nで始める最小の素数) :- nで始まる最小の素数を求める(_n,0,_nで始める最小の素数),!. nで始まる最小の素数を求める(_n,_m,_nで始める最小の素数) :- 探索範囲を定めその中に素数が現れたら停止する(_n,_m,_nで始める最小の素数). nで始まる最小の素数を求める(_n,_m,_nで始める最小の素数) :- 下位桁を増やしながらnで始まる最小の素数を求める(_n,_m,_nで始める最小の素数). 探索範囲を定めその中に素数が現れたら停止する(_n,_m,_nで始める最小の素数) :- 探索範囲を求める(_n,_m,_n_1,_n_2), 非決定性の素数生成(_n_2,_nで始める最小の素数), _nで始める最小の素数 >= _n_1. 探索範囲を求める(_n,_m,_n_1,_n_2) :- _n_1 is _n * 10 ^ _m, _n_2 is ( _n + 1 ) * 10 ^ _m - 1. 下位桁を増やしながらnで始まる最小の素数を求める(_n,_m,_nで始める最小の素数) :- succ(_m,_m_2), nで始まる最小の素数を求める(_n,_m_2,_nで始める最小の素数). 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(L1,_要素,'_要素はNで割り切れる'(_要素,N),_素数). 先頭の素数を網として篩に掛けて行く(L1,_要素,_副目標,_素数) :- 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), '_副目標を真とするものを篩に掛ける'(_副目標)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). '_副目標を真とするものを篩に掛ける'(_副目標) :- \+(_副目標). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒の成績を管理するプログラムを作成する。 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 内容は 数学:70 英語:80 国語:75 理科:80 社会:60 となっている このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名ならび,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(_テキストファイル名ならび) :- shs('ls -N *.txt',_テキストファイル名ならび). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する([],_,_) :- !. 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(_テキストファイル名,_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く(_テキストファイル名,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示して行く([_テキストファイル名|R],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の場合は出席番号を表示する([_テキストファイル名|R],_指定した科目,_指定した点数), 指定した科目で指定した点数の存在する生徒の出席番号を全て表示する(R,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の場合は出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数) :- forall(指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数), 生徒の出席番号を表示する(_テキストファイル名)). 指定した科目で指定した点数の(_テキストファイル名,_指定した科目,_指定した点数) :- get_split_lines(_テキストファイル名,[' ',':'],_行ならび), member([_指定した科目,_指定した点数],_行ならび). 生徒の出席番号を表示する(_テキストファイル名) :- 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #415 # 【 課題 】 # 生徒の成績を管理するプログラムを作成する。 # 生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 # 内容は # 数学:70 # 英語:80 # 国語:75 # 理科:80 # 社会:60 # となっている # このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】8/10 # 【 Ver  】1.6.0_06 # 【 補足 】 # # '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。 このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する' :- '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1), '指定した科目と点数を得る'(_指定した科目,_指定した点数), 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(L1,_指定した科目,_指定した点数). '生徒情報は「0001.txt」のように出席番号を名前としたテキストファイルである。'(L1) :- shs('ls -N *.txt',L1). '指定した科目と点数を得る'(_指定した科目,_指定した点数) :- '指定した科目を得る。科目名は数学、英語、国語、社会、理科のどれか'(_指定した科目), '指定した点数を得る。点数は整数。'(_指定した点数). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([],_,_). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_テキストファイル名|R1],_指定した科目,_指定した点数) :- 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号). 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'([_|R1],_指定した科目,_指定した点数) :- 'このファイルを読み込んでいき、指定した科目で指定した点数の生徒の出席番号を表示する'(R1,_指定した科目,_指定した点数). 指定した科目で指定した点数の生徒の出席番号を表示する(_テキストファイル名,_指定した科目,_指定した点数,_生徒の出席番号) :- get_split_lines(_テキストファイル名,[' ',':'],L), member([_指定した科目,_指定した点数],L), 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル,_生徒の出席番号), writef('%w\n',[_生徒の出席番号]). 'テキストファイル名から.txtを取り除いたものが生徒の出席番号'(_テキストファイル名,_生徒の出席番号) :- sub_atom(_テキストファイル名,_生徒の出席番号,'.txt',''). '科目を得る。科目は数学、英語、国語、理科、社会のどれか'(_指定した科目) :- repeat, '科目を得る。'(_科目), '科目は数学、英語、国語、理科、社会のどれか'(_科目),!. '科目を得る。'(_科目) :- write('科目を入力してください : '), 行入力(_科目). '科目は数学、英語、国語、理科、社会のどれか'(_科目) :- member(_科目,[数学,英語,国語,理科,社会]). '指定した点数を得る。点数は整数。'(_指定した点数) :- repeat, 整数を得る('点数(整数)を入力してください : ',true,_指定した点数),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,(member(A,Lines1) , split(A,Sep,Line)),Lines). get_lines(File,Lines) :- see(File), findall(_行,(repeat,(at_end_of_stream(current_input),!,fail;行入力(_行))),Lines), seen. sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,E,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,E,0,_後文字列). shs(Command,X) :- popen(Command,L), shs_2(L,X). shs_2([],[]) :- !. shs_2(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_2(R1,R),!. shs_2(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), sh_chars(Instream,Chars), close(Instream),!. sh_chars(Instream,[]) :- at_end_of_stream(Instream),!. sh_chars(Instream,[Char|R]) :- get_char(Instream,Char), sh_chars(Instream,R). sh_codes(Instream,[]) :- at_end_of_stream(Instream),!. sh_codes(Instream,[Code|R]) :- get_code(Instream,Code), sh_codes(Instream,R). % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号ならび,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), member(_区切り符号,_区切り符号ならび), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). 整数を得る(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数入力に失敗した時は再試行する(_催促文,_条件,_整数). 整数入力に失敗した時は再試行する(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- catch(_条件,E,fail). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは 前文字列の副文字列として適合文字列は現れない(_前文字列,_適合文字列) :- \+(sub_atom(_前文字列,_,_,_,_適合文字列)). % 以下のサイトは '適合文字列の最初の文字は前文字列の最後の文字ではないし、適合文字列の最後の文字は後文字列の最初の文字ではない。'(_前文字列,_適合文字列,_後文字列) :- '適合文字列の最初の文字は前文字列の最後の文字ではないし、'(_前文字列,_適合文字列), '適合文字列の最後の文字は後文字列の最初の文字ではない。'(_適合文字列,_後文字列). '適合文字列の最初の文字は前文字列の最後の文字ではないし、'(_前文字列,_適合文字列) :- 適合文字列の最初の文字は(_適合文字列,_適合文字列の最初の文字), '前文字列の最後の文字ではないし、'(_前文字列,_適合文字列の最初の文字). 適合文字列の最初の文字は(_適合文字列,_適合文字列の最初の文字) :- sub_atom(_適合文字列,0,1,_,_適合文字列の最初の文字). '前文字列の最後の文字ではないし、'(_前文字列,_適合文字列の最初の文字) :- \+(sub_atom(_前文字列,_,1,0,_適合文字列の最初の文字)). '適合文字列の最後の文字は後文字列の最初の文字ではない。'(_適合文字列,_後文字列) :- 適合文字列の最後の文字は(_適合文字列,_適合文字列の最後の文字), '後文字列の最初の文字ではない。'(_適合文字列の最後の文字,_後文字列). 適合文字列の最後の文字は(_適合文字列,_適合文字列の最後の文字) :- sub_atom(_適合文字列,_,1,0,_適合文字列の最後の文字). '後文字列の最初の文字ではない。'(_適合文字列の最後の文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_適合文字列の最後の文字)). % 以下のサイトは '適合文字列の最初の文字は前文字列の最後の文字ではないし、適合文字列の最後の文字は後文字列の最初の文字ではない。'(_前文字列,_適合文字列,_後文字列) :- '適合文字列の最初の文字は前文字列の最後の文字ではないし、'(_前文字列,_適合文字列), '適合文字列の最後の文字は後文字列の最初の文字ではない。'(_適合文字列,_後文字列). '適合文字列の最初の文字は前文字列の最後の文字ではないし、'(_前文字列,_適合文字列) :- 適合文字列の最初の文字は(_適合文字列,_適合文字列の最初の文字), '前文字列の最後の文字ではないし、'(_前文字列,_適合文字列の最初の文字). 適合文字列の最初の文字は(_適合文字列,_適合文字列の最初の文字) :- sub_atom(_適合文字列,0,1,_,_適合文字列の最初の文字). '前文字列の最後の文字ではないし、'(_前文字列,_適合文字列の最初の文字) :- \+(sub_atom(_前文字列,_,1,0,_適合文字列の最初の文字)). '適合文字列の最後の文字は後文字列の最初の文字ではない。'(_適合文字列,_後文字列) :- 適合文字列の最後の文字は(_適合文字列,_適合文字列の最後の文字), '後文字列の最初の文字ではない。'(_適合文字列の最後の文字,_後文字列). 適合文字列の最後の文字は(_適合文字列,_適合文字列の最後の文字) :- sub_atom(_適合文字列,_,1,0,_適合文字列の最後の文字). '後文字列の最初の文字ではない。'(_適合文字列の最後の文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_適合文字列の最後の文字)). % 以下のサイトは '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). % 以下のサイトは 連続日(_前の日の年/_前の日の月/_前の日の日,_後の日の年/_後の日の月/_後の日の日) :- 月日生成(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 日付成立検査(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- succ(_月,_翌日の月),月末日(_年,_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_年,_月,30) :- \+(_月 = 2), 小の月(_月). 月末日(_年,_月,31) :- 大の月(_月). 小の月(2). 小の月(4). 小の月(6). 小の月(9). 小の月(11). 大の月(1). 大の月(3). 大の月(5). 大の月(7). 大の月(8). 大の月(10). 大の月(12). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 月日生成(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日) :- 月生成(_前の日の月), 日生成(_前の日の日), 月生成(_後の日の月), 日生成(_後の日の日). 月生成(_月) :- between(1,12,_月). 日生成(_日) :- between(1,31,_日). 日付成立検査(_年,2,_日,_,2,_) :- '二月の日はうるう年が29以下、うるう年でなければ28以下'(_年,_日),!. 日付成立検査(_年,2,_日,_年,3,_) :- '二月の日はうるう年が29以下、うるう年でなければ28以下'(_年,_日),!. 日付成立検査(_年,_月,_日,_,_,_) :- '二月以外の日は月は大の月が31以下、小の月は30以下'(_月,_日). '二月以外の日は月は大の月が31以下、小の月は30以下'(_月,_日) :- 大の月(_月), _日 =< 31. '二月以外の日は月は大の月が31以下、小の月は30以下'(_月,_日) :- \+(_月 = 2), 小の月(_月), _日 =< 30. '二月の日はうるう年が29以下、うるう年でなければ28以下'(_年,_日) :- うるう年(_年), _日 =< 29. '二月の日はうるう年が29以下、うるう年でなければ28以下'(_年,_日) :- \+(うるう年(_年)), _日 =< 28. % 以下のサイトは 連続日(_前の日の年/_前の日の月/_前の日の日,_後の日の年/_後の日の月/_後の日の日) :- 月生成(_前の日の月), 日生成(_前の日の日), 月生成(_後の日の月), 日生成(_後の日の日), 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 日付成立検査(_前の日の年,_前の日の月,_前の日の日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- succ(_月,_翌日の月),月末日(_年,_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- \+(うるう年(_年)),!. 月末日(_年,_月,30) :- 小の月(_月). 月末日(_年,_月,31) :- 大の月(_月). 小の月(2). 小の月(4). 小の月(6). 小の月(9). 小の月(11). 大の月(1). 大の月(3). 大の月(5). 大の月(7). 大の月(8). 大の月(10). 大の月(12). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 月生成(_月) :- between(1,12,_月). 日生成(_日) :- between(1,31,_日). 日付成立検査(_年,2,_日) :- うるう年(_年), _日 =< 29,!. 日付成立検査(_年,2,_日) :- \+(うるう年(_年)), _日 =< 28,!. 日付成立検査(_年,_月,_日) :- 大の月(_月), _日 =< 31. 日付成立検査(_年,_月,_日) :- \+(_月=2), 小の月(_月), _日 =< 30. % 以下のサイトは 連続日(_前の日の年/_前の日の月/_前の日の日,_後の日の年/_後の日の月/_後の日の日) :- 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- succ(_月,_翌日の月),'十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月). '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(2). 小の月(4). 小の月(6). 小の月(9). 小の月(11). 大の月(1). 大の月(3). 大の月(5). 大の月(7). 大の月(8). 大の月(10). 大の月(12). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_ソケット,_ポート), 接続されたらソケットを開く(_ソケット, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(_ソケット,_ポート) :- tcp_socket(_ソケット), tcp_bind(_ソケット, _ポート), tcp_listen(_ソケット, 5). 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _ソケット, _Peer), tcp_open_socket(_ソケット, In, Out). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_ソケット,In,Out,_項). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 小タスクで実行(_ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(_ソケット,In,Out,_項) :- tell(Out), thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- 目標評価(In, Out, _項), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 目標評価(In, Out, _項) :- catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報),!. 目標評価(In, Out, _項) :- _項=false. 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- write(Out,'% end_of_file\n'), 項書き出す(Out,_項). 項を書き出す(Out,_項) :- format(Out,'~w\n',[_項]), flush_output(out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは :- use_module(library(socket)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(_ポート) :- tcpソケットの準備(_ソケット,_ポート), 接続されたらソケットを開く(_ソケット, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(_ソケット,_ポート) :- tcp_socket(_ソケット), tcp_bind(_ソケット, _ポート), tcp_listen(_ソケット, 5). 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out) :- tcp_accept(AcceptFd, _ソケット, _Peer), tcp_open_socket(_ソケット, In, Out). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,_ソケット,_Peer,In,Out), 一行読み出し項に変換(In,_項), インタプリタの実行(_ソケット,In,Out,_項). インタプリタの実行(_ソケット,In,Out,_項) :- 親タスクで実行(In,Out,_項), 小タスクで実行(_ソケット,In,Out,_項). 親タスクで実行(In,Out,_項) :- 項は親タスクで実行するべきもの(_項), 親タスクで実行(In,Out,_項), fail. 親タスクで実行(_,_,_項) :- 項は子タスクで実行するべきもの(_項). 項は親タスクで実行するべきもの(_項) :- _項 = findall(_,exec(_),_). 項は子タスクで実行するべきもの(_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項) :- catch(_項,_エラー情報,エラー発生時はfail扱い), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(_ソケット,In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,_エラー情報,エラー情報の送信(Out,_エラー情報)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 一行読み出し項に変換(In,_項,_エラー情報) :- 行入力(In,_行), 行を解析して項を得る(_行,_項,_エラー情報). 行を解析して項を得る(_行,_項,_エラー情報) :- catch(read_term_from_atom(_行,_項,[]),_エラー情報,_項 = false). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- format('~w\n',[_エラー情報]), format(Out,'~w\n',[_エラー情報]). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- format(Out,'~w\n',[_文字列]), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). エラー発生時はfail扱い :- fail. % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(Port) :- tcpソケットの準備(Socket,Port), 接続されたらソケットを開く(Socket, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(Socket,Port) :- tcp_socket(Socket), tcp_bind(Socket, Port), tcp_listen(Socket, 5). 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out) :- tcp_accept(AcceptFd, Socket, _Peer), tcp_open_socket(Socket, In, Out). 一行読み出し項に変換(In,Line,_項,E1) :- 行入力(In,Line), catch(read_term_from_atom(Line,_項,[]),E1,_項 = false). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out), 一行読み出し項に変換(In,Line,_項,E1), 親タスクで実行(In,Out,_項), 小タスクで実行(Socket,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- thread_create(項を実行して結果を返す(In, Out, _項),_,[]). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項), ストリームを閉じる(In,Out). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). exec(P) :- catch(P,E,fail). サーバ :- サーバ(6013). サーバ(Port) :- tcpソケットの準備(Socket,Port), 接続されたらソケットを開く(Socket, AcceptFd, _), tcpインタプリタ(AcceptFd). tcpソケットの準備(Socket,Port) :- tcp_socket(Socket), tcp_bind(Socket, Port), tcp_listen(Socket, 5). 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out) :- tcp_accept(AcceptFd, Socket, _Peer), tcp_open_socket(Socket, In, Out). 一行読み出し項に変換(In,Line,_項,E1) :- 行入力(In,Line), catch(read_term_from_atom(Line,_項,[]),E1,_項 = false). tcpインタプリタ(AcceptFd) :- repeat, 行を読みだして実行(AcceptFd), fail. 行を読みだして実行(AcceptFd) :- 接続されたらソケットを開く(AcceptFd,Socket,_Peer,In,Out), 一行読み出し項に変換(In,Line,_項,E1), 親タスクで実行(In,Out,_項), 小タスクで実行(Socket,In,Out,_項). 親タスクで実行(In,Out,_項) :- 親タスクで実行(In,Out,_項,E), fail. 親タスクで実行(In,Out,_項) :- \+(_項 = findall(_,exec(_),_)). 親タスクで実行(In,Out,_項,E) :- _項 = findall(_,exec(_),_), catch(_項,E,fail), 情報を送信する(Out,_項), ストリームを閉じる(In,Out). 小タスクで実行(Socket,In,Out,_項) :- fork(Pid), ( Pid == child -> 項を実行して結果を返す(In, Out, _項), ストリームを閉じる(In,Out), halt; tcp_close_socket(Socket) ). 項を実行して結果を返す(In, Out, _項) :- ( catch(_項,E2,エラー情報の送信(Out,E2)); _項=false),!, 情報を送信する(Out,_項). クライアント(Host, Port, _項) :- 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd), 行入力(ReadFd,Line2), catch(read_term_from_atom(Line2,_項2,[]),E,(ストリームを閉じる(ReadFd,WriteFd),fail)), ストリームを閉じる(ReadFd,WriteFd), 送信項と受信項の単一化(_項,_項2). 項にfindallを被せて目標として送信する(Host,Port,_項,Socket,ReadFd,WriteFd) :- サーバと接続する(Host, Port,Socket), tcp_open_socket(Socket, ReadFd, WriteFd), 情報を送信する(WriteFd,_項). サーバと接続する(Host, Port,Socket) :- tcp_socket(Socket), tcp_connect(Socket, Host:Port). (! P) :- (keizo97:6013 :: P). Network:Port :: P :- クライアント(Network,Port,findall(P,P,L)), 全解を取り出す(P,L). 全解を取り出す(P,L) :- member(P,L). 行入力(In,Line) :- read_line_to_codes(In,Codes), atom_codes(Line,Codes). エラー情報の送信(Out,E) :- write(E),nl, writeq(Out,E), write(Out,'\n'). 情報を送信する(Out,_項) :- 項を文字列に変換する(_項,_文字列), 書き出す(Out,_文字列). 書き出す(Out,_文字列) :- write(Out,_文字列), write(Out,'\n'), flush_output(Out). 項を文字列に変換する(_項,_文字列) :- swritef(String,'%t',[_項]), string_to_atom(String,_文字列). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), ( call(_副目標), thread_send_message(_キュー番号,_選択項), fail; メッセージを回収する(_キュー番号,_回収値ならび)), message_queue_destroy(_キュー番号). メッセージを回収する(_キュー番号,[]) :- \+(thread_peek_message(_キュー番号,_)),!. メッセージを回収する(_キュー番号,[_回収値|R]) :- thread_get_message(_キュー番号,_回収値), メッセージを回収する(_キュー番号,R). % 以下のサイトは # 出典 :: 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. % 以下のサイトは 二文字以上の同一文字文字列(_文字列,_前文字列,_同一文字文字列,_後文字列) :- 二文字以上の同一文字文字列(_文字列,S,R,_同一文字文字列,_同一文字), 同一文字と異なった文字で接する前文字列と後文字列(_文字列,S,R,_同一文字,_前文字列,_後文字列). 二文字以上の同一文字文字列(_文字列,S,R,_同一文字文字列,_同一文字) :- 二文字以上の(_文字列,S,R,_同一文字文字列), 同一文字文字列(_同一文字文字列,_同一文字). 二文字以上の(_文字列,S,R,_同一文字文字列) :- sub_atom(_文字列,S,_文字数,R,_同一文字文字列), _文字数 > 1. 同一文字と異なった文字で接する前文字列と後文字列(_文字列,S,R,_同一文字,_前文字列,_後文字列) :- 前文字列と後文字列(_文字列,S,R,_前文字列,_後文字列), 同一文字と異なった文字で接する(_前文字列,_後文字列,_同一文字). 前文字列と後文字列(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 同一文字と異なった文字で接する(_前文字列,_後文字列,_同一文字) :- 前文字列の最後の文字は同一文字ではない(_前文字列,_同一文字), 後文字列の最初の文字は同一文字ではない(_後文字列,_同一文字). 前文字列の最後の文字は同一文字ではない(_前文字列,_同一文字) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). 後文字列の最初の文字は同一文字ではない(_後文字列,_同一文字) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). 同一文字文字列(_文字列,_同一文字) :- 標本となる同一文字を得る(_文字列,_同一文字), 全ての文字列中の文字は同一文字と一致する(_文字列,_同一文字). 標本となる同一文字を得る(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字). 全ての文字列中の文字は同一文字と一致する(_文字列,_同一文字) :- forall(sub_atom(_文字列,_,1,_,_文字),_文字 = _同一文字). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #554 # [1] 授業単元:プログラミング 1 # [2] 問題文(含コード&リンク): # /************************* # ある二つの文字列str1,str2 の編集距離はつぎの3つの操作を行うことによりstr1 をstr2 に変換するのに要する操作の最低回数である # ・ 1文字挿入する # ・ 1文字削除する # ・ 1文字を他の1文字に置き換える # たとえば str1="sport" はstr2="sort" に, 文字 'p' を削除することによりstr2 に変換できるため編集距離は 1 である # # str_n を文字列str の頭からn 番目までの部分列としm(i,j)をstr i とstr j の編集距離を表すものとする.m(i,j)とm(i+1,j),m(i,j+1),m(i+1,j+1)の間に成り立つ再帰式を記述しなさい # # この再帰式に基づき効率良く編集距離を計算するプログラムを2次元配列を利用して作成しなさい.ただし,関数m(i,j)はint型の編集距離を返り値とする. # ******************************/ # 編集距離(_str1,_str2,_編集距離) :- 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離),!. 文字列をならびに変換して編集距離を計算する(_str1,_str2,_編集距離) :- 文字列をならびに変換して(_str1,_str2,L1,L2), 編集距離を計算する(L1,L2,0,_編集距離). 文字列をならびに変換して(_str1,_str2,L1,L2) :- atom_chars(_str1,L1), atom_chars(_str2,L2). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離). 編集距離を計算する(L1,L2,M1,_編集距離) :- 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離). 一致する部分がない時はその部分の距離計算を加算して停止する(L1,L2,M1,_編集距離) :- 一致する部分がない時は(L1,L2), その部分の距離計算を加算して(L1,L2,M1,_編集距離). その部分の距離計算を加算して(L1,L2,M1,_編集距離) :- 距離計算(L1,L2,M1,_編集距離). 一致する部分がない時は(L1,L2) :- \+(一致する部分(L1,L2)). 一致する部分(L1,L2) :- append(_,[X|_],L1), append(_,[X|_],L2). 一致する部分までの距離を加算して行く(L1,L2,M1,_編集距離) :- 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離), 編集距離を計算する(R1,R2,_一致部分までの編集距離,_編集距離). 一致部分までの編集距離(L1,L2,M1,R1,R2,_一致部分までの編集距離) :- 一致部分までの(L1,L2,L0_1,L0_2,R1,R2), 距離計算(L0_1,L0_2,M1,_一致部分までの編集距離). 一致部分までの(L1,L2,L0_1,L0_2,R1,R2) :- append(L0_1,[X|R1],L1), append(L0_2,[X|R2],L2). 距離計算(L1,L2,M1,M2) :- 'L1,L2の長さを取り'(L1,L2,Len1,Len2), 距離に加算する(Len1,Len2,M1,M2). 'L1,L2の長さを取り'(L1,L2,Len1,Len2) :- length(L1,Len1), length(L2,Len2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2). 距離に加算する(Len1,Len2,M1,M2) :- 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2). 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離より短い時は、Len2を加算する'(Len1,Len2,M1,M2) :- Len1 =< Len2, M2 is M1 + Len2. 'Len1すなわち_str1の長さが、Len2すなわち_str2の距離と等しいか長い時は、Len1を加算する'(Len1,Len2,M1,M2) :- Len1 > Len2, M2 is M1 + Len1. % 以下のサイトは # # fx = exp(x)- 3x において、区間{0,1}の根を二分法で求める。 # ただし、収束判定条件には|b-a|εを用いて ε=10^-5 # func(X,FX) :- FX is exp(X) - 3 * X. 収束判定条件(FX) :- abs(FX) < 1.0e-05. 'fx = exp(x)- 3x において、区間{0,1}の根を二分法で求める。ただし、収束判定条件には|b-a|ε を用いてε=10^-5'(X) :- 二分法(0.0,1.0,X). 二分法(S,E,X) :- 二分法の初期値(S,H,E,FX1,FX2,FX3), 二分法(S,H,E,FX1,FX2,FX3,X). 二分法の初期値(S,H,E,FX1,FX2,FX3) :- func(S,FX1), func(E,FX3), 二分して関数に適用する(S,E,H,FX2). 二分して関数に適用する(S,E,H,FX) :- H is ( S + E ) / 2, func(H,FX). 二分法(S,X,E,FX1,FX2,FX3,X) :- 収束判定条件(FX3),!. 二分法(S,H,E,FX1,FX2,FX3,X) :- '前半区間、後半区間の解のある方に二分法を適用する'(S,H,E,FX1,FX2,FX3,X). '前半区間、後半区間の解のある方に二分法を適用する'(S,H,E,FX1,FX2,FX3,X) :- 二分法を前半区間に適用(S,H,FX1,FX2,FX4,X). '前半区間、後半区間の解のある方に二分法を適用する'(S,H,E,FX1,FX2,FX3,X) :- 二分法を後半区間に適用(H,E,FX2,FX3,FX4,X). 二分法を前半区間に適用(S,H,FX1,FX2,FX4,X) :- こちらの区間に解はある(FX1,FX2), 二分法を適用する(S,H,FX1,FX2,FX4,X). 二分法を後半区間に適用(H,E,FX2,FX3,FX4,X) :- こちらの区間に解はある(FX2,FX3), 二分法を適用する(H,E,FX2,FX3,FX4,X). 二分法を適用する(S,H,FX1,FX2,FX4,X) :- 二分して関数に適用する(S,H,H2,FX4), 二分法(S,H2,H,FX1,FX4,FX2,X). こちらの区間に解はある(A,B) :- ふたつの値の絶対値が異なれば0を跨ぐことになるからこちらの区間に解がある(A,B). ふたつの値の絶対値が異なれば0を跨ぐことになるからこちらの区間に解がある(A,B) :- 絶対値が異なる(A,B). 絶対値が異なる(A,B) :- 'AとBの絶対値を取る'(A,B,A1,B1), 絶対値が異なる(A,A1,B,B1). 'AとBの絶対値を取る'(A,B,A1,B1) :- A1 is abs(A), B1 is abs(B). 絶対値が異なる(A,A,B,B1) :- 'BとB1が異なる'(B,B1). 絶対値が異なる(A,A1,B,B) :- 'AとA1が異なる'(A,A1). 'BとB1が異なる'(B,B1) :- \+(B=B1). 'AとA1が異なる'(A,A1) :- \+(A=A1). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは # # Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く # 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。 # 'Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。'(_関数) :- 関数の引数にダブリがない(_関数). 関数の引数にダブリがない(_関数) :- _関数 =.. [_|_関数の引数ならび], 全ての要素は後続要素に等しいものがない(_関数引数のならび). 全ての要素は後続要素に等しいものがない(_ならび) :- forall(要素は後続要素に(_ならび,_要素,_後続要素に),等しくない(_要素,_後続に)). 要素は後続要素に(_ならび,_要素は,_後続要素に) :- append(_,[_要素は|_残りならび],_ならび), member(_後続要素に,_残りならび). 等しくない(A,B) :- \+(A == B). % 以下のサイトは # 出典: Regular Expression(正規表現)Part12 #561 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # 前に指定したデータを含まない、「スケート」だけマッチさせたい # # # ●対象データ # アイススケート # ローラースケート # スケート # '前に指定したデータを冠としない検索文字列'(_文,_検索文字列,_指定したデータならび,_前データ,_検索文字列,_後データ) :- sub_atom(_文,_前データ,_検索文字列,_後データ), 前に指定したデータを含まない(_前データ,_指定したデータならび). 前に指定したデータを含まない(_前データ,_指定したデータならび) :- \+(前に指定したデータを含む(_前データ,_指定したデータならび)). 前に指定したデータを含む(_前データ,_指定したデータならび) :- member(_指定したデータ,_指定したデータならび), sub_atom(_前データ,_,_,0,_指定したデータ). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). ?- '前に指定したデータを冠としない検索文字列'(お気に入りのローラースケート,スケート,[アイス,ローラー],_前データ,_検索文字列,_後データ). false. ?- '前に指定したデータを冠としない検索文字列'(お気に入りのスケート,スケート,[アイス,ローラー],_前データ,_検索文字列,_後データ). _前データ = お気に入りの, _検索文字列 = スケート, _後データ = ''. ?- % 以下のサイトは '起点年月日を示して、翌日以降の日付と曜日を生成する'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_起点年,_起点月,_起点日,_,_起点曜日), 日付と曜日の生成(_起点年,_起点月,_起点日,_起点曜日,_年,_月,_日,_曜日). 日付と曜日の生成(_年,_月,_日,_曜日,_年,_月,_日,_曜日). 日付と曜日の生成(_年_1,_月_1,_日_1,_曜日_1,_年,_月,_日,_曜日) :- 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_曜日_1,_年,_月,_日,_曜日). 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_曜日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_曜日_1,_年_2,_月_2,_日_2), 曜日連鎖(_曜日_1,_曜日_2), 日付と曜日の生成(_年_2,_月_2,_日_2,_曜日_2,_年,_月,_日,_曜日). 翌日(_年_1,_月_1,_日_1,_年,_月,_日) :- '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日). 翌日(_年,_月,_日,_年,_月,_翌日) :- '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日) :- '12月、2月の月末日には特別ルールを適用する'(_年_1,_月_1,_日_1,_年,_月,_日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_翌月,_翌日) :- '12月、2月を除く月末日では、翌日は翌月の一日である'(_年_,_月_1,_日_1,_翌月,_翌日). '12月、2月の月末日には特別ルールを適用する'(_年,12,31,_翌年,1,1) :- 翌年(_年,_翌年). '12月、2月の月末日には特別ルールを適用する'(_年,2,_月末日,_年,3,1) :- 月末日(_年,2,_月末日). 翌年(_年,_翌年) :- succ(_年,_翌年). '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,1) :- '12月、2月を除く'(_月), 月末日(_年,_月,_月末日), 翌日は翌月の(_月,_翌月). '12月、2月を除く'(_月) :- \+('12月、2月を'(_月)). '12月、2月を'(_月) :- member(_月,[12,2]). 月末日(_,1,31). 月末日(_年,2,29) :- うるう年(_年). 月末日(_年,2,28) :- \+(うるう年(_年)). 月末日(_,3,31). 月末日(_,4,30). 月末日(_,5,31). 月末日(_,6,30). 月末日(_,7,31). 月末日(_,8,31). 月末日(_,9,30). 月末日(_,10,31). 月末日(_,11,30). 月末日(_,12,31). 翌日は翌月の(_月,_翌月) :- succ(_月,_翌月). '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日) :- '月末日でない日は、'(_年,_月,_日), 日のみ一加算される(_日,_翌日). '月末日でない日は、'(_年,_月,_日) :- \+(月末日(_年,_月,_日)). 日のみ一加算される(_日,_翌日) :- succ(_日,_翌日). うるう年(_年) :- 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年) :- 'うるう年は、4で割り切れる年が候補になるが、'(_年), '400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、'(_年) :- 0 is _年 mod 4. '400の倍数を除く100の倍数は除外される'(_年) :- \+('400の倍数を除く100の倍数は'(_年)). '400の倍数を除く100の倍数は'(_年) :- '400の倍数を除く'(_年), '100の倍数は'(_年). '400の倍数を除く'(_年) :- \+(0 is _年 mod 400). '100の倍数は'(_年) :- 0 is _年 mod 100. 曜日連鎖(日曜,月曜). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では月が2より大きければ(13,14を含む)公式をそのまま用いて計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して'(_年,_月,_前年,_月_2), 'Zellerの公式を用いて曜日を得る'(_前年,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して'(_年,_月,_前年,_月_2) :- '1月と2月は'(_月), それぞれ前年の13月と14月に変換して(_年,_月,_前年,_月_2). '1月と2月は'(_月) :- member(_月,[1,2]). それぞれ前年の13月と14月に変換して(_年,_月,_前年,_月_2) :- 前年の(_年,_前年), '13月と14月に変換して'(_月,_月_2). 前年の(_年,_前年) :- succ(_前年,_年). '13月と14月に変換して'(1,13). '13月と14月に変換して'(2,14). 'Zellerの公式では月が2より大きければ(13,14を含む)公式をそのまま用いて計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- '月が2より大きければ(13,14を含む)'(_月), 'Zellerの公式'(_年,_月,_日,_曜日を表す値,_曜日). '月が2より大きければ(13,14を含む)'(_月) :- _月 > 2. 'Zellerの公式'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは '起点年月日を示して、翌日以降の日付と曜日を生成する'(_起点年,_起点月,_起点日,_起点曜日,_年,_月,_日,_曜日) :- 日付と曜日の生成(_起点年,_起点月,_起点日,_起点曜日,_年,_月,_日,_曜日). 日付と曜日の生成(_年,_月,_日,_曜日,_年,_月,_日,_曜日). 日付と曜日の生成(_年_1,_月_1,_日_1,_曜日_1,_年,_月,_日,_曜日) :- 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_曜日_1,_年,_月,_日,_曜日). 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_曜日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_曜日_1,_年_2,_月_2,_日_2), 曜日連鎖(_曜日_1,_曜日_2), 日付と曜日の生成(_年_2,_月_2,_日_2,_曜日_2,_年,_月,_日,_曜日). 翌日(_年_1,_月_1,_日_1,_年,_月,_日) :- '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日). 翌日(_年,_月,_日,_年,_月,_翌日) :- '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日) :- '12月、2月の月末日には特別ルールを適用する'(_年_1,_月_1,_日_1,_年,_月,_日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_翌月,_翌日) :- '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,_翌日). '12月、2月の月末日には特別ルールを適用する'(_年,12,31,_翌年,1,1) :- 翌年(_年,_翌年). '12月、2月の月末日には特別ルールを適用する'(_年,2,_月末日,_年,3,1) :- 月末日(_年,2,_月末日). 翌年(_年,_翌年) :- succ(_年,_翌年). '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,1) :- '12月、2月を除く'(_月), 月末日(_年,_月,_月末日), 翌日は翌月の(_月,_翌月). '12月、2月を除く'(_月) :- \+('12月、2月を'(_月)). '12月、2月を'(_月) :- member(_月,[12,2]). 月末日(_,1,31). 月末日(_年,2,29) :- うるう年(_年). 月末日(_年,2,28) :- \+(うるう年(_年)). 月末日(_,3,31). 月末日(_,4,30). 月末日(_,5,31). 月末日(_,6,30). 月末日(_,7,31). 月末日(_,8,31). 月末日(_,9,30). 月末日(_,10,31). 月末日(_,11,30). 月末日(_,12,31). 翌日は翌月の(_月,_翌月) :- succ(_月,_翌月). '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日) :- '月末日でない日は、'(_年,_月,_日), 日のみ一加算される(_日,_翌日). '月末日でない日は、'(_年,_月,_日) :- \+(月末日(_年,_月,_日)). 日のみ一加算される(_日,_翌日) :- succ(_日,_翌日). うるう年(_年) :- 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年) :- 'うるう年は、4で割り切れる年が候補になるが、'(_年), '400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、'(_年) :- 0 is _年 mod 4. '400の倍数を除く100の倍数は除外される'(_年) :- \+('400の倍数を除く100の倍数は'(_年)). '400の倍数を除く100の倍数は'(_年) :- '400の倍数を除く'(_年), '100の倍数は'(_年). '400の倍数を除く'(_年) :- \+(0 is _年 mod 400). '100の倍数は'(_年) :- 0 is _年 mod 100. 曜日連鎖(日曜,月曜). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). % 以下のサイトは '起点年月日を示して、翌日以降の日付と曜日を生成する'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日) :- 日付と曜日の生成(_起点年,_起点月,_起点日,_年,_月,_日,_曜日). 日付と曜日の生成(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). 日付と曜日の生成(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_年,_月,_日,_曜日). 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 日付と曜日の生成(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). 翌日(_年_1,_月_1,_日_1,_年,_月,_日) :- '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日). 翌日(_年,_月,_日,_年,_月,_翌日) :- '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日) :- '12月、2月の月末日には特別ルールを適用する'(_年_1,_月_1,_日_1,_年,_月,_日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_月末日,_年,_翌月,_翌日) :- '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,_翌日). '12月、2月の月末日には特別ルールを適用する'(_年,12,31,_翌年,1,1) :- succ(_年,_翌年). '12月、2月の月末日には特別ルールを適用する'(_年,2,_月末日,_年,3,1) :- 月末日(_年,2,_月末日). '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,1) :- '12月、2月を除く'(_月), 月末日(_年,_月,_月末日), 翌日は翌月の一日である(_月,_翌月). '12月、2月を除く'(_月) :- \+(member(_月,[12,2])). 翌日は翌月の一日である(_月,_翌月) :- succ(_月,_翌月). 月末日(_,1,31). 月末日(_年,2,29) :- うるう年(_年). 月末日(_年,2,28) :- \+(うるう年(_年)). 月末日(_,3,31). 月末日(_,4,30). 月末日(_,5,31). 月末日(_,6,30). 月末日(_,7,31). 月末日(_,8,31). 月末日(_,9,30). 月末日(_,10,31). 月末日(_,11,30). 月末日(_,12,31). '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日) :- \+(月末日(_年,_月,_日)), 日のみ一加算される(_日,_翌日). 日のみ一加算される(_日,_翌日) :- succ(_日,_翌日). うるう年(_年) :- 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年) :- 'うるう年は、4で割り切れる年が候補になるが、'(_年), '400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、'(_年) :- 0 is _年 mod 4. '400の倍数を除く100の倍数は除外される'(_年) :- \+('400の倍数を除く100の倍数は'(_年)). '400の倍数を除く100の倍数は'(_年) :- '400の倍数を除く'(_年), '100の倍数は'(_年). '400の倍数を除く'(_年) :- \+(0 is _年 mod 400). '100の倍数は'(_年). 0 is _年 mod 100. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では月が2より大きければ(13,14を含む)公式をそのまま用いて計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して'(_年,_月,_前年,_月_2), 'Zellerの公式を用いて曜日を得る'(_前年,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して'(_年,_月,_前年,_月_2) :- '1月と2月は'(_月), それぞれ前年の13月と14月に変換して(_年,_月,_前年,_月_2). '1月と2月は'(_月) :- member(_月,[1,2]). それぞれ前年の13月と14月に変換して(_年,_月,_前年,_月_2) :- 前年の(_年,_前年), '13月と14月に変換して'(_月,_月_2). 前年の(_年,_前年) :- succ(_前年,_年). '13月と14月に変換して'(1,13). '13月と14月に変換して'(2,14). 'Zellerの公式では月が2より大きければ(13,14を含む)公式をそのまま用いて計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- '月が2より大きければ(13,14を含む)'(_月), 'Zellerの公式'(_年,_月,_日,_曜日を表す値,_曜日). '月が2より大きければ(13,14を含む)'(_月) :- _月 > 2. 'Zellerの公式'(_年,_月,_日,_曜日を表す値,_曜日) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは '起点年月日を示して、翌日以降の日付と曜日を生成する'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日) :- 日付と曜日の生成(_起点年,_起点月,_起点日,_年,_月,_日,_曜日). 日付と曜日の生成(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). 日付と曜日の生成(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_年,_月,_日,_曜日). 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 日付と曜日の生成(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). 翌日(_年_1,_月_1,_日_1,_年,_月,_日) :- '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日). 翌日(_年,_月,_日,_年,_月,_翌日) :- '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日) :- '12月、2月の月末日には特別ルールを適用する'(_年_1,_月_1,_日_1,_年,_月,_日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_翌月,_翌日) :- '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,_翌日). '12月、2月の月末日には特別ルールを適用する'(_年,12,31,_翌年,1,1) :- succ(_年,_翌年). '12月、2月の月末日には特別ルールを適用する'(_年,2,_月末日,_年,3,1) :- 月末日(_年,2,_月末日). '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,1) :- '12月、2月を除く'(_月), 月末日(_年,_月,_月末日), succ(_月,_翌月). '12月、2月を除く'(_月) :- \+(member(_月,[12,2])). 月末日(_,1,31). 月末日(_年,2,29) :- うるう年(_年). 月末日(_年,2,28) :- \+(うるう年(_年)). 月末日(_,3,31). 月末日(_,4,30). 月末日(_,5,31). 月末日(_,6,30). 月末日(_,7,31). 月末日(_,8,31). 月末日(_,9,30). 月末日(_,10,31). 月末日(_,11,30). 月末日(_,12,31). '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日) :- \+(月末日(_年,_月,_日)), succ(_日,_翌日). うるう年(_年) :- 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年) :- 'うるう年は、4で割り切れる年が候補になるが、'(_年), '400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、'(_年) :- 0 is _年 mod 4. '400の倍数を除く100の倍数は除外される'(_年) :- \+('400の倍数を除く100の倍数は'(_年)). '400の倍数を除く100の倍数は'(_年) :- \+(0 is _年 mod 400), 0 is _年 mod 100. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では月が2より大きければ(13,14を含む)公式をそのまま用いて計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して'(_年,_月,_年_1,_月_2), 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して'(_年,_月,_年_1,_月_2) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12. 'Zellerの公式では月が2より大きければ(13,14を含む)公式をそのまま用いて計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは '起点年月日を示して、翌日以降の日付と曜日を生成する'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日) :- 日付と曜日の生成(_起点年,_起点月,_起点日,_年,_月,_日,_曜日). 日付と曜日の生成(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). 日付と曜日の生成(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_年,_月,_日,_曜日). 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 日付と曜日の生成(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). 翌日(_年_1,_月_1,_日_1,_年,_月,_日) :- '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日). 翌日(_年,_月,_日,_年,_月,_翌日) :- '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_月,_日) :- '12月、2月の月末日には特別ルールを適用する'(_年_1,_月_1,_日_1,_年,_月,_日). '月末日の場合、翌日は1日だが、その月によって年月が決まる'(_年_1,_月_1,_日_1,_年,_翌月,_翌日) :- '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,_翌日). '12月、2月の月末日には特別ルールを適用する'(_年,12,31,_翌年,1,1) :- succ(_年,_翌年). '12月、2月の月末日には特別ルールを適用する'(_年,2,_月末日,_年,3,1) :- 月末日(_年,2,_月末日). '12月、2月を除く月末日では、翌日は翌月の一日である'(_年,_月,_月末日,_翌月,1) :- '12月、2月を除く'(_月), 月末日(_年,_月,_月末日), succ(_月,_翌月). '12月、2月を除く'(_月) :- \+(member(_月,[12,2])). 月末日(_,1,31). 月末日(_年,2,29) :- うるう年(_年). 月末日(_年,2,28) :- \+(うるう年(_年)). 月末日(_,3,31). 月末日(_,4,30). 月末日(_,5,31). 月末日(_,6,30). 月末日(_,7,31). 月末日(_,8,31). 月末日(_,9,30). 月末日(_,10,31). 月末日(_,11,30). 月末日(_,12,31). '月末日でない日は、年月は変わらず、日のみ一加算される'(_年,_月,_日,_翌日) :- \+(月末日(_年,_月,_日)), succ(_日,_翌日). うるう年(_年) :- 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、400の倍数を除く100の倍数は除外される'(_年) :- 'うるう年は、4で割り切れる年が候補になるが、'(_年), '400の倍数を除く100の倍数は除外される'(_年). 'うるう年は、4で割り切れる年が候補になるが、'(_年) :- 0 is _年 mod 4. '400の倍数を除く100の倍数は除外される'(_年) :- \+('400の倍数を除く100の倍数は'(_年)). '400の倍数を除く100の倍数は'(_年) :- \+(0 is _年 mod 400), 0 is _年 mod 100. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では月が2より大きければ(13,14を含む)公式をそのまま用いて計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して'(_年,_月,_年_1,_月_2), 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して'(_年,_月,_年_1,_月_2) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12. 'Zellerの公式では月が2より大きければ(13,14を含む)公式をそのまま用いて計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは 小さい順に取り出す(L,X) :- 一番小さいもの(L,R,Y), 小さい順に取り出す(R,Y,X). 一番小さいもの(L,R,Y) :- select(Y,L,R), 'Rの中にYより小さいものはない'(R,Y),!. 'Rの中にYより小さいものはない'(R,Y) :- \+('Rの中にYより小さいものがある'(R,Y)). 'Rの中にYより小さいものがある'(R,Y) :- 'Rの中に'(R,_Rの要素), 'Yより小さいものがある'(_Rの要素,Y). 'Rの中に'(R,_Rの要素) :- member(_Rの要素,R). 'Yより小さいものがある'(_Rの要素,Y) :- _Rの要素 @< Y. 小さい順に取り出す(_,X,X). 小さい順に取り出す(R,_,X) :- 小さい順に取り出す(R,X). % 以下のサイトは 冪乗法(_底,_指数,_法,_冪) :- _法 < 0,!. 冪乗法(_底,_指数,_法,_冪) :- '底を,底を法で割った余りに更新して行く'(_底,_法,_冪). '底を,底を法で割った余りに更新して行く'(_底,_法,_冪) :- '底を,底を法で割った余りに更新する'(_底,_法,_底_2), 冪乗法(_底_2,_指数,_法,_冪). '底を,底を法で割った余りに更新する'(_底,_法,_底_2) :- _底_2 is _底 mod _法. 冪乗法(0,0,_法,_冪) :- !. 冪乗法(0,_,_法,0) :- !. 冪乗法(_底,_指数,_法,_冪) :- 底が0になったら終了する(_底,_指数,_法,_冪). 冪乗法(_底,_指数,_法,_冪) :- '底が0でなく指数が0より大きい時は冪を1から成長させる'(_底,_指数,_法,_冪). 底が0になったら終了する(0,0,_法,_冪) :- !. 底が0になったら終了する(0,_,_法,0). '底が0でなく指数が0より大きい時は冪を1から成長させる'(_底,_指数,_法,_冪) :- 底が0でなく(_底), _指数 > 0, '冪乗法'(_底,_指数,_法,1,_冪). 底が0でなく(_底) :- \+(_底 = 0). 冪乗法(_底,_指数,_法,_冪_1,_冪) :- '底、指数、冪を更新して行く'(_底,_指数,_法,_冪_1,_冪). 冪乗法(_底,_指数,_法,_冪,_冪). '底、指数、冪を更新して行く'(_底,_指数,_法,_冪_1,_冪) :- '指数が奇数の時、底、指数、冪を更新する'(_底,_指数,_法,_冪_1,_底_2,_指数_2,_冪_2), 冪乗法(_底_2,_指数_2,_法,_冪_2,_冪). '指数が奇数の時、底、指数、冪を更新する'(_底,_指数,_法,_冪_1,_底_2,_指数_2,_冪_2) :- 指数が奇数の時(_指数), '底、指数、冪を更新する'(_底,_指数,_法,_冪_1,_底_2,_指数_2,_冪_2). '底、指数、冪を更新する'(_底,_指数,_法,_冪_1,_底_2,_指数_2,_冪_2) :- _冪_2 is _冪 * _底, _底_2 is (_底 ^ 2) mod _法, _指数_2 is _指数 // 2. 指数が奇数の時(_指数) :- 1 is _指数 mod 2. % 以下のサイトは 冪乗法(_底,_指数,_法,_冪) :- _法 < 0,!. 冪乗法(_底,_指数,_法,_冪) :- '底を,底を法で割った余りに更新して行く'(_底,_法,_冪). '底を,底を法で割った余りに更新して行く'(_底,_法,_冪) :- '底を,底を法で割った余りに更新する'(_底,_法,_底_2), 冪乗法(_底_2,_指数,_法,_冪). '底を,底を法で割った余りに更新する'(_底,_法,_底_2) :- _底_2 is _底 mod _法. 冪乗法(0,0,_法,_冪) :- !. 冪乗法(0,_,_法,0) :- !. 冪乗法(_底,_指数,_法,_冪) :- 底が0になったら終了する(_底,_指数,_法,_冪). 冪乗法(_底,_指数,_法,_冪) :- '底が0でなく指数が0より大きい時は冪を1から成長させる'(_底,_指数,_法,_冪). 底が0になったら終了する(0,0,_法,_冪) :- !. 底が0になったら終了する(0,_,_法,0). '底が0でなく指数が0より大きい時は冪を1から成長させる'(_底,_指数,_法,_冪) :- 底が0でなく(_底), _指数 > 0, '冪乗法'(_底,_指数,_法,1,_冪). 底が0でなく(_底) :- \+(_底 = 0). 冪乗法(_底,_指数,_法,_冪_1,_冪) :- '底、指数、冪を更新して行く'(_底,_指数,_法,_冪_1,_冪). 冪乗法(_底,_指数,_法,_冪,_冪). '底、指数、冪を更新して行く'(_底,_指数,_法,_冪_1,_冪) :- '指数が奇数の時、底、指数、冪を更新する'(_底,_指数,_法,_冪_1,_底_2,_指数_2,_冪_2), 冪乗法(_底_2,_指数_2,_法,_冪_2,_冪). '指数が奇数の時、底、指数、冪を更新する'(_底,_指数,_法,_冪_1,_底_2,_指数_2,_冪_2) :- 指数が奇数の時(_指数), '底、指数、冪を更新する'(_底,_指数,_法,_冪_1,_底_2,_指数_2,_冪_2). '底、指数、冪を更新する'(_底,_指数,_法,_冪_1,_底_2,_指数_2,_冪_2) :- _冪_2 is _冪 * _底, _底_2 is (_底 ^ 2) mod _法, _指数_2 is _指数 // 2. 指数が奇数の時(_指数) :- 1 is _指数 mod 2. % 以下のサイトは 冪乗法(_底,_指数,_法,_冪) :- _法 < 0,!. 冪乗法(_底,_指数,_法,_冪) :- '底を,底を法で割った余りに更新する'(_底,_法,_底_2), 冪乗法(_底_2,_指数,_法,_冪). '底を,底を法で割った余りに更新する'(_底,_法,_底_2) :- _底_2 is _底 mod _法. 冪乗法(0,0,_法,_冪) :- !. 冪乗法(0,_,_法,0) :- !. 冪乗法(_底,_指数,_法,_冪) :- _指数 > 0, '冪乗法'(_底,_指数,_法,1,_冪). 冪乗法(_底,_指数,_法,_冪_1,_冪) :- \+(0 is _指数 mod 2), _冪_2 is _冪 * _底, _底_2 is (_底 ^ 2) mod _法, _指数_2 is _指数 // 2, 冪乗法(_底_2,_指数_2,_法,_冪_2,_冪). 冪乗法(_底,_指数,_法,_冪,_冪). % 以下のサイトは '100000以下のどの桁にも0を含まない削除可能素数の度数'(_度数) :- 度数('100000以下のどの桁にも0を含まない削除可能素数'(_削除可能素数),_度数). '100000以下のどの桁にも0を含まない削除可能素数'(_削除可能素数) :- まず素数候補を100000以下に絞りましょう(_素数ならび), どの桁にも0を含まない削除可能素数を選別する(_素数ならび,_削除可能数). どの桁にも0を含まない削除可能素数を選別する(_素数ならび,_削除可能数) :- どの桁にも0を含まない削除可能素数の数字ならび(_素数ならび,_削除可能素数の数字ならび), 削除可能素数であるか検査して数値に戻す(_素数ならび,_削除可能素数の数字ならび,_削除可能素数). まず素数候補を100000以下に絞りましょう(_素数ならび) :- '2から100000までの数ならび'(_2から100000までの数ならび), エラトステネスの篩(_2から100000までの数ならび,_素数ならび). '2から100000までの数ならび'(_2から100000までの数ならび) :- findall(N,between(2,100000,N),_2から100000までの数ならび). どの桁にも0を含まない削除可能素数の数字ならび(_素数ならび,_削除可能素数の数字ならび) :- どの桁にも0を含まない削除可能素数候補を数字ならびで受け取る(_素数ならび,_削除可能素数の数字ならび). どの桁にも0を含まない削除可能素数候補を数字ならびで受け取る(_素数ならび,_削除可能素数の数字ならび) :- 素数をひとつ選択し削除可能素数の数字ならびに分解する(_素数ならび,_削除可能素数の数字ならび), どの桁にも0を含まない(_削除可能素数の数字ならび). 素数をひとつ選択し削除可能素数の数字ならびに分解する(_素数ならび,_削除可能素数の数字ならび) :- member(_素数,_素数ならび), number_chars(_素数,_削除可能素数の数字ならび). どの桁にも0を含まない(_削除可能素数の数字ならび) :- \+(member('0',_削除可能素数の数字ならび)). 削除可能素数であるか検査して数値に戻す(_素数ならび,_削除可能素数の数字ならび,_削除可能素数) :- once(削除可能素数であるか検査する(_素数ならび,_削除可能素数の数字ならび)), number_chars(_削除可能素数,_削除可能素数の数字ならび). 削除可能素数であるか検査する(_素数ならび,[]) :- !. 削除可能素数であるか検査する(_素数ならび,L) :- ひと桁ずつ減らしていってどれも素数である(_素数ならび,L). ひと桁ずつ減らしていってどれも素数である(_素数ならび,_素数を構成する数字ならび) :- 素数を構成する数字ならび(_素数ならび,_素数を構成する数字ならび), select(_,_素数を構成する数字ならび,R), 削除可能素数であるか検査する(_素数ならび,R). 素数を構成する数字ならび(_素数ならび,_素数を構成する数字ならび) :- number_chars(_素数,_素数を構成する数字ならび), 素数(_素数ならび,_素数). 素数(_素数ならび,_素数) :- member(_素数,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), 'すべて大文字に変換して(小文字は大文字に、大文字はそのままに)'(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). 'すべて大文字に変換して(小文字は大文字に、大文字はそのままに)'(_文字コードならび,_大文字に変換された文字コードならび) :- findall(_変換されたコード,( member(_文字コード,_文字コードならび), '小文字は大文字に、大文字はその(_文字コード,_変換された文字コード)),_大文字に変換された文字コードならび). '小文字は大文字に、大文字はそのままに'(_文字コード,_変換された文字コード) :- 小文字は大文字に(_文字コード,_変換された文字コード). '小文字は大文字に、大文字はそのままに'(_文字コード,_文字コード) :- 大文字はそのままに(_文字コード). 小文字は大文字に(_文字コード,_変換された文字コード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 大文字はそのままに(_文字コード) :- \+(小文字の場合は(_文字コード)). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/7 # # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示するプログラムを作成しなさい。 # ただし、文字を大文字に変換する関数を作成し、それを利用すること。 # 'キーボードから入力した文字列をすべて大文字(小文字は大文字に、大文字はそのままに)に変換して表示する' :- キーボードから入力した文字列を(_文字コードならび), すべて大文字に変換して(_文字コードならび,_大文字に変換された文字コードならび), 表示する(_大文字に変換された文字コードならび). キーボードから入力した文字列を(_文字コードならび) :- write('文字列を入力してください : '), read_line_to_codes(user_input,_文字コードならび). すべて大文字に変換して([],[]). すべて大文字に変換して(L1,L2) :- 小文字場合は大文字に変換する(L1,L2). 小文字場合は大文字に変換する([_文字コード|R1],[_変換されたコード|R2]) :- 小文字の場合は大文字に変換して(_文字コード,_変換されたコード), すべて大文字に変換して(R1,R2). 小文字の場合は大文字に変換して(_文字コード,_変換されたコード) :- 小文字の場合は(_文字コード), 大文字に変換して(_文字コード,_変換されたコード). 小文字の場合は大文字に変換して(_文字コード,_文字コード) :- 小文字でない場合は変換せずに(_文字コード). 小文字の場合は(_文字コード) :- between(97,121,_文字コード). 大文字に変換して(_文字コード,_変換されたコード) :- _大文字コード is _文字コード - 32. 小文字でない場合は変換せずに(_文字コード) :- \+(小文字の場合は(_文字コード)). 表示する(_大文字に変換された文字コードならび) :- atom_codes(_文字列,_大文字に変換された文字コードならび), writef('%w\n',[_文字列]). % 以下のサイトは # 【 課題 】マス取りゲーム # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11/27 24:00 # 【 Ver  】"1.7.0_45" # 【 補足 】3×3のマスに『○』と『×』を交互に入力して9マス埋まったら終了です。 # 勝ち負けはいりません 戦略なしマス取りゲーム(_手順) :- 戦略なしマス取りゲーム(○,[a1,a2,a3,b1,b2,b3,c1,c2,c3],_手順). 戦略なしマス取りゲーム(_手番,[],[]). 戦略なしマス取りゲーム(_手番,_残りマスならび,_手順) :- 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,_手順). 空いたマスがあれば戦略なしマス取りゲームを続ける(_手番,_残りマスならび,[[_手番,_マス]|_手順]) :- 空いたマスがあれば(_残りマスならび), 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび), 戦略なしマス取りゲーム(_次の手番,_ひとつマスを取られた残りマスならび,_手順). 空いたマスがあれば(_残りマスならび) :- \+(_残りマスならび = []). 手番がマスをひとつ取る(_手番,_残りマスならび,_次の手番,_マス,_ひとつマスを取られた残りマスならび) :- マスをひとつ取る(_残りマスならび,_マス), ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび), 次の手番(_手番,_次の手番). マスをひとつ取る(_残りマスならび,_マス) :- length(_残りマスならび,_残りマス数), _乱順数 is random(_残りマス数), nth0(_乱順数,_残りマスならび,_マス). ひとつマスを取られた残りマスならび(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび) :- select(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび). 次の手番(○,×). 次の手番(×,○). % 以下のサイトは # # Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く # 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。 # 'Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。'(_関数) :- 関数の引数にダブリがない(_関数). 関数の引数にダブリがない(_関数) :- _関数 =.. [_|L], forall((append(_,[A|R],L),member(B,R)),\+(A==B)). % 以下のサイトは # # Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く # 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。 # 'Prologで、 f(X1, X2, X3, X4 ・・・Xn) のX1〜Xnまでダブりがないのを簡単に書く 方法が絶対にありそうなのに見つからない。X1 \= X2, を延々と書くのは無謀すぎる。'(_関数) :- 関数の引数にダブリがない(_関数). 関数の引数にダブリがない(_関数) :- 関数から引数ならびを取り出す(_関数,_引数ならび), 引数ならびにダブリがない(_引数ならび). 関数から引数ならびを取り出す(_関数,_引数ならび) :- _関数 =.. [_関数名|_引数ならび]. 引数ならびにダブリがない(_引数ならび) :- 全ての引数は後続引数に一致するものがない(_引数ならび). 全ての引数は後続引数に一致するものがない(_引数ならび) :- forall( 引数と後続引数は(_引数ならび,_引数,_後続引数), 一致しない(_引数,_後続引数)). 引数と後続引数は(_引数ならび,_引数,_後続引数) :- append(_,[_引数|_後続引数ならび],_引数ならび), member(_後続引数,_後続引数ならび). 一致しない(_引数_1,_引数_2) :- \+(_引数_1 == _引数_2). % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- 篩に掛ける(R1,_要素,'_要素はNで割り切れる'(_要素,N),R2), 非決定性のエラトステネスの篩(R2,_素数). 篩に掛ける(L1,_要素,_副目標,L2) :- 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2). 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), '_副目標を真とするものを篩に掛ける'(_副目標)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). '_副目標を真とするものを篩に掛ける'(_副目標) :- \+(_副目標). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|L1],_素数) :- 先頭の素数を網として篩に掛けて行く(L1,_要素,'_要素はNで割り切れる'(_要素,N),_素数). 先頭の素数を網として篩に掛けて行く(L1,_要素,_副目標,_素数) :- 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2), 非決定性のエラトステネスの篩(L2,_素数). 'L1の要素で_副目標を真とするものを篩に掛ける'(L1,_要素,_副目標,L2) :- findall(_要素,( 'L1の要素で'(L1,_要素), '_副目標を真とするものを篩に掛ける'(_副目標)),L2). 'L1の要素で'(L1,_要素) :- member(_要素,L1). '_副目標を真とするものを篩に掛ける'(_副目標) :- \+(_副目標). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- エラトステネスの篩(N,R1,R2), 非決定性のエラトステネスの篩(R2,_素数). エラトステネスの篩(_,[],[]). エラトステネスの篩(N,[A|R1],L2) :- エラトステネスの篩(N,A,R2,L2), エラトステネスの篩(N,R1,R2). エラトステネスの篩(N,A,R2,R2) :- 0 is A mod N. エラトステネスの篩(N,A,R2,[A|R2]) :- \+(0 is A mod N). % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- findall(N,between(2,_限界値,N),L), 非決定性のエラトステネスの篩(L,_素数). 非決定性のエラトステネスの篩([_素数|_],_素数). 非決定性のエラトステネスの篩([N|R1],_素数) :- 篩に掛ける(R1,_要素,'_要素はNで割り切れる'(_要素,N),R2), 非決定性のエラトステネスの篩(R2,_素数). 篩に掛ける(L1,_要素,_副目標,L2) :- findall(_要素,( member(_要素,L1), \+(_副目標)),L2). '_要素はNで割り切れる'(_要素,N) :- 0 is _要素 mod N. % 以下のサイトは # 要素の和集合って結構手順面倒なんじゃね… 和集合(L1,L2,_和集合) :- 初出要素のみ収集(L1,[],L3), 初出要素のみ収集(L2,L3,_和集合). 初出要素のみ収集([],L,L). 初出要素のみ収集(L1,L2,L) :- '既出でない要素をL2に追加して行く'(L1,L2,L). '既出でない要素をL2に追加して行く'(L1,L2,L) :- 既出の場合は読み飛ばす(L1,L2,L). 'L2の要素にない要素のみ蒐集する'([A|R1],L2,L) :- 'Aが既出でない場合はL2にAを追加する'(A,R1,L2,L). 既出の場合は読み飛ばす(L1,L2,L) :- member(A,L2), 初出要素のみ収集(R1,L2,L). 'Aが既出でない場合はL2にAを追加する'(A,R1,L2,L) :- \+(member(A,L2)), 初出要素のみ収集(R1,[A|L2],L). % 以下のサイトは '差集合 A-B とは、Aの要素からBの要素を取り去った集合である'(A,B,_差集合) :- '差集合 A-B とは、Aの要素であるがBの要素ではない、そういう要素を集めた集合である'(A,B,_差集合). '差集合 A-B とは、Aの要素であるがBの要素ではない、そういう要素を集めた集合である'(A,B,_差集合) :- setof(_要素,[A,B,_要素] ^ 'Aの要素であるがBの要素ではない'(A,B,_要素),_差集合). 'Aの要素であるがBの要素ではない'(A,B,_要素) :- 'Aの要素であるが'(A,_要素), 'Bの要素ではない'(B,_要素). 'Aの要素であるが'(A,_要素) :- member(_要素,A). 'Bの要素ではない'(B,_要素) :- \+(member(_要素,B)). % 以下のサイトは '差集合 A-B とは、Aの要素からBの要素を取り去った集合である'(A,B,_差集合) :- '差集合 A-B とは、Aの要素であるがBの要素ではない、そういう要素を集めた集合である'(A,B,_差集合). '差集合 A-B とは、Aの要素であるがBの要素ではない、そういう要素を集めた集合である'(A,B,_差集合) :- setof(_要素,[A,B,_要素] ^ 'Aの要素であるがBの要素ではない'(A,B,_要素),_差集合). 'Aの要素であるがBの要素ではない'(A,B,_要素) :- 'Aの要素であるが'(A,_要素), 'Bの要素ではない'(B,_要素). 'Aの要素であるが'(A,_要素) :- member(_要素,A). 'Bの要素ではない'(B,_要素) :- \+(member(_要素,B)). % 以下のサイトは '差集合 A-B とは、Aの要素からBの要素を取り去った集合である'(A,B,_差集合) :- 'Aの要素からBの要素を取り去った集合'(A,B,_差集合). 'Aの要素からBの要素を取り去った集合'([],_,[]). 'Aの要素からBの要素を取り去った集合'(A,B,_差集合) :- 'Aの要素からBの要素だけを取り去っていく'(A,B,_差集合). 'Aの要素からBの要素だけを取り去っていく'([X|R1],B,_差集合) :- 'XがBの要素の場合だけ取り去る'(X,B,R3,_差集合), 'Aの要素からBの要素を取り去った集合'(R1,B,R3). 'XがBの要素の場合だけ取り去る'(X,B,R3,R3) :- 'XはBの要素である'(X,B). 'XがBの要素の場合だけ取り去る'(X,B,R3,[X|R3]) :- 'XはBの要素ではない'(X,B). 'XはBの要素である'(X,B) :- member(X,B). 'XはBの要素ではない'(X,B) :- \+(member(X,B)). % 以下のサイトは 限界まで同一文字の副文字列(_文字列,_前文字列,_限界まで同一文字の副文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_限界まで同一文字の副文字列,_後文字列), 文字列は全て同一文字からなる(_限界まで同一文字の副文字列,_文字), '_前文字列の最後の文字と_後文字列の最初の文字が_文字ではない'(_文字列,_文字,_前文字列,_限界まで同一文字の副文字列,_後文字列). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 文字列は全て同一文字からなる('',_). 文字列は全て同一文字からなる(_文字列,_文字) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_残り文字列), 文字列は全て同一文字からなる(_残り文字列,_文字). '_前文字列の最後の文字と_後文字列の最初の文字が_文字ではない'(_文字列,_文字,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_適合文字列,_後文字列), '_前文字列の最後の文字は_文字ではない'(_前文字列,_文字), '_後文字列の最初の文字は_文字ではない'(_後文字列,_文字). '_前文字列の最後の文字は_文字ではない'(_前文字列,_文字) :- \+(sub_atom(_前文字列,_,1,0,_文字)). '_後文字列の最初の文字は_文字ではない'(_後文字列,_文字) :- \+(sub_atom(_後文字列,0,1,_,_文字)). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), once(成績データを得る(_成績ならび)). 成績データを得る(_成績ならび) :- findnsols(100,[_学籍番号,_成績],( 連続した行入力(_行), (行入力終了条件(_行),!,fail;split(_行,[' '],[_学籍番号,_成績]))),_成績ならび). 連続した行入力(_行) :- repeat, get_line(_行). 行入力終了条件('0 0'). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_成績ならび,_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_成績ならび,_降順に整列した成績鍵ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), length(Ln,100), 成績データを得る(Ln,_行,_整列鍵ならび,_成績ならび). 成績データを得る(_,'0 0',[]) :- !. 成績データを得る([],_,[]). 成績データを得る([_|Ln],_行,[[_学籍番号,_成績]|R]) :- split(_行,[' '],[_学籍番号,_成績]), get_line(_行_2), 成績データを得る(Ln,_行_2,R). 降順に整列した成績鍵ならび(_成績ならび,_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ member([_学籍番号,_成績],_成績ならび),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_成績ならび,_降順に整列した成績鍵ならび) :- 上位11名を選別する(_上位11名), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_成績ならび,_上位11名ならび) :- once(findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績),_上位11名ならび)). '降順に整列した成績鍵から_学籍番号_成績を登録順に取り出す'(_降順に整列した成績鍵ならび,_成績ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), member([_学籍番号,_成績],_成績ならび). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出典:: http://chomework.sakura.ne.jp/log1/1137522945_02.html (レス番号110) # # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび), 成績データを成績順に並べ直す(_成績ならび,_成績順に整列した成績ならび), 上位11名の選別(_成績順に整列した成績ならび,_上位11名ならび), 上位11名を表示する(_上位11名ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)'(_成績ならび) :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), get_line(_行), 成績データを得る(1,_行,_整列鍵ならび,_成績ならび). 成績データと整列鍵を得る(_,'0 0',[],[]) :- !. 成績データと整列鍵を得る(100,_,[],[]). 成績データと整列鍵を得る(M,_行,[[_成績,M]|R1],[[_学籍番号,_成績]|R2]) :- split(_行,[' '],[_学籍番号,_成績]), succ(M,M_2), get_line(_行_2), 成績データと整列鍵を得る(M_2,_行_2,R1,R2). 成績データを成績順に並べ直す(_整列鍵ならび,_成績ならび,_成績順に整列した成績ならび) :- sort(_整列鍵ならび,_整列した整列鍵ならび), 成績データを大きい順に並べ直す(_整列した整列鍵ならび,_成績ならび,[],_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([],_,_成績順に整列した成績ならび,_成績順に整列した成績ならび). 成績データを大きい順に並べ直す([[_,M]|R1],_成績ならび,L1,_成績順に整列した成績ならび) :- nth1(M,_成績ならび,[_学籍番号,_成績]), 成績データを大きい順に並べ直す(R1,_成績ならび,[[_学籍番号,_成績]|L1],_成績順に整列した成績ならび). 上位11名の選別(L,_上位11名ならび) :- findnsols(11,X,member(X,L),_上位11名ならび),!. 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/170 # お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。 # m=3 -> 1/3,1/2,2/3 # m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5 # # '分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。'(_m,_整列した分数ならび) :- findall(_分子 rdiv _分母,分母ごとの既約分数(_m,_分母,_分子),_分数ならび), sort(_分数ならび,_整列した分数ならび). 分母ごとの既約分数(_m,_分母,_分子) :- between(2,_m,_分母), 分子候補を篩に掛ける(2,_分母,_篩に掛けられた分子ならび), member(_分子,_篩に掛けられた分子ならび). 分子候補を篩に掛ける(M,_分母,_篩に掛けられた分子ならび) :- 分子候補を生成(_分母,_数ならび), 分子候補を篩に掛ける(M,_分母,_数ならび,_篩に掛けられた分子ならび). 分子候補を生成(_分母,_数ならび) :- succ(_分母_1,_分母), findall(N,between(1,_分母_1,N),_数ならび). 分子候補を篩に掛ける(_分母,_分母,_篩に掛けられた分子ならび,_篩に掛けられた分子ならび) :- !. 分子候補を篩に掛ける(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび). 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2), succ(M,M_2), 分子候補を篩に掛ける(M_2,_分母,_数ならび_2,_篩に掛けられた分子ならび). 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2) :- findall(_分子候補,分子候補(M,_分母,_数ならび_1,_分子候補),_数ならび_2). 分子候補(M,_分母,_数ならび_1,_分子候補) :- member(_分子候補,_数ならび_1), 約分できない(M,_分母,_分子候補). 約分できない(M,_分母,_分子候補) :- \+(約分できる(M,_分母,_分子候補)). 約分できる(M,_分母,_分子候補) :- 0 is _分母 mod M, 0 is _分子候補 mod M. % 以下のサイトは # 出典::スレ立てるまでもない質問はここで 105匹目 #516 # 文字列をひっくり返す関数下さい # # in→あいうえお # out→おえうあい # # こんな感じのです # # # 文字列をひっくり返す関数下さい(_in,_out) :- 仕様に勘違いがある(_in,_out). 文字列をひっくり返す関数下さい(_in,_out) :- 仕様には深淵なるルールがある(_in,_out). 仕様に勘違いがある(_in,_out) :- 勘違い(おえうあい,おえういあ), '勘違いだと分かったら最も常識的な解決、乃ち文字列を単に反転する'(_in,_out). 勘違い(おえうあい,おえういあ). '勘違いだと分かったら最も常識的な解決、乃ち文字列を単に反転する'(_in,_out) :- atom_chars(_in,_文字ならび), reverse(_文字ならび,_反転した文字ならび), atom_chars(_out,_反転した文字ならび). 仕様には深淵なるルールがある(_in,_out) :- 仕様には深遠なるルールがある(_in,_out). 仕様には深遠なるルールがある(_in,_out) :- atom_chars(_in,Chars), 深遠なるルールを文字のならびで(Chars,Chars2), atom_chars(_out,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 一旦反転して最終二要素を置換する(Chars,Chars2). 深遠なるルールを文字のならびで(Chars,Chars2) :- 文字置換ルールに従って文字を置換する(Chars,Chars2). 第三要素から残り最後までを反転し最初の二要素を付加する(Chars,Chars2) :- 最初の二要素(Chars,_最初のに要素,_第三要素から残り最後まで), 第三要素から残り最後までを反転し(_第三要素から残りの最後まで,_反転した第三要素から残りの最後まで), 最初の二要素を付加する(_反転した第三要素から残りの最後まで,_最初の二要素,Chars2). 最初の二要素(Chars,_最初の二要素,_第三要素から残り最後まで) :- length(_最初の二要素,2), append(_最初の二要素,_第三要素から残り最後まで,Chars). 第三要素から残り最後までを反転し(_第三要素から最後まで,_反転した第三要素から最後まで) :- reverse(_第三要素から最後まで,_反転した第三要素から最後まで). 最初の二要素を付加する(_反転した第三要素から最後まで,_最初の二要素,Chars2) :- append(_反転した第三要素から最後まで,_最初の二要素,Chars2). 一旦反転して最終二要素を置換する(_文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- 一旦反転して(_文字ならび,_反転した文字ならび), 最終二要素を置換する(_反転した文字ならび,_一旦反転して最終二要素を置換した文字ならび). 一旦反転して(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 最終二要素を置換する(_反転した文字ならび,_一旦反転して最終二要素を置換した文字ならび) :- append(L,[A,B],_反転した文字ならび), append(L,[B,A],_一旦反転して最終二要素を置換した文字ならび). 文字置換ルールに従って文字を置換する(_文字ならび,_置換された文字ならび) :- findall(_置換文字, 置換文字を取り出す(_文字ならび,_置換文字),_置換された文字ならび). 置換文字を取り出す(_文字ならび,_置換文字) :- member(_文字,_文字ならび), 文字置換ルール(_文字,_置換文字). 文字置換ルール(あ,お). 文字置換ルール(い,え). 文字置換ルール(う,う). 文字置換ルール(え,あ). 文字置換ルール(お,い). % 以下のサイトは 足し算(M,N,X) :- 'MとNがともに整数の時はMとNを足す'(M,N,X). 足し算(M,N,X) :- 'MとNの少なくとも一方が整数でない時は丸めてMとNを足す'(M,N,X). 'MとNがともに整数の時はMとNを足す'(M,N,X) :- 'MとNがともに整数の時は'(M,N), 'MとNを足す'(M,N,X). 'MとNがともに整数の時は'(M,N) :- integer(M), integer(N). 'MとNを足す'(M,N,X) :- X is M + N. 'MとNの少なくとも一方が整数でない時は丸めてMとNを足す'(M,N,X) :- 'MとNの少なくとも一方が整数でない時は'(M,N), 丸めてMとNを足す(M,N,X). 'MとNの少なくとも一方が整数でない時は'(M,N) :- \+((integer(M),integer(N))). 丸めてMとNを足す(M,N,X) :- C is M + N, sformat(D,'~7f',[C]), number_codes(X,D). 引き算(M,N,X) :- 'MとNがともに整数の時はMからNを引く'(M,N,X). 引き算(M,N,X) :- 'MとNの少なくとも一方が整数でない時は丸めてMからNを引く'(M,N,X). 'MとNがともに整数の時はMからNを引く'(M,N,X) :- 'MとNがともに整数の時は'(M,N), 'MからNを引く'(M,N,X). 'MからNを引く'(M,N,X) :- X is M - N. 'MとNの少なくとも一方が整数でない時は丸めてMからNを引く'(M,N,X) :- 'MとNの少なくとも一方が整数でない時は'(M,N), 丸めてMからNを引く(M,N,X). 丸めてMからNを引く(M,N,X) :- C is M - N, sformat(D,'~7f',[C]), number_codes(X,D). 掛け算(M,N,X) :- 'MとNがともに整数の時はMにNを掛ける'(M,N,X). 掛け算(M,N,X) :- 'MとNの少なくとも一方が整数でない時はMにNを掛けて丸める'(M,N,X). 'MとNがともに整数の時はMにNを掛ける'(M,N,X) :- 'MとNがともに整数の時は'(M,N), 'MにNを掛ける'(M,N,X). 'MにNを掛ける'(M,N,X) :- X is M * N. 'MとNの少なくとも一方が整数でない時はMにNを掛けて丸める'(M,N,X) :- 'MとNの少なくとも一方が整数でない時は'(M,N), 'MにNを掛けて丸める'(M,N,X). 'MにNを掛けて丸める'(M,N,X) :- C is M * N, sformat(D,'~7f',[C]), number_codes(X,D). 割り算(M,N,X) :- 'MとNがともに整数の時はMをNで割る'(M,N,X). 割り算(M,N,X) :- 'MとNの少なくとも一方が整数でない時はMをNで割って丸める'(M,N,X). 'MとNがともに整数の時はMをNで割る'(M,N,X) :- 'MとNがともに整数の時は'(M,N), 'MをNで割る'(M,N,X). 'MをNで割る'(M,N,X) :- X is M / N. 'MとNの少なくとも一方が整数でない時はMをNで割って丸める'(M,N,X) :- 'MとNの少なくとも一方が整数でない時は'(M,N), 'MをNで割って丸める'(M,N,X). 'MをNで割って丸める'(M,N,X) :- C is M / N, sformat(D,'~7f',[C]), number_codes(X,D). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #104 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): #   100以下までの素数を求め、その表示をするプログラムを作成せよ。 #   ただし、求める素数の量は引数として関数側に渡して求めることとする。 # #   【関数仕様】 #   戻り値:なし #   関数名:prime #   引数:int n # '100以下までの素数を求め、その表示をするプログラムを作成せよ。ただし、求める素数の量は引数として関数側に渡して求めることとする。'(_n) :- '100以下までの素数をn個求め'(_n,_n個の素数ならび), その表示をする(_n個の素数ならび). '100以下までの素数をn個求め'(_n,_n個の素数ならび) :- findnsols(_n,_素数,'100以下までの素数を求め'(_素数),_n個の素数ならび),!. '100以下までの素数を求め'(_素数) :- '100以下までの'(_素数候補), 素数を求め(_素数候補,_素数). '100以下までの'(_素数候補) :- findall(N,between(2,100,N),_素数候補). 素数を求め(_素数候補,_素数) :- エラトステネスの篩(_素数候補,_素数). エラトステネスの篩([A|R1],X) :- 篩(A,R1,L), エラトステネスの篩(A,L,X). エラトステネスの篩(A,_,A). エラトステネスの篩(A,L,X) :- エラトステネスの篩(L,X). 篩(_,[],[]) :- !. 篩(N,L,R2) :- 'Nで割り切れるものを篩に掛ける'(N,L,R2). 'Nで割り切れるものを篩に掛ける'(N,[A|R1],L) :- 'Nで割り切れるものを取り除く'(N,A,R1,L,R2), 篩(N,R1,R2). 'Nで割り切れるものを取り除く'(N,A,R1,R2,R2) :- 'Nで割り切れるものを'(A,N). 'Nで割り切れるものを取り除く'(N,A,R1,[A|R2],R2) :- 'Nで割り切れないものは取り除かない'(A,N). 'Nで割り切れるものを'(A,N) :- 0 is A mod N. 'Nで割り切れないものは取り除かない'(A,N) :- \+(0 is A mod N). その表示をする(_n個の素数ならび) :- atomic_list_concat(_n個の素数ならび,' ',_n個の素数文字列), writef('%w\n',[_n個の素数文字列]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #520 # お題: nをmで割って余りを切り上げる関数を作れ! # n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか? # nは0または自然数、mは自然数とする。 # 10 3 -> 4 'nをmで割って余りを切り上げる関数を作れ!'(_n,_m,_余りを切り上げた商) :- nをmで割って割り切れる時は単純に整数除算する(_n,_m,_余りを切り上げた商). 'nをmで割って余りを切り上げる関数を作れ!'(_n,_m,_余りを切り上げた商) :- nをmで割って割り切れない時は整数除算して1を加える(_n,_m,_余りを切り上げた商). nをmで割って割り切れる時は単純に整数除算する(_n,_m,_余りを切り上げた商) :- nをmで割って割り切れる(_n,_m), 単純に整数除算する(_n,_m,_余りを切り上げた商). nをmで割って割り切れない時は整数除算して1を加える(_n,_m,_余りを切り上げた商) :- nをmで割って割り切れない(_n,_m), 整数除算して1を加える(_n,_m,_余りを切り上げた商). nをmで割って割り切れる(_n,_m) :- 0 is _n mod _m. 単純に整数除算する(_n,_m,_余りを切り上げた商) :- _余りを切り上げた商 is _n // _m. nをmで割って割り切れない(_n,_m) :- \+(nをmで割って割り切れる(_n,_m)). 整数除算して1を加える(_n,_m,_余りを切り上げた商) :- _余りを切り上げた商 is _n // _m + 1. % 以下のサイトは # 出典:: twitter by kro ?@___zoj 20151111 # 出典:: '「父」は神である'(ラテン語: 'PATER est DEUS',英語: 'The Father is God'). '「子」は神である'(ラテン語: 'FILIUS est DEUS',英語: 'The Son is God'). '聖霊は神である'(ラテン語: 'SPRITUS est DEUS',英語: 'The Holly Sprit is God'). '神は「父」である'(ラテン語: 'DEUS est PATER',英語: 'God is The Father'). '神は「子」である'(ラテン語: 'DEUS est FILIUS',英語: 'God is The Son'). '神は聖霊である'(ラテン語: 'DEUS est SPIRITUS SANCTUS',英語: 'God is The Holly Sprit'). '「父」は「子」ではない'(ラテン語: 'PATER non est FILIUS',英語: 'The Father is not The Son'). '「子」は「父」ではない'(ラテン語: 'FILIUS non est PATER',英語: 'The Son is not The Father'). '「父」は聖霊ではない'(ラテン語: 'PATER non est SPRITUS SANCTUS',英語: 'The Father is not The Holly Sprit'). '聖霊は「父」ではない'(ラテン語: 'SPRITUS SANCTUS non est PATER',英語: 'The Holly Sprit is not The Father'). '「子」は聖霊ではない'(ラテン語: 'FILIUS non est SPRITUS SANCTUS',英語: 'The Son is not The Holly Sprit'). '聖霊は「子」ではない'(ラテン語: 'SPRITUS SANCTUS non est FILIUS',英語: 'The Holly Sprit is not The Son'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '日本語・ラテン語・英語'(日本語: '「父」は神である',ラテン語: 'PATER est DEUS',英語: 'The Father is God'). '日本語・ラテン語・英語'(日本語: '「子」は神である',ラテン語: 'FILIUS est DEUS',英語: 'The Son is God'). '日本語・ラテン語・英語'(日本語: '聖霊は神である',ラテン語: 'SPRITUS est DEUS',英語: 'The Holly Sprit is God'). '日本語・ラテン語・英語'(日本語: '神は「父」である',ラテン語: 'DEUS est PATER',英語: 'God is The Father'). '日本語・ラテン語・英語'(日本語: '神は「子」である',ラテン語: 'DEUS est FILIUS',英語: 'God is The Son'). '日本語・ラテン語・英語'(日本語: '神は聖霊である',ラテン語: 'DEUS est SPIRITUS SANCTUS',英語: 'God is The Holly Sprit'). '日本語・ラテン語・英語'(日本語: '「父」は「子」ではない',ラテン語: 'PATER non est FILIUS',英語: 'The Father is not The Son'). '日本語・ラテン語・英語'(日本語: '「子」は「父」ではない',ラテン語: 'FILIUS non est PATER',英語: 'The Son is not The Father'). '日本語・ラテン語・英語'(日本語: '「父」は聖霊ではない',ラテン語: 'PATER non est SPRITUS SANCTUS',英語: 'The Father is not The Holly Sprit'). '日本語・ラテン語・英語'(日本語: '聖霊は「父」ではない',ラテン語: 'SPRITUS SANCTUS non est PATER',英語: 'The Holly Sprit is not The Father'). '日本語・ラテン語・英語'(日本語: '「子」は聖霊ではない',ラテン語: 'FILIUS non est SPRITUS SANCTUS',英語: 'The Son is not The Holly Sprit'). '日本語・ラテン語・英語'(日本語: '聖霊は「子」ではない',ラテン語: 'SPRITUS SANCTUS non est FILIUS',英語: 'The Holly Sprit is not The Son'). % 以下のサイトは # 出典 :: # すいませんおねがいします。日曜までです。 # # # String型の配列として与えられた人の名前を全て使って「しりとり」を作りましょう。 # 参考資料ファイルを自分のプロジェクトにコピーもしくはインポートし、50音順で並んでいる配列をしりとりの原理で並び替え、出力するプログラムを作成してください。 # -----------Original NameList----------- # ごりら # らっぱ # りんご # -----------Sorted NameList----------- # りんご # ごりら # らっぱ # # 単語は適当に自分がうめるのでプログラミングそのものだけつくってもらえませんか? # # # 語彙集(ごりら). 語彙集(らっぱ). 語彙集(りんご). 語彙集(もも). 語彙集(もり). 語彙集(こくご). 語彙集(らっこ). しりとり(_任意の語彙,_最長のしりとり) :- findall(_しりとり,しりとり([_任意の語彙],_任意の語彙,_しりとり),_しりとりならび), 最長のしりとりを得る(_しりとりならび,_最長のしりとり). しりとり(_すでに使った語彙ならび,_語彙,_しりとり) :- 次の語彙を捜ししりとりを続ける(_すでに使った語彙ならび,_語彙,_しりとり). しりとり(_逆順しりとり,_語彙,_しりとり) :- 逆順しりとりを正順に戻して停止(_逆順しりとり,_しりとり). 次の語彙を捜ししりとりを続ける(_すでに使った語彙ならび,_語彙,_しりとり) :- 次の語彙(_すでに使った語彙ならび,_語彙,_次の語彙), しりとり([_次の語彙|_すでに使った語彙ならび],_次の語彙,_しりとり). 次の語彙(_すでに使った語彙ならび,_語彙,_次の語彙) :- '語彙の末尾の文字と一致する語彙を語彙集の中から捜す'(_語彙,_次の語彙), 次の語彙はすでに使った語彙ではない(_次の語彙,_すでに使った語彙ならび). '語彙の末尾の文字と一致する語彙を語彙集の中から捜す'(_語彙,_次の語彙) :- sub_atom(_語彙,_,1,0,_語彙の最後の文字), 語彙集(_次の語彙), sub_atom(_次の語彙,0,1,_,_語彙の最後の文字). 次の語彙はすでに使った語彙ではない(_次の語彙,_すでに使った語彙ならび) :- \+(member(_次の語彙,_すでに使った語彙ならび)). 逆順しりとりを正順に戻して停止(_逆順しりとり,_しりとり) :- reverse(_逆順しりとり,_しりとり). 最長のしりとりを得る(_しりとりならび,_最長のしりとり) :- しりとりならびの最大要素数を得る(_しりとりならび,_最大要素数), 最大要素数のしりとりを得る(_しりとりならび,_最大要素数,_最長のしりとり). しりとりならびの最大要素数を得る(_しりとりならび,_最大要素数) :- findmax(_要素数,しりとりの要素数(_しりとりならび,_要素数),_最大要素数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). しりとりの要素数(LL,_要素数) :- member(_しりとり,LL), length(_しりとり,_要素数). 最大要素数のしりとりを得る(LL,_最大要素数,_最長のしりとり) :- member(_最長のしりとり,LL), length(_最長のしりとり,_最大要素数). % 以下のサイトは # 出典:: C/C++の宿題片付けます 127代目 #413 # # 演習 # 今日は友引の火曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求めるプログラムを作成せよ。 # 六曜:先勝,友引,先負,仏滅,大安,赤口 '日付の六曜・曜日を得る'(_8桁の日付文字列,_六曜,_曜日) :- '日付から整数の年・月・日を得る'(_8桁の日付文字列,_年,_月,_日), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日),!. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日) :- '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(2015,10,15,大安,木曜,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年,_月,_日,_六曜,_曜日,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @>= [2015,10,15], '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @< [2015,10,15], '翌日の六曜、曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年_1,_月_1,_日_1,_六曜_1,_曜日_1), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 六曜連鎖(_六曜_1,_六曜_2), 曜日連鎖(_曜日_1,_曜日_2). '前日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_2,_月_2,_日_2,_年_1,_月_1,_日_1), 六曜連鎖(_六曜_2,_六曜_1), 曜日連鎖(_曜日_2,_曜日_1). 六曜連鎖(先勝,友引). 六曜連鎖(友引,先負). 六曜連鎖(先負,仏滅). 六曜連鎖(仏滅,大安). 六曜連鎖(大安,赤口). 六曜連鎖(赤口,先勝). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). 翌日(_年,12,31,_翌年の年,1,1) :- succ(_年,_翌年の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,30,_年,_翌日の月,1) :- member(_月,[4,6,9,11]), succ(_月,_翌日の月),!. 翌日(_年,_月,31,_年,_翌日の月,1) :- member(_月,[1,3,5,7,8,10,12]), succ(_月,_翌日の月),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). うるう年(_うるう年) :- 0 is _うるう年 mod 400,!. うるう年(_うるう年) :- 0 is _うるう年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. '日付から整数の年・月・日を得る'(_日付,_年,_月,_日) :- 日付から整数年を得る(_日付,_年), 日付から整数月を得る(_日付,_月), 日付から整数日を得る(_日付,_日). 日付から整数年を得る(_日付,_整数年) :- sub_atom(_日付,0,4,_,_年文字列), atom_number(_年文字列,_整数月). 日付から整数月を得る(_日付,_整数月) :- sub_atom(_日付,4,2,_,_月文字列), atom_number(_月文字列,_整数月). 日付から整数日を得る(_日付,_整数日) :- sub_atom(_日付,6,2,_,_日文字列), atom_number(_日文字列,_整数日). % 以下のサイトは # 出典:: C/C++の宿題片付けます 127代目 #413 # # 演習 # 今日は友引の火曜日である。今日からN日後までに仏滅ではない日曜日が何日あるか求めるプログラムを作成せよ。 # 六曜:先勝,友引,先負,仏滅,大安,赤口 六曜連鎖(先勝,友引). 六曜連鎖(友引,先負). 六曜連鎖(先負,仏滅). 六曜連鎖(仏滅,大安). 六曜連鎖(大安,赤口). 六曜連鎖(赤口,先勝). 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). '日付の六曜・曜日を得る'(_日付,_六曜,_曜日) :- '日付から整数の年・月・日を得る'(_日付,_年,_月,_日), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日を答えよ'(_年,_月,_日,_六曜,_曜日) :- '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(2015,10,15,大安,木曜,_年,_月,_日,_六曜,_曜日),!. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年,_月,_日,_六曜,_曜日,_年,_月,_日,_六曜,_曜日) :- !. '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日). '2015年10月15日以後の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @>= [2015,10,15], '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '2015年10月15日より前の_年、_月、_日の六曜と曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年,_月,_日,_六曜,_曜日) :- [_年_1,_月_1,_日_1] @< [2015,10,15], '翌日の六曜、曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年_1,_月_1,_日_1,_六曜_1,_曜日_1), '2015年10月15日は大安の木曜日である。_年、_月、_日の六曜と曜日'(_年_2,_月_2,_日_2,_六曜_2,_曜日_2,_年,_月,_日,_六曜,_曜日). '翌日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 六曜連鎖(_六曜_1,_六曜_2), 曜日連鎖(_曜日_1,_曜日_2). '前日の六曜、曜日'(_年_1,_月_1,_日_1,_六曜_1,_曜日_1,_年_2,_月_2,_日_2,_六曜_2,_曜日_2) :- 翌日(_年_2,_月_2,_日_2,_年_1,_月_1,_日_1), 六曜連鎖(_六曜_2,_六曜_1), 曜日連鎖(_曜日_2,_曜日_1). 翌日(_年,12,31,_翌年の年,1,1) :- succ(_年,_翌年の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,30,_年,_翌日の月,1) :- member(_月,[4,6,9,11]), succ(_月,_翌日の月),!. 翌日(_年,_月,31,_年,_翌日の月,1) :- member(_月,[1,3,5,7,8,10,12]), succ(_月,_翌日の月),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). うるう年(_うるう年) :- 0 is _うるう年 mod 400,!. うるう年(_うるう年) :- 0 is _うるう年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. '日付から整数の年・月・日を得る'(_日付,_年,_月,_日) :- 日付から整数年を得る(_日付,_年), 日付から整数月を得る(_日付,_月), 日付から整数日を得る(_日付,_日). 日付から整数年を得る(_日付,_整数年) :- sub_atom(_日付,0,4,_,_年文字列), atom_number(_年文字列,_整数月). 日付から整数月を得る(_日付,_整数月) :- sub_atom(_日付,4,2,_,_月文字列), atom_number(_月文字列,_整数月). 日付から整数日を得る(_日付,_整数日) :- sub_atom(_日付,6,2,_,_日文字列), atom_number(_日文字列,_整数日). % 以下のサイトは 性質の異なる文字に挟まれた適合文字列(_文字列,_性質,_文字,_前文字列,_適合文字列,_後文字列) :- 'ある性質を持つ適合文字列'(_文字列,_性質,_文字,S,R,_適合文字列), 直前にある性質を持つ文字がない(_文字列,S,_性質,_文字,_前文字列), 直後にある性質を持つ文字がない(_文字列,R,_性質,_文字,_後文字列). 'ある性質を持つ適合文字列'(_文字列,_性質,_文字,S,R,_適合文字列) :- '適合文字列(空文字にはならない)'(_文字列,S,_適合文字列,R), 'ある性質を持つ適合文字列'(_適合文字列,_性質,_文字). '適合文字列(空文字にはならない)'(_文字列,S,_適合文字列,R) :- sub_atom(_文字列,S,_,R,_適合文字列), \+(_適合文字列=''). 'ある性質を持つ適合文字列'(_適合文字列,_性質,_文字) :- forall(sub_atom(_適合文字列,_,1,_,_文字),_性質). 直前にある性質を持つ文字がない(_文字列,S,_性質,_文字,_前文字列) :- sub_atom(_文字列,0,S,_,_前文字列), 直前にある性質を持つ文字がない(_前文字列,_性質,_文字). 直前にある性質を持つ文字がない(_前文字列,_性質,_文字) :- \+(前文字列の最後の文字の性質(_前文字列,_文字,_性質)). 前文字列の最後の文字の性質(_前文字列,_文字,_性質) :- sub_atom(_前文字列,_,1,0,_文字), \+(_文字=''), call(_性質). 直後にある性質を持つ文字がない(_文字列,R,_性質,_文字,_後文字列) :- sub_atom(_文字列,_,R,0,_後文字列), 直後にある性質を持つ文字がない(_後文字列,_性質,_文字). 直後にある性質を持つ文字がない(_後文字列,_性質,_文字) :- \+(後文字列の最初の文字の性質(_後文字列,_文字,_性質)). 後文字列の最初の文字の性質(_後文字列,_文字,_性質) :- sub_atom(_後文字列,0,1,_,_文字), \+(_文字=''), call(_性質). % 以下のサイトは # 出典 :: 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([]. % 以下のサイトは # @TakaoOzaki リプありがとうございます。 # XはYの兄弟(姉妹や兄妹なども含む)である。というものを作りたいのですが、 # 兄弟(X,Y):=親(Z,X),親(Z,Y).とすると # 兄弟(私,X).としたときにX=私と解が出てしまいどうすればいいか # 試行錯誤していたところです。 親(道隆,伊周). 親(道隆,定子). 親(貴子,伊周). 親(貴子,定子). 私は誰でしょう(定子). 兄弟(私,Y) :- 私の兄弟を得る(Y). 兄弟(X,Y) :- 兄弟の組を得る(X,Y). 私の兄弟を得る(Y) :- 私は誰でしょう(_私), 兄弟(_私,Y). 兄弟の組を得る(X,Y) :- setof([X,Y],[X,Y] ^ 親が共通の人が兄弟である(X,Y),LL), member([X,Y],LL). 親が共通の人が兄弟である(X,Y) :- 親(_親,X), 親(_親,Y), 自分自身は兄弟ではない(X,Y). 自分自身は兄弟ではない(X,Y) :- \+(X == Y). % ?- 兄弟(私,Y). % % Y = '伊周'; % false. % % ?- % 以下のサイトは # @TakaoOzaki リプありがとうございます。 # XはYの兄弟(姉妹や兄妹なども含む)である。というものを作りたいのですが、 # 兄弟(X,Y):=親(Z,X),親(Z,Y).とすると # 兄弟(私,X).としたときにX=私と解が出てしまいどうすればいいか # 試行錯誤していたところです。 親(道隆,伊周). 親(道隆,定子). 親(貴子,伊周). 親(貴子,定子). 私は誰でしょう(定子). 兄弟(私,Y) :- 私は誰でしょう(_私), 兄弟(_私,Y). 兄弟(X,Y) :- \+(X == 私), 親(Z,X), 親(Z,Y), \+(X = Y). % ?- 兄弟(私,Y). % % Y = '伊周'; % Y = '伊周'; % false. % % ?- % 以下のサイトは 軸要素の選定(_対象ならび,_軸要素) :- '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'(_対象ならび,_軸要素),!. '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(_値ならび,_中間位置の値) :- '_前ならびを作り'(_値ならび,_前ならび), append(_前ならび,[_中間位置の値|_],_値ならび),!. '_前ならびを作り'(_値ならび,_前ならび) :- length(_値ならび,_ならびの要素数), _前ならびの要素数 is _ならびの要素数 // 2, length(_前ならび,_前ならびの要素数). 三値の中央値(_1,_2,_3,_三値の中央値) :- select(_三値の中央値,[_1,_2,_3],_残り値ならび), '残り値ならびの値の全てが三値の中央値より小さいことはなく、残り値ならびの値の全てが三値の中央値より大きいこともない'(_残り値ならび,_三値の中央値),!. '残り値ならびの値の全てが三値の中央値より小さいことはなく、残り値ならびの値の全てが三値の中央値より大きいこともない'(_残り値ならび,_三値の中央値) :- 残り値ならびの値の全てが三値の中央値より小さいことはなく(_残り値ならび,_三値の中央値), 残り値ならびの値の全てが三値の中央値より大きいこともない(_残り値ならび,_三値の中央値). 残り値ならびの値の全てが三値の中央値より小さいことはなく(_残り値ならび,_三値の中央値) :- \+(残り値ならびの値の全てが三値の中央値より小さい(_残り値ならび,_三値の中央値)). 残り値ならびの値の全てが三値の中央値より小さい(_残り値ならび,_三値の中央値) :- forall(member(_値,_残り値ならび),_値 @< _三値の中央値)). 残り値ならびの値の全てが三値の中央値より大きいこともない(_残り値ならび,_三値の中央値) :- \+(残り値ならびの値の全てが三値の中央値より大きい(_残り値ならび,_三値の中央値)). 残り値ならびの値の全てが三値の中央値より大きい(_残り値ならび,_三値の中央値) :- forall(member(_値,_残り値ならび),_値 @> _三値の中央値)). % 以下のサイトは 軸要素の選定(_対象ならび,_軸要素) :- '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'(_対象ならび,_軸要素),!. '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(_値ならび,_中間位置の値) :- '_前ならびを作り'(_値ならび,_前ならび), append(_前ならび,[_中間位置の値|_],_値ならび),!. '_前ならびを作り'(_値ならび,_前ならび) :- length(_値ならび,_ならびの要素数), _前ならびの要素数 is _ならびの要素数 // 2, length(_前ならび,_前ならびの要素数). 三値の中央値(_1,_2,_3,_三値の中央値) :- select(_三値の中央値,[_1,_2,_3],_残り値ならび), '残り値ならびの値の全てが中央値より小さいことはなく、残り値ならびの値の全てが中央値より大きいこともない'(_残り値ならび,_三値の中央値),!. '残り値ならびの値の全てが中央値より小さいことはなく、残り値ならびの値の全てが中央値より大きいこともない'(_残り値ならび,_三値の中央値) :- 残り値ならびの値の全てが中央値より小さいことはなく(_残り値ならび,_三値の中央値), 残り値ならびの値の全てが中央値より大きいこともない(_残り値ならび,_三値の中央値). 残り値ならびの値の全てが中央値より小さいことはなく(_残り値ならび,_三値の中央値) :- \+(forall(member(A,_残り値ならび),A @< _三値の中央値)). 残り値ならびの値の全てが中央値より大きいこともない(_残り値ならび,_三値の中央値) :- \+(forall(member(A,_残り値ならび),A @> _三値の中央値)). % 以下のサイトは # # length/2をsucc/2を使って定義してみる。 # length(L,N) :- length(L,0,N). length([],N,N). length(L,M1,N) :- (\+(var(N));\+(var(L))), L=[_|R], succ(M1,M2), length(R,M2,N),!. length([_|R],M1,N) :- succ(M1,M2), length(R,M2,N). % 以下のサイトは 小さい順に取り出す(L,X) :- 一番小さいもの(L,R,Y), 小さい順に取り出す(R,Y,X). 一番小さいもの(L,R,Y) :- select(Y,L,R), 'Rの中にYより小さいものはない'(R,Y),!. 'Rの中にYより小さいものはない'(R,Y) :- forall(member(Z,R),\+(Z @< Y)). 小さい順に取り出す(_,X,X). 小さい順に取り出す(R,_,X) :- 小さい順に取り出す(R,X). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に1ちゃんと0ちゃんは最高っすよ! 長女として他の数字子ちゃん達を一生懸命支える1ちゃん。全てを無に帰す力を持ったミステリアス美少女の0ちゃん。……かわええ〜。 # # スマ子さん:……もう帰っていいかしら。 # # ガリ夫:もう数の世界には1ちゃんと0ちゃん以外要りません! 1ちゃんと0ちゃんさえいれば、それで満足です! # # スマ子さん:あら、それはなかなか鋭い指摘ね。 # # ガリ夫くん:……と言いますと? # # スマ子さん:実は、私たちが普段使っている数は、勝手に0〜9までの数を使いますよと決めているに過ぎないの。実際には0と1だけでも数を表すことは可能なのよ。 # # ガリ夫くん:ほうほう……。 # # スマ子さん:これを2進法って言うんだけれどもね。一の位が1になったら、その次の位は一の位を0に戻して、その上の位を1増やして……ってしていくとあらゆる数を表すことができるわ。例えば、1,10,11,100,101,110,111……ってな具合にね。 # # ガリ夫くん:なるほど! と言うことは全ての数は1ちゃんと0ちゃんのハーレムと化すんですね! ここは天国か! # # スマ子さん:……。ところでガリ夫くん、1ちゃんと0ちゃんはどちらがお好き? # # ガリ夫くん:う〜〜〜ん……甲乙つけ難いですが、やっぱり健気な1ちゃんですかね〜。 # # スマ子さん:じゃあその1ちゃん、ハーレムの中にどれぐらいいるのか、知りたくない? # # ガリ夫くん:知りたい知りたい! 1ちゃんのこと、もっと知りたい! # # スマ子さん:うわあ……。ま、まあいいわ! 1ちゃんの数を数えて、それじゃあ2014年にちなんでこんな問題を解いてみましょう! そう、スマートにね! # # # 【問】 # 1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。 # # 解答用テキストファイルに問題の答えと、その答えを導出したプロセスを記述して、提出してください。 # また、プログラムを使用した場合はソースコードを解答用テキストファイルに貼り付けてください。言語は問いませんが、ideone(http://ideone.com/)で実行できるものを解答として提出してください。 # '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'('ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合',_ペアの組数) :- 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数). '1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか、答えてください。'('ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合',_ペアの組数) :- 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数) :- '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび), 度数('ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'(_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'([A,A|R]). 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'([_|R]) :- 'ペアをACCCBのCのペアを2,ACCCCBのCのペアを3と考える場合のペア'(R). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合の、1〜2014までの数を2進法で表した時に、連続した2数でその数の中に1の登場する回数が同じであるようなペアは何組存在するか'(_ペアの組数) :- '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび), 度数('ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'(_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,A|R]). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,A|R]) :- 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'(R). 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([A,B|R]) :- \+(A=B), 'ペアをACCCBのCのペアを1,ACCCCBのCのペアを2と考える場合のペア'([B|R]). '1〜2014までの数を2進法で表した時に1の登場する回数ならび'(_数を2進法で表した時に1の登場する回数ならび) :- findall(_数を2進法で表した時に1の登場する回数,( between(1,2014,_数), '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数)),_数を2進法で表した時に1の登場する回数ならび). '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数) :- 度数('桁を2で割った時の剰余が1'(_数),_数を2進法で表した時に1の登場する回数). 桁を2で割った時の剰余が1(N) :- 1 is N mod 2. 桁を2で割った時の剰余が1(N) :- 最上位桁まで剰余が1かどうか調べる(N). 最上位桁まで剰余が1かどうか調べる(N) :- N > 0, N_1 is N // 2, 桁を2で割った時の剰余が1(N_1). 度数(_目標,_度数) :- findall(1,_目標,_度数を示す1のならび), length(_度数を示す1のならび,_度数). % 以下のサイトは # 出題場所 :: Regular Expression(正規表現) Part11 #844 # たぶんやりたいことはこうだろう。数字以外の文字が1文字でもあればエラーを出す。# # [[ "$A" =~ [^0-9] ]] && echo "not number" # 数字以外の文字が1文字でもあればエラーを出す(_文字列) :- 数字以外の文字が1文字でもあれば(_文字列), エラーを出す. 数字以外の文字が1文字でもあれば(_文字列) :- sub_atom(_文字列,_,1,_,_数字以外の文字), 数字以外の文字(_数字以外の文字),!. 数字以外の文字(_数字以外の文字) :- \+(member(_数字以外の文字,['0','1','2','3','4','5','6','7','8','9'])). エラーを出す :- write('エラー\n'). % 以下のサイトは count(X,Y,Z) :- 'Yの要素としてXがいくつ存在するか'(X,Y,Z). 'Yの要素としてXがいくつ存在するか'(X,Y,Z) :- '加算器型count'(X,Y,0,Z). '加算器型count'(X,Y,Z1,Z) :- '停止節::第二引数のリストが[]になったら停止する。countは第三引数に生成されている。'(X,Y,Z1,Z). '加算器型count'(X,Y,Z1,Z) :- '加算器型count Yが[]で無い限りcountを続ける'(X,Y,Z1,Z). '停止節::第二引数のリストが[]になったら停止する。countは第三引数に生成されている。'(_,[],Z,Z). '加算器型count Yが[]で無い限りcountを続ける'(X,[W|Y],Z1,Z) :- 加算するかどうか(X,W,Z1,Z2), '加算型count'(X,Y,Z2,Z). 加算するかどうか(X,X,Z1,Z2) :- Z2 is Z1 + 1. 加算するかどうか(X,W,Z1,Z1) :- \+(X = W). % 以下のサイトは count(X,Y,Z) :- '加算器型count'(X,Y,0,Z). '加算器型count'(_,[],Z,Z) :- '停止節::第二引数のリストが[]になったら停止する。countは第三引数に生成されている。'(_,[],Z,Z),!. '加算器型count'(X,Y,Z1,Z) :- '加算器型count Yが[]で無い限りcountを続ける'(X,Y,Z1,Z). '停止節::第二引数のリストが[]になったら停止する。countは第三引数に生成されている。'(_,[],Z,Z). '加算器型count Yが[]で無い限りcountを続ける'(X,[W|Y],Z1,Z) :- 加算するかどうか(X,W,Z1,Z2), '加算器型count'(X,Y,Z2,Z). 加算するかどうか(X,X,Z1,Z2) :- Z2 is Z1 + 1. 加算するかどうか(X,W,Z1,Z1) :- \+(X = W). % 以下のサイトは '_ならび の中に _ある要素 はいくつ存在するか'(_ある要素,_ならび,_いくつ) :- count(_ある要素,_ならび,_いくつ). count(X,Y,Z) :- '加算器型count'(X,Y,0,Z). '加算器型count'(_,[],Z,Z) :- !. '加算器型count'(X,Y,Z1,Z) :- '加算器型count Yが[]で無い限りcountを続ける'(X,Y,Z1,Z). '加算器型count Yが[]で無い限りcountを続ける'(X,[W|Y],Z1,Z) :- 加算するかどうか(X,W,Z1,Z2), '加算器型count'(X,Y,Z2,Z). 加算するかどうか(X,X,Z1,Z2) :- Z2 is Z1 + 1. 加算するかどうか(X,W,Z1,Z1) :- \+(X = W). % 以下のサイトは '_ならび の中に _ある要素 はいくつ存在するか'(_ある要素,_ならび,_いくつ) :- count(_ある要素,_ならび,_いくつ). count(X,Y,Z) :- '加算器型count'(X,Y,0,Z). '加算器型count'(_,[],Z,Z) :- !. '加算器型count'(X,Y,Z1,Z) :- '加算器型count Yが[]で無い限りcountを続ける'(X,Y,Z1,Z). '加算器型count Yが[]で無い限りcountを続ける'(X,[W|Y],Z1,Z) :- 加算するかどうか(X,W,Z1,Z2), '加算器型count'(X,Y,Z2,Z). 加算するかどうか(X,X,Z1,Z2) :- Z2 is Z1 + 1. 加算するかどうか(X,W,Z1,Z1) :- \+(X = W). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(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([]. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 164代目 #833 # お願いします。 # [1] 情報処理演習 # [2] 自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力するプログラムを作 # 成せよ. #  [3.1] Linux #  [3.2] コンパイラ名とバージョン:visual studio 2010 #  [3.3] C言語 # [4] 指定なし # [5] 特になし # # '自然数n > 0 を入力として, その自明でない約数(1とその数以外の約数)を一つ出力する' :- '自然数n > 0 を入力として,'(_n), 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数),!. '自然数n > 0 を入力として,'(_n) :- 整数を得る('0より大きい自然数',_n > 0,_n). 'その自明でない約数(1とその数以外の約数)を一つ出力する'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数), 出力する(_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を一つ'(_n,_その自明でない約数) :- 'その自明でない約数(1とその数以外の約数)を'(_n,L), 一つ(L,_その自明でない約数). 'その自明でない約数(1とその数以外の約数)を'(_n,L) :- findall(_その自明でない約数,'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数),L). 'その自明でない約数(1とその数以外の約数)'(_n,_その自明でない約数) :- _n_1 is _n - 1, between(2,_n_1,_その自明でない約数), 0 is _n mod _その自明でない約数. 一つ([H|T],_その自明でない約数) :- length([H|T],Len), _乱数 is random(Len), nth0(_乱数,[H|T],_その自明でない約数). 出力する(_その自明でない約数) :- writef('%t\n',[_その自明でない約数]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 整数を得る(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([]. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1305867431/726 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した10文字以内の任意の文字列の中で、 # ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す関数 # char *cut_str(char *address1, char target_char)を定義し、 # その動作を確認するkadai7-2.cを作りなさい。 # ただし、文字列と、ある特定の文字の入力は、 # char str[10], target_char; # scanf("%s %c", str, &target_char); # で入力されるものとして、 # 答えは以下で出力されるものとする。 # printf("answer = %s\n", cut_str(str, target_char)); # # 'キーボードから入力した10文字以内の任意の文字列の中で、ある特定の文字が最初に表れる位置からそれ以降の部分文字列を返す'(_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字), 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列). キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字),!. キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字) :- キーボードから入力した10文字以内の任意の文字列とある特定の文字を入力する(_文字列,_ある特定の文字). 催促の後一行入力して文字列とある特定の文字を得る(_文字列,_ある特定の文字) :- 催促の後一行入力する(_入力文字列), 文字列入力診断(_入力文字列,_文字列,_ある特定の文字). 催促の後一行入力する(_入力文字列) :- write('10文字以内の任意の文字列とある特定の文字を空白区切りで入力してください : '), 一行読み込む(_入力文字列,_). 文字列入力診断(_入力文字列,_文字列,_ある特定の文字) :- 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字), 文字列の長さ診断(_文字列,_ある特定の文字),!. 文字列入力診断(_入力文字列,_,_) :- writef('入力された %t から適切な情報が得られません。再入力をお願いします。\n',[_入力文字列]), fail. 文字列とある特定の文字を切り出す(_入力文字列,_文字列,_ある特定の文字) :- sub_atom(_入力文字列,_文字列,_空白文字列,_ある特定の文字), 空白文字列(_空白文字列), ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字). 空白文字列(_空白文字列) :- sub_atom(_空白文字列,_,1,_,' '), forall(sub_atom(_空白文字列,_,1,_,_文字),_文字 = ' '). ある特定の文字は先頭文字は空白になり得ない(_ある特定の文字) :- \+(sub_atom(_ある特定の文字,0,1,_,' ')). 文字列の長さ診断(_文字列,_ある特定の文字) :- '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字),!. 文字列の長さ診断(_文字列,_ある特定の文字) :- atom_length(_文字列,_文字列の長さ), writef('入力された文字列 %t は%t文字あります。10文字以下の長さで再入力をお願いします\n',[_文字列,_文字列の長さ]), fail. '10文字以内の文字列と1文字のある特定の文字'(_文字列,_ある特定の文字) :- '10文字以内の文字列'(_文字列), '1文字のある特定の文字'(_ある特定の文字). '10文字以内の文字列'(_文字列) :- atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 10. '1文字のある特定の文字'(_ある特定の文字) :- atom_length(_ある特定の文字,1). 'ある特定の文字が最初に現れる位置からそれ以降の部分文字列を返す'(_文字列,_ある特定の文字,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列) :- sub_atom(_文字列,S,_,_,_ある特定の文字), sub_atom(_文字列,S,_,0,_ある特定の文字が最初に現れる位置からそれ以降の部分文字列),!. 一行読み込む(_行,_終了状態) :- 行入力(_行,_終了状態). 行入力(X,_終了状態) :- get_char(C), '行入力/3'(C,Chars,_終了状態), atom_chars(X,Chars). '行入力/3'('\n',[],改行) :- !. '行入力/3'([A],[A],end_of_file) :- at_end_of_stream(user_input),!. '行入力/3'(C,[C|R],_終了状態) :- get_char(C2), '行入力/3'(C2,R,_終了状態). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1268979408/905 # # ●実装しようとしている正規表現 # ^[1-9]\d{3}$ # # PHPのpreg_matchでいえば # preg_match (/^[1-9]\d{3}$/, $subject) # # ●正規表現の使用環境 # PHP 5.2 # ●検索か置換か? # 検索 # ●説明 # 4桁の西で0000のみを除外したい。 # 西暦1万年(10000)以上は考慮しない # # 0000 × # 1000〜9999 ○ # # ●対象データ # 説明の項を参照 # ●希望する結果 # 説明の項を参照 # # # '4桁の西暦で0000のみを除外したい'(_文字列,_前文字列,_検索文字列,_後文字列) :- '4桁の西暦で'(_文字列,_前文字列,_検索文字列,_後文字列), '0000のみ除外したい'(_検索文字列). '4桁の西暦で'(_文字列,_前文字列,_検索文字列,_後文字列) :- 検索文字列を得る(_文字列,S,R,_検索文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_文字列,S,R,_前文字列,_検索文字列,_後文字列). 検索文字列を得る(_文字列,S,R,_検索文字列) :- sub_atom(_文字列,S,4,R,_検索文字列), 全ての文字が数字である(_検索文字列). 全ての文字が数字である(_検索文字列) :- forall(sub_atom(_検索文字列,_,1,_,_文字),数字(_文字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_文字列,S,R,_前文字列,_後文字列) :- 前文字列の最後の文字は数字ではない(_文字列,S,_前文字列), 後文字列の最初の文字は数字ではない(_文字列,R,_後文字列). 前文字列の最後の文字は数字ではない(_文字列,S,_前文字列) :- 前文字列の(_文字列,S,_前文字列), 最後の文字は数字ではない(_前文字列). 前文字列の(_文字列,S,_前文字列) :- sub_atom(_文字列,0,S,_,_前文字列). 最後の文字は数字ではない(_後文字列) :- \+((sub_atom(_後文字列,_,1,0,_文字),数字(_文字))). 後文字列の最初の文字は数字ではない(_文字列,R,_後文字列) :- 後文字列の(_文字列,R,_後文字列), 最初の文字は数字ではない(_後文字列). 後文字列の(_文字列,R,_後文字列) :- sub_atom(_文字列,_,R,0,_後文字列). 最初の文字は数字ではない(_前文字列) :- \+((sub_atom(_前文字列,0,1,_,_文字),数字(_文字))). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. '0000のみ除外したい'(_検索文字列) :- \+(sub_atom(_検索文字列,0,1,_,'0')). % 以下のサイトは # 出典 :: 正規表現 Part9 #786 # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- 'キャリッジ・リターンが30回登場したら'(_文字列,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列_1,_文字列) :- 'キャリッジ・リターンが30回未満しかない場合そのまま文字列を解とする'(_文字列_1,_文字列). 'キャリッジ・リターンが30回登場したら'(_文字列,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_,_末尾を削除された文字列), sub_atom(_文字列,_,1,0,'\r'), 度数(sub_atom(_末尾を削除された文字列,_,1,_,'\r'),30). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). 'キャリッジ・リターンが30回未満しかない場合そのまま文字列を解とする'(_文字列,_文字列) :- \+('キャリッジ・リターンが30回登場したら'(_文字列,_)). % 以下のサイトは 文字列の中である副文字列の最後の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最後の出現を検出する(_後文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_,_残り文字数,_ある副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最後の出現を検出する(_後文字列,_ある副文字列) :- 後文字列の中にある副文字列は存在しない(_後文字列,_ある副文字列). 後文字列の中にある副文字列は存在しない(_後文字列,_ある副文字列) :- \+(sub_atom(_後文字列,_,_,_,_ある副文字列)). % 以下のサイトは 文字列の中である副文字列の最初の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最初の出現を検出する(_前文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_,_残り文字数,_ある副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最初の出現を検出する(_前文字列,_ある副文字列) :- 前文字列の中にある副文字列は存在しない(_前文字列,_ある副文字列). 前文字列の中にある副文字列は存在しない(_前文字列,_ある副文字列) :- \+(sub_atom(_前文字列,_,_,_,_ある副文字列)). % 以下のサイトは 文字列の中である副文字列の最後の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最後の出現を検出する(_後文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_,_残り文字数,_ある副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最後の出現を検出する(_後文字列,_ある副文字列) :- 後文字列の中にある副文字列は存在しない(_後文字列,_ある副文字列). 後文字列の中にある副文字列は存在しない(_後文字列,_ある副文字列) :- \+(sub_atom(_後文字列,_,_,_,_ある副文字列)). % 以下のサイトは 文字列の中である副文字列の最初の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最初の出現を検出する(_前文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_,_残り文字数,_ある副文字列), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最初の出現を検出する(_前文字列,_ある副文字列) :- 前文字列の中にある副文字列は存在しない(_前文字列,_ある副文字列). 前文字列の中にある副文字列は存在しない(_前文字列,_ある副文字列) :- \+(sub_atom(_前文字列,_,_,_,_ある副文字列)). % 以下のサイトは 同一要素数ならびを要素の出現順に得る(_ならび,_同一要素数ならび) :- findall([_要素,_度数],( 同一要素数を得る(_ならび,_要素,_度数)),_同一要素数ならび). 同一要素数を得る(_ならび,_要素,_度数) :- 最初の要素を得る(_ならび,_残りならび,_要素), 度数(member(_要素,[_要素|_残りならび]),_度数). 最初の要素を得る(_ならび,_残りならび,_要素) :- append(_前ならび,[_要素|_残りならび],_ならび), '_前ならびは_要素を含まない'(_前ならび,_要素). '_前ならびは_要素を含まない'(_前ならび,_要素) :- \+(member(_要素,_前ならび)). 度数(_目標,_度数) :- findall(1,_目標,_目標が真になった数だけ整数1を要素とするならび), length(_目標が真になった数だけ整数1を要素とするならび,_度数). % 以下のサイトは 同一要素数ならび(_ならび,_同一要素数ならび) :- findall([_要素,_度数],( 同一要素数を得る(_ならび,_要素,_度数)),_同一要素数ならび). 同一要素数を得る(_ならび,_要素,_度数) :- 最終要素を得る(_ならび,_前要素ならび,_要素), 度数(member(_要素,[_要素|_前要素ならび]),_度数). 最終要素を得る(_ならび,_前要素ならび,_要素) :- append(_前要素ならび,[_要素|_残りならび],_ならび), '_残りならびは_要素を含まない'(_残りならび,_要素). '_残りならびは_要素を含まない'(_残りならび,_要素) :- \+(member(_要素,_残りならび)). 度数(_目標,_度数) :- findall(1,_目標,_目標が真になった数だけ整数1を要素とするならび), length(_目標が真になった数だけ整数1を要素とするならび,_度数). % 以下のサイトは 文字列の中である文字の最初の出現を検出する(_文字列,_前文字列,_ある文字,_後文字列) :- 文字列の中である文字の(_文字列,_前文字列,_ある文字,_後文字列), 最初の出現を検出する(_ある文字,_前文字列). 文字列の中である文字の(_文字列,_前文字列,_ある文字,_後文字列) :- sub_atom(_文字列,_開始位置,1,_残り文字数,_ある文字), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最初の出現を検出する(_ある文字,_前文字列) :- 前文字列の中にある文字は存在しない(_ある文字,_前文字列). 前文字列の中にある文字は存在しない(_ある文字,_前文字列) :- ある文字は存在しない(_前文字列,_ある文字). ある文字は存在しない(_前文字列,_ある文字) :- \+(sub_atom(_前文字列,_,1,_,_ある文字)). % 以下のサイトは 文字列の中である文字の最初の出現を検出する(_文字列,_前文字列,_ある文字,_後文字列) :- 文字列の中である文字の(_文字列,_開始位置,_ある文字,_残り文字数), 最初の出現を検出する(_文字列,_ある文字,_開始文字数,_前文字列), 後文字列(_文字列,_残り文字数,_後文字列). 文字列の中である文字の(_文字列,_開始位置,_ある文字,_残り文字数) :- sub_atom(_文字列,_開始位置,1,_残り文字数,_ある文字). 最初の出現を検出する(_文字列,_ある文字,_開始位置,_前文字列) :- 前文字列の中にある文字は存在しない(_文字列,_ある文字,_開始位置,_前文字列). 前文字列の中にある文字は存在しない(_文字列,_ある文字,_開始位置,_前文字列) :- 前文字列(_文字列,_開始位置,_前文字列), ある文字は存在しない(_前文字列,_ある文字). ある文字は存在しない(_前文字列,_ある文字) :- \+(sub_atom(_前文字列,_,1,_,_ある文字)). 前文字列(_文字列,_開始位置,_前文字列) :- sub_atom(_文字列,0,_開始位置,_,_前文字列). 後文字列(_文字列,_残り文字数,_後文字列) :- sub_atom(_文字列,_,_残り文字数,0,_後文字列). % 以下のサイトは 文字列の中である文字の最後の出現を検出する(_文字列,_前文字列,_ある文字,_後文字列) :- 文字列の中である文字の(_文字列,_前文字列,_ある文字,_後文字列), 最後の出現を検出する(_ある文字,_後文字列). 文字列の中である文字の(_文字列,_前文字列,_ある文字,_後文字列) :- sub_atom(_文字列,_開始位置,1,_残り文字数,_ある文字), sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字数,0,_後文字列). 最後の出現を検出する(_ある文字,_後文字列) :- 後文字列の中にある文字は存在しない(_ある文字,_後文字列). 後文字列の中にある文字は存在しない(_ある文字,_後文字列) :- ある文字は存在しない(_後文字列,_ある文字). ある文字は存在しない(_後文字列,_ある文字) :- \+(sub_atom(_後文字列,_,1,_,_ある文字)). % 以下のサイトは 文字列の中である文字の最後の出現を検出する(_文字列,_前文字列,_ある文字,_後文字列) :- 文字列の中である文字の(_文字列,_開始位置,_ある文字,_残り文字数), 最後の出現を検出する(_文字列,_ある文字,_残り文字数,_後文字列), 前文字列(_文字列,_開始位置,_前文字列). 文字列の中である文字の(_文字列,_開始位置,_ある文字,_残り文字数) :- sub_atom(_文字列,_開始位置,1,_残り文字数,_ある文字). 最後の出現を検出する(_文字列,_ある文字,_残り文字数,_後文字列) :- 後文字列の中にある文字は存在しない(_文字列,_ある文字,_残り文字数,_後文字列). 後文字列の中にある文字は存在しない(_文字列,_ある文字,_残り文字数,_後文字列) :- 後文字列(_文字列,_残り文字数,_後文字列), ある文字は存在しない(_後文字列,_ある文字). ある文字は存在しない(_後文字列,_ある文字) :- \+(sub_atom(_後文字列,_,1,_,_ある文字)). 後文字列(_文字列,_残り文字数,_後文字列) :- sub_atom(_文字列,_,_残り文字数,0,_後文字列). 前文字列(_文字列,_開始位置,_前文字列) :- sub_atom(_文字列,0,_開始位置,_,_前文字列). % 以下のサイトは 最長しりとりならび(_語彙ならび,_最長しりとりならび) :- 全しりとりならびを得てその中から最長しりとりを得る(_語彙ならび,_最長しりとりならび). 全しりとりならびを得てその中から最長しりとりを得る(_語彙ならび,_最長しりとりならび) :- 全しりとりならびを得て(_語彙ならび,_全しりとりならび), その中から最長しりとりならびを得る(_全しりとりならび,_最長しりとりならび). 全しりとりならびを得て(_語彙ならび,_全しりとりならび) :- findall(_しりとりならび,( select(_語彙,_語彙ならび,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,_しりとりならび)),_全しりとりならび). その中から最長しりとりならびを得る(_全しりとりならび,_最長しりとりならび) :- 最長しりとり要素数を得る(_全しりとりならび,_最長しりとり要素数), 最長しりとりならびは(_最長しりとり要素数,_全しりとりならび,_最長しりとりならび). 最長しりとり要素数を得る(_全しりとりならび,_最長しりとり要素数) :- findmax(_要素数,( member(_しりとりならび,_全しりとりならび), length(_しりとりならび,_要素数)),_最長しりとり要素数). 最長しりとりならびは(_最長しりとり要素数,_全しりとりならび,_最長しりとりならび) :- member(_最長しりとりならび,_全しりとりならび), length(_最長しりとりならび,_最長しりとり要素数). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,[_前の語彙]) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- sub_atom(_前の語彙,_,1,0,_語彙の先頭文字). 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび) :- forall(select(_語彙,_語彙ならび,_),\+(sub_atom(_語彙,0,1,_,_語彙の先頭文字))). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_前の語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), sub_atom(_語彙,0,1,_,_語彙の先頭文字). findmax(A,B,Max) :- findall(A,B,L), max_list(L,Max). % 以下のサイトは しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,[]) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- atom_chars(_前の語彙,Chars), last(Chars,_語彙の先頭文字). 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび) :- forall(select(_語彙,_語彙ならび,_),\+(atom_chars(_語彙,[_語彙の先頭文字|_]))). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), atom_chars(_語彙,[_語彙の先頭文字|_]). % 以下のサイトは 互いに素(L1,L2) :- \+((member(_要素,L1),member(_要素,L2)). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_適合文字列,_後文字列), '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列). '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列) :- 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列). 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列) :- findall(_ギャップではない文字, 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字),_ギャップではない文字ならび), atomic_list_concat(_ギャップではない文字ならび,'CGUU'). 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字) :- sub_atom(_適合文字列,_,1,_,_ギャップではない文字), \+(_ギャップではない文字 = '-'). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは 末尾までの空白列を取り除いた文字列(_文字列,_末尾までの空白列を取り除いた文字列) :- sub_atom(_文字列,0,_,R,_末尾までの空白列を取り除いた文字列), \+(sub_atom(_末尾までの空白列を取り除いた文字列,_,1,0,' ')), 末尾までの空白列(_文字列,R,_末尾までの空白列). 末尾までの空白列(_文字列,R,_末尾までの空白列) :- 末尾までの(_文字列,R,_末尾までの空白列), 空白列(_末尾までの空白列). 末尾までの(_文字列,R,_末尾までの空白列) :- sub_atom(_文字列,_,R,0,_末尾までの空白列). 空白列(_末尾までの空白列) :- forall(sub_atom(_末尾までの空白列,_,1,_,_文字),_文字 = ' '). % 以下のサイトは before(X,Y,Ls) :- append(Xの前方リスト,[X|Xの後方リスト],Ls), 'Xの前方リストにYは存在せず、Xの後方リストにYは存在する'(Xの前方リスト,Xの後方リスト,Y). 'Xの前方リストにYは存在せず、Xの後方リストにYは存在する'(Xの前方リスト,Xの後方リスト,Y) :- 'Xの前方リストにYは存在せず'(Xの前方リスト,Y), 'Xの後方リストにYは存在する'(Xの後方リスト,Y). 'Xの前方リストにYは存在せず'(Xの前方リスト,Y) :- \+(member(Y,Xの前方リスト)). 'Xの後方リストにYは存在する'(Xの後方リスト,Y) :- member(Y,Xの後方リスト). % 以下のサイトは 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列) :- 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_). 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列) :- 区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列), 排他的区間文字列には区間先頭文字列も区間末尾文字列も含まれることはない(_排他的区間文字列,_区間先頭文字列,_区間末尾文字列). 区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列) :- '前文字列・区間文字列・後文字列'(_文字列,_前文字列,_区間文字列,_後文字列), 排他的区間文字列を切り取る(_区間文字列,_区間先頭文字列,_区間末尾文字列,_排他的区間文字列). '前文字列・区間文字列・後文字列'(_文字列,_前文字列,_区間文字列,_後文字列) :- sub_atom(_文字列,_前文字列文字数,_,_後文字列文字数,_区間文字列), sub_atom(_文字列,0,_前文字列文字数,_,_前文字列), sub_atom(_文字列,_,_後文字列文字数,0,_後文字列). 排他的区間文字列を切り取る(_区間文字列,_区間先頭文字列,_区間末尾文字列,_排他的区間文字列) :- sub_atom(_区間文字列,0,_区間先頭文字列文字数,_,_区間先頭文字列), sub_atom(_区間文字列,_,_区間末尾文字列文字数,0,_区間末尾文字列), sub_atom(_区間文字列,_区間先頭文字列文字数,_,_区間末尾文字列文字数,_排他的区間文字列). 排他的区間文字列には区間先頭文字列も区間末尾文字列も含まれることはない(_排他的区間文字列,_区間先頭文字列,_区間末尾文字列) :- \+('区間先頭文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間先頭文字列)), \+('区間末尾文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間末尾文字列)). '区間先頭文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間先頭文字列) :- sub_atom(_排他的区間文字列,_,_文字数,_,_区間先頭文字列), _文字数 > 0. '区間末尾文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間末尾文字列) :- sub_atom(_排他的区間文字列,_,_文字数,_,_区間末尾文字列), _文字数 > 0. % 以下のサイトは % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z), X = Z,!. % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L),\+(member(U,_区切り符号ならび))),Z), X = Z,!. % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,L), findall(U,(member(U,L) , \+(U = '')),Z) X = Z,!. % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- split_0(_文字列,_区切り符号ならび,X),!. split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L). split_0(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号,L). '文字列が区切り符号と一致するか、文字列中に区切り符号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,L) :- '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,L),!. '文字列が区切り符号と一致するか、文字列中に区切り記号を含まなくなった時に停止する'(_文字列,_区切り符号ならび,[_文字列]) :- '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび). '文字列が区切り符号と一致する'(_文字列,_区切り符号ならび,['',_文字列,'']) :- member(_文字列,_区切り符号ならび),!. '文字列に区切り符号を含まない'(_文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_文字列,_,_,_,_区切り符号))). '文字列が区切り符号と一致せず、文字列は空でない時は、順に副文字列と区切り符号を刻んで行く'(_文字列,_区切り符号,[_前文字列,_区切り符号|R]) :- sub_atom(_文字列,_前文字列,_区切り符号,_後文字列), 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび), split_0(_後文字列,_区切り符号ならび,R). 前文字列のなかに区切り符号を含まない(_前文字列,_区切り符号ならび) :- forall(member(_区切り符号,_区切り符号ならび),\+(sub_atom(_前文字列,_,_,_,_区切り符号))). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_先頭からの変位,_,_後方からの変位,_適合文字列), sub_atom(_文字列,0,_先頭からの変位,_,_前文字列), sub_atom(_文字列,_,_後方からの変位,0,_後文字列). % 以下のサイトは 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列) :- 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_). 排他的区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列) :- 区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列), 排他的区間文字列には区間先頭文字列も区間末尾文字列も含まれることはない(_排他的区間文字列,_区間先頭文字列,_区間末尾文字列). 区間文字列(_文字列,_区間先頭文字列,_区間末尾文字列,_前文字列,_区間文字列,_後文字列,_排他的区間文字列) :- '前文字列・区間文字列・後文字列'(_文字列,_前文字列,_区間文字列,_後文字列), 排他的区間文字列を切り取る(_区間文字列,_区間先頭文字列,_区間末尾文字列,_排他的区間文字列). '前文字列・区間文字列・後文字列'(_文字列,_前文字列,_区間文字列,_後文字列) :- sub_atom(_文字列,_前文字列文字数,_,_後文字列文字数,_区間文字列), sub_atom(_文字列,0,_前文字列文字数,_,_前文字列), sub_atom(_文字列,_,_後文字列文字数,0,_後文字列). 排他的区間文字列を切り取る(_区間文字列,_区間先頭文字列,_区間末尾文字列,_排他的区間文字列) :- sub_atom(_区間文字列,0,_区間先頭文字列文字数,_,_区間先頭文字列), sub_atom(_区間文字列,_,_区間末尾文字列文字数,0,_区間末尾文字列), sub_atom(_区間文字列,_区間先頭文字列文字数,_,_区間末尾文字列文字数,_排他的区間文字列). 排他的区間文字列には区間先頭文字列も区間末尾文字列も含まれることはない(_排他的区間文字列,_区間先頭文字列,_区間末尾文字列) :- \+('区間先頭文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間先頭文字列)), \+('区間末尾文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間末尾文字列)). '区間先頭文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間先頭文字列) :- sub_atom(_排他的区間文字列,_,_文字数,_,_区間先頭文字列), _文字数 > 0. '区間末尾文字列が空文字でなく、かつ排他的区間文字列に含まれる'(_排他的区間文字列,_区間末尾文字列) :- sub_atom(_排他的区間文字列,_,_文字数,_,_区間末尾文字列), _文字数 > 0. % 以下のサイトは # 出典 :: 30代を思い出してPrologで言明、質問のプログラムを書いてみた。で「太郎は男です」という言明を入れたあと、質問「太郎は男ですか」には「そうです」と返ってくるのに、「太郎は女ですか」には「分かりません」と返ってきた。「男と女は反対語」という定義を入れなければならない? # 出典 :: AZ-Prologだとnoになるので、私はそこで「分かりません」と表示するようにしましたので・・・。反対語(X,Y)みたいな述語を用意して、反対語でマッチしたら「違います」と表示し、それでもダメなら「分かりません」と表示することにしました。 :- op(700,xfx,は). (A は B) :- P =.. [B,A], call(P), write('そうです\n'). (A は B) :- P =.. [B,A], \+(call(P)), (反義語(B,C);反義語(C,B)), P2 =.. [C,A], call(P2), write('違います\n'). (A は B) :- P =.. [B,A], \+(call(P)), \+(反義語(B,C)), \+(反義語(C,B)), write('わかりません\n'). % 以下のサイトは # 出典 :: CodeIQ q1533 # # 中学数学のひとつの山ともいえる、因数分解。 # 数学を嫌いになるきっかけとなってしまった人も多いのではないでしょうか? # そんな因数分解を、プログラミングで解いてみましょう! # # ■問題 # 二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 # これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。 # # # ■例 # 【入力】 # 4, -23, 15 # 【出力】 # 4, -3, 1, -5 # # つまり、4x2-23x+15=(4x-3)(x-5)という因数分解を行った結果を出力するプログラムです。 # (出力は、順番を入れ替えた1, -5, 4, -3でも正解となりますが、いずれか一方を出力するものとします。) # なお、α、β、γとして与えられる数字は互いに素な整数であるものとします。 # ※出力エラーの表記は、エラーとわかる何らかの出力で構いません。(※2015年4月20日13:30追記) # # # 最低限、以下のテストデータで正しい出力が得られることを確認してください。 # # 【テストデータ1:入力】 # 3, 10, 3 # 【出力】 # 1, 3, 3, 1 または 3, 1, 1, 3 # # 【テストデータ2:入力】 # 6, -1, -15 # 【出力】 # 2, 3, 3, -5 または 3, -5, 2, 3 # # 【テストデータ3:入力】 # 12, -1, -6 # 【出力】 # 3, 2, 4, -3 または 4, -3, 3, 2 # # 【テストデータ4:入力】 # 3, -8, 4 # 【出力】 # 1, -2, 3, -2 または 3, -2, 1, -2 # # 【テストデータ5:入力】 # 3, 5, 7 # 【出力】 # エラー # '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。'(_α,_β,_γ,_a,_b,_c,_d) :- findall([_a,_b,_c,_d], '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d),_解ならび), 重複解を取り除く(_解ならび,_a,_b,_c,_d). '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d) :- '_a,_b,_c,_dの候補を得る'(_α,_γ,_a,_b,_c,_d), _β is _a * _d + _b * _c. '_a,_b,_c,_dの候補を得る'(_α,_γ,_a,_b,_c,_d) :- '_a,_c候補'(_α,_a,_c), '_b,_d候補'(_γ,_b,_d). '_a,_c候補'(_α,_a,_c) :- 因数に分解する(_α,_a,_c) . '_b,_d候補'(_γ,_b,_d) :- 因数に分解する(_γ,_b,_d) . 因数に分解する(A,B,C) :- 'Aの絶対値からB_1候補を得る'(A,_正のA,B_1), '因数B_1,C_1を得る'(_正のA,B_1,C_1), 符号の組合せ(A,B_1,C_1,B,C). 'Aの絶対値からB_1候補を得る'(A,_正のA,B_1) :- _正のA is abs(A), between(1,_正のA,B_1). '因数B_1,C_1を得る'(_正のA,B_1,C_1) :- 0 is _正のA mod B_1, C_1 is _正のA // B_1. 符号の組合せ(A,B_1,C_1,B,C) :- 'Aが正の時は二数の符号は同じになる'(A,B_1,C_1,B,C). 符号の組合せ(A,B_1,C_1,B,C) :- 'Aが負の時は二数の符号は異なる'(A,B_1,C_1,B,C). 'Aが正の時は二数の符号は同じになる'(A,B_1,C_1,B,C) :- A > 0, 二数の符号は同じになる(A,B_1,C_1,B,C). 二数の符号は同じになる(A,B,C,B,C). 二数の符号は同じになる(A,B_1,C_1,B,C) :- B is B_1 * -1, C is C_1 * -1. 'Aが負の時は二数の符号は異なる'(A,B_1,C_1,B,C) :- A < 0, 二数の符号は異なる(A,B_1,C_1,B,C). 二数の符号は異なる(A,B_1,C,B,C) :- B is B_1 * -1. 二数の符号は異なる(A,B,C_1,B,C) :- C is C_1 * -1. 重複解を取り除く(_解ならび,_a,_b,_c,_d) :- append(L0,[[_a,_b,_c,_d]|_],_解ならび), \+(member([_c,_d,_a,_b],L0)). % 以下のサイトは # 出典 :: CodeIQ q1533 # # 中学数学のひとつの山ともいえる、因数分解。 # 数学を嫌いになるきっかけとなってしまった人も多いのではないでしょうか? # そんな因数分解を、プログラミングで解いてみましょう! # # ■問題 # 二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 # これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。 # # # ■例 # 【入力】 # 4, -23, 15 # 【出力】 # 4, -3, 1, -5 # # つまり、4x2-23x+15=(4x-3)(x-5)という因数分解を行った結果を出力するプログラムです。 # (出力は、順番を入れ替えた1, -5, 4, -3でも正解となりますが、いずれか一方を出力するものとします。) # なお、α、β、γとして与えられる数字は互いに素な整数であるものとします。 # ※出力エラーの表記は、エラーとわかる何らかの出力で構いません。(※2015年4月20日13:30追記) # # # 最低限、以下のテストデータで正しい出力が得られることを確認してください。 # # 【テストデータ1:入力】 # 3, 10, 3 # 【出力】 # 1, 3, 3, 1 または 3, 1, 1, 3 # # 【テストデータ2:入力】 # 6, -1, -15 # 【出力】 # 2, 3, 3, -5 または 3, -5, 2, 3 # # 【テストデータ3:入力】 # 12, -1, -6 # 【出力】 # 3, 2, 4, -3 または 4, -3, 3, 2 # # 【テストデータ4:入力】 # 3, -8, 4 # 【出力】 # 1, -2, 3, -2 または 3, -2, 1, -2 # # 【テストデータ5:入力】 # 3, 5, 7 # 【出力】 # エラー # '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、a, b, c, dの値を出力してください。'(_α,_β,_γ,_a,_b,_c,_d) :- findall([_a,_b,_c,_d], '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d),_解ならび), 重複解を取り除く(_解ならび,_a,_b,_c,_d). '二次式αx2+βx+γにおいて、係数α、β、γの値が与えられます。 これを(ax+b)(cx+d)の形に因数分解し、'(_α,_β,_γ,_a,_b,_c,_d) :- 検査範囲の確定(_α,_γ,S_1,E_1,S_2,E_2), '_a,_b,_c,_dの候補を得る'(_α,_γ,S_1,E_1,S_2,E_2,_a,_b,_c,_d), _β is _a * _d + _c * _b. '_a,_b,_c,_dの候補を得る'(_α,_γ,S_1,E_1,S_2,E_2,_a,_b,_c,_d) :- '_a,_c候補'(_α,S_1,E_1,_a,_c), '_b,_d候補'(_γ,S_2,E_2,_b,_d). '_a,_c候補'(_α,S_1,E_1,_a,_c) :- between(S_1,E_1,_a), between(S_1,E_1,_c), _α is _a * _c. '_b,_d候補'(_γ,S_2,E_2,_b,_d) :- between(S_2,E_2,_b), between(S_2,E_2,_d), _γ is _b * _d. 検査範囲の確定(_α,_γ,S_1,E_1,S_2,E_2) :- '_αの検査範囲'(_α,S_1,E_1), '_γの検査範囲'(_γ,S_2,E_2). '_αの検査範囲'(_α,S_1,E_1) :- E_1 is abs(_α), S_1 is -1 * E_1. '_γの検査範囲'(_γ,S_2,E_2) :- E_2 is abs(_γ), S_2 is -1 * E_2. 重複解を取り除く(_解ならび,_a,_b,_c,_d) :- append(L0,[[_a,_b,_c,_d]|_],_解ならび), \+(member([_c,_d,_a,_b],L0)), '_a,_cと_b,_dにそれぞれ-1を掛ける'(_a,_b,_c,_d,_a_1,_b_1,_c_1,_d_1), \+(member([_a_1,_b_1,_c_1,_d_1],L0)). '_a,_cと_b,_dにそれぞれ-1を掛ける'(_a,_b,_c,_d,_a_1,_b_1,_c_1,_d_1) :- _a_1 is _a * -1, _b_1 is _b * -1, _c_1 is _c * -1, _d_1 is _d * -1. % 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- _次の範囲下限 is _範囲下限_1 + _区切り, _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%w:%w\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- 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). % 以下のサイトは fizzbuzz(_数,_FizzBuzz) :- '_数を生成し_FizzBuzzを得る'(_数,_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). '_数は3で割り切れて、5では割り切れない'(_数) :- 0 is _数 mod 3, \+(0 is _数 mod 5). '_数は5で割り切れて、3では割り切れない'(_数) :- 0 is _数 mod 5, \+(0 is _数 mod 3). '_数は3でも5でも割り切れる'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5. '_数が3で5でも割り切れないときは_数を返す'(_数,_数) :- \+(0 is _数 mod 3), \+(0 is _数 mod 5). % 以下のサイトは 小の月(_小の月) :- '十二ヶ月の中で定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月). '十二ヶ月の中で定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月) :- 十二ヶ月の中で(_小の月), '定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月). 十二ヶ月の中で(_月) :- between(1,12,_月). '定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月) :- '定められた月末日が31日の月を大の月といい、'(_大の月), この大の月でない月を小の月という(_大の月,_小の月). '定められた月末日が31日の月を大の月といい、'(_大の月) :- 定められた月末日が31日の月(_大の月). 大の月(_大の月) :- '定められた月末日が31日の月を大の月といい、'(_大の月). 定められた月末日が31日の月(1). 定められた月末日が31日の月(3). 定められた月末日が31日の月(5). 定められた月末日が31日の月(7). 定められた月末日が31日の月(8). 定められた月末日が31日の月(10). 定められた月末日が31日の月(12). この大の月でない月を小の月という(_大の月,_小の月) :- \+(_大の月 = _小の月). % 以下のサイトは 小の月(_小の月) :- 十二ヶ月の中で定められた月末日が31日ではない月を小の月という(_小の月). 十二ヶ月の中で定められた月末日が31日ではない月を小の月という(_小の月) :- 十二ヶ月の中で(_小の月), 定められた月末日が31日ではない月を(_小の月). 十二ヶ月の中で(_月) :- between(1,12,_月). 定められた月末日が31日ではない月を(_小の月) :- \+((月末日が31日の月(_月末日が31日の月ならび),member(_小の月,_月末日が31日の月ならび)). 月末日が31日の月([1,3,5,7,8,10,12]). % 以下のサイトは 小の月(_小の月) :- 十二ヶ月の中で定められた月末日が31日ではない月を小の月という(_小の月). 十二ヶ月の中で定められた月末日が31日ではない月を小の月という(_小の月) :- 十二ヶ月の中で(_小の月), 定められた月末日が31日ではない月を(_小の月). 十二ヶ月の中で(_月) :- between(1,12,_月). 定められた月末日が31日ではない月を(_小の月) :- \+(月末日が31日の月(_小の月)). 月末日が31日の月(1). 月末日が31日の月(3). 月末日が31日の月(5). 月末日が31日の月(7). 月末日が31日の月(8). 月末日が31日の月(10). 月末日が31日の月(12). % 以下のサイトは 小の月(_小の月) :- '十二ヶ月の中で定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月). '十二ヶ月の中で定められた月末日が31日の月を大の月といい、この大の月でない月を小の月という'(_小の月) :- 十二ヶ月の中で(_小の月), 定められた月末日が31日ではない月を(_小の月). 十二ヶ月の中で(_月) :- between(1,12,_月). 定められた月末日が31日ではない月を(_小の月) :- \+(月末日が31日の月(_小の月)). 月末日が31日の月(1). 月末日が31日の月(3). 月末日が31日の月(5). 月末日が31日の月(7). 月末日が31日の月(8). 月末日が31日の月(10). 月末日が31日の月(12). % 以下のサイトは ワンペア(_手札,_ペア数字,_残りの手札) :- 'ワンペアとは、手札に二枚の同位な数字があり、かつ、ツーペア、スリーカード、フォーカード、フルハウスの可能性がないものである。'(_手札,_ペア数字,_残りの手札). 'ワンペアとは、手札に二枚の同位な数字があり、かつ、ツーペア、スリーカード、フォーカード、フルハウスの可能性がないものである。'(_手札,_ペア数字,_残りの手札) :- 手札に二枚の同位な数字があり(_手札,_ペア数字,_ペア数字,_残りの手札), 'ツーペア、スリーカード、フォーカード、フルハウスの可能性がない'(_ペア数字,_残りの手札). 手札に二枚の同位な数字があり(_手札,_数字,_数字,_残りの手札) :- 二枚の札を選択(_手札,(_数字,_),(_数字,_),_残りの手札). 二枚の札を選択(_手札,(_数字_1,_スート_1),(_数字_2,_スート_2),_残りの手札) :- select((_数字_1,_スート_1),_手札,_残りの手札_1), select((_数字_2,_スート_2),_残りの手札_1,_残りの手札). 'ツーペア、スリーカード、フォーカード、フルハウスの可能性がない'(_ペア数字,_残りの手札) :- 'スリーカード、フォーカードの可能性がない'(_ペア数字,_残りの手札), 'ツーペア、フルハウスの可能性がない'(_ペア数字,_残りの手札). 'スリーカード、フォーカードの可能性がない'(_ペア数字,_残りの手札) :- ペア数字は残りの手札の中にはない(_ペア数字,_残りの手札). ペア数字は残りの手札の中にはない(_ペア数字,_残りの手札) :- \+(member((_ペア数字,_),_残りの手札)). 'ツーペア、フルハウスの可能性がない'(_ペア数字,_残りの手札) :- ペア数字は残りの手札の中にはない(_ペア数字,_残りの手札), 残りの手札の中に同位数字がない(_残りの手札). 残りの手札の中に同位数字がない(_残りの手札) :- \+(同位数字がある(_残りの手札)). 同位数字がある(_残りの手札) :- select((_同位数字,_),_残りの手札,_残りの手札_1), select((_同位数字,_),_残りの手札_1,_). % 以下のサイトは # 出典 :: CodeIQ q1385 言語不問:通分と約分を実装しよう # # 小学生が分数を学ぶときに、最初に躓くのが「通分」です。 # # 分母の異なる分数の足し算や引き算を行うとき、先に通分を行っておく必要があります。 # # また、計算した結果、「約分」できる場合は、可能な限り簡単な分数にしないと正解になりません。 # # 【問題】 # # では、入力される二つの分数について足し算を行った時に、 # # 正しい答えを出力するプログラムを作り、 # # 問1〜問5の標準入力に対して、出力内容を答えてください。 # # ※分母が1の時には整数として出力してください。 # # ■例 # # 例1) # # 【標準入力】 # # 5/6 # # 1/10 # # 【標準出力】 # # 14/15 # # 例2) # # 【標準入力】 # # 1/3 # # 2/3 # # 【標準出力】 # # 1 # # ■問1〜5 # # 問1) # # 1/3 # # 2/7 # # 問2) # # 2/8 # # 3/5 # # 問3) # # 3/10 # # 1/6 # # 問4) # # 3/4 # # 5/8 # # 問5) # # 2/5 # # 2/3 # # 【解答方法】 # # 解答用テキストファイルanswer_q1385.txtをダウンロードし、必要事項をご記入ください。 # # 必須事項がすべて記入されていることをご確認いただいた後、テキストファイルのままアップロードしてください。 # # 【注意】 # # ・ご提出いただいたプログラムは個別に実行テストを行いますので、 # #  解答用テキストファイルに書かれた解答が正解していても最高評価になるとは限りません。 # # ・プログラミング言語は不問ですが、古すぎる実行環境・特殊な設備を要する実行環境では採点できない場合がございます。 # # ・使用する言語は1解答につき必ず1種類でお願いします。 # #  どうしても複数の言語を用いる場合は、解答に「メインの言語名」を明記してください。 # '問1〜問5の標準入力に対して、出力内容を答えてください。 ■問1〜5 問1) 1/3 2/7 問2) 2/8 3/5 問3) 3/10 1/6 問4) 3/4 5/8 問5) 2/5 2/3' :- between(1,5,N), '入力される二つの分数について足し算を行った時に、正しい答えを出力する', N = 5. '入力される二つの分数について足し算を行った時に、正しい答えを出力する' :- 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2), 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _加算された分母), 約分(_加算された分子 / _加算された分母,_約分された分子 / _約分された分母), 答えを出力する(_約分された分子 / _約分された分母). 分数の加算(_分子_1 / _分母_1,_分子_2 / _分母_2,_加算された分子 / _通分された分母) :- 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _通分された分母,_通分された分子_2 / _通分された分母), _加算された分子 is _通分された分子_1 + _通分された分子_2,!. 入力される二つの分数(_分子_1 / _分母_1,_分子_2 / _分母_2) :- 入力される分数(_分子_1 / _分母_1), 入力される分数(_分子_2 / _分母_2). 入力される分数(_分子 / _分母) :- 行入力(_行), read_term_from_atom(_行,_分子 / _分母,[]). 行入力(_行) :- get_char(_先読み文字), 行ならびを得る(_先読み文字,_行ならび), atom_chars(_行,_行ならび). 行ならびを得る('\n',[]) :- !. 行ならびを得る(_先読み文字,[_先読み文字|R]) :- get_char(_次の文字), 行ならびを得る(_次の文字,R). 答えを出力する(_約分された分子 / _約分された分母) :- writef('%t\n',[_約分された分子 / _約分された分母]). 約分(_分子 / _分母,X) :- 最大公約数で分子分母を割って約分する(_分子,_分母,_分子_1,_分母_1), 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子_2,_分母_2), 分母が1の時は整数に変形(_分子_2,_分母_2,X). 最大公約数で分子分母を割って約分する(_分子_1,_分母_1,_分子,_分母) :- 最大公約数(_分子_1,_分母_1,_最大公約数), _分子 is _分子_1 // _最大公約数, _分母 is _分母_1 // _最大公約数. 負数の場合のマイナス符号は分子側に付ける(_分子_1,_分母_1,_分子,_分母) :- 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母),!. 負数の場合のマイナス符号は分子側に付ける(_分子,_分母,_分子,_分母). 分母が負数だったら分子分母ともに符号を反転する(_分子_1,_分母_1,_分子,_分母) :- _分母_1 =< 0, _分子 is _分子_1 * -1, _分母 is _分母_1 * -1. 分母が1の時は整数に変形(_分子,1,_分子) :- !. 分母が1の時は整数に変形(_分子,1.0,_分子) :- !. 分母が1の時は整数に変形(_分子,_分母,_分子 / _分母). 通分(_分子_1 / _分母_1,_分子_2 / _分母_2,_通分された分子_1 / _最小公倍数,_通分された分子_2 / _最小公倍数) :- 最小公倍数([_分母_1,_分母_2],_最小公倍数), _通分された分子_1 is _分子_1 * (_最小公倍数 // _分母_1), _通分された分子_2 is _分子_2 * (_最小公倍数 // _分母_2). 最大公約数([_整数],_整数). 最大公約数([_整数|R],_最大公約数) :- 最大公約数(R,_最大公約数_2), 二つの整数の最大公約数(_整数,_最大公約数_2,_最大公約数). 二つの整数の最大公約数(M,N,X) :- 二つの整数の絶対値をとる(M,N,M_2,N_2), 最大公約数をユークリッドの互除法で求める(M_2,N_2,Y), 負数解の可能性も探る(M,M_2,N,N_2,Y,X). 負数解の可能性も探る(M,M_2,N,N_2,Y,X) :- setof(X,[M,M_2,N,N_2,Y,X] ^ 負数解の可能性(M,M_2,N,N_2,Y,X),L), member(X,L). 負数解の可能性(M,M_2,_,_,Y,X) :- X is Y * (M // M_2). 負数解の可能性(_,_,N,N_2,Y,X) :- X is Y * (N // N_2). 二つの整数の絶対値をとる(M,N,M_2,N_2) :- M_2 is abs(M), N_2 is abs(N). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). 最小公倍数(_整数_1,_整数_2,_最小公倍数) :- 二つの整数の最小公倍数(_整数_1,_整数_2,_最小公倍数). 最小公倍数(_整数ならび,_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(_整数ならび,_最小公倍数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数],_整数). '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'([_整数|R],_最小公倍数) :- '最小公倍数とは、0ではない複数の整数の公倍数のうち最小のものをさす'(R,_最小公倍数_1), 二つの整数の最小公倍数(_整数,_最小公倍数_1,_最小公倍数). 二つの整数の最小公倍数(A,B,X) :- 二つの整数の最大公約数(A,B,_最大公約数), X is A * B // _最大公約数. % 以下のサイトは '2012年はうるう年である' :- うるう年(2012). うるう年(_年) :- うるう年とは4で割り切れる年の中で例外となる年を除いたものである(_年). うるう年とは4で割り切れる年の中で例外となる年を除いたものである(_年) :- うるう年とは4で割り切れる年の中で(_年), 例外となる年を除いたものである(_年). うるう年とは4で割り切れる年の中で(_年) :- 0 is _年 mod 4. 例外となる年を除いたものである(_年) :- \+(例外となる年(_年)). 例外となる年(_年) :- 0 is _年 mod 100, \+(0 is _年 mod 400). % 以下のサイトは 縦書文書を横書文書に変形する(_縦書文書,_横書文書) :- 縦書文書を横書行ならびに変形する(_縦書文書,_横書き行ならび), atomic_list_concat(_横書行ならび,'\n',_縦書文書). 縦書文書を横書行ならびに変形する(_縦書文書,_横書き行ならび) :- 改行を区切りに行ならびに変形する(_縦書文書,_縦書行ならび), 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび). 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび) :- 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび), 転置(_反転した行文字ならび,_転置した行文字ならび), 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび). 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび) :- findall(_反転した文字ならび,( member(_行文字列,_縦書行ならび), 文字列を反転した文字ならびに変換(_行文字列,_反転した文字ならび)),_反転した行文字ならび). 文字列を反転した文字ならびに変換(_文字列,_反転した文字ならび) :- 文字列を反転した文字ならびに変換(_文字列,[],_反転した文字ならび). 文字列を反転した文字ならびに変換('',_反転した文字ならび,_反転した文字ならび) :- !. 文字列を反転した文字ならびに変換(_文字列,L1,_反転した文字ならび) :- 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列), 文字列を反転した文字ならびに変換(_残り文字列,[_先頭文字|L1],_反転した文字ならび). 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,_末尾からの変位,_先頭文字), sub_atom(_文字列,_,_末尾からの変位,0,_残り文字列). 改行を区切りに行ならびに変形する(_縦書文書,[_前文字列|R]) :- 改行を区切りに(_縦書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_縦書文書,_前文字列,_後文字列) :- sub_atom(_縦書文書,_先頭からの変位,1,_末尾からの変位,'\n'), sub_atom(_縦書文書,0,_先頭からの変位,_,_前文字列), sub_atom(_縦書文書,_,_末尾からの変位,0,_後文字列),!. 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび) :- findall(_行文字列,( 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列)),_横書き行ならび). 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列) :- member(_行文字ならび,_転置した行文字ならび), 空白行ではない(_行文字ならび), atom_chars(_行文字列,_行文字ならび). 空白行ではない(_行文字ならび) :- \+(空白行(_行文字ならび)). 空白行(_行文字ならび) :- forall(member(_文字,_行文字ならび),_文字 = ' '). % 以下のサイトは '2012年はうるう年である' :- '2012年は4で割り切れる年の中でうるう年の例外となる年を除いたものにあたる'. '2012年は4で割り切れる年の中でうるう年の例外となる年を除いたものにあたる' :- '2012年は4で割り切れ', '2012年はうるう年の例外となる年ではない'. '2012年は4で割り切れ' :- 0 is 2012 mod 4. '2012年はうるう年の例外となる年ではない' :- \+('2012年はうるう年の例外となる年'). '2012年はうるう年の例外となる年' :- 0 is 2012 mod 100, \+(0 is 2012 mod 400). % 以下のサイトは '2012年はうるう年である'(2012) :- '2012年は4で割り切れる年の中でうるう年の例外となる年を除いたものにあたる'(2012). '2012年は4で割り切れる年の中でうるう年の例外となる年を除いたものにあたる'(2012) :- '2012年は4で割り切れ'(2012), '2012年はうるう年の例外となる年ではない'(2012). '2012年は4で割り切れ'(2012) :- 0 is 2012 mod 4. '2012年はうるう年の例外となる年ではない'(2012) :- \+('2012年はうるう年の例外となる年'(2012)). '2012年はうるう年の例外となる年'(2012) :- 0 is 2012 mod 100, \+(0 is 2012 mod 400). % 以下のサイトは うるう年(_年) :- うるう年とは4で割り切れる年の中で例外となる年を除いたものである(_年). うるう年とは4で割り切れる年の中で例外となる年を除いたものである(_年) :- うるう年とは4で割り切れる年の中で(_年), 例外となる年を除いたものである(_年). うるう年とは4で割り切れる年の中で(_年) :- 0 is _年 mod 4. 例外となる年を除いたものである(_年) :- \+(例外となる年(_年)). 例外となる年(_年) :- 0 is _年 mod 100, \+(0 is _年 mod 400). % 以下のサイトは # 出典 :: C#,C#の宿題片付けます。 #699 # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク): # 1.acをabbに置き換える最小のレーヴェンシュタイン距離を求めよ # 2.1をもとにdiffツールを作成せよ。なお、出力時の形式は以下のとおりとする # ac # ^ # # abb # || # レーベンシュタイン距離(_文字列1,_文字列2,_レーベンシュタイン距離) :- 編集距離(_文字列1,_文字列2,_レーベンシュタイン距離). 編集距離(S1,S2,_編集距離) :- atom_chars(S1,LX), atom_chars(S2,LY), ならびの編集距離(LX,LY,LZ), length(LZ,_編集距離),!. ならびの編集距離(LX,LY,LZ) :- 'ならびの編集距離の停止条件はLXかLYが[]'(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ). ならびの編集距離(LX,LY,LZ) :- append(LX,LY,LZ). 'ならびの編集距離の停止条件はLXかLYが[]'([],LY,LY). 'ならびの編集距離の停止条件はLXかLYが[]'(LX,[],LX). ならびの編集距離の共通部分を取り除いていく(LX,LY,LZ) :- ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21), append(L01,L21,LYR), append(L0,LZ_1,LZ), ならびの編集距離(L2,LYR,LZ_1). ならびの編集距離の共通部分と残りの部分に分離する(LX,LY,L0,L1,L2,L01,L21) :- append(L0,L1,L2,LX), \+(L1 = []), append(L01,L1,L21,LY). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), '1000以下の素数ならびを小さい順に得る'(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'([],[]) :- !. '1000以下の素数ならびを小さい順に得る'([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), '1000以下の素数ならびを小さい順に得る'(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行する'(R,_1,_2). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]でない時は_1,_2出力後カンマを出力する'(R,_1,_2). 'Rが[]の時は_1,_2出力後カンマは省略して改行する'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). 'Rが[]でない時は_1,_2出力後カンマを出力する'([_|_],_1,_2) :- writef('(%t,%t), ',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # 出典 :: CodeIQ q1346 # # あるとき、マシューは美人な双子と出会った。お姉さん、妹さん、実に美しいのだ!この2人、双子でありつつ、とても仲が良い。仲が良すぎて、同じタイミングで話すという特技がある。 # # 姉&妹 「あ。マシューだ。」 # マシュー「いかにもマシューだ。」 # 姉&妹 「双子ならではのクイズを出してもいい?」 # マシュー「え、あ、いいよ。」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # マシュー「・・・え?」 # 姉&妹 「1000以下の双子素数をすべて出力せよ。」 # # なんだかとんでもないクイズに巻き込まれてしまった!プログラムを書いて答えてほしい。 # # 解き方だが、 (3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力して欲しい。 # '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する' :- '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび), '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび). '1000以下の素数ならびを小さい順に得る'(_1000以下の素数ならび) :- findall(M,between(2,1000,M),_小さい順に並んだ2から1000までの整数ならび), エラトステネスの篩(_小さい順に並んだ2から1000までの整数ならび,_1000以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の素数ならび) :- '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび), '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび). '1000以下の双子素数のすべてを'(_1000以下の素数ならび,_1000以下の双子素数ならび) :- findall([_1,_2],'1000以下の双子素数の'(_1000以下の素数ならび,_1,_2),_1000以下の双子素数ならび). '1000以下の双子素数の'(_1000以下の素数ならび,_1,_2) :- append(_,[_1,_2|_],_1000以下の素数ならび), 2 is _2 - _1. '(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する'(_1000以下の双子素数ならび) :- 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R), 'カンマ区切りで標準出力する'(R,_1,_2), R = []. 小さい数の組み合わせから順番に(_1000以下の双子素数ならび,_1,_2,R) :- append(_,[[_1,_2]|R],_1000以下の双子素数ならび). 'カンマ区切りで標準出力する'(R,_1,_2) :- 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'(R,_1,_2),!. 'カンマ区切りで標準出力する'(_,_1,_2) :- writef('(%t,%t), ',[_1,_2]). 'Rが[]の時は_1,_2出力後カンマは省略して改行して終わる'([],_1,_2) :- writef('(%t,%t)\n',[_1,_2]). :- '1000以下の双子素数のすべてを(3, 5), (5, 7), (11, 13),などのように小さい数の組み合わせから順番にカンマ区切りで標準出力する',halt. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/649 # # [1] 授業単元:プログラミング基礎 # [2] 問題文(含コード&リンク): # ダイエットファイルに # # 20100930,curry and rice # 20101003,kitsune soba # 20101003,rice ball # # のような形で日付とその日食べた昼食が保存されているとする. # コマンド行引数にダイエットファイル名と日付(yyyymmdd 形式) を指定して実行すると, # ファイルの中から指定した日付を含む行を検索し,その日の昼食を出力するプログラムを作成せよ. # また,引数としてファイルと文字列を指定しなかった場合に,使い方を出力して終了するようにせよ. # 日付の検索には,標準関数char *strstr(const char *str1, const char *str2); を使用するのが簡単である. # # 【実行例】 # % ./q3-3 diet.txt 20100929 # date 20100929 was not found in file diet.txt # % ./q3-3 diet.txt 20101003 # 20101003,kitsune soba # 20101003,rice ball # % ./q3-3 # Usage: ./q3-3 filename date(yyyymmdd) # % # # program :- パラメータを得る(_ファイル,_日付), get_split_lines(_ファイル,[','],LL), 日付をキーに検索する(_日付,LL,LL2), 検索した行を表示する(_日付,LL2). halt. パラメータを得る(_ファイル,_日付) :- user_paramaters(L), 診断(L,_ファイル,_日付),!. 診断([_ファイル,_日付],_ファイル,_日付) :- !. 診断(_,_,_) :- write('Usage: ./prolog filename date(yyyymmdd)\n'), halt. 日付をキーに検索する(_,[],[]) :- !. 日付をキーに検索する(_日付,[[_日付,_その日食べた昼食]|R1],[[_日付,_その日食べた昼食]|R2]) :- 日付をキーに検索する(_日付,R1,R2),!. 日付をキーに検索する(_日付,[_|R1],R2) :- 日付をキーに検索する(_日付,R1,R2),!. 検索した行を表示する([]) :- !. 検索した行を表示する([[_,_日付,_その日食べた昼食]|R]) :- write('%t,%t\n',[_日付,_その日食べた昼食]), 検索した行を表示する(R). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/477 # # [1] アルゴリズム論 # [2] Unixコマンドのgrepを実装したmygrepの作成 #   コマンドライン引数で検索文字列とファイル名をもらい、ファイル内に検索文字列が含まれる行があればその行を出力する #   正規表現に対応させる必要はない # [3] # [3.1]windows xp  # [3.2]gcc  # [3.3]c言語 # [4] 無期限 # [5] strstrは使用禁止 # # よろしくおねがいします # program :- user_paramaters([_検索文字列,_ファイル名]), open(_ファイル名,read,Instream), grep_line(Instream,_検索文字列), close(Instream), halt. grep_line(Instream,_検索文字列) :- at_end_of_stream(Instream),!. grep_line(Instream,_検索文字列) :- get_line(Stream,Line), sub_atom(Line,_,_,_,_検索文字列), writef('%t\n',[Line]), fail. grep_line(Instream,_検索文字列) :- grep_line(Instream,_検索文字列). % 以下のサイトは # 出典 :: twitter_by_@a_hisame_20150219 # # "aがn回以上続いた直後にbがn回続く"ことを(拡張)正規表現で有限長で表現できるんでしたっけ? (nは0以上の任意の整数) # 'aがn回以上続いた直後にbがn回続く(nは0以上の任意の整数)'(_文字列,_n,_前文字列,_適合文字列,_後文字列) :- 'aがn回以上続いた'(_n,_文字列,_前文字列,_適合文字列_1,_後文字列_1), '直後にbがn回続く'(_n,_適合文字列_1,_後文字列,_適合文字列,_後文字列). aがn回以上続いた(_n,_a,_文字列,_前文字列,_適合文字列,_後文字列) :- aがn回以上続いた(_n,_a,_文字列,_前文字列,_適合文字列,_後文字列,_), その連続部分では最長である(_a,_前文字列,_後文字列). aがn回以上続いた(_n,_a,_文字列,_前文字列,_適合文字列,_後文字列,_文字列長) :- sub_atom(_文字列,S,_文字列長,R,_適合文字列), _文字列長 >= _n, forall(sub_atom(_適合文字列,_,1,_,_文字),_a = _文字), 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列). 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). その連続部分では最長である(_或る文字,_前文字列,_後文字列) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)), \+(sub_atom(_後文字列,0,1,_,_或る文字)). '直後にbがn回続く'(_n,_適合文字列_1,_後文字列_1,_適合文字列,_後文字列) :- bがn回続く(_n,_後文字列_1,_bがn個の文字列), atom_concat(_適合文字列_1,_bがn個の文字列,_適合文字列), sub_atom(_後文字列_1,_,R,0,_後文字列). bがn回続く(_n,_後文字列_1,_bがn個の文字列) :- sub_atom(_後文字列_1,0,_n,R,_bがn個の文字列), forall(sub_atom(_bがn個の文字列,_,1,_,_文字),_文字 = b), \+(sub_atom(_後文字列,_n,1,_,b)). % 以下のサイトは # 出典 :: twitter_by_@a_hisame_20150219 # # "aがn回以上続いた直後にbがn回続く"ことを(拡張)正規表現で有限長で表現できるんでしたっけ? (nは0以上の任意の整数) # 'aがn回以上続いた直後にbがn回続く(nは0以上の任意の整数)'(_文字列,_n,_前文字列,_適合文字列,_後文字列) :- 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3), '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2), atom_chars(_適合文字列,L2_2), atom_chars(_後文字列,L3_2). 'aがn回以上続いた'(_n,_文字列,_前文字列,L2,L3) :- sub_atom(_文字列,_前文字列,_適合文字列_1,_後文字列_1,L1,L2,L3), all(L2,a), \+(last(L1,a)), \+(L3 = [a|_]), length(L2,Len_1), Len_1 >= _n. '直後にbがn回続く'(_n,L2,L3,L2_2,L3_2) :- findall(b,between(1,_n,_),L), append(L,L3_2,L3), \+(L3_2 = [b|_]), append(L2,L,L2_2). all([],A). all([A|R],A) :- all(R,A). sub_atom(A,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは 250 ToastXToast 要約  何種類かのパンがあり,種類ごとにちょうどよい焼き時間が決まっている.その焼き時間より短ければ生焼けで,長ければ焦げてしまう.またどの種類のパンかは見た目にはわからない.生焼けのパンと焦げたパンがいくつか与えられていて.それぞれのパンの焼いた時間がわかっている.また,それぞれの種類で生焼けのパンと焦げたパンが少なくとも1枚ずつある事もわかっている.パンの種類として考えられるもののうち最小値を求めよ.  生焼けのパンの数と焦げたパンの数は1以上50以下,それぞれのパンの焼いた時間は1以上1000000以下.同じ時間だけ焼いたパンは2枚以上存在しない事は保証されている. 方針 生焼けのパンを○,焦げたパンを●で表し,焼き時間を横軸で表すと,一般的な状況では ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーー●ーーーーーー●●●●ーー●●ー●ーーー●● の用になっている.この場合, ○○ー○○○○○○ーーーー○○ーー○ー○○○ーー ーーーーーーーーーーーーーーーーーーーーーー●● と ○○ーーーーーーーーーーーーーーーーーーーーーー ーー●ーーーーーー●●●●ーー●●ー●ーーーーー とわけることができ,答えは2種類とわかる.あとはこの状況にならないのはいつかを考えればよい. コード例 #include #include #include #include #include using namespace std; class ToastXToast { public: int bake(vector under, vector over) { sort(under.begin(), under.end()); sort(over.begin(), over.end()); if(over[0] <= under[0] ) return -1; if(under[under.size()-1] >= over[over.size()-1]) return -1; if(over[0] > under[under.size()-1]) return 1; else return 2; } }; 500 KingdomXCitiesandVillage 要約  座標平面上の格子点に町がいくつかと村がいくつか配置されている.次のアルゴリズムで,すべての村をいずれかの町と道路でつなぐ. はじめ,すべての村は町につながっていない 町につながっていない村をランダムに一つ選ぶ (それを sv(selected village) とする) 町 or「既に町につながっている村」のなかで sv に(ユークリッド距離で)最も近いものを選び,その2つを道路でつなぐ.最も近いものが複数ある場合はランダムに選ぶ. sv を「既に町につながっている村」に昇格させる. これをすべての村がつながるまで繰り返す.  道路の総距離の期待値を答えよ.町と村の数はそれぞれ1以上50以下,それぞれの町,村の座標は0以上1000000以下.同じ箇所に複数の町や村はない事は保証されている. 方針  まず期待値の加法性から,各々の村から延ばす道路の距離の期待値を合計すればよいので,一つの村に注目する(以降その村をvとし,その村から最も近い町をcとする).v とつながる可能性のある村は,v との距離が vc 間より短いもののみである.まずそれだけを取り出し v との距離が短い順に v[1], v[2], ・・・, v[k] とする.v と c がつながるのは,v が v[1], v[2], ・・・v[k] のいずれよりも先に選ばれたときなので,その確率は 1/(k+1).v と v[j] がつながるのは「 v[j]が vより先に選ばれ,かつvが v[1], v[2], ・・・, v[j-1]より先に選ばれる」ときである(前者が満たされないとv[j]は村とつながっていないのでそもそも候補に入らず,また後者が満たされないとvはv[1]・・・v[j-1]のいずれかとつながってしまう).v[j+1]・・・v[k]には制限がないので考慮しなくても良い.j+1個の球を横一列に並べる事を考えると,条件を満たすのは最左にv[j], その隣に v ,残りj-1個にv[1]・・・v[j-1]を自由に並べかえるものなので,その場合の数は(j - 1)!,全事象は(j + 1)! なので,求める確率は(j-1)! / (j+1)! = 1/ ( j * (j + 1) ) . #include #include #include #include #include #include using namespace std; typedef long long ll; ll dist2(int ax, int ay, int bx, int by){ return (ll)(ax - bx) * (ax - bx) + (ll)(ay - by) * (ay - by) ; } class KingdomXCitiesandVillages { public: double determineLength(vector cx, vector cy, vector vx, vector vy) { int n = cx.size(); int m = vx.size(); double ans = 0; for(int i = 0;i kouho; for(int j = 0;j% 以下のサイトは % [1] 授業単元:C言語演習課題 % http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9422.txt % 問題 % 年と月を「YYYY/MM」と入力し、入力された月のカレンダーを表示しなさい。 % % 1752年10月以前、及び10000年1月以降はエラーを返す。 % % 出力形式は以下のとおり % ・1行目は該当月の1日が月曜日でなければ、前月の最終月曜日から表示。 % ・該当月の最終日が日曜日でなければ、翌月の第1日曜日まで表示。 % ・6行目の表示が必要ない場合は表示しない。 % % うるう年判定は以下のとおり % ・年が4で割り切れる年はうるう年。 % ・年が100で割り切れる年はうるう年でない。 % ・年が400で割り切れる年はうるう年である。 % % [出力例] % 年月日を入力:2009/07 % % 月 火 水 木 金 土 日 % 29 30 01 02 03 04 05 % 06 07 08 09 10 11 12 % 13 14 15 16 17 18 19 % 20 21 22 23 24 25 26 % 27 28 29 30 31 01 02 課題のカレンダー(_年/_月) :- not((_年/_月 >= 1752/10,_年/_月 =< 10000/1)), write('エラー: 入力された年月は範囲を逸脱しています\n'),!. 課題のカレンダー(_年/_月) :- _年/_月 @=< 2009/6,!, 曜日検索(_日付,_曜日,2009/6/13,土曜), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー(_年/_月) :- _年/_月 @>= 2009/6,!, 曜日検索(2009/6/13,土曜,_日付,_曜日), _日付=_年/_月/1, 課題のカレンダー表示(_日付,_曜日). 課題のカレンダー表示(_年/_月/_日,月曜) :- 日付候補を得る(_年/_月/_日,_年/_月/_日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 課題のカレンダー表示(_年/_月/_日,_曜日) :- not(_曜日=月曜), 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日), 日付候補を得る(_年/_月/_日,_前週の月曜日,月曜,_日付整数ならび), 課題のカレンダー見出し表示, 課題のカレンダー週表示(_日付整数ならび). 前週の月曜日(_年/_月/_日,_曜日,_前週の月曜日) :- 曜日検索(_前週の月曜日,_前週の曜日,_年/_月/_日,_曜日), _前週の曜日 = 月曜,!. 日付候補を得る(_年/_月/_日,_起点日付,_曜日,_日付整数ならび) :- findall(_日付,( 曜日(_起点日付,_曜日,_日付2,_),(_日付2=_年2/_月2/7,_年2/_月2 @> _年/_月,!,fail;true)),_日付整数ならび). 課題のカレンダー週表示(_日付整数ならび) :- n個組(7,_日付整数ならび,_7個組), 月曜から日曜までヘッドゼロサプライで表示(_7個組). 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t\n',[_日文字列]),!. 月曜から日曜までヘッドゼロサプライで表示([_年/_月/_日|R]) :- ヘッドゼロサプライ(2,_日,_日付文字列), write_formatted('%t ',[_日付文字列]), 月曜から日曜までヘッドゼロサプライで表示(R). 課題のカレンダー見出し表示 :- write_formatted('月 火 水 木 金 土 日\n'). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_日付,_曜日,_今日,_今日の曜日). 曜日検索(_日付,_曜日,_今日,_今日の曜日) :- var(_日付), var(_曜日), 前日・今日(_前日,_前日の曜日,_今日,_今日の曜日), 曜日検索(_日付,_曜日,_前日,_前日の曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_日付,_曜日). 曜日検索(_今日,_今日の曜日,_日付,_曜日) :- var(_日付), var(_曜日), 前日・今日(_今日,_今日の曜日,_翌日,_翌日の曜日), 曜日検索(_翌日,_翌日の曜日,_日付,_曜日). '曜日'(_日付,_曜日,_日付,_曜日) :- ! . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @> _日付2, '前日・今日'(_日付3,_曜日3,_日付1,_曜日1), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . '曜日'(_日付1,_曜日1,_日付2,_曜日2) :- _日付1 @< _日付2, '前日・今日'(_日付1,_曜日1,_日付3,_曜日3), '曜日'(_日付3,_曜日3,_日付2,_曜日2) . 前日・今日(_前日の年/12/31,_前日の曜日,_年/1/1,_曜日) :- 一つ違い(_前日の年,_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/29,_前日の曜日,_年/3/1,_曜日) :- うるう年(_年), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/2/28,_前日の曜日,_年/3/1,_曜日) :- not(うるう年(_年)), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/30,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[4,6,9,11]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_前月/31,_前日の曜日,_年/_月/1,_曜日) :- 一つ違い(_前月,_月), member(_前月,[1,3,5,7,8,10,12]), 曜日連鎖(_前日の曜日,_曜日),!. 前日・今日(_年/_月/_前日,_前日の曜日,_年/_月/_日,_曜日) :- 一つ違い(_前日,_日), 曜日連鎖(_前日の曜日,_曜日),!. 一つ違い(M,N) :- integer(M),!, N is M + 1. 一つ違い(M,N) :- integer(N),!, M is N - 1. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 曜日連鎖(月曜,火曜). 曜日連鎖(火曜,水曜). 曜日連鎖(水曜,木曜). 曜日連鎖(木曜,金曜). 曜日連鎖(金曜,土曜). 曜日連鎖(土曜,日曜). 曜日連鎖(日曜,月曜). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt # Rubyの問題がわかりません 助けてください # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正 規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ ッドstr2hashを定義してください。 # # p str2hash("bule 青 white 白\uff3cnred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} :- op(450,xfx,(=>)). % (1) wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}). % (2) hash_count(Hashname,Count) :- functor(P,Hashname,1), call(P), arg(1,P,H), count(H,Count). count(','(A,B),Count) :- count(B,Count2), Count is Count2 + 1. count(A,1). % (3) ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true. each(Hashname.Key=>Value) :- functor(P,Hashname,1), arg(1,P,V), each(V,Key=>Value). each(','(Key=>Value,B),Key=>Value). each(','(_,B),Key=>Value) :- each(B,Key=>Value). each(Key=>Value,Key=>Value). % (4) str2hash(Atom,Hash) :- split(Atom,[' ','\t','\n'],L), findall(U,n個組(2,L,U),L2), hashを成長させる(L2,Hash). hashを成長させる([A,B],{ A=>B }) :- !. hashを成長させる([[A,B]|R], { (A=>B,R2) }) :- hashを成長させる(R,{ R2 }). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/103 # # 【質問テンプレ】 # [1] 授業単元: C言語演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9753.txt # 2.入力された年月の1日が何曜日かを調べる。 #   曜日のチェックはZellerの公式を使用する。Zellerの公式は、 #    #   曜日を表す値=(y + [ y / 4 ] - [ y / 100 ] + [ y / 400 ] + [ (( 13 * m ) + 8 ) / 5 ] + d ) % 7 # #           ※ 上記の公式中の y は年、 m は月、 d は日を表し、 #             []はその数を越えない最大の整数を表す。(例: [13.6]は13になる) # #   で、曜日を表す値は次のようになっている。 # #     日曜日 = 0, 月曜日 = 1, 火曜日 = 2, 水曜日 = 3, # # 木曜日 = 4, 金曜日 = 5, 土曜日 = 6, # #   ※但し、1月と2月は前年の13月14月として計算するものとする。 % (1) 年月の入力 年月入力処理(_年,_月) :- 年入力処理(_年), 月入力処理(_月). % (2) 曜日計算 :- op(450,xfx,が),op(500,xfx,であり),op(600,xfx,ならば),op(450,xfx,は). 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は (Y + Y // 4 - Y // 100 + Y // 400 + ((( 13 * M ) + 8 ) // 5 ) + D ) mod 7). 曜日計算処理(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値), 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値を得る'(_年,1,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,13,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,2,_日,_曜日を表す値) :- _前年 is _年 - 1, 'Zellerの公式を用いて曜日を表す値を得る'(_前年,14,_日,_曜日を表す値),!. 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,_日,_曜日を表す値) :- _年=Y,_月=M,_日=D, 'Zellerの公式'(年 が Y であり 月 が M であり 日 が D ならば 曜日を表す値 は _Zellerの公式), _曜日を表す値 is _Zellerの公式,!. 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % (3) カレンダー表示 カレンダー表示 :- 年月入力処理(_年,_月), 'Zellerの公式を用いて曜日を表す値を得る'(_年,_月,1,_曜日を表す整数値), カレンダー表示データ編集(_年,_月,_曜日を表す整数値,_カレンダー表示文字列ならび), 要素に空白を挿入して全行表示(_カレンダー表示文字列ならび). カレンダー表示データ編集(_年,_月,_各月1日の曜日を表す整数値,_カレンダー表示文字列ならび) :- 年月文字列編集処理(_年,_月,_年月文字列), 月日数(_年,_月,_月日数), findall(S,for(1,N,_月日数),ヘッドゼロサプレス(2,N,S)),_表示日ならび), Length is _月日数 + _各月1日の曜日を表す整数値, M is (7 - (Length mod 7)), '7個組ならび'(Length,M,_表示日ならび,_7個組ならび), 見出しならび(_年月文字列,_見出しならび), append(_見出しならび,_7個組ならび,_カレンダー表示文字列ならび). 見出しならび(_年月文字列,[[_年月文字列],[日,月,火,水,木,金,土]]). '7個組ならび'(Length,0,_表示日ならび,_7個組ならび) :- length(L0,Length), すべての要素が(L0,' '), append(L0,_表示日ならび,L), '7個組'(L,_7個組ならび),!. '7個組ならび'(Length,M,_表示日ならび,_7個組ならび) :- not(M=0), length(L0,Length), すべての要素が(L0,' '), length(L2,M), すべての要素が(L2,' '), append(L0,_表示日ならび,L2,L), '7個組'(L,_7個組ならび),!. うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- not(0 is _年 mod 4),fail. 月日数(_年,2,29) :- うるう年(_年),!. 月日数(_年,2,28) :- not(うるう年(_年)),!. 月日数(_,_月,30) :- member(_月,[4,6,9,11]). 月日数(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). % (4) 基礎述語の定義 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), get_line(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_to_term(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- write_formatted('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), get_line(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_to_term(_行,_月,_), integer(_月),!. 月入力処理の二(_行,_月) :- write_formatted('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- write_formatted('この月を表す整数%tは不正です\n',[_月]), fail. 日付文字列編集処理(_年,_月,_日,_日付文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), ヘッドゼロサプライ(2,_日,_日文字列), concat_atom([_年文字列,_月文字列,_日文字列],_日付文字列). 年月文字列編集処理(_年,_月,_年月文字列) :- ヘッドゼロサプライ(2,_年,_年文字列), ヘッドゼロサプライ(2,_月,_月文字列), concat_atom([_年文字列,_月文字列],_年月文字列). ヘッドゼロサプライ(N桁,_整数,_ヘッドゼロ整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプライ_1(N桁,_数字ならび,_ヘッドゼロ整数文字ならび), concat_atom(_ヘッドゼロ整数文字ならび,_ヘッドゼロ整数文字列),!. ヘッドゼロサプライ_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプライ_1(N桁,L,['0'|R]) :- M桁 is N桁 - 1, ヘッドゼロサプライ_1(M桁,L,R). ヘッドゼロサプレス(N桁,_整数,_ヘッド空白整数文字列) :- number_chars(_整数,_数字ならび), ヘッドゼロサプレス_1(N桁,_数字ならび,_ヘッド空白整数文字ならび), concat_atom(_ヘッド空白整数文字ならび,_ヘッド空白整数文字列),!. ヘッドゼロサプレス_1(N桁,L,L) :- length(L,N桁),!. ヘッドゼロサプレス_1(N桁,L,[' '|R]) :- M桁 is N桁 - 1, ヘッドゼロサプレス_1(M桁,L,R). 要素に空白を挿入して全行表示([]) :- !. 要素に空白を挿入して全行表示([L|R]) :- concat_atom(L,' ',_表示行), write_formatted('%t\n',[_表示行]), 要素に空白を挿入して全行表示(R). すべての要素が([],_). すべての要素が([V|R],V) :- すべての要素が(R,V). '7個組'([],[]) :- !. '7個組'([A,B,C,D,E,F,G|R1]),[[A,B,C,D,E,F,G]|R2]) :- '7個組'(R1,R2). n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. not(P) :- \+(P). append([],L1,L2,L) :- append(L1,L2,L) . append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R) . concat_atom([],'') :- !. concat_atom([A],A) :- !. concat_atom([A|R],S) :- concat_atom(R,S1), atom_concat(A,S1,S). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],_区切り文字列,S) :- concat_atom(R,_区切り文字列,S1), atom_concat(A,_区切り文字列,S2), atom_concat(S2,S1,S). # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1247438792/157 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9762.txt # # 正数による正方行列のうち、全ての行、列、斜め列の合計が同じであり、 # かつ2回以上使用される数字が存在しないものを魔方陣という。 # 下図に示すa,bに数値を設定したときに、1〜9の整数によって構成される魔方陣を # 出力するプログラムを作成せよ。 # 但し、魔方陣が作成不可能な(a,b)の組み合わせが設定された場合は、「Impossible」 # と出力するとする。 # # la_lb_l__l # l__l__l__l # l__l__l__l # 魔方陣(N枡,A,B,_行列) :- 魔方陣のための行列の生成(N枡,_行列), _行列 = [[A,B|_],_,_], 行の合計が全て一致する(_行列,S), 列の合計が全て一致する(_行列,S), 正方行列の斜め要素の合計が一致する(_行列,S). 魔方陣のための行列の生成(N枡,_行列) :- N2 is N枡 ^ 2, findall(M,for(1,M,N2),NL),!, 順列(NL,N2,_順列数字ならび), findall(_N個組,n個組(N枡,_順列数字ならび,_N個組),_行列). 行の合計が全て一致する([],S) :- !. 行の合計が全て一致する([_行|R],S) :- 魔方陣の加算(_行,0,S), 行の合計が全て一致する(R,S). 列の合計が全て一致する(_行列,S) :- 行列の転置(_行列,_転置行列), 列の合計が全て一致する(_転置行列,S),!. 正方行列の斜め要素の合計が一致する(_正方行列,S) :- length(_行列,Len), 左上から右下方向の合計(1,Len,_正方行列,0,S), 右上から左下方向の合計(1,Len,_正方行列,0,S),!. 左上から右下方向の合計(M,N,_,S,S) :- M > N,!. 左上から右下方向の合計(M,N,_行列,S1,S) :- list_nth(M,_行列,_行), list_nth(M,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 左上から右下方向の合計(M2,N,_行列,S2,S),!. 右上から左下方向の合計(M,N,_,S,S) :- M > N,!. 右上から左下方向の合計(M,N,_行列,S1,S) :- M1 is N - M + 1, list_nth(M1,_行列,_行), list_nth(M1,_行,_要素), S2 is _要素 + S1, M2 is M + 1, 右上から左下方向の合計(M2,N,_行列,S2,S),!. n個組(N,L,X) :- length(X,N), append(X,L2,L3), append(L1,L3,L), length(L1,Len), 0 is Len mod N. 魔方陣の加算([],X,X) :- !. 魔方陣の加算([A|R],Y,X) :- Z is A + Y, 魔方陣の加算(R,Z,X). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/566 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 番号と点数を配列に初期化して、それらを # 5段階にランク付けをして、受験番号・ランクを表示するプログラムを作成。 # ランク付けをする部分を関数Rankとして、番号と評価を表示する部分を関数Outputとすること。 # なお、ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 # 60〜79点をB、80〜100点をAとする。 # ただし、受験者の数は、50人以下とする。 # 番号と点数は、以下の配列を使用すること。 # 番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10}; # 点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100}; # '問題文の5段階にランク付け'('ランクの評価は0〜19点をE、20〜39点をD、40〜59点をC、 60〜79点をB、80〜100点をAとする。 '). 番号の定義文('番号 int no[NUMBER]={1,2,3,4,5,6,7,8,9,10};'). 点数の定義文('点数 int tensu[NUMBER]={45,21,60,81,70,99,0,10,20,100};'). 'ランクならびの生成'(_ランクならび) :- '問題文の5段階にランク付け'(_ランク定義文), ランクの定義文解析(_ランク定義文,_ランクならび). 番号ならびの生成(_番号ならび) :- 番号の定義文(_番号の定義文), 番号の定義文解析(_番号の定義文,_番号ならび). 点数ならびの生成(_点数ならび) :- 点数の定義文(_点数の定義文), 点数の定義文解析(_点数の定義文,_点数ならび). '5段階にランク付けをして、受験番号・ランクを表示する' :- ランクならびの生成(_ランクならび), 番号ならびの生成(_番号ならび), 点数ならびの生成(_点数ならび), '5段階にランク付けをして、受験番号・ランクを表示する'(_番号ならび,_点数ならび,_ランクならび). '5段階にランク付けをして、受験番号・ランクを表示する'([],[],_). '5段階にランク付けをして、受験番号・ランクを表示する'([_番号|R1],[_点数|R2],_ランクならび) :- append(_,[[_点数下限,_点数上限,_ランク]|_],_ランクならび), _点数 >= _点数下限, _点数 =< _点数上限, writef('受験番号:%t ランク:%t\n',[_番号,_ランク]), '5段階にランク付けをして、受験番号・ランクを表示する'(R1,R2,_ランクならび). ランクの定義文解析(_ランク定義文,_ランクならび) :- 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文), split(_半角数字変換されたランク定義文,[' ','。','、','〜','点を','とする'],L), n個組(3,L,_ランクならび). 全角数字を半角数字に変換(_ランク定義文,_半角数字変換されたランク定義文) :- atom_chars(_ランク定義文,Chars), findall(_文字_1, append(_,[_文字|_],Chars), 全角数字ならば半角数字に変換(_文字,_文字_1)), Chars2), atom_chars(_半角数字変換されたランク定義文,Chars2). 全角数字ならば半角数字に変換([_全角数字|R1],[_半角数字|R2]) :- 全角数字半角数字変換(_全角数字,_半角数字), 全角数字ならば半角数字に変換(R1,R2). 全角数字ならば半角数字に変換([_文字|R1],[_文字|R2]) :- \+(全角数字半角数字変換(_文字,_)), 全角数字ならば半角数字に変換(R1,R2). 全角数字半角数字変換(0,0). 全角数字半角数字変換(1,1). 全角数字半角数字変換(2,2). 全角数字半角数字変換(3,3). 全角数字半角数字変換(4,4). 全角数字半角数字変換(5,5). 全角数字半角数字変換(6,6). 全角数字半角数字変換(7,7). 全角数字半角数字変換(8,8). 全角数字半角数字変換(9,9). 番号の定義文解析(_番号の定義文,_番号ならび) :- split(_番号の定義文,['=',',',';'],[_|_番号ならび]). 点数の定義文解析(_点数の定義文,_点数ならび) :- split(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1295436346/173 # # 質問させてください # selectしたデータを一部だけ別のテーブルに入れる方法ってありますか? # # 例:insert into table2 (aaa,bbb,ccc) select aaa as aaa,bbb as bbb,ccc as ccc from table1 # この場合table1のデータがすべてtable2に入るのでaaaだけ別のデータを入れたいと思っています。 # よろしくお願いします。 # # 海に接していない都道府県名([栃木県,群馬県,埼玉県,山梨県,長野県,岐阜県,滋賀県,奈良県]). table1(奈良県,1000,aa). table1(埼玉県,2000,ab). selectしたデータを一部だけ別のテーブルに入れる方法 :- 海に接していない都道府県名(_海に接していない都道府県名ならび), table1(_都道府県名の一,_bbb,_ccc), 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二), assertz(table2(_都道府県名の二,_bbb,_ccc)), fail. selectしたデータを一部だけ別のテーブルに入れる方法. 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- M is (random mod 8) + 1, list_nth(M,_海に接していない道府県名ならび,_都道府県名の二), \+(_都道府県名の一 = _都道府県名の二), \+(table2(_都道府県名の二,_,_)). 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二) :- 新しい都道府県名の生成(_海に接していない都道府県名ならび,_都道府県名の一,_都道府県名の二). ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/584 # # MySQL 5.5.19 . 長くなりますので # テーブルの定義・内容と欲しい結果はここに # http://ime.nu/codepad.org/oe1jhVrF # # で、 # # create table a_tbl( # code int(9) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into a_tbl # values # (1111,'2012-02-01',10,12), # (1111,'2012-02-02',133,14), # (1111,'2012-02-04',13,15), # (1111,'2012-02-06',13,10); # # create table b_tbl( # code varchar(10) not null, # input_date date not null, # data1 double(9,2) unsigned default 0 not null, # data2 double(9,2) unsigned default 0 not null, # primary key(code,input_date) # ) ; # # insert into b_tbl # values # ('ddd','2012-02-01',122,13), # ('ddd','2012-02-03',127,18), # ('ddd','2012-02-04',11,14), # ('ddd','2012-02-05',16,95), # ('ddd','2012-02-06',13,10); # # 欲しい結果 # input_date a.data1 a.data2 b.data2 # 2012-02-01 10 12 13 # 2012-02-02 133 14 null # 2012-02-03 null null 18 # 2012-02-04 13 15 14 # 2012-02-05 null null 95 # 2012-02-06 13 10 10 # # # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date; とすると、結果が # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | NULL | 2012-02-03 | NULL | NULL | 18 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | NULL | 2012-02-05 | NULL | NULL | 95 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # なんですが、実際にはいろんなコードが入っているので、コードも抽出条件に入れたら # select a.input_date,b.input_date,a.data1,a.data2,b.data2 # from a_tbl a # right join b_tbl b # on a.input_date = b.input_date # where # a.code=1111 and b.code='ddd'; # +------------+------------+-------+-------+-------+ # | input_date | input_date | data1 | data2 | data2 | # +------------+------------+-------+-------+-------+ # | 2012-02-01 | 2012-02-01 | 10 | 12 | 13 | # | 2012-02-04 | 2012-02-04 | 13 | 15 | 14 | # | 2012-02-06 | 2012-02-06 | 13 | 10 | 10 | # +------------+------------+-------+-------+-------+ # になってしまいました。 # コードを抽出条件に入れた状態で望ましい結果または上の方の結果になるようなSQLを教えて下さい。 # 'input_dateの集合を得る'(_input_dateの集合) :- findall(_input_date,a_tbl(_input_date,_,_),L1), findall(_input_date,b_tbl(_input_date,_,_),L2), append(L1,L2,L3), setof(_input_date,member(_input_date,L3),_input_dateの集合). 抽出(_input_date,_tbl_aのdata1ならび,_tbl_aのdata2ならび,_tbl_bのdata2ならび) :- 'input_dateの集合を得る'(_input_dateの集合), member(_input_date,_input_dateの集合), findall([_data1],tbl_a(_,_input_date,_data1,_),_tbl_aのdata1ならび), findall([_data2],tbl_a(_,_input_date,_,_data2),_tbl_aのdata2ならび), findall([_data2],tbl_b(_,_input_date,_,_data2),_tbl_bのdata2ならび). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/633 # # MySQL 5.1です。 # # create table staff_list( # staff_id int(5) primary key //社員番号 # staff_name varchar(8) //社員名 # unit varchar(8) primary key //部署名 # ) # # insert into staff_list (staff_id,staff_name,unit) values # (1,'範馬','総務'), # (2,'愚地','総務'), # (3,'花山','総務'), # (1,'高津','企画'), # (2,'池谷','企画'), # (3,'長嶋','企画'), # (1,'鳩山','営業'), # (2,'野田','営業'), # (3,'小沢','営業'), # (4,'枝野','営業') # # # # このようなテーブルに対してSELECTをかける際、一度のクエリーで # 部署別にソートしたうえで、総務だけstaff_id降順で他を昇順で出したいと思っています。 # # order by unit,IF(staff_name='総務',staff_id desc,staff_id asc) # などと試行してみているのですがうまくできません。 # # どなたかうまい方法をご存じないでしょうか。 # # よろしくお願いいたします。 # スタッフリスト(1,範馬,総務). スタッフリスト(2,愚地,総務). スタッフリスト(3,花山,総務). スタッフリスト(1,高津,企画). スタッフリスト(2,池谷,企画). スタッフリスト(3,長嶋,企画). スタッフリスト(1,鳩山,営業). スタッフリスト(2,野田,営業). スタッフリスト(3,小沢,営業). スタッフリスト(4,枝野,営業). 'このようなテーブルを選択する際、一度部署別にソートしたうえで、総務だけ社員番号降順で出したいと思っています。'(_部署名,_社員番号,_社員名) :- 一度部署別にソートしたうえで(_部署名ならび), 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名). 一度部署別にソートしたうえで(_部署名ならび) :- findsetof(_部署名,( スタッフリスト(_社員番号,_社員名,_部署名)), _部署名ならび). 総務だけ社員番号降順で出したい(_部署名ならび,_部署名,_社員番号,_社員名) :- member(_部署名,_部署名ならび), 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名). 総務だけ社員番号降順で出したい(総務,_社員番号,_社員名) :- 総務だけ社員番号降順で(_社員番号,_社員名). 総務だけ社員番号降順で出したい(_部署名,_社員番号,_社員名) :- \+(_部署名 == 総務), スタッフリスト(_社員番号,_社員名,_部署名). 総務だけ社員番号降順で(_社員番号,_社員名) :- findall([_社員番号,_社員名],( スタッフリスト(_社員番号,_社員名,総務)), L1), 降順でソート(L1,L2), member([社員番号,_社員名],L2). 降順でソート(L1,L2) :- sort(L1,L3), reverse(L3,L2). % % findsetof/3 % # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 年度の場合の月順('04','05'). 年度の場合の月順('05','06'). 年度の場合の月順('06','07'). 年度の場合の月順('07','08'). 年度の場合の月順('08','09'). 年度の場合の月順('09','10'). 年度の場合の月順('10','11'). 年度の場合の月順('11','12'). 年度の場合の月順('12','01'). 年度の場合の月順('01','02'). 年度の場合の月順('02','03'). 年度の場合の月順('03','04'). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる('04',_id,_年度,_月). 年度順に並べる(_月,_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる(_月_1,_id,_年度,_月) :- \+(_月_1 = '03'), 年度の場合の月順(_月,_次の月), 年度順に並べる(_次の月,_id,_年度,_月). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 欲しい結果(_id,_年度,_月) :- findsetof(_年度,aaa(_,_年度,_),_年度ならび), member(_年度,_年度ならび), 年度順に並べる(['04','05','06','07','08','09','10','11','12','01','02','03'],_id,_年度,_月). 年度順に並べる([_月|R],_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる([_|R],_id,_年度,_月) :- 年度順に並べる(R,_id,_年度,_月). # 質問です。 # MySQL5です。 # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。 # 各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。 # 言っていることが、よくわからなくてすみません。 # # 元テーブル # DATE, CODE, VALUE # .... # 20140401, 11, A # 20140402, 12, B # 20140403, 11, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # .... # # 欲しい結果 # 20140401, 11, A # 20140403, 11, C # 20140406, 11, F # 20140402, 12, B # 20140405, 12, E # 20140404, 13, D # # 宜しくお願い致します。 # # # 879 名前:NAME IS NULL [sage]: 2014/04/25(金) 17:41:21.67 ID:??? # >>877 # どうも質問が明確じゃないけど、 # insert into tname select 〜 # の形式にすればとりあえず解決しそうな話に見える。 # # >>878 # order by code, date ということ? # # # 880 名前:NAME IS NULL []: 2014/04/25(金) 17:47:38.30 ID:+Fb19Efw (3) # 879 # 分かりずらい # 欲しい結果にしてしまいました。 # # 第1キーは、日付です。 # # 元テーブル # DATE, CODE, VALUE # 20140401, 13, A # 20140402, 11, B # 20140403, 12, C # 20140404, 13, D # 20140405, 12, E # 20140406, 11, F # # 欲しい結果 # 20140401, 13, A # 20140404, 13, D # 20140402, 11, B # 20140406, 11, F # 20140403, 12, C # 20140405, 12, E # # 宜しくお願い致します。 # # # 要するに第一キーは降順、第二キーは昇順で整列する。 # 'テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(varchar型) の3カラムからなります。各日付順の降順にしたいのですが、スレッドのように、同じコードの場合、その下に日付順でソートしたいです。'(_DATE,_CODE,_VALUE) :- '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE). '要するに第一キーは降順、第二キーは昇順で整列する。'(_DATE,_CODE,_VALUE) :- 第一キー順序(_CODE), 第二キー順序(_CODE,_DATE), 元テーブル(_DATE,_CODE,_VALUE). 第一キー順序(_CODE) :- findsetof(_CODE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), reverse(L1,L2), member(_CODE,L2). 第二キー順序(_CODE,_DATE) :- findsetof(_DATE,( 元テーブル(_DATE,_CODE,_VALUE)), L1), member(_DATE,L1). % 以下のサイトは 既に昇順整列した二つのリストの併合(L1,L2,L3) :- '第一引数、第二引数のどちらかが[]の場合停止できる'(L1,L2,L3). 既に昇順整列した二つのリストの併合(L1,L2,L3) :- '第一引数、第二引数どちらも[]ではない場合、併合を続ける'(L1,L2,L3). '第一引数、第二引数のどちらかが[]の場合停止できる'([],L,L). '第一引数、第二引数のどちらかが[]の場合停止できる'(L,[],L). '第一引数、第二引数どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],L3) :- 'AがBより小さい場合はAを選択して併合を続ける'([A|R1],[B|R2],L3). '第一引数、第二引数どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],L3) :- 'AがBに等しいか大きい場合はBを選択して併合を続ける'([A|R1],[B|R2],L3). 'AがBより小さい場合はAを選択して併合を続ける'([A|R1],[B|R2],[A|R3]) :- A @< B, 既に昇順整列した二つのリストの併合(R1,[B|R2],R3). 'AがBに等しいか大きい場合はBを選択して併合を続ける'([A|R1],[B|R2],[B|R3]) :- A @>= B, 既に昇順整列した二つのリストの併合([A|R1],R2,R3). % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた # 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列) :- 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_文字列長), その連続部分では最長である(_或る文字,_前文字列,_後文字列). 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_適合文字列長) :- sub_atom(_文字列,S,_適合文字列長,R,_適合文字列), 長さがn文字以上の或る文字だけによる文字列(_n,_或る文字,_適合文字列長,_適合文字列), 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列). 長さがn文字以上の或る文字だけによる文字列(_n,_或る文字,_文字列長,_文字列) :- 長さがn文字以上(_n,_文字列長), forall(sub_atom(_文字列,_,1,_,_文字),_文字 = _或る文字). 長さがn文字以上(_n,_文字列長) :- _n =< _文字列長. 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). その連続部分では最長である(_或る文字,_前文字列,_後文字列) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)), \+(sub_atom(_後文字列,0,1,_,_或る文字)). % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた # 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列) :- 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_), その連続部分では最長である(_或る文字,_前文字列,_後文字列). 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_文字列長) :- sub_atom(_文字列,S,_文字列長,R,_適合文字列), _文字列長 >= _n, forall(sub_atom(_適合文字列,_,1,_,_文字),_或る文字 = _文字), 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列). 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). その連続部分では最長である(_或る文字,_前文字列,_後文字列) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)), \+(sub_atom(_後文字列,0,1,_,_或る文字)). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める' :- findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_指数表記を使った素因数分解,_乗算記号度数)),L), writef('%t\n',[L]). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_指数表記を使った素因数分解,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L), 素因数分解項構成(L,_指数表記を使った素因数分解,0,_乗算記号度数). 素因数分解(U,M,N,C,X,X) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(2,M,N,0,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X),!. 素因数分解(2,M,N,C,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,[2^C|Y],X),!. 素因数分解(U,M,N,0,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(U,M,N,C,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,[U^C|Y],X),!. 素因数分解(U,M,N,C,Y,X) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X). 素因数分解項構成([J^M],J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数 is _乗算記号度数_1 + M -1,!. 素因数分解項構成([J^M|R1],B * J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + M, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). :- '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める',halt. % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める'(L) :- findall(N,( between(1000,9999,N), 各桁の合計(N,0,_乗算記号度数), 素因数分解(N,X,_乗算記号度数)),L). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 素因数分解表示(N) :- 素因数分解(N,X,_乗算記号度数), writef('%t = %t\n乗算記号度数 = %t\n',[N,X,_乗算記号度数]). 素因数分解(N,X,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L,0,_乗算記号度数_1), 素因数分解項構成(L,X,_乗算記号度数_1,_乗算記号度数). 素因数分解(U,M,N,C,X,X,_乗算記号度数,_乗算記号度数) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(2,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(2,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(0 is M mod 2), _乗算記号度数_2 is _乗算記号度数_1 + C - 1, 素因数分解(3,N,N,0,[2^C|Y],X,_乗算記号度数_2,_乗算記号度数),!. 素因数分解(U,M,N,0,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X,_乗算記号度数_1,_乗算記号度数),!. 素因数分解(U,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, _乗算記号度数_2 is _乗算記号度数_1 + C - 1, 素因数分解(U2,N,N,0,[U^C|Y],X,_乗算記号度数_2,_乗算記号度数),!. 素因数分解(U,M,N,C,Y,X,_乗算記号度数_1,_乗算記号度数) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X,_乗算記号度数_1,_乗算記号度数). 素因数分解項構成([A],A,_乗算記号度数,_乗算記号度数) :- !. 素因数分解項構成([A|R1],B * A,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + 1, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める'(_各桁の和と乗算記号度数の一致する4桁の数ならび) :- '9999以下の素数ならび'(_9999以下の素数ならび), findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_9999以下の素数ならび,_乗算記号度数)),_各桁の和と乗算記号度数の一致する4桁の数ならび). '9999以下の素数ならび'(_9999以下の素数ならび) :- findall(N,between(2,9999,N),_2以上9999以下の数リスト), エラトステネスの篩(_2以上9999以下の数リスト,_9999以下の素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- 'R1の残りの数ならびの中で、Mで割り切れるものは篩い落とす'(M,R1,L), エラトステネスの篩(L,R2). 'R1の残りの数ならびの中で、Mで割り切れるものは篩い落とす'(M,R1,L) :- findall(N,( 'R1の残りの数ならびの中で'(R1,N), 'Mで割り切れるものは篩い落とす'(N,M)),L). 'R1の残りの数ならびの中で'(R1,N) :- member(N,R1). 'Mで割り切れるものは篩い落とす'(N,M) :- \+(0 is N mod M). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- '下位1桁を切り取って加算する'(N,_各桁の合計_1,_下位一桁を切り取った数,_各桁の合計_2), 各桁の合計(_下位一桁を切り取った数,_各桁の合計_2,_各桁の合計). '下位1桁を切り取って加算する'(N,_各桁の合計_1,_下位一桁を切り取った数,_各桁の合計_2) :- M is N mod 10, _下位一桁を切り取った数 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M. 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_素数ならび,_乗算記号度数) :- 素数で何回割り切れるか(N,_素数ならび,[],_素因数の数の合計を表すならび), 素因数の数の合計を表すならびから乗算記号度数を得る(_素因数の数の合計を表すならび,_乗算記号度数). 素数で何回割り切れるか(N,[],_何回,_何回). 素数で何回割り切れるか(N,[_素数|R],_何回_1,_何回) :- 一つの素数で割ることができる数を加算する(N,_素数,_何回_1,_何回_2), 素数で何回割り切れるか(N,R,_何回_2,_何回). 一つの素数で割ることができる数を加算する(N,_素数,_何回,_何回) :- 素数で割り切れなくなったらその素数は終了する(N,_素数),!. 一つの素数で割ることができる数を加算する(N,_素数,L1,L) :- 素数で割れるだけ割っていく(N,_素数,L1,N_1,L). 素数で割り切れなくなったらその素数は終了する(N,_素数) :- \+(0 is N mod _素数). 素数で割れるだけ割っていく(N,_素数,L1,N_1,L) :- N_1 is N // _素数, 一つの素数で割ることができる数を加算する(N_1,_素数,[_|L1],L). 素因数の数の合計を表すならびから乗算記号度数を得る([_|L],_乗算記号度数) :- length(L,_乗算記号度数). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「72=2×2×2×3×3」のように表現します。 # このときに使う『×』の数は4つです。 # # ここで、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなるものを考えます。 # 上の72の例であれば、各桁の和は7+2で「9」ですが、『×』の数は「4」なので不適です。 # # この条件を満たすものとしては、「110=2×5×11」や「210=2×3×5×7」、 # 「512=2×2×2×2×2×2×2×2×2」などがあります。 # # では、4桁の整数で上記の条件を満たす数をすべて求めてください。 # # プログラミング言語は不問です。 # お好きな言語で計算してください。 # # 【解答方法】 # 解答用テキストファイルをダウンロードしてください。 # # 解答用テキストファイルを完成させ、アップロードしてください。 '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める' :- findall(_4桁の数,( '4桁の数の各桁の合計'(_4桁の数,_乗算記号度数), 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(_4桁の数,_指数表記を使った素因数分解,_乗算記号度数)),L), writef('%t\n',[L]). '4桁の数の各桁の合計'(_4桁の数,_各桁の合計) :- between(1000,9999,_4桁の数), 各桁の合計(_4桁の数,0,_各桁の合計). 各桁の合計(0,_各桁の合計,_各桁の合計) :- !. 各桁の合計(N,_各桁の合計_1,_各桁の合計) :- M is N mod 10, N_1 is N // 10, _各桁の合計_2 is _各桁の合計_1 + M, 各桁の合計(N_1,_各桁の合計_2,_各桁の合計). 指数表記を使わず素因数分解を乗算記号で表現した場合の乗算記号度数(N,_指数表記を使った素因数分解,_乗算記号度数) :- 素因数分解(2,N,N,0,[],L), 素因数分解項構成(L,_指数表記を使った素因数分解,0,_乗算記号度数). 素因数分解(U,M,N,C,X,X) :- U > N // 2,!. 素因数分解(U,M,N,0,Y,X) :- member(J^_,Y), 0 is U mod J, U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(2,M,N,0,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,Y,X),!. 素因数分解(2,M,N,C,Y,X) :- \+(0 is M mod 2), 素因数分解(3,N,N,0,[2^C|Y],X),!. 素因数分解(U,M,N,0,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,Y,X),!. 素因数分解(U,M,N,C,Y,X) :- \+(U=2), \+(0 is M mod U), U2 is U + 2, 素因数分解(U2,N,N,0,[U^C|Y],X),!. 素因数分解(U,M,N,C,Y,X) :- 0 is M mod U, C2 is C + 1, M1 is M // U, 素因数分解(U,M1,N,C2,Y,X). 素因数分解項構成([J^M],J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数 is _乗算記号度数_1 + M -1,!. 素因数分解項構成([J^M|R1],B * J^M,_乗算記号度数_1,_乗算記号度数) :- _乗算記号度数_2 is _乗算記号度数_1 + M, 素因数分解項構成(R1,B,_乗算記号度数_2,_乗算記号度数). :- '指数表記を使わずに4桁の整数を素因数分解して、元の数の「各桁の和」が「素因数分解した『×』の数」と等しくなる整数を全て求める',halt. % 以下のサイトは 併合(L1,L2,L3) :- 'L1とL2のどちらかが[]の場合停止できる'(L1,L2,L3). 併合(L1,L2,L3) :- 'L1、L2どちらも[]ではない場合、併合を続ける'(L1,L2,L3). 'L1とL2のどちらかが[]の場合停止できる'([],L,L). 'L1とL2のどちらかが[]の場合停止できる'(L,[],L). 'L1、L2どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],[A|R3]) :- 'AがBより小さい場合はAを選択して併合を続ける'([A|R1],[B|R2],[A|R3]). 'L1、L2どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],[B|R3]) :- 'AがBに等しいか大きい場合はBを選択して併合を続ける'([A|R1],[B|R2],[B|R3]). 'AがBより小さい場合はAを選択して併合を続ける'([A|R1],[B|R2],[A|R3]) :- A @< B, 併合(R1,[B|R2],R3). 'AがBに等しいか大きい場合はBを選択して併合を続ける'([A|R1],[B|R2],[B|R3]) :- A @>= B, 併合([A|R1],R2,R3). % 以下のサイトは 併合(L1,L2,L3) :- 'L1とL2のどちらかが[]の場合停止できる'(L1,L2,L3). 併合(L1,L2,L3) :- 'L1、L2どちらも[]ではない場合、併合を続ける'(L1,L2,L3). 'L1とL2のどちらかが[]の場合停止できる'([],L,L). 'L1とL2のどちらかが[]の場合停止できる'(L,[],L). 'L1、L2どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],[A|R3]) :- 'AがBより小さい場合はAを選択して併合を続ける'([A|R1],[B|R2],[A|R3]). 'L1、L2どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],[B|R3]) :- 'AがBに等しいか大きい場合はBを選択して併合を続ける'([A|R1],[B|R2],[B|R3]). 'AがBより小さい場合はAを選択して併合を続ける'([A|R1],[B|R2],[A|R3]) :- A @< B, 併合(R1,[B|R2],R3). 'AがBに等しいか大きい場合はBを選択して併合を続ける'([A|R1],[B|R2],[B|R3]) :- A @>= B, 併合([A|R1],R2,R3). % 以下のサイトは 併合(L1,L2,L3) :- 'L1とL2のどちらかが[]の場合停止できる'(L1,L2,L3). 併合(L1,L2,L3) :- 'L1、L2どちらも[]ではない場合、併合を続ける'(L1,L2,L3). 'L1とL2のどちらかが[]の場合停止できる'([],L,L). 'L1とL2のどちらかが[]の場合停止できる'(L,[],L). 'L1、L2どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],[A|R3]) :- A @< B, 併合(R1,[B|R2],R3). 'L1、L2どちらも[]ではない場合、併合を続ける'([A|R1],[B|R2],[B|R3]) :- A @>= B, 併合([A|R1],R2,R3). % 以下のサイトは % family.txt mother_of(sazae, tarao). mother_of(fune, sazae). father_of(namihei, sazae). father_of(namihei, katsuo). father_of(namihei, wakame). parent_of(A, B) :- father_of(A, B). parent_of(A, B) :- mother_of(A, B). grandparent_of(A, B) :- parent_of(A, C), parent_of(C, B). grandfather_of(A, B) :- father_of(A, C), parent_of(C, B). grandmother_of(A, B) :- mother_of(A, C), parent_of(C, B). aunt_of(A, B) :- female(A), \+(parent(A, B)), grandparent(C, B), parent(C, A). great_aunt_of(A, B) :- parent_of(C, B), aunt_of_A, C). uncle_of(A, B) :- male(A), \+(parent_of(A, B)), grandparent_of(C, B), parent_of(C, A). great_uncle_of(A, B) :- parent_of(C, B), uncle_of(A, C). daughter_of(A, B) :- female(A), parent_of(B, A). son_of(A, B) :- male(A), parent_of(B, A). cousin_of(A, B) :- grandparent_of(C, A), grandparent_of(C, B). lame_cousin_of(A, B) :- cousin_of(C, B), parent_of(A, C). lame_cousin_of(A, B) :- cousin_of(C, A), parent_of(B, C). second_cousin_of(A, B) :- parent_of(C, A), parent_of(D, B), cousin_of(C, D). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1418278634/168 # お題:前に詰めた # # 初売りのためにお客さんが並んでいます。 # 店の前の32マスにはお客さん(i)、空き(.)、警備員(P)がいます。 # # ← 前 # 店 iii.ii.i..ii..P.ii..i..Pii.ii... # # 混んできたので一歩前に詰めてもらうことにしました。 # 前方のお客さんから順に前に空きがあれば一歩前に進んでもらいます。 # 空きが複数あっても、進むのは一歩だけです。 # 警備員は動かず、お客さんは警備員を越えられません。 # # 店 iii.ii.i..ii..P.ii..i..Pii.ii... # ↓ # 店 iiiii.i..ii...Pii..i...Piiii.... # # さて、前に詰めた状態が与えられたとき、 # 詰める前にあり得たすべての状態を示してください。 # たとえば、以下のようにあり得た状態がない場合もあります。 # # 店 ......iP(以下略) # # '初売りのためにお客さんが並んでいます。 店の前の32マスにはお客さん(i)、空き(.)、警備員(P)がいます。 ← 前 店 iii.ii.i..ii..P.ii..i..Pii.ii... 混んできたので一歩前に詰めてもらうことにしました。 前方のお客さんから順に前に空きがあれば一歩前に進んでもらいます。 空きが複数あっても、進むのは一歩だけです。 警備員は動かず、お客さんは警備員を越えられません。 店 iii.ii.i..ii..P.ii..i..Pii.ii... ↓ 店 iiiii.i..ii...Pii..i...Piiii.... さて、前に詰めた状態が与えられたとき、 詰める前にあり得たすべての状態を示してください。 たとえば、以下のようにあり得た状態がない場合もあります。 店 ......iP(以下略)'(A,B) :- atom_chars(A,L1), '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'(L1,L2), atom_chars(B,L2), \+(A = B). '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'([],[]). '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'(['i'|R1],['.','i'|R2]) :- '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'(R1,R2). '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'([A|R1],[A|R2]) :- '前に詰めた状態が与えられたとき、詰める前にあり得たすべての状態を示す。'(R1,R2). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦), ( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_1または0), 出力する(_西暦,_1または0), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数), '52回なら1を、53回なら0を'(_月曜日の回数,_0または1). 'その年に月曜日が何回あるか数え'(_西暦,_月曜日の回数) :- findall(1,( 日付と曜日の生成(_西暦,1,1,_年,_月,_日,月曜), ( \+(_年 = _西暦),!,fail;true)),L), length(L,_月曜日の回数). '52回なら1を、53回なら0を'(52,1). '52回なら1を、53回なら0を'(53,0). 出力する(_西暦,_1または0) :- writef('%t年 %t\n',[_西暦,_1または0]). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1889,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数,_年,_月,_日,_曜日) :- '日付と曜日の生成'(_年_1,_月_1,_日_1,0,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_日数,_日数,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_起点日からの日数_1,_起点日からの日数,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), succ(_起点日からの日数_1,_起点日からの日数_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_起点日からの日数_2,_起点日からの日数,_年,_月,_日,_曜日). '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). '日付と曜日の生成'(_起点年月日文字列,_年月日文字列,_曜日) :- 年月日文字列から整数年月日を得る(_起点年月日文字列,_起点年,_起点月,_起点日), '日付と曜日の生成'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日), 整数から文字列(4,_年,_年文字列), 整数から文字列(2,_月,_月文字列), 整数から文字列(2,_日,_日文字列), atomic_list_concat([_年文字列,_月文字列,_日文字列],_年月日文字列). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). 整数から文字列(_文字列桁,_整数,_定数) :- '整数・文字番号変換'(_整数,_文字番号ならび), ならびの長さ(_文字番号ならび,_ならびの長さ), _不足桁 is _文字列桁 - _ならびの長さ, 頭部に零を詰める(_不足桁,_文字番号ならび,_整形された文字番号ならび), '定数・文字番号変換'(_定数,_整形された文字番号ならび),!. 年月日文字列から整数年月日を得る(_年月日文字列,_年,_月,_日) :- sub_atom(_年月日文字列,0,4,4,_年文字列), sub_atom(_年月日文字列,2,2,2,_月文字列), sub_atom(_年月日文字列,4,2,0,_日文字列), 文字列ならびから整数ならびを得る([_年文字列,_月文字列,_日文字列],[_年,_月,_日]). 文字列ならびから整数ならびを得る([],[]). 文字列ならびから整数ならびを得る([_文字列|R1],[_整数|R2]) :- get_term_from_atom(_文字列,_整数,[]), 文字列ならびから整数ならびを得る(R1,R2). ならびの長さ(_ならび,_ならびの長さ) :- length(_ならび,_ならびの長さ). '整数・文字番号変換'(_整数,_文字番号ならび) :- number_codes(_整数,_文字番号ならび). 頭部に零を詰める(0,_文字ならび,_文字ならび) :- !. 頭部に零を詰める(_桁,[_|_未決定ならび],_文字ならび) :- _桁 < 0,!, _残り桁 is _桁 + 1, 頭部に零を詰める(_残り桁,_未決定ならび,_文字ならび). 頭部に零を詰める(_桁,_文字ならび,[48|_未決定ならび]) :- _残り桁 is _桁 - 1, 頭部に零を詰める(_残り桁,_文字ならび,_未決定ならび). '定数・文字番号変換'(_定数,_文字番号ならび) :- atom_codes(_定数,_文字番号ならび). % 以下のサイトは '日付と曜日の生成'(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). '日付と曜日の生成'(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), '日付と曜日の生成'(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). 翌日(_年,12,31,_翌日の年,1,1) :- succ(_年,_翌日の年),!. 翌日(_年,2,29,_年,3,1) :- うるう年(_年),!. 翌日(_年,2,28,_年,3,1) :- \+(うるう年(_年)),!. 翌日(_年,_月,_日,_年,_翌日の月,1) :- _翌日の月 is _月 + 1, '十二月・二月を除く月末日'(_月,_日),!. 翌日(_年,_月,_日,_年,_月,_翌日の日) :- succ(_日,_翌日の日). '十二月・二月を除く月末日'(_月,30) :- 小の月(_月),!. '十二月・二月を除く月末日'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). % 以下のサイトは 等差数列([_],_公差) :- 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)). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数列) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N), findall(_フィボナッチ数,フィボナッチ数(_,_フィボナッチ数),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), L1=[],!. フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(N,L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(0,[0]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(1,[0,1]) :- !. 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化(N,L), 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 'フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である。2からNまでのフィボナッチ数を登録する'(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C), (L1=[],!,fail;fail). フィボナッチ数は二つ前のフィボナッチ数と一つ前のフィボナッチ数の和である(A,B,C) :- フィボナッチ数(B,_一つ前のフィボナッチ数), フィボナッチ数(C,_二つ前のフィボナッチ数), _フィボナッチ数 is _一つ前のフィボナッチ数 + _二つ前のフィボナッチ数, フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数). フィボナッチ数が未登録ならば登録する(A,_フィボナッチ数) :- \+(フィボナッチ数(A,_)), assertz(フィボナッチ数(A,_フィボナッチ数)). 初期化(N,L) :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)), 'Nから0までの逆順リストを用意する'(L). 'Nから0までの逆順リストを用意する'(N,L) :- findall(M,between(0,N,M),L1), reverse(L1,L). % 以下のサイトは :- dynamic(フィボナッチ数/2). 'repeat-failループでのフィボナッチ数列の計算'(N,_) :- 初期化, findall(M,between(0,N,M),L1), reverse(L1,L2), フィボナッチ数の解決(L2,N). 'repeat-failループでのフィボナッチ数列の計算'(_,_フィボナッチ数列) :- findall(M,フィボナッチ数(_,M),_フィボナッチ数列). 初期化 :- abolish(フィボナッチ数/2), assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数の解決(L,N) :- repeat, append(L1,[A,B,C|L2],L), フィボナッチ数(B,V_1), フィボナッチ数(C,V_2), V is V_1 + V_2, \+(フィボナッチ数(A,V)), assertz(フィボナッチ数(A,V)), (L1=[],!,fail;fail). % 以下のサイトは :- dynamic(フィボナッチ数/2). :- dynamic(id/1). 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数) :- フィボナッチ数プログラムの初期化(N), フィボナッチ数の解決(N). 'repeat-failループでのフィボナッチ数列の計算'(N,_フィボナッチ数) :- フィボナッチ数(N,_フィボナッチ数). フィボナッチ数プログラムの初期化(N) :- フィボナッチ数とidをabolish, フィボナッチ数0番目と1番目の定義, フィボナッチ数構造の定義(N). フィボナッチ数とidをabolish :- abolish(フィボナッチ数/2), abolish(id/1). フィボナッチ数0番目と1番目の定義 :- assertz(フィボナッチ数(0,0)), assertz(フィボナッチ数(1,1)). フィボナッチ数構造の定義(N) :- between(2,N,M), asserta(id(M)), asserta(フィボナッチ数(M,V)), N = M. フィボナッチ数の解決(N) :- 先頭のidから順にMとVを得る(M,V), (idの先頭データのフィボナッチ数が解決済みならば(M,N,V),!,fail; 'Vが未解決の時は、フィボナッチ数を二つ前と一つ前のフィボナッチ数の和に更新する'(M,V)). 先頭のidから順にMとVを得る(M,V) :- 先頭のidから順にMと(M), 'Vを得る'(M,V). 先頭のidから順にMと(M) :- repeat, id(M). 'Vを得る'(M,V) :- フィボナッチ数(M,V). idの先頭データのフィボナッチ数が解決済みならば(M,N,V) :- M = N, integer(V). 'Vが未解決の時は、フィボナッチ数を二つ前と一つ前のフィボナッチ数の和に更新する'(M,V) :- 'Vが未解決の時は'(V), 二つ前のフィボナッチ数と一つ前のフィボナッチ数を得る(M,V_1,V_2), 'V_1とV_2が共に整数の時はVはV_1とV_2の和である'(V_1,V_2,V), フィボナッチ数の更新(M,V), fail. 'Vが未解決の時は'(V) :- \+(integer(V)). 二つ前のフィボナッチ数と一つ前のフィボナッチ数を得る(M,V_1,V_2) :- 二つ前のフィボナッチ数と(M,V_2), 一つ前のフィボナッチ数を得る(M,V_1). 二つ前のフィボナッチ数と(M,V_2) :- M_2 is M - 2, フィボナッチ数(M_2,V_2). 一つ前のフィボナッチ数を得る(M,V_1) :- succ(M_1,M), フィボナッチ数(M_1,V_1). 'V_1とV_2が共に整数の時はVはV_1とV_2の和である'(V_1,V_2,V) :- integer(V_1), integer(V_2), V is V_1 + V_2. フィボナッチ数の更新(M,V) :- retract(フィボナッチ数(M,_)), assertz(フィボナッチ数(M,V)). % 以下のサイトは # # 匿名変数リストを使った割り算 # 匿名変数リストを使った割り算(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(_変数). % 以下のサイトは 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が1つだけ存在する場合(_ガウス行列,_解ならび),!. 連立一次方程式の一般解(_ガウス行列,解は無数に存在する) :- 解が無数にある場合(_ガウス行列),!. 連立一次方程式の一般解(_ガウス行列,解は存在しない) :- 解がない場合(_ガウス行列). 解が1つだけ存在する場合(_ガウス行列,_解ならび) :- '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列), 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび). '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(_,[]) :- !. '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N,[L|R]) :- 先頭から0がN要素(N,L), succ(N,N_2), '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N_2,R). 先頭から0がN要素(N,L) :- append(L1,[A|_],L), \+(A=0),!, length(L1,N). 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび) :- findall(_解,( member(_行,_既約ガウス行列), last(_行,_解)),_解ならび). 解が無数にある場合(_ガウス行列) :- length(_ガウス行列,N), 行列の階数(_ガウス行列,_ガウス行列の階数), \+(N = _ガウス行列の階数). 解がない場合(_ガウス行列). % 以下のサイトは # 最大の利益 # FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、(108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 # # ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。 # # 入力 # 最初の行に整数 N が与えられる。 # # 続くN行に整数 R[t] (t=1,2,,,N) が順番に与えられる。 # # 出力 # 最大値を1行に出力せよ。 # # 制約 # 2?N?200000 # 1?R[t]?109 # 入力例 1 # 6 # 2 # 3 # 1 # 3 # 4 # 3 # 入力例 1 に対する出力 # 3 # 入力例 2 # 4 # 4 # 1 # 2 # 1 # 入力例 2 に対する出力 # 1 'FX取引では、異なる国の通貨を交換することで為替差の利益を得ることができます。 例えば、1ドル100円の時に 1000ドル買い、価格変動により 1ドル 108円になった時に売ると、 (108円 − 100円) × 1000ドル = 8000円の利益を得ることができます。 ある通貨について、時刻 t における価格 R[t] (t=1,2,,,N)が入力として与えられるので、 価格の差 R[j]−R[i] (ただし、j>i とする) の最大値を求めてください。' :- ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列為替価格ならび), 最大の為替差の利益(_ある通貨の時系列為替価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). ある通貨の時系列為替価格ならびを得る(_ある通貨の時系列価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( 価格を得る(_時系列数,_価格)), _ある通貨の時系列価格ならび). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_時系列数,_価格) :- between(1,_時系列数,_t), 整数を得る(_価格). 最大の為替差の利益(_ある通貨の時系列価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大利益,( 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益)), _最大の為替差の利益). 時刻tの投資に対する最大利益(_ある通貨の時系列価格ならび,_時刻tの投資に対する最大利益) :- append(_,[_時刻tの価格|_その後の価格ならび],_ある通貨の時系列価格ならび), 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益). 時刻tの投資に対する最大利益(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大利益) :- findmax(_時刻tの価格との価格差,( 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)), _時刻tの投資に対する最大利益). 時刻tの価格との価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % % 整数を入力する場合の一般型 % 整数を得る(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([]. % 以下のサイトは ハイカード(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), '大きい順に並んでいて、全て異なっている'(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), スートは二種類以上混じっている(_手札),!. '大きい順に並んでいて、全て異なっている'(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 数字順位(L), findall(_数字,( 大きい順に重複しない数字を取り出す(L,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5)), [_数字_1,_数字_2,_数字_3,_数字_4,_数字_5]). 大きい順に重複しない数字を取り出す(L,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- member(_数字,L), select(_数字,[_数字_1,_数字_2,_数字_3,_数字_4,_数字_5],R), \+(member(_数字,R)). ワンペア(_手札,_同位数字,_残りの手札) :- 二枚の同位な数字を取り出す(_手札,_数字,_数字,_残りの手札), この数字は残りの手札の中にはない(_数字,_残りの手札), 残りの手札の中に同位数字がない(_残りの手札),!. 二枚数字を取り出す(_手札,_数字_1,_数字_2,_残りの手札) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札). この数字は残りの手札の中にはない(_数字,_残りの手札) :- \+(member((_数字,_),_残りの手札)). 残りの手札の中に同位数字がない(_残りの手札) :- \+(同位数字がある(_残りの手札)). 同位数字がある(_手札) :- select((_数字,_),_手札,_残りの手札_2), select((_数字,_),_残りの手札_2,_). ツーペア(_手札,_数字_1,_数字_2,_残りの手札) :- 二枚数字を取り出す(_手札,_数字_1,_数字_1,_残りの手札), 二枚数字を取り出す(_残りの手札,_数字_2,[(_数字_3,_)]), '_数字_1と_数字_2は同位でなく、それぞれは_数字_3とも同位ではない'(_数字_1,_数字_2,_数字_3),!. '_数字_1と_数字_2は同位でなく、それぞれは_数字_3とも同位ではない'(_数字_1,_数字_2,_数字_3) :- '_数字_1と_数字_2は同位でなく、'(_数字_1,_数字_2), '_数字_1と_数字_2は_数字_3とも同位でない'(_数字_1,_数字_2,_数字_3). '_数字_1と_数字_2は同位でなく、'(_数字_1,_数字_2) :- \+(_数字_1 = _数字_2). '_数字_1と_数字_2は_数字_3とも同位でない'(_数字_1,_数字_2) :- \+(_数字_3 = _数字_1), \+(_数字_3 = _数字_2). 二枚数字を取り出す(_手札,_数字_1,_数字_2,_残りの手札) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札). 残りの手札に_数字がない(_数字,_残りの手札) :- \+(member((_数字,_),_残りの手札)). 残りの手札に同位数字がない(_残りの手札) :- \+((select((_数字,_),_残りの手札,_残りの手札_2),select((_数字,_),_残りの手札_2,_))). スリーカーズ(_手札,_数字) :- 三枚数字を取り出す(_手札,_数字,_数字,_数字,[(A,_),(B,_)]), 'A,B,_数字はそれぞれ異なる'(_数字,_残りの手札),!. 三枚数字を取り出す(_手札,_数字_1,__数字_2,_数字_3,_残りの手札) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札_2), select((_数字_3,_),_残りの手札_2,_残りの手札). 'A,B,_数字はそれぞれ異なる'(_数字,A,B) :- \+(A = B), '_数字はAでもBでもない'(_数字,_A,B). '_数字はAでもBでもない'(_数字,_A,B) :- \+(_数字 = A), \+(_数字 = B). 'フォー・オブ・ア・カインド'(_手札,_数字) :- 四枚数字を取り出す(_手札,_数字,_数字,_数字,_数字,_残りの手札),!. 五枚数字を取り出す(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札_2), select((_数字_3,_),_残りの手札_2,_残りの手札_3), select((_数字_4,_),_残りの手札_3,_残りの手札_4), select((_数字_5,_),_残りの手札_4,_). 四枚数字を取り出す(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_残りの手札) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札_2), select((_数字_3,_),_残りの手札_2,_残りの手札_3), select((_数字_4,_),_残りの手札_3,_残りの手札). フルハウス(_手札,_3枚の数字,_2枚の数字) :- 三枚の数字と二枚の数字が同位(_手札),!. 三枚の数字と二枚の数字が同位(_手札,_3枚の数字,_2枚の数字) :- 三枚数字を取り出す(_手札,_3枚の数字,_3枚の数字,_3枚の数字,[(_2枚の数字,_),(_2枚の数字,_)]), \+(_数字_1 = _数字_2),!. フラッシュ(_手札,_スート,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), \+(連続している(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5)), 全てのスートが同じ(_手札,_スート),!. ストレート(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は連続している(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), スートは二種類以上混じっている(_手札),!. ストレートフラッシュ(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は連続している(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), 全てのスートが同じ(_手札,_スート),!. 五枚の数字は連続している(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 五枚の数字は(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5), 連続している(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5),!. 五枚の数字は(_手札,_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- select((_数字_1,_),_手札,_残りの手札_1), select((_数字_2,_),_残りの手札_1,_残りの手札_2), select((_数字_3,_),_残りの手札_2,_残りの手札_3), select((_数字_4,_),_残りの手札_3,_残りの手札_4), select((_数字_5,_),_残りの手札_4,_残りの手札_5). '連続している'(_数字_1,_数字_2,_数字_3,_数字_4,_数字_5) :- 数字の連続(_数字_1,_数字_2), 数字の連続(_数字_2,_数字_3), 数字の連続(_数字_3,_数字_4), 数字の連続(_数字_4,_数字_5),!. スートは二種類以上混じっている(_手札) :- select((_,_スート_1),_手札,_残りの手札_1), select((_,_スート_2),_残りの手札_1,_), \+(_スート_1 = _スート_2),!. 全てのスートが同じ(_手札,_スート) :- _手札 = [(_,_スート),(_,_スート),(_,_スート),(_,_スート),(_,_スート)]. 数字の連続('A','2'). 数字の連続('2','3'). 数字の連続('3','4'). 数字の連続('4','5'). 数字の連続('5','6'). 数字の連続('6','7'). 数字の連続('7','8'). 数字の連続('8','9'). 数字の連続('9','10'). 数字の連続('10','J'). 数字の連続('J','Q'). 数字の連続('Q','K'). 数字の連続('K','A'). 数字順位(['A','K','Q','J','10','9','8','7','6','5','4','3','2']). % 以下のサイトは # 出典: プログラミングのお題スレ Part5 #252 # お題: # 整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け # # n=9563なら # ######## # #oo|||o# # #||ooo|# # ######## # #||o|oo# # #oooo|o# # #oooooo# # #ooooo|# # #oo|ooo# # ######## # # 等幅フォントじゃないとちゃんと見れないけどごめんね '整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け'(_n) :- '整数n(0<=n<1000000)をソロバンの'(_n,[],LL), 'AAに変換する'(LL). '整数n(0<=n<1000000)をソロバンの'(0,LL,LL) :- !. '整数n(0<=n<1000000)をソロバンの'(_n,LL1,LL) :- 一桁を天下に二分する(_n,[_1,_2,_3],[_4,_5,_6,_7,_8]), _n_2 is _n // 10, '整数n(0<=n<1000000)をソロバンの'(_n_2,[[_1,_2,_3,_4,_5,_6,_7,_8]|LL1],LL). 一桁を天下に二分する(_n,_天,_下) :- _n_1 is _n mod 10, _n_1_1 is _n_1 // 5, _n_1_2 is _n_1 mod 5, 天(_n_1_1,_天), 下(_n_1_2,_下). 天(0,['O','|']). 天(1,['|','O']). 下(0,['|','O','O','O','O']). 下(1,['O','|','O','O','O']). 下(2,['O','O','|','O','O']). 下(3,['O','O','O','|','O']). 下(4,['O','O','O','O','|']). 'AAに変換する'(LL) :- 梁(LL,_梁), 転置(LL,LL2), 枠の中に描く(_梁,LL2). 枠の中に描く(_梁,LL) :- writef('#%t#\n',[_梁]), forall(上から下まで枠と珠ならびを描く(_梁,LL,_表示行),writef('%t',[_表示行])), writef('#%t#\n',[_梁]). 上から下までの枠と珠ならびを描く(_梁,LL,_表示行) :- nth1(_nth1,LL,_横方向珠ならび), atomic_list_concat(_横方向珠ならび,_横方向珠文字列), 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行). 上から下までの枠と珠ならびを描く(4,_梁,_横方向珠文字列,_表示行) :- swritef(_表示行,'%t\n#%t#\n',[_梁,_横方向珠文字列]). 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行) :- \+(_nth1=4), swritef(_表示行,'#%t#\n',[_横方向珠文字列]). 梁(LL,_梁) :- length(LL,_幅), lenth(L,_幅), all(L,'#'), atom_chars(_梁,L). % 以下のサイトは # 出題場所 :: 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). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/89 # 0と1のみでランダムに生成した文字列Sがある # 長さは2<=S<=1000である # 11001010110100011001011011111111111111000000000010111000000 # # 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX # 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN # としたときのMXとMNを求めよ # 見当たらない場合はFALSEを出力しろ # # S=110001010100 # MX=3 (000が一番長い) # MN=2 (11または00が二番目に長い) # # S=111111 # MX=3 (111111が一番長い) # MN=FALSE (2番目に短いものが存在しない) # # S=10 # MX=FALSE (1番長いのが存在しない) # MX=FALSE (2番目に短いものが存在しない) # # '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- '0と1のみでランダムに生成した文字列Sがある'(_文字列), forall('同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列), write('S=%t\nMX=%t,MN=%t\n',[_文字列,_最長文字列,_短い方から二番目の文字列])),!. '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- write('FALSE\n'). '0と1のみでランダムに生成した文字列Sがある'(_文字列) :- R is random(999) + 2, findall(_0または1,( between(2,R,_), _0または1 is random(3341) mod 2), _0または1ならび), atomic_list_concat(_0または1ならび,_文字列). '同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列) :- 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび), 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列). 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび) :- findall([_連続した文字列,_文字数],( 連続した文字列と文字数(_文字列,_連続した文字列,_文字数)), _連続した文字列_文字数ならび). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '0の連続したの文字列'(_文字列,_連続した文字列,_文字数). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '1の連続したの文字列と文字数'(_文字列,_連続した文字列,_文字数). '0の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='0'). '1の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='1'). 前後に0の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'0')), \+(sub_atom(_文字列,_開始点_2,1,_,'0')). 前後に1の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'1')), \+(sub_atom(_文字列,_開始点_2,1,_,'1')). 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列) :- 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数), 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列). 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数) :- 文字列長ならび(_連続した文字列と文字数ならび,_文字列長ならび), sort(_文字列長ならび,_整列した文字列長ならび), nth1(2,_整列した文字列長ならび,_短い方から二番目に短い文字数), append(_,[_最長文字数],_整列した文字列長ならび). 文字数ならび(_連続した文字列と文字数ならび,_文字数ならび) :- findall(_文字数,( member([_,_文字数],_連続した文字列と文字列数ならび)), _文字数ならび). 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列) :- member([_最長文字列,_最長文字数],_連続した文字列と文字数ならび), member([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/18 # 優先順位が文脈として矛盾・混乱しているようだ、優先度の高い順に # # 5で割り切れる場合は何も出力するな # 出力ごとに改行も入れろ # 4と6で割り切れる場合はFizzBuzzを出力しろ # 4で割り切れる場合はFizzを出力しろ # 6で割り切れる場合はBuzzを出力しろ # それ以外は数字を出力しろ # # ということか? # '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを' :- between(1,100,_数字), '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字), _数字 = 100. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '5で割り切れた時は何も出力するな'(_数字,_表示), '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示), 'それ以外は数字を'(_数字,_表示), '出力しろ(出力ごとに改行も入れろ)'(_表示). '5で割り切れた時は何も出力するな'(_数字,'') :- '5で割り切れた'(_数字),!. '5で割り切れた時は何も出力するな'(_,_). '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、4と6で割り切れる場合はFizzBuzzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、4で割り切れる場合はFizzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_数字,_表示) :- '5では割り切れず、6で割り切れる場合はBuzzを'(_数字,_表示),!. '5では割り切れず、Fizz、Buzz、またはFizzBuzzを表示するのは4または6で割り切れる時'(_,_). '5では割り切れず、4と6で割り切れる場合はFizzBuzzを'(_数字,'FizzBuzz') :- '5では割り切れず'(_数字), '4と6で割り切れる'(_数字),!. '5では割り切れず、4で割り切れる場合はFizzを'(_数字,'Fizz') :- '5では割り切れず、4で割り切れる'(_数字). '5では割り切れず、6で割り切れる場合はBuzzを'(_数字,'Buzz') :- '5では割り切れず、6で割り切れる'(_数字). '5では割り切れず、4で割り切れる'(_数字) :- '5では割り切れず'(_数字), '4で割り切れる'(_数字), \+('6で割り切れる'(_数字)). '5では割り切れず、6で割り切れる'(_数字) :- '5では割り切れず'(_数字), '6で割り切れる'(_数字), \+('4で割り切れる'(_数字)). '5で割り切れた'(_数字) :- 0 is _数字 mod 5. '5では割り切れず'(_数字) :- \+(0 is _数字 mod 5). '4と6で割り切れる'(_数字) :- '4で割り切れる'(_数字), '6で割り切れる'(_数字). '4で割り切れる'(_数字) :- 0 is _数字 mod 4. '6で割り切れる'(_数字) :- 0 is _数字 mod 6. 'それ以外は数字を'(_数字,V) :- var(V), _数字=V,!. 'それ以外は数字を'(_,_). '出力しろ(出力ごとに改行も入れろ)'('') :- !. '出力しろ(出力ごとに改行も入れろ)'(_表示) :- writef('%t\n',[_表示]). % 以下のサイトは 'https://twitter.com/uso_tuki/status/509652179930456064'(_投球,_捕球,_打者,_アウトカウント,_ランナー) :- 三回ストライクするとアウトになってしまうんじゃ(_投球,_捕球,_打者,_アウトカウント,_ランナー). 三回ストライクするとアウトになってしまうんじゃ(_投球,_,_打者,_,_) :- 打者に当たる(_投球), 空振り(_打者),!. 三回ストライクするとアウトになってしまうんじゃ(_投球,_捕球,_,_,_) :- ストライクゾーンを通過(_投球), 正規捕球(_捕球). 三回ストライクするとアウトになってしまうんじゃ(_,_捕球,_打者,_,_) :- 正規捕球(_捕球), 空振り(_打者). 三回ストライクするとアウトになってしまうんじゃ(_投球,_捕球,_,_アウトカウント,_ランナー) :- ストライクゾーンを通過(_投球), \+(正規捕球(_捕球)), 無死または一死(_アウトカウント), 一塁走者がいる(_ランナー). 三回ストライクするとアウトになってしまうんじゃ(_,_捕球,_打者,_アウトカウント,_ランナー) :- 空振り(_打者), \+(正規捕球(_捕球)), 無死または一死(_アウトカウント), 一塁走者がいる(_ランナー). % 以下のサイトは 挟区間文字列(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列) :- '文字列の中で副文字列Aと副文字列Bに挟まれた挟区間文字列(ただし、_挟区間文字列のなかに副文字列Aと副文字列Bは含まれない)'(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列). '文字列の中で副文字列Aと副文字列Bに挟まれた挟区間文字列(ただし、_挟区間文字列のなかに副文字列Aと副文字列Bは含まれない)'(_文字列,_副文字列A,_副文字列B,_前文字列,_挟区間文字列,_後文字列) :- '副文字列Aと副文字列Bで検索する'(_文字列,_副文字列A,_副文字列B,_前文字列_1,_挟区間文字列,_後文字列_2), '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B), 前文字列と後文字列を構成する(_前文字列_1,_副文字列A,_副文字列B,_後文字列_2,_前文字列,_後文字列). '副文字列Aと副文字列Bで検索する'(_文字列,_副文字列A,_副文字列B,_前文字列_1,_挟区間文字列,_後文字列_2) :- 検索文字列(_文字列,_前文字列_1,_副文字列A,_後文字列_1), 検索文字列(_後文字列_1,_挟区間文字列,_副文字列B,_後文字列_2), '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B). 前文字列と後文字列を構成する(_前文字列_1,_副文字列A,_副文字列B,_後文字列_2,_前文字列,_後文字列) :- atomic_list_concat([_前文字列_1,_副文字列A],_前文字列), atomic_list_concat([_副文字列B,_後文字列_2],_後文字列). 検索文字列(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '挟区間文字列の中に副文字列Aと副文字列Bは含まれない'(_挟区間文字列,_副文字列A,_副文字列B) :- \+(sub_atom(_挟区間文字列,_,_,_,_副文字列A)), \+(sub_atom(_挟区間文字列,_,_,_,_副文字列B)). % 以下のサイトは # 問題文 # (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). % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # まだ読まれていない、読み札も分かっていることとします。 # 読み札/2、既に読んでしまった札/2、自陣/1、敵陣/1がそれぞれ # 述語としして定義済みだとして、自陣、敵陣、あるいはその両方の札の # 決まり字を示すプログラムを定義してください。 # :- dynamic(読み札/1). :- dynamic(既に読んでしまった札/1). :- dynamic(自陣/1). :- dynamic(敵陣/1). 自陣または敵陣の全ての札の決まり字(_下の句,_上の句,_決まり字) :- 自陣または敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 自陣の札の決まり字(_下の句,_上の句,_決まり字) :- 自陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 敵陣の札の決まり字(_下の句,_上の句,_決まり字) :- 敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 決まり字(_上の句,_決まり字) :- 最長共通文字数(_上の句,_最長共通文字数), succ(_最長共通文字数,_決まり字の位置), sub_atom(_上の句,0,_決まり時の位置,_,_決まり字). 最長共通文字数(_上の句,_最長共通文字数) :- findmax(_先頭から最長共通文字数,( 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句), '先頭から最長共通文字数(0オリジン)'(_上の句,別の上の句,_先頭からの最長共通文字数)),_最長共通文字数). 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句) :- 読み札(_別の上の句,_), \+(_上の句 = _別の上の句). '先頭から最長共通文字数(0オリジン)'(_上の句,_別の上の句,_文字数) :- nth0(_文字数,_,_), sub_atom(_上の句,_文字数,1,_,_文字_1), sub_atom(_別の上の句,_文字数,1,_,_文字_2), \+(_文字_1=_文字_2),!. 下の句から決まり字を得る(_下の句,_決まり字) :- 自陣または敵陣(_下の句), '下の句から上の句を得る'(_下の句,_上の句), 決まり字(_上の句,_決まり字). 自陣または敵陣(_下の句) :- 自陣(_下の句). 自陣または敵陣(_下の句) :- 敵陣(_下の句). 下の句から上の句を得る(_下の句,_上の句) :- 読み札(_上の句,_下の句). findmax(_値,_目標,_最大値) :- findall(_値,_目標,_値ならび), 最大値(_値ならび,_最大値). 最大値(_標本ならび,_最大値) :- select(_最大値,_標本ならび,_残り標本ならび), forall(member(_標本_1,_残り標本ならび),_標本_1 @=< _最大値),!. /* 読み札('あきのたのかりほのいほのとまをあらみ,わがころもではつゆにぬれつつ'). 読み札('はるすぎてなつきにけらししろたへの,ころもほすてふあまのかぐやま'). 読み札('あしびきのやまどりのをのしだりをの,ながながしよをひとりかもねむ'). 読み札('たごのうらにうちいでてみればしろたへの,ふじのたかねにゆきはふりつつ'). 読み札('おくやまにもみぢふみわけなくしかの,こゑきくときぞあきはかなしき'). 読み札('かささぎのわたせるはしにおくしもの,しろきをみればよぞふけにける'). 読み札('あまのはらふりさけみればかすがなる,みかさのやまにいでしつきかも'). 読み札('わがいほはみやこのたつみしかぞすむ,よをうぢやまとひとはいふなり'). 読み札('はなのいろはうつりにけりないたづらに,わがみよにふるながめせしまに'). 読み札('これやこのゆくもかへるもわかれては,しるもしらぬもあふさかのせき'). 読み札('わたのはらやそしまかけてこぎいでぬと,ひとにはつげよあまのつりぶね'). 読み札('あまつかぜくものかよひぢふきとぢよ,をとめのすがたしばしとどめむ'). 読み札('つくばねのみねよりおつるみなのがは,こひぞつもりてふちとなりぬる'). 読み札('みちのくのしのぶもぢずりたれゆゑに,みだれそめにしわれならなくに'). 読み札('きみがためはるののにいでてわかなつむ,わがころもでにゆきはふりつつ'). 読み札('たちわかれいなばのやまのみねにおふる,まつとしきかばいまかへりこむ'). 読み札('ちはやぶるかみよもきかずたつたがは,からくれなゐにみづくくるとは'). 読み札('すみのえのきしによるなみよるさへや,ゆめのかよひぢひとめよくらむ'). 読み札('なにはがたみじかきあしのふしのまも,あはでこのよをすぐしてよとや'). 読み札('わびぬればいまはたおなじなにはなる,みをつくしてもあはむとぞおもふ'). 読み札('いまこむといひしばかりにながつきの,ありあけのつきをまちいでつるかな'). 読み札('ふくからにあきのくさきのしをるれば,むべやまかぜをあらしといふらむ'). 読み札('つきみればちぢにものこそかなしけれ,わがみひとつのあきにはあらねど'). 読み札('このたびはぬさもとりあへずたむけやま,もみぢのにしきかみのまにまに'). 読み札('なにしおはばあふさかやまのさねかづら,ひとにしられでくるよしもがな'). 読み札('をぐらやまみねのもみぢばこころあらば,いまひとたびのみゆきまたなむ'). 読み札('みかのはらわきてながるるいづみがは,つみきとてかこひしかるらむ'). 読み札('やまざとはふゆぞさびしさまさりける,ひとめもくさもかれぬとおもへば'). 読み札('こころあてにをらばやをらむはつしもの,おきまどはせるしらぎくのはな'). 読み札('ありあけのつれなくみえしわかれより,あかつきばかりうきものはなし'). 読み札('あさぼらけありあけのつきとみるまでに,よしののさとにふれるしらゆき'). 読み札('やまがはにかぜのかけたるしがらみは,ながれもあへぬもみぢなりけり'). 読み札('ひさかたのひかりのどけきはるのひに,しづごころなくはなのちるらむ'). 読み札('たれをかもしるひとにせむたかさごの,まつもむかしのともならなくに'). 読み札('ひとはいさこころもしらずふるさとは,はなぞむかしのかににほひける'). 読み札('なつのよはまだよひながらあけぬるを,くものいづこにつきやどるらむ'). 読み札('しらつゆにかぜのふきしくあきののは,つらぬきとめぬたまぞちりける'). 読み札('わすらるるみをばおもはずちかひてし,ひとのいのちのをしくもあるかな'). 読み札('あさぢふのをののしのはらしのぶれど,あまりてなどかひとのこひしき'). 読み札('しのぶれどいろにいでにけりわがこひは,ものやおもふとひとのとふまで'). 読み札('こひすてふわがなはまだきたちにけり,ひとしれずこそおもひそめしか'). 読み札('ちぎりきなかたみにそでをしぼりつつ,すゑのまつやまなみこさじとは'). 読み札('あひみてののちのこころにくらぶれば,むかしはものをおもはざりけり'). 読み札('あふことのたえてしなくはなかなかに,ひとをもみをもうらみざらまし'). 読み札('あはれともいふべき人はおもほえで,みのいたづらになりぬべきかな'). 読み札('ゆらのとをわたるふなびとかぢをたえ,ゆくへもしらぬこひのみちかな'). 読み札('やへむぐらしげれるやどのさびしきに,ひとこそみえねあきはきにけり'). 読み札('かぜをいたみいはうつなみのおのれのみ,くだけてものをおもふころかな'). 読み札('みかきもりゑじのたくひのよるはもえ,ひるはきえつつものをこそおもへ'). 読み札('きみがためをしからざりしいのちさへ,ながくもがなとおもひけるかな'). 読み札('かくとだにえやはいぶきのさしもぐさ,さしもしらじなもゆるおもひを'). 読み札('あけぬればくるるものとはしりながら,なほうらめしきあさぼらけかな'). 読み札('なげきつつひとりぬるよのあくるまは,いかにひさしきものとかはしる'). 読み札('わすれじのゆくすゑまではかたければ,けふをかぎりのいのちともがな'). 読み札('たきのおとはたえてひさしくなりぬれど,なこそながれてなほきこえけれ'). 読み札('あらざらむこのよのほかのおもひでに,いまひとたびのあふこともがな'). 読み札('めぐりあひてみしやそれともわかぬまに,くもがくれにしよはのつきかな'). 読み札('ありまやまゐなのささはらかぜふけば,いでそよひとをわすれやはする'). 読み札('やすらはでねなましものをさよふけて,かたぶくまでのつきをみしかな'). 読み札('おほえやまいくののみちのとほければ,まだふみもみずあまのはしだて'). 読み札('いにしへのならのみやこのやへざくら,けふここのへににほひぬるかな'). 読み札('よをこめてとりのそらねははかるとも,よにあふさかのせきはゆるさじ'). 読み札('いまはただおもひたえなむとばかりを,ひとづてならでいふよしもがな'). 読み札('あさぼらけうぢのかはぎりたえだえに,あらはれわたるせぜのあじろぎ'). 読み札('うらみわびほさぬそでだにあるものを,こひにくちなむなこそをしけれ'). 読み札('もろともにあはれとおもへやまざくら,はなよりほかにしるひともなし'). 読み札('はるのよのゆめばかりなるたまくらに,かひなくたたむなこそをしけれ'). 読み札('こころにもあらでうきよにながらへば,こひしかるべきよはのつきかな'). 読み札('あらしふくみむろのやまのもみぢばは,たつたのかはのにしきなりけり'). 読み札('さびしさにやどをたちいでてながむれば,いづこもおなじあきのゆふぐれ'). 読み札('ゆふさればかどたのいなばおとづれて,あしのまろやにあきかぜぞふく'). 読み札('おとにきくたかしのはまのあだなみは,かけじやそでのぬれもこそすれ'). 読み札('たかさごのをのへのさくらさきにけり,とやまのかすみたたずもあらなむ'). 読み札('うかりけるひとをはつせのやまおろしよ,はげしかれとはいのらぬものを'). 読み札('ちぎりおきしさせもがつゆをいのちにて,あはれことしのあきもいぬめり'). 読み札('わたのはらこぎいでてみればひさかたの,くもゐにまがふおきつしらなみ'). 読み札('せをはやみいはにせかるるたきがはの,われてもすゑにあはむとぞおもふ'). 読み札('あはぢしまかよふちどりのなくこゑに,いくよねざめぬすまのせきもり'). 読み札('あきかぜにたなびくくものたえまより,もれいづるつきのかげのさやけさ'). 読み札('ながからむこころもしらずくろかみの,みだれてけさはものをこそおもへ'). 読み札('ほととぎすなきつるかたをながむれば,ただありあけのつきぞのこれる'). 読み札('おもひわびさてもいのちはあるものを,うきにたへぬはなみだなりけり'). 読み札('よのなかよみちこそなけれおもひいる,やまのおくにもしかぞなくなる'). 読み札('ながらへばまたこのごろやしのばれむ,うしとみしよぞいまはこひしき'). 読み札('よもすがらものおもふころはあけやらで,ねやのひまさへつれなかりけり'). 読み札('なげけとてつきやはものをおもはする,かこちがほなるわがなみだかな'). 読み札('むらさめのつゆもまだひぬまきのはに,きりたちのぼるあきのゆふぐれ'). 読み札('なにはえのあしのかりねのひとよゆゑ,みをつくしてやこひわたるべき'). 読み札('たまのをよたえなばたえねながらへば,しのぶることのよわりもぞする'). 読み札('みせばやなをじまのあまのそでだにも,ぬれにぞぬれしいろはかはらず'). 読み札('きりぎりすなくやしもよのさむしろに,ころもかたしきひとりかもねむ'). 読み札('わがそではしほひにみえぬおきのいしの,ひとこそしらねかわくまもなし'). 読み札('よのなかはつねにもがもななぎさこぐ,あまのをぶねのつなでかなしも'). 読み札('みよしののやまのあきかぜさよふけて,ふるさとさむくころもうつなり'). 読み札('おほけなくうきよのたみにおほふかな,わがたつそまにすみぞめのそで'). 読み札('はなさそふあらしのにはのゆきならで,ふりゆくものはわがみなりけり'). 読み札('こぬひとをまつほのうらのゆふなぎに,やくやもしほのみもこがれつつ'). 読み札('かぜそよぐならのをがはのゆふぐれは,みそぎぞなつのしるしなりける'). 読み札('ひともをしひともうらめしあぢきなく,よをおもふゆゑにものおもふみは'). 読み札('ももしきやふるきのきばのしのぶにも,なほあまりあるむかしなりけり'). */ % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # 現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。 # '現在の自陣にある札のうち、一文字目が決まり字である札は何枚あるでしょうか。'(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_何枚) :- 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,_自陣にある札ならび,_度数ならび), 目標の度数(member(1,_度数ならび),_何枚). 自陣の札の上の句の先頭の文字の未出の読み札数(_,_,[],[]). 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,[_下の句|R1],[_度数|R2]) :- 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭文字), 上の句の先頭の文字の度数を得る(_まだ読んでいない札,_既に読んでしまった札,_上の句の先頭の文字,_度数), 自陣の札の上の句の先頭の文字の未出の読み札数(_まだ読んでいない札,_既に読んでしまった札,R1,R2). 下の句から上の句の先頭の文字を得る(_下の句,_上の句の先頭の文字) :- 百人一首(_歌), '上の句と下の句'(_歌,_上の句,_下の句), '上の句の先頭の文字、下の句の先頭の文字'(_歌,_,_,_上の句の先頭の文字,_). '上の句と下の句'(_歌,_上の句,_下の句) :- sub_atom(_歌,S,1,R,' '), sub_atom(_歌,_,R,0,_下の句), 目標の度数(sub_atom(_下の句,_,1,_,' ')),1), sub_atom(_歌,0,S,_,_上の句). '上の句の先頭の文字、下の句の先頭の文字'(_歌,_上の句,_下の句,_上の句の先頭の文字,_下の句の先頭の文字) :- '上の句と下の句'(_歌,_上の句,_下の句), sub_atom(_上の句,0,1,_,_上の句の先頭の文字), sub_atom(_下の句,0,1,_,_下の句の先頭の文字). 上の句の先頭の文字の度数を得る(_既に読んでしまった札,_上の句の先頭の文字,_度数) :- 目標の度数(上の句の先頭の文字の(_上の句の先頭の文字),_度数). 上の句の先頭の文字の(_上の句の先頭の文字) :- 百人一首(_歌), \+(member(_歌,_既に読んでしまった札)), sub_atom(_歌,0,1,_,_上の句の先頭の文字). 百人一首('あきのたの かりほのいほの とまをあらみ わがころもでは つゆにぬれつつ'). 百人一首('はるすぎて なつきにけらし しろたへの ころもほすてふ あまのかぐやま'). 百人一首('あしびきの やまどりのをの しだりをの ながながしよを ひとりかもねむ'). 百人一首('たごのうらに うちいでてみれば しろたへの ふじのたかねに ゆきはふりつつ'). 百人一首('おくやまに もみぢふみわけ なくしかの こゑきくときぞ あきはかなしき'). 百人一首('かささぎの わたせるはしに おくしもの しろきをみれば よぞふけにける'). 百人一首('あまのはら ふりさけみれば かすがなる みかさのやまに いでしつきかも'). 百人一首('わがいほは みやこのたつみ しかぞすむ よをうぢやまと ひとはいふなり'). 百人一首('はなのいろは うつりにけりな いたづらに わがみよにふる ながめせしまに'). 百人一首('これやこの ゆくもかへるも わかれては しるもしらぬも あふさかのせき'). 百人一首('わたのはら やそしまかけて こぎいでぬと ひとにはつげよ あまのつりぶね'). 百人一首('あまつかぜ くものかよひぢ ふきとぢよ をとめのすがた しばしとどめむ'). 百人一首('つくばねの みねよりおつる みなのがは こひぞつもりて ふちとなりぬる'). 百人一首('みちのくの しのぶもぢずり たれゆゑに みだれそめにし われならなくに'). 百人一首('きみがため はるののにいでて わかなつむ わがころもでに ゆきはふりつつ'). 百人一首('たちわかれ いなばのやまの みねにおふる まつとしきかば いまかへりこむ'). 百人一首('ちはやぶる かみよもきかず たつたがは からくれなゐに みづくくるとは'). 百人一首('すみのえの きしによるなみ よるさへや ゆめのかよひぢ ひとめよくらむ'). 百人一首('なにはがた みじかきあしの ふしのまも あはでこのよを すぐしてよとや'). 百人一首('わびぬれば いまはたおなじ なにはなる みをつくしても あはむとぞおもふ'). 百人一首('いまこむと いひしばかりに ながつきの ありあけのつきを まちいでつるかな'). 百人一首('ふくからに あきのくさきの しをるれば むべやまかぜを あらしといふらむ'). 百人一首('つきみれば ちぢにものこそ かなしけれ わがみひとつの あきにはあらねど'). 百人一首('このたびは ぬさもとりあへず たむけやま もみぢのにしき かみのまにまに'). 百人一首('なにしおはば あふさかやまの さねかづら ひとにしられで くるよしもがな'). 百人一首('をぐらやま みねのもみぢば こころあらば いまひとたびの みゆきまたなむ'). 百人一首('みかのはら わきてながるる いづみがは いつみきとてか こひしかるらむ'). 百人一首('やまざとは ふゆぞさびしさ まさりける ひとめもくさも かれぬとおもへば'). 百人一首('こころあてに をらばやをらむ はつしもの おきまどはせる しらぎくのはな'). 百人一首('ありあけの つれなくみえし わかれより あかつきばかり うきものはなし'). 百人一首('あさぼらけ ありあけのつきと みるまでに よしののさとに ふれるしらゆき'). 百人一首('やまがはに かぜのかけたる しがらみは ながれもあへぬ もみぢなりけり'). 百人一首('ひさかたの ひかりのどけき はるのひに しづごころなく はなのちるらむ'). 百人一首('たれをかも しるひとにせむ たかさごの まつもむかしの ともならなくに'). 百人一首('ひとはいさ こころもしらず ふるさとは はなぞむかしの かににほひける'). 百人一首('なつのよは まだよひながら あけぬるを くものいづこに つきやどるらむ'). 百人一首('しらつゆに かぜのふきしく あきののは つらぬきとめぬ たまぞちりける'). 百人一首('わすらるる みをばおもはず ちかひてし ひとのいのちの をしくもあるかな'). 百人一首('あさぢふの をののしのはら しのぶれど あまりてなどか ひとのこひしき'). 百人一首('しのぶれど いろにいでにけり わがこひは ものやおもふと ひとのとふまで'). 百人一首('こひすてふ わがなはまだき たちにけり ひとしれずこそ おもひそめしか'). 百人一首('ちぎりきな かたみにそでを しぼりつつ すゑのまつやま なみこさじとは'). 百人一首('あひみての のちのこころに くらぶれば むかしはものを おもはざりけり'). 百人一首('あふことの たえてしなくは なかなかに ひとをもみをも うらみざらまし'). 百人一首('あはれとも いふべき人は 思ほえで 身のいたづらに なりぬべきかな'). 百人一首('ゆらのとを わたるふなびと かぢをたえ ゆくへもしらぬ こひのみちかな'). 百人一首('やへむぐら しげれるやどの さびしきに ひとこそみえね あきはきにけり'). 百人一首('かぜをいたみ いはうつなみの おのれのみ くだけてものを おもふころかな'). 百人一首('みかきもり ゑじのたくひの よるはもえ ひるはきえつつ ものをこそおもへ'). 百人一首('きみがため をしからざりし いのちさへ ながくもがなと おもひけるかな'). 百人一首('かくとだに えやはいぶきの さしもぐさ さしもしらじな もゆるおもひを'). 百人一首('あけぬれば くるるものとは しりながら なほうらめしき あさぼらけかな'). 百人一首('なげきつつ ひとりぬるよの あくるまは いかにひさしき ものとかはしる'). 百人一首('わすれじの ゆくすゑまでは かたければ けふをかぎりの いのちともがな'). 百人一首('たきのおとは たえてひさしく なりぬれど なこそながれて なほきこえけれ'). 百人一首('あらざらむ このよのほかの おもひでに いまひとたびの あふこともがな'). 百人一首('めぐりあひて みしやそれとも わかぬまに くもがくれにし よはのつきかな'). 百人一首('ありまやま ゐなのささはら かぜふけば いでそよひとを わすれやはする'). 百人一首('やすらはで ねなましものを さよふけて かたぶくまでの つきをみしかな'). 百人一首('おほえやま いくののみちの とほければ まだふみもみず あまのはしだて'). 百人一首('いにしへの ならのみやこの やへざくら けふここのへに にほひぬるかな'). 百人一首('よをこめて とりのそらねは はかるとも よにあふさかの せきはゆるさじ'). 百人一首('いまはただ おもひたえなむ とばかりを ひとづてならで いふよしもがな'). 百人一首('あさぼらけ うぢのかはぎり たえだえに あらはれわたる せぜのあじろぎ'). 百人一首('うらみわび ほさぬそでだに あるものを こひにくちなむ なこそをしけれ'). 百人一首('もろともに あはれとおもへ やまざくら はなよりほかに しるひともなし'). 百人一首('はるのよの ゆめばかりなる たまくらに かひなくたたむ なこそをしけれ'). 百人一首('こころにも あらでうきよに ながらへば こひしかるべき よはのつきかな'). 百人一首('あらしふく みむろのやまの もみぢばは たつたのかはの にしきなりけり'). 百人一首('さびしさに やどをたちいでて ながむれば いづこもおなじ あきのゆふぐれ'). 百人一首('ゆふされば かどたのいなば おとづれて あしのまろやに あきかぜぞふく'). 百人一首('おとにきく たかしのはまの あだなみは かけじやそでの ぬれもこそすれ'). 百人一首('たかさごの をのへのさくら さきにけり とやまのかすみ たたずもあらなむ'). 百人一首('うかりける ひとをはつせの やまおろしよ はげしかれとは いのらぬものを'). 百人一首('ちぎりおきし させもがつゆを いのちにて あはれことしの あきもいぬめり'). 百人一首('わたのはら こぎいでてみれば ひさかたの くもゐにまがふ おきつしらなみ'). 百人一首(' せをはやみ いはにせかるる たきがはの われてもすゑに あはむとぞおもふ'). 百人一首('あはぢしま かよふちどりの なくこゑに いくよねざめぬ すまのせきもり'). 百人一首('あきかぜに たなびくくもの たえまより もれいづるつきの かげのさやけさ'). 百人一首('ながからむ こころもしらず くろかみの みだれてけさは ものをこそおもへ'). 百人一首('ほととぎす なきつるかたを ながむれば ただありあけの つきぞのこれる'). 百人一首('おもひわび さてもいのちは あるものを うきにたへぬは なみだなりけり'). 百人一首('よのなかよ みちこそなけれ おもひいる やまのおくにも しかぞなくなる'). 百人一首('ながらへば またこのごろや しのばれむ うしとみしよぞ いまはこひしき'). 百人一首('よもすがら ものおもふころは あけやらで ねやのひまさへ つれなかりけり'). 百人一首('なげけとて つきやはものを おもはする かこちがほなる わがなみだかな'). 百人一首('むらさめの つゆもまだひぬ まきのはに きりたちのぼる あきのゆふぐれ'). 百人一首('なにはえの あしのかりねの ひとよゆゑ みをつくしてや こひわたるべき'). 百人一首('たまのをよ たえなばたえね ながらへば しのぶることの よわりもぞする'). 百人一首('みせばやな をじまのあまの そでだにも ぬれにぞぬれし いろはかはらず'). 百人一首('きりぎりす なくやしもよの さむしろに ころもかたしき ひとりかもねむ'). 百人一首('わがそでは しほひにみえぬ おきのいしの ひとこそしらね かわくまもなし'). 百人一首('よのなかは つねにもがもな なぎさこぐ あまのをぶねの つなでかなしも'). 百人一首('みよしのの やまのあきかぜ さよふけて ふるさとさむく ころもうつなり'). 百人一首('おほけなく うきよのたみに おほふかな わがたつそまに すみぞめのそで'). 百人一首('はなさそふ あらしのにはの ゆきならで ふりゆくものは わがみなりけり'). 百人一首('こぬひとを まつほのうらの ゆふなぎに やくやもしほの みもこがれつつ'). 百人一首('かぜそよぐ ならのをがはの ゆふぐれは みそぎぞなつの しるしなりける'). 百人一首('ひともをし ひともうらめし あぢきなく よをおもふゆゑに ものおもふみは'). 百人一首('ももしきや ふるきのきばの しのぶにも なほあまりある むかしなりけり'). 目標の度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0.0,200.0,_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), read_term_from_atom(_身長文字列,_身長,[]), read_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重) :- 収束条件を満たす(_体重_下,_体重_上,_体重),!. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下_1,_体重_上_1,_身長,_BMI,_体重) :- '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_体重_下,_体重_上,_身長,_BMI,_体重). 収束条件を満たす(_体重_下,_体重_上,_体重) :- (_体重_上 - _体重_下) < 0.1, _体重 is (_体重_上 + _体重_下) / 2. '新しい体重とその時のBMIを計算して、次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_身長,_BMI,_BMI_2,_体重_下,_体重_上) :- '新しい体重とその時のBMIを計算する'(_体重_下_1,_体重_上_1,_身長,_BMI_2,_体重_2), '次の体重の計算区間を得る'(_体重_下_1,_体重_上_1,_体重_2,_BMI,_BMI_2,_体重_下,_体重_上). '新しい体重とその時のBMIを計算する'(_体重_下,_体重_上,_身長,_BMI_2,_体重_2) :- _体重_2 is (_体重_下 + _体重_上) / 2, _BMI_2 is _体重_2 / ((_身長 / 100) ^ 2). '次の体重の計算区間を得る'(_体重_下,_,_体重_2,_BMI,_BMI_2,_体重_下,_体重_2) :- _BMI_2 =< _BMI,!. '次の体重の計算区間を得る'(_体重_下,_体重_上,_体重_2,_BMI,_BMI_2,_体重_2,_体重_上). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % これはsplitをわかりやすいように簡略化した定義です。 % より完全なsplit/3の定義はこちらをご覧ください % split(_文,_区切り語ならび,_区切られた語ならび) :- 区切り語ならびの変形(_区切り語ならび,SeparatersL), atom_chars(_文,_文字ならび), split_list_1(_文字ならび,SeparatersL,_区切られた語ならび). sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X,!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_list([],SeparatersL,[]). split_list(L1,SeparatersL,[L2|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), split_list(R2,SeparatersL,R). split_list(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list(R2,SeparatersL,X). split_list_1([],SeparatersL,[]). split_list_1(L1,SeparatersL,[A|R]) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), \+(L2=[]), atom_chars(A,L2), split_list_1(R2,SeparatersL,R). split_list_1(L1,SeparatersL,X) :- \+(L1=[]), split_list_2(L1,SeparatersL,L2,R2), L2=[], split_list_1(R2,SeparatersL,X). split_list_2([],_,[],[]). split_list_2(L1,SeparatersL,[],R) :- member(L2,SeparatersL), append(L2,R,L1). split_list_2([A|R1],SeparatersL,[A|R2],R) :- \+((member(L2,SeparatersL),append(L2,_,[A|R1]))), split_list_2(R1,SeparatersL,R2,R). 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび), atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,NL), catch(atom_chars(C,NL),_,fail),!. split_5(B,C) :- concat_atom(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. number(A,B) :- number_codes(A,B). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/274 # よろしくお願いいたします。 # 【DBMS名とバージョン】Oracle 11g # 【テーブルデータ】 # ID   YMD # 1  20140101 # 1  20140102 # 1  20140103 # 1  20140105 # 1  20140106 # 2  20140101 # 2  20140102 # 【欲しい結果 】 # ID START_YMD END_YMD # 1 20140101 20140103 # 1 20140105 20140106 # 2 20140101 20140102 # 【説明】 # レコード単位で一日の日付を持つデータをグループかして、 # 開始日付と終了日付に集約したいです。 # ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。 # # どなたかいいお知恵がございましたら、よろしくお願いいたしますm(_ _)m # # 'レコード単位で一日の日付を持つデータをグループかして、 開始日付と終了日付に集約したいです。 ただし、一日でも間があれば、集約データ内では別レコードとして扱いたいです。'(_id,_START_YMD,_END_YMD) :- setof(_ID,[_ID,_YMD] ^ table(_ID,_YMD),_ID候補), member(_ID,_ID候補), setof(_YMD,[_ID,_YMD] ^ table(_ID,_YMD),_YMD候補), 連続性検査(_YMD候補,_START_YMD,_END_YMD). 連続性検査(_YMD候補,_START_YMD,_END_YMD) :- append([L1,[_START_YMD|R2],L2],_YMD候補), 連続している([_START_YMD|R2],_END_YMD), 連続していない(L1,[_START_YMD]), 連続していない([_END_YMD],L2). 連続している([_END_YMD],_END_YMD) :- !. 連続している([_YMD_1,_YMD_2|R1],_END_YMD) :- 翌日(_YMD_1,_YMD_2), 連続している([_YMD_2|R1],_END_YMD). 連続していない(L1,L2) :- \+((last(L1,_YMD_1),L2 = [_YMD_2|_],翌日(_YMD_1,_YMD_2))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 翌日(_YMD,_翌日) :- 年月日(_YMD,_年,_月,_日), 翌日(_年,_月,_日,_翌日). 年月日(_YMD,_年,_月,_日) :- sub_atom(_YMD,0,2,_,_年), sub_atom(_YMD,2,2,_,_月), sub_atom(_YMD,4,2,_,_日). 翌日(_年,_月,_日,_翌日) :- 年月換わり(年,_月,_日,_翌日),!. 翌日(_年,_月,_日,_翌日) :- 翌日の日(_日,_翌日の日), atomic_list_concat([_年,_月,_翌日の日],_翌日). 年月換わり(_年,'02',_月末日,_翌日) :- 二月月末(_年,'02',_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 小の月の月末日の翌日(_月,_月末日,_翌日). 年月換わり(_年,_月,_月末日,_翌日) :- 大の月の月末日の翌日(_年,_月,_月末日,_翌日). 二月月末(_年,'02','29',_翌日) :- atomic_list_concat([_年,'03','01'],_翌日). 二月月末(_年,'02','28',_翌日) :- atom_number(_年,_年整数), \+(うるう年(_年整数)), atomic_list_concat([_年,'03','01'],_翌日). 小の月の月末日の翌日(_月,'30',_翌日) :- member(_月,['04','06','09','11']), 翌月(_月,_翌月), atomic_list_concat([_年,_翌月,'01'],_翌日). 大の月の月末日の翌日(_年,_月,'31',_翌日) :- member(_月,['01','03','05','07','08','10','12']), 翌月(_月,_翌月), 年換わり(_年,_月,_年_1), atomic_list_concat([_年_1,_翌月,'01'],_翌日). 年換わり(_年,'12',_翌年) :- 翌年(_年,_翌年). 年換わり(_年,_月,_年) :- \+(_月='12'). うるう年(_うるう年) :- 0 is mod _うるう年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_うるう年) :- 0 is _うるう年 mod 4. 翌月('01','02'). 翌月('02','03'). 翌月('03','04'). 翌月('04','05'). 翌月('05','06'). 翌月('06','07'). 翌月('07','08'). 翌月('08','09'). 翌月('09','10'). 翌月('10','11'). 翌月('11','12'). 翌月('12','01'). 翌日の日('01','02'). 翌日の日('02','03'). 翌日の日('03','04'). 翌日の日('04','05'). 翌日の日('05','06'). 翌日の日('06','07'). 翌日の日('07','08'). 翌日の日('08','09'). 翌日の日('09','10'). 翌日の日('10','11'). 翌日の日('11','12'). 翌日の日('12','13'). 翌日の日('13','14'). 翌日の日('14','15'). 翌日の日('15','16'). 翌日の日('16','17'). 翌日の日('17','18'). 翌日の日('18','19'). 翌日の日('19','20'). 翌日の日('20','21'). 翌日の日('21','22'). 翌日の日('22','23'). 翌日の日('23','24'). 翌日の日('24','25'). 翌日の日('25','26'). 翌日の日('26','27'). 翌日の日('27','28'). 翌日の日('28','29'). 翌日の日('29','30'). 翌日の日('30','31'). 翌年(_年,_翌年) :- atom_number(_年,_年整数), succ(_年整数,_翌年の年整数), atom_number(_翌年,_翌年の年整数). % 以下のサイトは # 問題文 # 天下一王国では整数は辞書順比較で表します。入国したばかりのダイキ君はとりあえず 1000 までの整数を書き出すことにしました。 # # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。 # # 辞書順比較について # 文字列 A に対して、 Ai で i 番目の文字を表し、 |A| で文字列 A の文字数を表すことにすると、文字列 A と文字列 B を辞書順比較で比較するとは、 # # Ai≠Bi となる最小の i (1?i?min(|A|, |B|))に対して # AiBi であれば、文字列 A は文字列 B より大きい # そのような i が存在しなければ、文字数が少ない方を小さいとする # として文字列 A と文字列 B の大小関係を決めることである。 # # 例えば、 1, 2, 11, 12, 21 を辞書順比較で昇順にソートすると 1, 11, 12, 2, 21 となる。 # # 入力 # この問題では入力は与えられない。 # # # 出力 # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力せよ。 # # なお、行の終端には改行が必要である。 '1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。' :- '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび), '辞書順比較で昇順にソートして、'(_十進文字列ならび,_辞書順比較で昇順にソートされた文字列ならび), '1 行ずつ出力してください。'(_辞書順比較で昇順にソートされた文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび) :- findall(_十進文字列,'1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列),_十進文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列) :- '1 以上 1000 以下のすべての整数を'(_整数), 十進数で表した(_整数,_十進数で表した). '1 以上 1000 以下のすべての整数を'(_整数) :- between(1,1000,_整数). 十進数で表した文字列を(_整数,_十進数で表した文字列) :- number_chars(_整数,Chars), atom_chars(_十進数で表した文字列,Chars). '辞書順比較で昇順にソートして、'([],[]). '辞書順比較で昇順にソートして、'([_軸要素|L1],L2) :- '辞書順比較で軸要素との大小で分割'(_軸要素,L1,L1_1,L1_2), '辞書順比較で昇順にソートして、'(L1_1,L1_1_2), '辞書順比較で昇順にソートして、'(L1_2,L1_2_2), append(L1_1_2,[_軸要素|L1_2_2],L2). '辞書順比較で軸要素との大小で分割'(_,[],[],[]). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],[A|R3],R4) :- '辞書順に小さい'(A,_軸要素),!, '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],R3,[A|R4]) :- '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順に小さい'(_文字列_1,_文字列_2) :- '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2),!. '辞書順に小さい'(_文字列_1,_文字列_2) :- 文字列の差分が文字列_2にある(_文字列_1,_文字列_2). '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2) :- 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2), \+(_文字_1 = _文字_2),!, _文字_1 @< _文字_2. 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2) :- sub_atom(_文字列_1,_同一位置,1,_,_文字_1), sub_atom(_文字列_2,_同一位置,1,_,_文字_2). '文字列の差分が文字列_2にある'(_文字列_1,_文字列_2) :- sub_atom(_文字列_2,0,_文字列_1の長さ,_差分文字数,_文字列_1), _差分文字数 > 0. '1 行ずつ出力してください。'(L2) :- forall(member(M,L2),writef('%t\n',[M])). % 以下のサイトは # phpの文字置換で質問です # # 【目的】 文字列内の ab を a にする ただしabの後ろがcの場合を除く # 例 ab123 → a123 、 abcde → abcde # # という条件を正規表現で記述するにはどのように書けばよいでしょうか? # # よろしくおねがいします '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_文字列,_置換された文字列) :- '文字列内のabただしabの後ろがcの場合を除く'(_文字列,_前文字列,_後文字列), '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_後文字列,_置換された文字列_2), atomic_list_concat([_前文字列,a,_置換された文字列_2],_置換された文字列),!. '文字列内の ab を a にする ただしabの後ろがcの場合を除く'(_文字列,_文字列). '文字列内のabただしabの後ろがcの場合を除く'(_文字列,_前文字列,_後文字列) :- '文字列内のab'(_文字列,_前文字列,_後文字列), 'ただしabの後ろがcの場合を除く'(_後文字列). '文字列内のab'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,2,R,ab), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 'ただしabの後ろがcの場合を除く'(_後文字列) :- \+(sub_atom(_後文字列,0,1,_,c)). % 以下のサイトは # 要件 # # ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている # 退会していないユーザーの場合、退会日にはNULLが入る # ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧化したい。どうすれば取得できるか? # 例 # # ユーザーテーブル(users) # # id joined_on left_on # 1 2014-08-01 2014-08-10 # 2 2014-08-01 2014-08-05 # 3 2014-08-03 NULL # 4 2014-08-03 2014-08-10 # 5 2014-08-10 NULL # 期待する出力結果 # # date joined_count left_count # 2014-08-01 2 0 # 2014-08-03 2 0 # 2014-08-05 0 1 # 2014-08-10 1 2 # ユーザーテーブル(1,'2014-08-01','2014-08-10'). ユーザーテーブル(2,'2014-08-01','2014-08-05'). ユーザーテーブル(3,'2014-08-03','NULL'). ユーザーテーブル(4,'2014-08-03','2014-08-10'). ユーザーテーブル(5,'2014-08-10','NULL'). 'ユーザーテーブル(users)は入会日(joined_on)と退会日(left_on)を持っている 退会していないユーザーの場合、退会日にはNULLが入る ユーザー数の増減を確認するために、日付単位で入会したユーザーの人数と 退会したユーザーの人数を一覧化したい。どうすれば取得できるか?' :- setof(_日付,[_日付] ^ 'joined_onの候補+left_offの候補'(_日付),_日付候補), '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補). 'joined_onの候補+left_offの候補'(_日付) :- ユーザーテーブル(_,_入会日付,_退会日付), member(_日付,[_入会日付,_退会日付]), \+(_日付 = 'NULL'). '日付単位で入会したユーザーの人数と退会したユーザーの人数を一覧したい。'(_日付候補) :- '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R), 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数), R = []. '日付単位で入会したユーザーの人数と退会したユーザーの人数を'(_日付候補,_日付,_入会したユーザーの人数,_退会したユーザーの人数,R) :- append(_,[_日付|R],_日付候補), 度数(ユーザーテーブル(_,_日付,_),_入会したユーザーの人数), 度数(ユーザーテーブル(_,_,_日付),_退会したユーザーの人数). 表示する(_日付,_入会したユーザーの人数,_退会したユーザーの人数) :- writef('%t %3r %3r\n',[_日付,_入会したユーザーの人数,_退会したユーザーの人数]). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは 攪乱順列(_n,_撹乱順列) :- 完全順列(_n,_撹乱順列). 完全順列(_n,_完全順列) :- findall(_m,between(1,_n,_m),L), 完全順列(L,[_],_完全順列). 完全順列([],_,[]). 完全順列(L,Lm,[N|R]) :- select(N,L,L2), \+(length(Lm,N)), 完全順列(L2,[_|Lm],R). % 以下のサイトは 攪乱順列(L,_撹乱順列) :- 完全順列(L,_完全順列). 完全順列(L,_完全順列) :- 完全順列(L,[_],_完全順列). 完全順列([],_,[]). 完全順列(L,Lm,[A|R]) :- select(A,L,L2), \+(length(Lm,A)), 完全順列(L2,[_|Lm],R). % 以下のサイトは 完全順列(L,K,_順列) :- length(Ln,K), 完全順列(L,[_],Ln,_順列). 完全順列(_,_,[],[]). 完全順列(L,Lm,[_|Ln],[A|R]) :- select(A,L,L2), \+(length(Lm,A)), 完全順列(L2,[_|Lm],Ln,R). % 以下のサイトは 完全順列(L,K,_順列) :- 完全順列(L,K,K,_順列). 完全順列(_,_,0,[]). 完全順列(L,M,K,[A|R]) :- select(A,L,L2), \+(A =:= M - K + 1), succ(K_1,K), 完全順列(L2,M,K_1,R). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/855 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 値引率、単価、数量の金額を算出し表示する # 1のケース  5% #  2のケース 10% #  3のケース 15% #  それ以外   0% # switch caseを使用すること # 金額=単価×数量×(100−値引率)÷100 # '値引率、単価、数量の金額を算出し表示する  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% switch caseを使用すること 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量) :- '値引率、単価、数量の金額を 計算式 金額=単価×数量×(100−値引率)÷100で算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0%'(_ケース,_単価,_数量,_金額), 表示する(_金額). '値引率、単価、数量の金額を 計算式 金額=単価×数量×(100−値引率)÷100で算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% '(_ケース,_単価,_数量,_金額) :- ' 1のケース  5% 計算式 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額). '値引率、単価、数量の金額を 計算式 金額=単価×数量×(100−値引率)÷100で算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% '(_ケース,_単価,_数量,_金額) :- ' 2のケース 10% 計算式 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額). '値引率、単価、数量の金額を 計算式 金額=単価×数量×(100−値引率)÷100で算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% '(_ケース,_単価,_数量,_金額) :- ' 3のケース 15% 計算式 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額). '値引率、単価、数量の金額を 計算式 金額=単価×数量×(100−値引率)÷100で算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% '(_ケース,_単価,_数量,_金額) :- ' それ以外   0% 計算式 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額). ' 1のケース  5% 計算式 金額=単価×数量×(100−値引率)÷100'(1,_単価,_数量,_金額) :- '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,5,_金額). ' 2のケース 10% 計算式 金額=単価×数量×(100−値引率)÷100'(2,_単価,_数量,_金額) :- '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,10,_金額). ' 3のケース 15% 計算式 金額=単価×数量×(100−値引率)÷100'(3,_単価,_数量,_金額) :- '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,15,_金額). ' それ以外   0% 計算式 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額) :- \+(member(_ケース,[1,2,3])), '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,0,_金額). '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,_値引率,_金額) :- _金額 is _単価 * _数量 * (100 - _値引率) / 100. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/855 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 値引率、単価、数量の金額を算出し表示する # 1のケース  5% #  2のケース 10% #  3のケース 15% #  それ以外   0% # switch caseを使用すること # 金額=単価×数量×(100−値引率)÷100 # '値引率、単価、数量の金額を算出し表示する  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量) :- '値引率、単価、数量の金額を算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額), 表示する(_金額). '値引率、単価、数量の金額を算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量) :- ' 1のケース  5%'(_ケース,_単価,_数量,_金額). '値引率、単価、数量の金額を算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量) :- ' 2のケース 10%'(_ケース,_単価,_数量,_金額). '値引率、単価、数量の金額を算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額) :- ' 3のケース 15%'(_ケース,_単価,_数量,_金額). '値引率、単価、数量の金額を算出し  1のケース  5%  2のケース 10%  3のケース 15%  それ以外   0% 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額) :- ' それ以外   0%'(_ケース,_単価,_数量,_金額). ' 1のケース  5% 金額=単価×数量×(100−値引率)÷100'(1,_単価,_数量,_金額) :- '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,5,_金額). ' 2のケース 10% 金額=単価×数量×(100−値引率)÷100'(2,_単価,_数量,_金額) :- '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,10,_金額). ' 3のケース 15% 金額=単価×数量×(100−値引率)÷100'(3,_単価,_数量,_金額) :- '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,15,_金額). ' それ以外   0% 金額=単価×数量×(100−値引率)÷100'(_ケース,_単価,_数量,_金額) :- \+(member(_ケース,[1,2,3])), '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,0,_金額). '金額=単価×数量×(100−値引率)÷100'(_単価,_数量,_値引率,_金額) :- _金額 is _単価 * _数量 * (100 - _値引率) / 100. 表示する(_金額) :- writef('%w\n',[_金額]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/808 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売 # 上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。 # ________________________________ # 担当者  売上  比率 # --------------------- # 山田  12000  30.0% # 鈴木   8000  20.0% # 井上  20000  50.0% # 合計  40000  100.0% # ===================== # '担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。' :- '担当者はなん人でも構わない、担当者名と売上を入力する。', '売上合計を求める。'(_売上合計), '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'. '担当者はなん人でも構わない、担当者名と売上を入力する。' :- 担当者名と売上を入力(_担当者名,_売上), 担当者と売上を追加定義する(_担当者名,_売上), '担当者はなん人でも構わない、担当者名と売上を入力する。',!. '担当者はなん人でも構わない、担当者名と売上を入力する。'. 担当者名と売上を入力(_担当者名,_売上) :- 担当者名の入力(_担当者名), \+(_担当者名=''), 売上の入力(_売上). 担当者名の入力(_担当者名) :- write('担当者名を入力して下さい : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る(売上,integer(_売上),_売上). 担当者と売上を追加定義する(_担当者,_売上) :- assertz('担当者・売上'(_担当者,_売上)). 売上合計を得る(_売上合計) :- findall(_売上,( '担当者・売上'(_,_売上)), _売上ならび), sum_list(_売上ならび,_売上合計). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_売上合計) :- write('担当者  売上  比率 \n'), forall('担当者・売上'(_担当者名,_売上),'各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計)), write('===================== \n'). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計) :- \+(_売上合計 = 0), _比率 is _売上 / _売上合計 * 100, '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率). '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率) :- format('~w ~0f ~1f%\n',[_担当者名,_売上,_比率]). % 以下のサイトは # 出典: twitter_by_@facebookersjp_20140429 # '『存在と時間』の大枠を図にしてみた。網羅的ではないが。私はいつもこんな感じのモデルを頭の中で転がしてます。' :- ''. ''. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/769 # [1] 授業単元:プログラミング # [2] 問題文 # 6人の学生の点数を読み込み、最高点を表示するプログラムを作成せよ # '6人の学生の点数を読み込み、最高点を表示するプログラムを作成せよ' :- '6人の学生の点数を読み込み、最高点を表示する'. '6人の学生の点数を読み込み、最高点を表示する' :- '6人の学生の点数を読み込み、'(_6人の学生の点数), 最高点を表示する(_6人の学生の点数). '6人の学生の点数を読み込み、'(_6人の学生の点数) :- '6人の学生の'(_6人の学生の点数), 点数を読み込み(_6人の学生の点数). '6人の学生の点数を読み込み、'(_6人の学生の点数) :- findall(_学生の点数,( between(1,6,_), 整数を得る(学生の点数,true,_学生の点数)), _6人の学生の点数). 最高点を表示する(_6人の学生の点数) :- 最高点を(_6人の学生の点数,_最高点), 表示する(_6人の学生の点数,_最高点). 最高点を(_6人の学生の点数,_最高点) :- append(L1,[_最高点|L2],_6人の学生の点数), \+((member(A,L1),A > _最高点)), \+((member(A,L2),A > _最高点)). 表示する(_6人の学生の点数,_最高点) :- writef('6人の学生の点数 = %t,%t,%t,%t,%t,%t\n',_6人の学生の点数), writef('最高点 = %t\n',[_最高点]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/765 # [1] 授業単元:プログラミング1 # [2] 問題文:n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 # 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 # そして、和と平均を求め出力する。 # 次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) # の人数を求めるプログラムを、if else文を使い作成せよ。 # # ここからが本題なのですが # # 上記問題のs、a、b、c、fの人数を # 関数を使用して*で表すヒストグラムにせよ。 # # 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め出力する。 次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。 ここからが本題なのですが 上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_ヒストグラム) :- 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め'(_n,_n人分の得点ならび,_得点の和,_平均), 出力する(_得点の和,_平均), '次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。'(_n人分の得点ならび,_クラス_人数ならび), '上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_n,_クラス_人数ならび,_ヒストグラム). 'n人分の試験の得点の和と平均を求めるプログラムを作成せよ。 始めに処理するデータの人数nを読み込み、次にn人分の得点を読み込む。 そして、和と平均を求め'(_n,_n人分の得点ならび,_得点の和,_平均) :- '始めに処理するデータの人数nを読み込み、'(_n), '次にn人分の得点を読み込む。'(_n,_n人分の得点ならび), 'n人分の試験の得点の和と平均を求める'(_n,_n人分の得点ならび,_得点の和,_平均). '始めに処理するデータの人数nを読み込み、'(_n) :- 整数を得る(人数,true,_人数). '次にn人分の得点を読み込む。'(_n,_n人分の得点ならび) :- findall(_得点,( between(1,_n,_), 整数を得る(得点,true,_得点)), _n人分の得点ならび). 'n人分の試験の得点の和と平均を求める'(_n,_n人分の得点ならび,_得点の和,_平均) :- sum_list(_n人分の得点ならび,_得点の和), _平均 is _得点の和 / _n. 出力する(_得点の和,_平均) :- writef('得点の和 = %t\n平均 = %t\n',[_得点の和,_平均]). '次に、s(90以上)、a(80〜89)、b(70〜79)、c(60〜69)、f(それ以外) の人数を求めるプログラムを、if else文を使い作成せよ。'(_n人分の得点ならび,_クラス_人数ならび) :- findall([_クラス,_人数],( member(_クラス,[s,a,b,c,f]), クラスの人数(_クラス,_n人分の得点ならび,_人数)), _クラス_人数_ならび). クラスの人数(_クラス,_n人分の得点ならび,_人数) :- findall(1,( member(_得点,_n人分の得点ならび), クラス(_クラス,_得点)), L), sum_list(L,_人数). クラス(s,_得点) :- _得点 >= 90. クラス(a,_得点) :- between(80,89,_得点). クラス(b,_得点) :- between(70,79,_得点). クラス(c,_得点) :- between(60,69,_得点). クラス(f,_得点) :- クラス_f(_得点). クラス_f(_得点) :- \+(_得点 >= 60). '上記問題のs、a、b、c、fの人数を 関数を使用して*で表すヒストグラムにせよ。'(_n,_クラス_人数ならび,_ヒストグラム) :- length(_クラス_人数ならび,_クラスの数), ヒストグラムの生成(_n,_クラスの数,_クラス_人数ならび,_ヒストグラム). ヒストグラムの生成(_n,_クラスの数,_クラス_人数ならび,_ヒストグラム) :- findall([_クラス,_星文字列],( member([_クラス,_人数],_クラス_人数ならび), _星の数 is _人数 // (_n // _クラスの数 // 5), 星文字列(_星の数,_星文字列)), _ヒストグラム). 星文字列(_星の数,_星文字列) :- findall('*',between(1,_星の数,_),L), atomic_list_concat(L,_星文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/757 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者名が"end"になるまで、担当者名と売上を入力する。 # 売上合計、平均、最も売上が多い担当者名とその売上、 # 最も売上が低い担当者名とその売上を表示する。 # '担当者名が"end"になるまで、担当者名と売上を入力する。 売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。' :- '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび), '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび). '担当者名が"end"になるまで、担当者名と売上を入力する。'(_担当者名_売上ならび) :- findall([_担当者名,_売上],( 担当者の入力(_担当者名), ( _担当者名 = end,!,fail; 売上の入力(_売上))), _担当者名_売上ならび). 担当者の入力(_担当者名) :- write('担当者名を入力してください (endで終了する) : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る('売上を入力して下さい : ',true,_売上). '売上合計、平均、最も売上が多い担当者名とその売上、 最も売上が低い担当者名とその売上を表示する。'(_担当者_売上ならび) :- '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均), '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上), 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上). '売上合計、平均、'(_担当者_売上ならび,_売上合計,_平均) :- findall(_売上,( member([_,_売上],_担当者名_売上ならび)), _売上ならび), sum_list(_売上ならび,_売上合計), length(_売上ならび,_要素数), _平均 is _売上合計 / _要素数. '最も売上が多い担当者名とその売上、最も売上が低い担当者名とその売上を'(_担当者_売上ならび,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- setof(_担当者,[_担当者,_売上] ^ member([_担当者,_売上],_担当者_売上ならび),_担当者名ならび), 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび), '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上), '最も売上が低い担当者名とその売上'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上). 担当者別の売上合計(_担当者_売上ならび,_担当者名ならび,_担当者別売上合計ならび) :- findall([_担当者名,_売上合計],( member(_担当者名,_担当者名ならび), findsum(_売上,( member([_担当者名,_売上],_担当者別売上ならび), _売上合計))), _担当者別売上合計ならび). '最も売上が多い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が多い担当者,_最も売上が多い担当者の売上) :- append(L1,[[_最も売上が多い担当者,_最も売上が多い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 > _最も売上が多い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 > _最も売上が多い担当者の売上)). '最も売上が低い担当者名とその売上、'(_担当者別売上合計ならび,_最も売上が低い担当者,_最も売上が低い担当者の売上) :- append(L1,[[_最も売上が低い担当者,_最も売上が低い担当者の売上]|L2],_担当者別売上合計ならび), \+((member([_,_売上合計],L1),_売上合計 < _最も売上が低い担当者の売上)), \+((member([_,_売上合計],L2),_売上合計 < _最も売上が低い担当者の売上)). 表示する(_売上合計,_平均,_最も売上が多い担当者名,_最も売上が多い担当者の売上,_最も売上が低い担当者名,_最も売上が低い担当者の売上) :- writef('売上合計 = %t\n平均 = %t\n',[_売上合計,_平均]), writef('最も売上が多い担当者名 = %t\n最も売上が多い担当者の売上 = %t\n最も売上が低い担当者名 = %t\n',[_最も売上が多い担当者名,_最も売上が多い担当者の売上]), writef('最も売上が低い担当者名 = %t\n最も売上が低い担当者の売上 = %t\n',[_最も売上が低い担当者名,_最も売上が低い担当者の売上]). % 以下のサイトは # 出典 : http://peace.2ch.net/test/read.cgi/tech/1392388003/754 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。 # '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。' :- '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'([]). '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- sum_list(_点数ならび,_合計), _合計 >= 999,!. '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- 新たな点数を入力する(_点数ならび,_新たな点数ならび), '合計、平均、最高点数、最低点数を表示する。'(_あらたな点数ならび). '合計、平均、最高点数、最低点数を表示する。'(_点数ならび) :- '合計、平均、最高点数、最低点数を表示する。'(_点数ならび), '点数が999になる迄、点数を入力し、合計、平均、最高点数、最低点数を表示する。'(_点数ならび). '合計、平均、最高点数、最低点数を表示する。'(_点数合計,_点数ならび) :- length(_点数ならび,_要素数), _平均 is _点数合計 / _要素数, 最高点数(_点数ならび,_最高点数), 最低点数(_点数ならび,_最低点数), writef('合計 = %t\n平均 = %t\n最高点数 = %t\n最低点数 = %t\n',[_点数合計,_平均,_最高点数,_最低点数]). 新たな点数を入力する(_点数ならび,[_点数|_新たな点数ならび]) :- 整数を得る('点数を入力してください : ',(integer(_点数),_点数>=0),_点数),!. 最高点数(_点数ならび,_最高点数) :- append(L1,[_最高点数|L2],_点数ならび), \+((member(N,L1),N > _最高点数)), \+((member(N,L2),N > _最高点数)). 最低点数(_点数ならび,_最低点数) :- append(L1,[_最低点数|L2],_点数ならび), \+((member(N,L1),N < _最低点数)), \+((member(N,L2),N < _最低点数)). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/741 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成すること # 英文の回文判定 # 回文とは、どちらから読んでも # 同じ並びになる文章。 # 1つの英文字列(100文字以内)が入力されるので、 # 回文であれば、GOODと表示 # 回文でなければ、NGと表示 # *大文字小文字を区別しない # *「?!,. 」を無視する # # 実行例) # apple 入力 # NG 出力 # Borrow or rob? 入力 # GOOD 出力 # Kodak ad? OK! 入力 # GOOD 出力 # What time is it? 入力 # NG 出力 # Was it a bar or a bat I saw? 入力 # GOOD 出力 # '英文の回文判定 回文とは、どちらから読んでも 同じ並びになる文章。 1つの英文字列(100文字以内)が入力されるので、 回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する' :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列). '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 100,!. '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列). '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列) :- '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列,_回文判定文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示'(_回文判定文字列). '*大文字小文字を区別しない *「?!,. 」を無視する'('',''). '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列_1,_文字列) :- 最初の文字と残り文字列(_文字列_1,_文字,_残り文字列), '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2), '*大文字小文字を区別しない *「?!,. 」を無視する'(_残り文字列,_文字列_2), atom_concat(_文字_2,_文字列_2,_文字列). '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2) :- '大文字を小文字に変換し'(_文字,_文字_1), '*「?!,. 」を無視する'(_文字_1,_文字_2). 大文字を小文字に変換(_文字,_小文字) :- 英大文字英小文字(_文字,_小文字),!. 大文字を小文字に変換(_文字,_文字). 英大文字英小文字('A',a). 英大文字英小文字('B',b). 英大文字英小文字('C',c). 英大文字英小文字('D',d). 英大文字英小文字('E',e). 英大文字英小文字('F',f). 英大文字英小文字('G',g). 英大文字英小文字('H',h). 英大文字英小文字('I',i). 英大文字英小文字('J',j). 英大文字英小文字('K',k). 英大文字英小文字('L',l). 英大文字英小文字('M',m). 英大文字英小文字('N',n). 英大文字英小文字('O',o). 英大文字英小文字('P',p). 英大文字英小文字('Q',q). 英大文字英小文字('R',r). 英大文字英小文字('S',s). 英大文字英小文字('T',t). 英大文字英小文字('U',u). 英大文字英小文字('V',v). 英大文字英小文字('W',w). 英大文字英小文字('X',x). 英大文字英小文字('Y',y). 英大文字英小文字('Z',z). '*「?!,. 」を無視する'(_文字,'') :- member(_文字,['?','!','.',' ']),!. '*「?!,. 」を無視する'(_文字,_文字). '回文であれば、GOODと表示 回文でなければ、NGと表示'(_文字列) :- '回文であれば、'(_文字列), 'GOODと表示'. '回文であれば、GOODと表示 回文でなければ、NGと表示'(_) :- '回文でなければ、'(_文字列), 'NGと表示'. '回文であれば、'(_文字列) :- forall((sub_atom(_文字列,S,1,R,_文字),S =< R),sub_atom(_文字列,R,1,S,_文字)). '回文でなければ、'(_文字列) :- \+('回文であれば、'(_文字列)). 'GOODと表示' :- write('Good\n'). 'NGと表示' :- write('NG\n'). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #525 # お題:バイトごとに固定値とのXORでバイナリが暗号化される。正しい # バイナリを引数として指定するとtrueを返すような関数examがある。 # 正しいバイナリを暗号化した後、examを使って暗号化されたバイナ # リを解読するプログラムを作れ。正しいバイナリは{0x20,0x11,0x03,0x11}とし、 # 暗号化に使う固定値はプログラムの起動時にランダムに選ぶものとする。 'バイトごとに固定値とのXORでバイナリが暗号化される。 正しいバイナリを引数として指定するとtrueを返すような関数examがある。 正しいバイナリを暗号化した後、examを使って暗号化されたバイナリを解読するプログラムを作れ。 正しいバイナリは{0x20,0x11,0x03,0x11}とし、 暗号化に使う固定値はプログラムの起動時にランダムに選ぶものとする。'(_固定値,_正しいバイナリ,_暗号化されたバイナリ) :- _固定値 is random(255), '正しいバイナリを暗号化された後、'(_正しいバイナリ,_固定値,_暗号化されたバイナリ), exam(_正しいバイナリ). '正しいバイナリを暗号化された後、'(_正しいバイナリ,_固定値,_暗号化されたバイナリ) :- findall(_暗号化された値,( member(_値,_正しいバイナリ), _暗号化された値 is _値 # _固定値), _暗号化されたバイナリ), assertz(固定値(_固定値)), assertz(暗号化されたバイナリ(_暗号化されたバイナリ)). exam(_正しいバイナリ) :- 正しいバイナリを引数として指定すると(_正しいバイナリ), 暗号化されたバイナリ(_暗号化されたバイナリ), 固定値(_固定値), 各バイナリを固定値とXORすることによって復号化する(_暗号化されたバイナリ,_固定値,_正しいバイナリ). 正しいバイナリを引数として指定すると(_正しいバイナリ) :- \+(var(_正しいバイナリ)). 各バイナリを固定値とXORすることによって復号化する(_暗号化されたバイナリ,_固定値,_正しいバイナリ) :- findall(_復号化された値,( member(_値,_暗号化されたバイナリ), _復号化された値 is _値 # _固定値), _正しいバイナリ). % 以下のサイトは # 出典: # C/C++の宿題片付けます 167代目 #716 # [1] 授業単元: プログラミング基礎 # [2] 問題文:10個の整数を入力し配列に保存した後、入力された数字の中に # 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 # 含まれていない時に「5の倍数が含まれていません」と表示するプログラムを作りなさい。 # # よろしくお願いいたします。 '10個の整数を入力し配列に保存した後、入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。' :- '10個の整数を入力し配列に保存した後、'(L), '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L). '10個の整数を入力し配列に保存した後、'(L) :- write('カンマ区切りで整数を10個入力しなさい : '), get_split_line([','],L). '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L) :- '5の倍数が含まれているかを調べ、含まれていた時には'(L), write('5の倍数が含まれています\n'). '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L) :- '5の倍数が含まれていない時に'(L), write('5の倍数が含まれていません\n'). '5の倍数が含まれているかを調べ、含まれていた時には'(L) :- member(N,L), 0 is N mod 5,!. '5の倍数が含まれていない時に'(L) :- forall(member(N,L),\+(0 is N mod 5)). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_限界数,_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), スレッド上でメッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標), 'メッセージを待ち合わせ、回収する'(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッド上でメッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標) :- thread_create(メッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標),_,[]). 'メッセージを待ち合わせ、回収する'(_キュー番号,_回収値ならび) :- メッセージを待ち合わせる(_キュー番号), メッセージを回収する(_キュー番号,_回収値ならび). メッセージを待ち合わせる(_キュー番号) :- repeat, thread_peek_message(_キュー番号,end_of_file),!. メッセージを回収する(_キュー番号,_回収値ならび) :- findall(_回収値,( thread_get_message(_キュー番号,_回収値), ( _回収値 = end_of_file,!,fail; true)), _メッセージならび). %%%%%%%%%%%%%%%%%%%% スレッド側 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% メッセージキューに限界数までの選択項を登録する(_限界数,_キュー番号,_選択項,_副目標) :- 副目標を実行して選択項を登録する(_キュー番号,_選択項,_副目標), ( メッセージが限界数を超えた(_キュー番号,_限界数),!,fail; fail). メッセージキューに限界数までの選択項を登録する(_,_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージが限界数を超えた(_キュー番号,_限界数) :- メッセージの現在の度数を数える(_キュー番号,_度数), _度数 >= _限界数, thread_send_message(_キュー番号,end_of_file),!. 副目標を実行して選択項を登録する(_キュー番号,_選択項,_副目標) :- call(_副目標), 重複メッセージにはならない(_キュー番号,_選択項), thread_send_message(_キュー番号,_選択項). 重複メッセージにはならない(_キュー番号,_選択項) :- \+(thread_peek_message(_キュー番号,_選択項)). メッセージの現在の度数を数える(_キュー番号,_度数) :- message_queue_property(_キュー番号,size(_度数)). % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_限界数,_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), スレッド上でメッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標), メッセージを回収する(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッド上でメッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標) :- thread_create(メッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標),_,[]). メッセージを回収する(_キュー番号,L) :- thread_peek_message(_キュー番号,end_of_file), thread_get_message(_キュー番号,_回収値_1), メッセージを回収する(_キュー番号,_回収値_1,L),!. メッセージを回収する(_キュー番号,L) :- メッセージを回収する(_キュー番号,L). メッセージを回収する(_キュー番号,end_of_file,[]) :- !. メッセージを回収する(_キュー番号,_回収値,[_回収値|R]) :- thread_get_message(_キュー番号,_回収値_2), メッセージを回収する(_キュー番号,_回収値_2,R). %%%%%%%%%%%%%%%%%%%% スレッド側 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% メッセージキューに限界数までの選択項を登録(_限界数,_キュー番号,_選択項,_副目標) :- 副目標の実行と選択項の登録(_キュー番号,_選択項,_副目標), ( メッセージが限界数を超えた(_キュー番号,_限界数),!,fail; fail). メッセージキューに限界数までの選択項を登録(_,_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージが限界数を超えた(_キュー番号,_限界数) :- メッセージの現在の度数(_キュー番号,_度数), _度数 >= _限界数, thread_send_message(_キュー番号,end_of_file),!. 副目標の実行と選択項の登録(_キュー番号,_選択項,_副目標) :- call(_副目標), 重複メッセージにはならない(_キュー番号,_選択項), thread_send_message(_キュー番号,_選択項). 重複メッセージにはならない(_キュー番号,_選択項) :- \+(thread_peek_message(_キュー番号,_選択項)). メッセージの現在の度数(_キュー番号,_度数) :- message_queue_property(_キュー番号,size(_度数)). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #707 # 3 と 5 または両方を調べるプログラムを作る。 # 1) 数を1からカウントしていく # 2) カウントする上限を尋ねる # 3) 3の倍数の時、「アホになる」と表示 # 4) 5の倍数の時、「バカになる」と表示 # 5) 3と5の倍数の時、「ボケカス」と表示 '3 と 5 または両方を調べるプログラムを作る。 1) 数を1からカウントしていく 2) カウントする上限を尋ねる 3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示' :- '1) 数を1からカウントしていく'(_数), '2) カウントする上限を尋ねる'(_カウントする上限), '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限), _数 >= _カウントする上限. '1) 数を1からカウントしていく'(_数) :- nth1(_数,_,_). '2) カウントする上限を尋ねる'(_カウントする上限) :- write('カウントする上限を指定して下さい : '), read(_カウントする上限). '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限) :- _数 > _カウントする上限,!. '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限) :- '3) 3の倍数の時、「アホになる」と表示(_数). '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限) :- '4) 5の倍数の時、「バカになる」と表示'(_数). '3) 3の倍数の時、「アホになる」と表示 4) 5の倍数の時、「バカになる」と表示 5) 3と5の倍数の時、「ボケカス」と表示'(_数,_カウントする上限) :- '5) 3と5の倍数の時、「ボケカス」と表示'(_数). '3) 3の倍数の時、「アホになる」と表示'(_数) :- 0 is _数 mod 3, \+(0 is _数 mod 5), write('アホになる\n'). '4) 5の倍数の時、「バカになる」と表示'(_数) :- 0 is _数 mod 5, \+(0 is _数 mod 3), write('バカになる\n'). '5) 3と5の倍数の時、「ボケカス」と表示'(_数) :- 0 is _数 mod 3, 0 is _数 mod 5, write('ボケカス\n'). % 以下のサイトは " 出典: このディレクトリの索引 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # ?以下のプログラムを作成しなさい. # 文字列を入力して、 # その文字列が数字であるかどうか調べる # (符号も対応すること) # (数字は、intの範囲内で) # (0023は、数字として扱う) # 実行例) # 1234 入力 # number 出力 # 1234abncdef 入力 # string 出力 # ab^d34x 入力 # string 出力 # -92837 入力 # number 出力 # +37 入力 # number 出力 # [3] 環境 . #  [3.1] Windows 8.1 #  [3.2] Visual studio 2013 #  [3.3] C # [4] 期限:2014年7月14日0:00 '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)' :- get_line(_文字列), '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)'(_文字列). '文字列を入力して、その文字列が数字であるかどうか調べる(符号も対応すること)(数字は、intの範囲内で)(0023は、数字として扱う)'(_文字列) :- その文字列が数字であるかどうか調べる(_文字列). その文字列が数字であるかどうか調べる(_文字列) :- その文字列は数字を構成する(_文字列). その文字列は数字を構成する(_文字列) :- 数字文字列(_文字列), write('number\n'). その文字列は数字を構成する(_文字列) :- \+(数字文字列(_文字列)), write('string\n'). 数字文字列(_文字列) :- '先頭文字が+または-である'(_文字列,_残り文字列), '記号を除く数字ならび。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_残り文字列),!. 数字文字列(_文字列) :- '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列). '先頭文字が+または-である'(_文字列,_残り文字列) :- 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列), '+または-である'(_先頭文字). '+または-である'('+'). '+または-である'('-'). '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列) :- 先頭文字と最終文字にピリオドが来ている(_文字列),!,fail. '記号を除く数字文字列。ただし先頭と最終要素以外ならピリオドと一度だけ含むことができる'(_文字列) :- 記号を除く数字文字列(_文字列), 先頭文字と最終文字にピリオドが来ている(_文字列) :- sub_atom(_文字列,0,1,_,'.'). 先頭文字と最終文字にピリオドが来ている(_文字列) :- sub_atom(_文字列,_,1,0,'.'). 記号を除く数字文字列('') :- !. 記号を除く数字文字列(_文字列) :- 先頭文字の数字記号検査(_文字列,_残り文字列). 記号を除く数字文字列(_残り文字列). 先頭文字の数字記号検査(_文字列,_残り文字列) :- 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列), 先頭文字の数字記号検査(_先頭文字,_文字列,_残り文字列). 先頭文字の数字記号検査('.',_残り文字列) :- \+(sub_atom(_残り文字列,_,1,_,'.')),!. 先頭文字の数字記号検査(A,_残り文字列) :- sub_atom('0123456789',_,1,_,A),!. 先頭文字と残り文字列を得る(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,R,_先頭文字), sub_atom(_文字列,1,R,0,_残り文字列). % 以下のサイトは # # 述語名は'$解の度数','$射影項' の述語名は必須ではない。 # :- dynamic(['$解の度数'/2,'$射影項'/2]). 解の数を制限した全解照会(_限界実行回数,_射影項,_実行項,_射影項ならび) :- 履歴管理(_管理指標), forall(解の数を制限した解照会(_限界実行回数,_管理指標,_射影項,_実行項),true), 射影項の収集(_管理指標,_射影項ならび). 解の数を制限した解照会(_限界実行回数,_管理指標,_射影項,_実行項) :- 解の数を勘定しながらの実行(_管理指標,N,_射影項,_実行項), ( N = _限界実行回数; N = _限界実行回数,!,fail; asserta('$解の度数'(_管理指標,N))). 解の数を勘定しながらの実行(_管理指標,N,_射影項,_実行項) :- call(_実行項), 解は既出解を捨てて収集する(_管理指標,_射影項,_実行項), retract('$解の度数'(_管理指標,N_1)), succ(N_1,N). 解は既出解を捨てて収集する(_管理指標,_射影項,_実行項) :- \+(catch('$射影項'(_管理指標,_射影項),E,fail)), asserta('$解の度数'(_管理指標,_射影項)),!. 履歴管理(_管理指標) :- _管理指標 is random(2147483647), \+(catch('$射影項'(_管理指標,_),E,fail)), asserta('$解の度数'(_管理指標,0)),!. 履歴管理(_管理指標) :- 履歴管理(_管理指標). 射影項の収集(_管理指標,_射影項ならび) :- findall(_射影項,'$射影項'(_管理指標,_射影項)),_射影項ならび). % 以下のサイトは # # 述語名は'$call_n_count'である必要はない。 # :- dynamic([call_n_id/2,call_n_goal/2]). call_n(_n,P) :- call_n_id(_id), call_n_goal(_id,N,P), ( N = _n; N = _n,!,fail; asserta('$call_n_count'(_id,N))). call_n_goal(_id,N,P) :- call(P), call_n_unique_goal(_id,P), retract('$call_n_count'(_id,N_1)), succ(N_1,N). call_n_unique_goal(_id,P) :- \+(catch('$call_n_goal'(_id,P),E,fail)), asserta('$call_n_goal'(_id,P)),!. call_n_id(_id) :- _id is random(2147483647), \+(catch('$call_n_count'(_id,_),E,fail)), asserta('$call_n_count'(_id,0)),!. call_n_id(_id) :- call_n_id(_id). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #466 # お題 # 昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する # Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう # 例 # 入: A = [2,3,5,7,9], a = 2, B = [9,2,5] # 出: [2,5,9] # 入: A = [2,3,5,7,9], a = 9, B = [9,2,5] # 出: [9,2,5] # 入: A = [2,3,5,7,9], a = 5, B = [9,2,5] # 出: [5,9,2] # 入: A = [2,3,5,7,9], a = 3, B = [9,2,5,5,2] # 出: [5,5,9,2,2] '昇順の数列A[a0,a1,..,an]とAの要素amを一つ指定する Aの要素からなる数列Bを与えて[am,am+1,..,an,a0,a1,..,am-1]の順番で整列させよう'(A,_am,B,_整列したならび) :- '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび), 整列させよう(B,_順番ならび,_整列したならび). '[am,am+1,..,an,a0,a1,..,am-1]の順番で'(A,_am,_順番ならび) :- append(L1,[_am|L2],A), append([_am|L2],L1,_順番ならび),!. 整列させよう(B,_順番ならび,_整列したならび) :- findall(_a,( append(L0,[_a|_],_順番ならび), \+(member(_a,L0)), member(_a,B)), _整列したならび). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #393 # 文字列A(2≦N≦100000)が与えられる # どうしていするかな # うしていするかなど # していするかなどう # ていするかなどうし # いするかなどうして # するかなどうしてい # るかなどうしていす # かなどうしていする # などうしていするか 例('どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'). '文字列A(2≦N≦100000)が与えられる どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'(_文字列,_一文字づつ回転した文字列ならび) :- '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる', '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび). '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる' :- 例(_回転する例文), '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(どうしていするかな,_一文字づつ回転した文字列ならび), atomic_list_concat(_一文字づつ回転した文字列ならび,'\n',_回転する例文). '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび) :- findall(_一文字づつ回転して文字列,( 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R), ただし最終行は元に戻らない(R)), _一文字づつ回転した文字列ならび). 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R) :- sub_atom(_文字列,0,N,R,_副文字列_1), sub_atom(_文字列,N,R,0,_副文字列_2), atom_concat(_副文字列_2,_副文字列_1,_一文字づつ回転した文字列). ただし最終行は元に戻らない(R) :- \+(R = 0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_文字列長,_回転する例文) :- atom_concat(_文字列,_文字列,_連結した文字列), findall(_副文字列,( sub_atom(_連結した文字列,_,_文字列長,_残り文字数,_副文字列), \+(_残り文字数 = 0)), _位置文字づつ回転した文字列ならび), atomic_list_concat(_位置文字づつ回転した文字列ならび,'\n',_回転する例文). % 以下のサイトは p(A,B,L1,L2) :- append(L0,[B|R],L1),!, p(A,B,L0,R,L2). p(A,B,L1,L1) :- \+(append(_,[B|_],L1)). p(A,B,L0,R,L2) :- append(L0,[A,B|R],L2). p(A,B,L0,R,L2) :- p(A,B,R,R2), append(L0,[A,B|R2],L2),!. % 以下のサイトは # # min-heapで以下のクエリを実装せよ # # 1.push(t, v) 時刻tに値vをpushするクエリがあったことにする # 2.pop(t) 時刻tにおける最小値をpopしたことにする # 3.min(t)時刻tにおける最小値を出力する # 時刻tに値vをpushするクエリがあったことにする(_t,_v,_stack,[[_t,_v]|_stack]). 時刻tにおける最小値をpopしたことにする(_t,_stack_1,_stack_2) :- findmin(_v,member([_t,_v],_stack_1),_min), findall([_t_1,_v_1],( member([_t_1,_v_1],_stack_1), \+((_t_1=_t,_v_1=_min))), _stack_2). 時刻tにおける最小値を出力する(_t,_stack_1,_stack_2) :- findmin(_v,member([_t,_v],_stack_1),_min), writef('%t',[_min]). % 以下のサイトは 西暦和暦表から元号に対応する西暦の順序数を得る(_元号,_西暦) :- nth1(_nth1,_,_),( \+(西暦和暦表(_西暦,_元号,_nth1)),!,fail; 西暦和暦表(_西暦,_元号,_nth1)). 西暦和暦表(645,'大化',1). 西暦和暦表(646,'大化',2). 西暦和暦表(647,'大化',3). 西暦和暦表(648,'大化',4). 西暦和暦表(649,'大化',5). 西暦和暦表(650,'大化',6). 西暦和暦表(650,'白雉',1). 西暦和暦表(651,'白雉',2). 西暦和暦表(652,'白雉',3). 西暦和暦表(653,'白雉',4). 西暦和暦表(654,'白雉',5). 西暦和暦表(686,'朱鳥',1). 西暦和暦表(687,'朱鳥',2). 西暦和暦表(701,'大宝',1). 西暦和暦表(702,'大宝',2). 西暦和暦表(703,'大宝',3). 西暦和暦表(704,'大宝',4). 西暦和暦表(704,'慶雲',1). 西暦和暦表(705,'慶雲',2). 西暦和暦表(706,'慶雲',3). 西暦和暦表(707,'慶雲',4). 西暦和暦表(708,'慶雲',5). 西暦和暦表(708,'和銅',1). 西暦和暦表(709,'和銅',2). 西暦和暦表(710,'和銅',3). 西暦和暦表(711,'和銅',4). 西暦和暦表(712,'和銅',5). 西暦和暦表(713,'和銅',6). 西暦和暦表(714,'和銅',7). 西暦和暦表(715,'和銅',8). 西暦和暦表(715,'霊亀',1). 西暦和暦表(716,'霊亀',2). 西暦和暦表(717,'霊亀',3). 西暦和暦表(717,'養老',1). 西暦和暦表(718,'養老',2). 西暦和暦表(719,'養老',3). 西暦和暦表(720,'養老',4). 西暦和暦表(721,'養老',5). 西暦和暦表(722,'養老',6). 西暦和暦表(723,'養老',7). 西暦和暦表(724,'養老',8). 西暦和暦表(724,'神亀',1). 西暦和暦表(725,'神亀',2). 西暦和暦表(726,'神亀',3). 西暦和暦表(727,'神亀',4). 西暦和暦表(728,'神亀',5). 西暦和暦表(729,'神亀',6). 西暦和暦表(729,'天平',1). 西暦和暦表(730,'天平',2). 西暦和暦表(731,'天平',3). 西暦和暦表(732,'天平',4). 西暦和暦表(733,'天平',5). 西暦和暦表(734,'天平',6). 西暦和暦表(735,'天平',7). 西暦和暦表(736,'天平',8). 西暦和暦表(737,'天平',9). 西暦和暦表(738,'天平',10). 西暦和暦表(739,'天平',11). 西暦和暦表(740,'天平',12). 西暦和暦表(741,'天平',13). 西暦和暦表(742,'天平',14). 西暦和暦表(743,'天平',15). 西暦和暦表(744,'天平',16). 西暦和暦表(745,'天平',17). 西暦和暦表(746,'天平',18). 西暦和暦表(747,'天平',19). 西暦和暦表(748,'天平',20). 西暦和暦表(749,'天平',21). 西暦和暦表(749,'天平感宝',1). 西暦和暦表(749,'天平勝宝',1). 西暦和暦表(750,'天平勝宝',2). 西暦和暦表(751,'天平勝宝',3). 西暦和暦表(752,'天平勝宝',4). 西暦和暦表(753,'天平勝宝',5). 西暦和暦表(754,'天平勝宝',6). 西暦和暦表(755,'天平勝宝',7). 西暦和暦表(756,'天平勝宝',8). 西暦和暦表(757,'天平勝宝',9). 西暦和暦表(757,'天平宝字',1). 西暦和暦表(758,'天平宝字',2). 西暦和暦表(759,'天平宝字',3). 西暦和暦表(760,'天平宝字',4). 西暦和暦表(761,'天平宝字',5). 西暦和暦表(762,'天平宝字',6). 西暦和暦表(763,'天平宝字',7). 西暦和暦表(764,'天平宝字',8). 西暦和暦表(765,'天平宝字',9). 西暦和暦表(765,'天平神護',1). 西暦和暦表(766,'天平神護',2). 西暦和暦表(767,'天平神護',3). 西暦和暦表(767,'神護景雲',1). 西暦和暦表(768,'神護景雲',2). 西暦和暦表(769,'神護景雲',3). 西暦和暦表(770,'神護景雲',4). 西暦和暦表(770,'宝亀',1). 西暦和暦表(771,'宝亀',2). 西暦和暦表(772,'宝亀',3). 西暦和暦表(773,'宝亀',4). 西暦和暦表(774,'宝亀',5). 西暦和暦表(775,'宝亀',6). 西暦和暦表(776,'宝亀',7). 西暦和暦表(777,'宝亀',8). 西暦和暦表(778,'宝亀',9). 西暦和暦表(779,'宝亀',10). 西暦和暦表(780,'宝亀',11). 西暦和暦表(781,'天応',1). 西暦和暦表(782,'天応',2). 西暦和暦表(782,'延暦',1). 西暦和暦表(783,'延暦',2). 西暦和暦表(784,'延暦',3). 西暦和暦表(785,'延暦',4). 西暦和暦表(786,'延暦',5). 西暦和暦表(787,'延暦',6). 西暦和暦表(788,'延暦',7). 西暦和暦表(789,'延暦',8). 西暦和暦表(790,'延暦',9). 西暦和暦表(791,'延暦',10). 西暦和暦表(792,'延暦',11). 西暦和暦表(793,'延暦',12). 西暦和暦表(794,'延暦',13). 西暦和暦表(795,'延暦',14). 西暦和暦表(796,'延暦',15). 西暦和暦表(797,'延暦',16). 西暦和暦表(798,'延暦',17). 西暦和暦表(799,'延暦',18). 西暦和暦表(800,'延暦',19). 西暦和暦表(801,'延暦',20). 西暦和暦表(802,'延暦',21). 西暦和暦表(803,'延暦',22). 西暦和暦表(804,'延暦',23). 西暦和暦表(805,'延暦',24). 西暦和暦表(806,'延暦',25). 西暦和暦表(806,'大同',1). 西暦和暦表(807,'大同',2). 西暦和暦表(808,'大同',3). 西暦和暦表(809,'大同',4). 西暦和暦表(810,'大同',5). 西暦和暦表(810,'弘仁',1). 西暦和暦表(811,'弘仁',2). 西暦和暦表(812,'弘仁',3). 西暦和暦表(813,'弘仁',4). 西暦和暦表(814,'弘仁',5). 西暦和暦表(815,'弘仁',6). 西暦和暦表(816,'弘仁',7). 西暦和暦表(817,'弘仁',8). 西暦和暦表(818,'弘仁',9). 西暦和暦表(819,'弘仁',10). 西暦和暦表(820,'弘仁',11). 西暦和暦表(821,'弘仁',12). 西暦和暦表(822,'弘仁',13). 西暦和暦表(823,'弘仁',14). 西暦和暦表(824,'弘仁',15). 西暦和暦表(824,'天長',1). 西暦和暦表(825,'天長',2). 西暦和暦表(826,'天長',3). 西暦和暦表(827,'天長',4). 西暦和暦表(828,'天長',5). 西暦和暦表(829,'天長',6). 西暦和暦表(830,'天長',7). 西暦和暦表(831,'天長',8). 西暦和暦表(832,'天長',9). 西暦和暦表(833,'天長',10). 西暦和暦表(834,'天長',11). 西暦和暦表(834,'承和',1). 西暦和暦表(835,'承和',2). 西暦和暦表(836,'承和',3). 西暦和暦表(837,'承和',4). 西暦和暦表(838,'承和',5). 西暦和暦表(839,'承和',6). 西暦和暦表(840,'承和',7). 西暦和暦表(841,'承和',8). 西暦和暦表(842,'承和',9). 西暦和暦表(843,'承和',10). 西暦和暦表(844,'承和',11). 西暦和暦表(845,'承和',12). 西暦和暦表(846,'承和',13). 西暦和暦表(847,'承和',14). 西暦和暦表(848,'承和',15). 西暦和暦表(848,'嘉祥',1). 西暦和暦表(849,'嘉祥',2). 西暦和暦表(850,'嘉祥',3). 西暦和暦表(851,'嘉祥',4). 西暦和暦表(851,'仁寿',1). 西暦和暦表(852,'仁寿',2). 西暦和暦表(853,'仁寿',3). 西暦和暦表(854,'仁寿',4). 西暦和暦表(854,'斉衡',1). 西暦和暦表(855,'斉衡',2). 西暦和暦表(856,'斉衡',3). 西暦和暦表(857,'斉衡',4). 西暦和暦表(857,'天安',1). 西暦和暦表(858,'天安',2). 西暦和暦表(859,'天安',3). 西暦和暦表(859,'貞観',1). 西暦和暦表(860,'貞観',2). 西暦和暦表(861,'貞観',3). 西暦和暦表(862,'貞観',4). 西暦和暦表(863,'貞観',5). 西暦和暦表(864,'貞観',6). 西暦和暦表(865,'貞観',7). 西暦和暦表(866,'貞観',8). 西暦和暦表(867,'貞観',9). 西暦和暦表(868,'貞観',10). 西暦和暦表(869,'貞観',11). 西暦和暦表(870,'貞観',12). 西暦和暦表(871,'貞観',13). 西暦和暦表(872,'貞観',14). 西暦和暦表(873,'貞観',15). 西暦和暦表(874,'貞観',16). 西暦和暦表(875,'貞観',17). 西暦和暦表(876,'貞観',18). 西暦和暦表(877,'貞観',19). 西暦和暦表(877,'元慶',1). 西暦和暦表(878,'元慶',2). 西暦和暦表(879,'元慶',3). 西暦和暦表(880,'元慶',4). 西暦和暦表(881,'元慶',5). 西暦和暦表(882,'元慶',6). 西暦和暦表(883,'元慶',7). 西暦和暦表(884,'元慶',8). 西暦和暦表(885,'元慶',9). 西暦和暦表(885,'仁和',1). 西暦和暦表(886,'仁和',2). 西暦和暦表(887,'仁和',3). 西暦和暦表(888,'仁和',4). 西暦和暦表(889,'仁和',5). 西暦和暦表(889,'寛平',1). 西暦和暦表(890,'寛平',2). 西暦和暦表(891,'寛平',3). 西暦和暦表(892,'寛平',4). 西暦和暦表(893,'寛平',5). 西暦和暦表(894,'寛平',6). 西暦和暦表(895,'寛平',7). 西暦和暦表(896,'寛平',8). 西暦和暦表(897,'寛平',9). 西暦和暦表(898,'寛平',10). 西暦和暦表(898,'昌泰',1). 西暦和暦表(899,'昌泰',2). 西暦和暦表(900,'昌泰',3). 西暦和暦表(901,'昌泰',4). 西暦和暦表(901,'延喜',1). 西暦和暦表(902,'延喜',2). 西暦和暦表(903,'延喜',3). 西暦和暦表(904,'延喜',4). 西暦和暦表(905,'延喜',5). 西暦和暦表(906,'延喜',6). 西暦和暦表(907,'延喜',7). 西暦和暦表(908,'延喜',8). 西暦和暦表(909,'延喜',9). 西暦和暦表(910,'延喜',10). 西暦和暦表(911,'延喜',11). 西暦和暦表(912,'延喜',12). 西暦和暦表(913,'延喜',13). 西暦和暦表(914,'延喜',14). 西暦和暦表(915,'延喜',15). 西暦和暦表(916,'延喜',16). 西暦和暦表(917,'延喜',17). 西暦和暦表(918,'延喜',18). 西暦和暦表(919,'延喜',19). 西暦和暦表(920,'延喜',20). 西暦和暦表(921,'延喜',21). 西暦和暦表(922,'延喜',22). 西暦和暦表(923,'延喜',23). 西暦和暦表(923,'延長',1). 西暦和暦表(924,'延長',2). 西暦和暦表(925,'延長',3). 西暦和暦表(926,'延長',4). 西暦和暦表(927,'延長',5). 西暦和暦表(928,'延長',6). 西暦和暦表(929,'延長',7). 西暦和暦表(930,'延長',8). 西暦和暦表(931,'延長',9). 西暦和暦表(931,'承平',1). 西暦和暦表(932,'承平',2). 西暦和暦表(933,'承平',3). 西暦和暦表(934,'承平',4). 西暦和暦表(935,'承平',5). 西暦和暦表(936,'承平',6). 西暦和暦表(937,'承平',7). 西暦和暦表(938,'承平',8). 西暦和暦表(938,'天慶',1). 西暦和暦表(939,'天慶',2). 西暦和暦表(940,'天慶',3). 西暦和暦表(941,'天慶',4). 西暦和暦表(942,'天慶',5). 西暦和暦表(943,'天慶',6). 西暦和暦表(944,'天慶',7). 西暦和暦表(945,'天慶',8). 西暦和暦表(946,'天慶',9). 西暦和暦表(947,'天慶',10). 西暦和暦表(947,'天暦',1). 西暦和暦表(948,'天暦',2). 西暦和暦表(949,'天暦',3). 西暦和暦表(950,'天暦',4). 西暦和暦表(951,'天暦',5). 西暦和暦表(952,'天暦',6). 西暦和暦表(953,'天暦',7). 西暦和暦表(954,'天暦',8). 西暦和暦表(955,'天暦',9). 西暦和暦表(956,'天暦',10). 西暦和暦表(957,'天暦',11). 西暦和暦表(957,'天徳',1). 西暦和暦表(958,'天徳',2). 西暦和暦表(959,'天徳',3). 西暦和暦表(960,'天徳',4). 西暦和暦表(961,'天徳',5). 西暦和暦表(961,'応和',1). 西暦和暦表(962,'応和',2). 西暦和暦表(963,'応和',3). 西暦和暦表(964,'応和',4). 西暦和暦表(964,'康保',1). 西暦和暦表(965,'康保',2). 西暦和暦表(966,'康保',3). 西暦和暦表(967,'康保',4). 西暦和暦表(968,'康保',5). 西暦和暦表(968,'安和',1). 西暦和暦表(969,'安和',2). 西暦和暦表(970,'安和',3). 西暦和暦表(970,'天禄',1). 西暦和暦表(971,'天禄',2). 西暦和暦表(972,'天禄',3). 西暦和暦表(973,'天禄',4). 西暦和暦表(973,'天延',1). 西暦和暦表(974,'天延',2). 西暦和暦表(975,'天延',3). 西暦和暦表(976,'天延',4). 西暦和暦表(976,'貞元',1). 西暦和暦表(977,'貞元',2). 西暦和暦表(978,'貞元',3). 西暦和暦表(978,'天元',1). 西暦和暦表(979,'天元',2). 西暦和暦表(980,'天元',3). 西暦和暦表(981,'天元',4). 西暦和暦表(982,'天元',5). 西暦和暦表(983,'天元',6). 西暦和暦表(983,'永観',1). 西暦和暦表(984,'永観',2). 西暦和暦表(985,'永観',3). 西暦和暦表(985,'寛和',1). 西暦和暦表(986,'寛和',2). 西暦和暦表(987,'寛和',3). 西暦和暦表(987,'永延',1). 西暦和暦表(988,'永延',2). 西暦和暦表(989,'永延',3). 西暦和暦表(989,'永祚',1). 西暦和暦表(990,'永祚',2). 西暦和暦表(990,'正暦',1). 西暦和暦表(991,'正暦',2). 西暦和暦表(992,'正暦',3). 西暦和暦表(993,'正暦',4). 西暦和暦表(994,'正暦',5). 西暦和暦表(995,'正暦',6). 西暦和暦表(995,'長徳',1). 西暦和暦表(996,'長徳',2). 西暦和暦表(997,'長徳',3). 西暦和暦表(998,'長徳',4). 西暦和暦表(999,'長徳',5). 西暦和暦表(999,'長保',1). 西暦和暦表(1000,'長保',2). 西暦和暦表(1001,'長保',3). 西暦和暦表(1002,'長保',4). 西暦和暦表(1003,'長保',5). 西暦和暦表(1004,'長保',6). 西暦和暦表(1004,'寛弘',1). 西暦和暦表(1005,'寛弘',2). 西暦和暦表(1006,'寛弘',3). 西暦和暦表(1007,'寛弘',4). 西暦和暦表(1008,'寛弘',5). 西暦和暦表(1009,'寛弘',6). 西暦和暦表(1010,'寛弘',7). 西暦和暦表(1011,'寛弘',8). 西暦和暦表(1012,'寛弘',9). 西暦和暦表(1012,'長和',1). 西暦和暦表(1013,'長和',2). 西暦和暦表(1014,'長和',3). 西暦和暦表(1015,'長和',4). 西暦和暦表(1016,'長和',5). 西暦和暦表(1017,'長和',6). 西暦和暦表(1017,'寛仁',1). 西暦和暦表(1018,'寛仁',2). 西暦和暦表(1019,'寛仁',3). 西暦和暦表(1020,'寛仁',4). 西暦和暦表(1021,'寛仁',5). 西暦和暦表(1021,'治安',1). 西暦和暦表(1022,'治安',2). 西暦和暦表(1023,'治安',3). 西暦和暦表(1024,'治安',4). 西暦和暦表(1024,'万寿',1). 西暦和暦表(1025,'万寿',2). 西暦和暦表(1026,'万寿',3). 西暦和暦表(1027,'万寿',4). 西暦和暦表(1028,'万寿',5). 西暦和暦表(1028,'長元',1). 西暦和暦表(1029,'長元',2). 西暦和暦表(1030,'長元',3). 西暦和暦表(1031,'長元',4). 西暦和暦表(1032,'長元',5). 西暦和暦表(1033,'長元',6). 西暦和暦表(1034,'長元',7). 西暦和暦表(1035,'長元',8). 西暦和暦表(1036,'長元',9). 西暦和暦表(1037,'長元',10). 西暦和暦表(1037,'長暦',1). 西暦和暦表(1038,'長暦',2). 西暦和暦表(1039,'長暦',3). 西暦和暦表(1040,'長暦',4). 西暦和暦表(1040,'長久',1). 西暦和暦表(1041,'長久',2). 西暦和暦表(1042,'長久',3). 西暦和暦表(1043,'長久',4). 西暦和暦表(1044,'長久',5). 西暦和暦表(1044,'寛徳',1). 西暦和暦表(1045,'寛徳',2). 西暦和暦表(1046,'寛徳',3). 西暦和暦表(1046,'永承',1). 西暦和暦表(1047,'永承',2). 西暦和暦表(1048,'永承',3). 西暦和暦表(1049,'永承',4). 西暦和暦表(1050,'永承',5). 西暦和暦表(1051,'永承',6). 西暦和暦表(1052,'永承',7). 西暦和暦表(1053,'永承',8). 西暦和暦表(1053,'天喜',1). 西暦和暦表(1054,'天喜',2). 西暦和暦表(1055,'天喜',3). 西暦和暦表(1056,'天喜',4). 西暦和暦表(1057,'天喜',5). 西暦和暦表(1058,'天喜',6). 西暦和暦表(1058,'康平',1). 西暦和暦表(1059,'康平',2). 西暦和暦表(1060,'康平',3). 西暦和暦表(1061,'康平',4). 西暦和暦表(1062,'康平',5). 西暦和暦表(1063,'康平',6). 西暦和暦表(1064,'康平',7). 西暦和暦表(1065,'康平',8). 西暦和暦表(1065,'治暦',1). 西暦和暦表(1066,'治暦',2). 西暦和暦表(1067,'治暦',3). 西暦和暦表(1068,'治暦',4). 西暦和暦表(1069,'治暦',5). 西暦和暦表(1069,'延久',1). 西暦和暦表(1070,'延久',2). 西暦和暦表(1071,'延久',3). 西暦和暦表(1072,'延久',4). 西暦和暦表(1073,'延久',5). 西暦和暦表(1074,'延久',6). 西暦和暦表(1074,'承保',1). 西暦和暦表(1075,'承保',2). 西暦和暦表(1076,'承保',3). 西暦和暦表(1077,'承保',4). 西暦和暦表(1077,'承暦',1). 西暦和暦表(1078,'承暦',2). 西暦和暦表(1079,'承暦',3). 西暦和暦表(1080,'承暦',4). 西暦和暦表(1081,'承暦',5). 西暦和暦表(1081,'永保',1). 西暦和暦表(1082,'永保',2). 西暦和暦表(1083,'永保',3). 西暦和暦表(1084,'永保',4). 西暦和暦表(1084,'応徳',1). 西暦和暦表(1085,'応徳',2). 西暦和暦表(1086,'応徳',3). 西暦和暦表(1087,'応徳',4). 西暦和暦表(1087,'寛治',1). 西暦和暦表(1088,'寛治',2). 西暦和暦表(1089,'寛治',3). 西暦和暦表(1090,'寛治',4). 西暦和暦表(1091,'寛治',5). 西暦和暦表(1092,'寛治',6). 西暦和暦表(1093,'寛治',7). 西暦和暦表(1094,'寛治',8). 西暦和暦表(1094,'嘉保',1). 西暦和暦表(1095,'嘉保',2). 西暦和暦表(1096,'嘉保',3). 西暦和暦表(1096,'永長',1). 西暦和暦表(1097,'永長',2). 西暦和暦表(1097,'承徳',1). 西暦和暦表(1098,'承徳',2). 西暦和暦表(1099,'承徳',3). 西暦和暦表(1099,'康和',1). 西暦和暦表(1100,'康和',2). 西暦和暦表(1101,'康和',3). 西暦和暦表(1102,'康和',4). 西暦和暦表(1103,'康和',5). 西暦和暦表(1104,'康和',6). 西暦和暦表(1104,'長治',1). 西暦和暦表(1105,'長治',2). 西暦和暦表(1106,'長治',3). 西暦和暦表(1106,'嘉承',1). 西暦和暦表(1107,'嘉承',2). 西暦和暦表(1108,'嘉承',3). 西暦和暦表(1108,'天仁',1). 西暦和暦表(1109,'天仁',2). 西暦和暦表(1110,'天仁',3). 西暦和暦表(1110,'天永',1). 西暦和暦表(1111,'天永',2). 西暦和暦表(1112,'天永',3). 西暦和暦表(1113,'天永',4). 西暦和暦表(1113,'永久',1). 西暦和暦表(1114,'永久',2). 西暦和暦表(1115,'永久',3). 西暦和暦表(1116,'永久',4). 西暦和暦表(1117,'永久',5). 西暦和暦表(1118,'永久',6). 西暦和暦表(1118,'元永',1). 西暦和暦表(1119,'元永',2). 西暦和暦表(1120,'元永',3). 西暦和暦表(1120,'保安',1). 西暦和暦表(1121,'保安',2). 西暦和暦表(1122,'保安',3). 西暦和暦表(1123,'保安',4). 西暦和暦表(1124,'保安',5). 西暦和暦表(1124,'天治',1). 西暦和暦表(1125,'天治',2). 西暦和暦表(1126,'天治',3). 西暦和暦表(1126,'大治',1). 西暦和暦表(1127,'大治',2). 西暦和暦表(1128,'大治',3). 西暦和暦表(1129,'大治',4). 西暦和暦表(1130,'大治',5). 西暦和暦表(1131,'大治',6). 西暦和暦表(1131,'天承',1). 西暦和暦表(1132,'天承',2). 西暦和暦表(1132,'長承',1). 西暦和暦表(1133,'長承',2). 西暦和暦表(1134,'長承',3). 西暦和暦表(1135,'長承',4). 西暦和暦表(1135,'保延',1). 西暦和暦表(1136,'保延',2). 西暦和暦表(1137,'保延',3). 西暦和暦表(1138,'保延',4). 西暦和暦表(1139,'保延',5). 西暦和暦表(1140,'保延',6). 西暦和暦表(1141,'保延',7). 西暦和暦表(1141,'永治',1). 西暦和暦表(1142,'永治',2). 西暦和暦表(1142,'康治',1). 西暦和暦表(1143,'康治',2). 西暦和暦表(1144,'康治',3). 西暦和暦表(1144,'天養',1). 西暦和暦表(1145,'天養',2). 西暦和暦表(1145,'久安',1). 西暦和暦表(1146,'久安',2). 西暦和暦表(1147,'久安',3). 西暦和暦表(1148,'久安',4). 西暦和暦表(1149,'久安',5). 西暦和暦表(1150,'久安',6). 西暦和暦表(1151,'久安',7). 西暦和暦表(1151,'仁平',1). 西暦和暦表(1152,'仁平',2). 西暦和暦表(1153,'仁平',3). 西暦和暦表(1154,'仁平',4). 西暦和暦表(1154,'久寿',1). 西暦和暦表(1155,'久寿',2). 西暦和暦表(1156,'久寿',3). 西暦和暦表(1156,'保元',1). 西暦和暦表(1157,'保元',2). 西暦和暦表(1158,'保元',3). 西暦和暦表(1159,'保元',4). 西暦和暦表(1159,'平治',1). 西暦和暦表(1160,'平治',2). 西暦和暦表(1160,'永暦',1). 西暦和暦表(1161,'永暦',2). 西暦和暦表(1161,'応保',1). 西暦和暦表(1162,'応保',2). 西暦和暦表(1163,'応保',3). 西暦和暦表(1163,'長寛',1). 西暦和暦表(1164,'長寛',2). 西暦和暦表(1165,'長寛',3). 西暦和暦表(1165,'永万',1). 西暦和暦表(1166,'永万',2). 西暦和暦表(1166,'仁安',1). 西暦和暦表(1167,'仁安',2). 西暦和暦表(1168,'仁安',3). 西暦和暦表(1169,'仁安',4). 西暦和暦表(1169,'嘉応',1). 西暦和暦表(1170,'嘉応',2). 西暦和暦表(1171,'嘉応',3). 西暦和暦表(1171,'承安',1). 西暦和暦表(1172,'承安',2). 西暦和暦表(1173,'承安',3). 西暦和暦表(1174,'承安',4). 西暦和暦表(1175,'承安',5). 西暦和暦表(1175,'安元',1). 西暦和暦表(1176,'安元',2). 西暦和暦表(1177,'安元',3). 西暦和暦表(1177,'治承',1). 西暦和暦表(1178,'治承',2). 西暦和暦表(1179,'治承',3). 西暦和暦表(1180,'治承',4). 西暦和暦表(1181,'治承',5). 西暦和暦表(1181,'養和',1). 西暦和暦表(1182,'養和',2). 西暦和暦表(1182,'寿永',1). 西暦和暦表(1183,'寿永',2). 西暦和暦表(1184,'寿永',3). 西暦和暦表(1185,'寿永',4). 西暦和暦表(1185,'文治',1). 西暦和暦表(1186,'文治',2). 西暦和暦表(1187,'文治',3). 西暦和暦表(1188,'文治',4). 西暦和暦表(1189,'文治',5). 西暦和暦表(1190,'文治',6). 西暦和暦表(1190,'建久',1). 西暦和暦表(1191,'建久',2). 西暦和暦表(1192,'建久',3). 西暦和暦表(1193,'建久',4). 西暦和暦表(1194,'建久',5). 西暦和暦表(1195,'建久',6). 西暦和暦表(1196,'建久',7). 西暦和暦表(1197,'建久',8). 西暦和暦表(1198,'建久',9). 西暦和暦表(1199,'建久',10). 西暦和暦表(1199,'正治',1). 西暦和暦表(1200,'正治',2). 西暦和暦表(1201,'正治',3). 西暦和暦表(1201,'建仁',1). 西暦和暦表(1202,'建仁',2). 西暦和暦表(1203,'建仁',3). 西暦和暦表(1204,'建仁',4). 西暦和暦表(1204,'元久',1). 西暦和暦表(1205,'元久',2). 西暦和暦表(1206,'元久',3). 西暦和暦表(1206,'建永',1). 西暦和暦表(1207,'建永',2). 西暦和暦表(1207,'承元',1). 西暦和暦表(1208,'承元',2). 西暦和暦表(1209,'承元',3). 西暦和暦表(1210,'承元',4). 西暦和暦表(1211,'承元',5). 西暦和暦表(1211,'建暦',1). 西暦和暦表(1212,'建暦',2). 西暦和暦表(1213,'建暦',3). 西暦和暦表(1213,'建保',1). 西暦和暦表(1214,'建保',2). 西暦和暦表(1215,'建保',3). 西暦和暦表(1216,'建保',4). 西暦和暦表(1217,'建保',5). 西暦和暦表(1218,'建保',6). 西暦和暦表(1219,'建保',7). 西暦和暦表(1219,'承久',1). 西暦和暦表(1220,'承久',2). 西暦和暦表(1221,'承久',3). 西暦和暦表(1222,'承久',4). 西暦和暦表(1222,'貞応',1). 西暦和暦表(1223,'貞応',2). 西暦和暦表(1224,'貞応',3). 西暦和暦表(1224,'元仁',1). 西暦和暦表(1225,'元仁',2). 西暦和暦表(1225,'嘉祿',1). 西暦和暦表(1226,'嘉祿',2). 西暦和暦表(1227,'嘉祿',3). 西暦和暦表(1227,'安貞',1). 西暦和暦表(1228,'安貞',2). 西暦和暦表(1229,'安貞',3). 西暦和暦表(1229,'寛喜',1). 西暦和暦表(1230,'寛喜',2). 西暦和暦表(1231,'寛喜',3). 西暦和暦表(1232,'寛喜',4). 西暦和暦表(1232,'貞永',1). 西暦和暦表(1233,'貞永',2). 西暦和暦表(1233,'天福',1). 西暦和暦表(1234,'天福',2). 西暦和暦表(1234,'文暦',1). 西暦和暦表(1235,'文暦',2). 西暦和暦表(1235,'嘉禎',1). 西暦和暦表(1236,'嘉禎',2). 西暦和暦表(1237,'嘉禎',3). 西暦和暦表(1238,'嘉禎',4). 西暦和暦表(1238,'暦仁',1). 西暦和暦表(1239,'暦仁',2). 西暦和暦表(1239,'延応',1). 西暦和暦表(1240,'延応',2). 西暦和暦表(1240,'仁治',1). 西暦和暦表(1241,'仁治',2). 西暦和暦表(1242,'仁治',3). 西暦和暦表(1243,'仁治',4). 西暦和暦表(1243,'寛元',1). 西暦和暦表(1244,'寛元',2). 西暦和暦表(1245,'寛元',3). 西暦和暦表(1246,'寛元',4). 西暦和暦表(1247,'寛元',5). 西暦和暦表(1247,'宝治',1). 西暦和暦表(1248,'宝治',2). 西暦和暦表(1249,'宝治',3). 西暦和暦表(1249,'建長',1). 西暦和暦表(1250,'建長',2). 西暦和暦表(1251,'建長',3). 西暦和暦表(1252,'建長',4). 西暦和暦表(1253,'建長',5). 西暦和暦表(1254,'建長',6). 西暦和暦表(1255,'建長',7). 西暦和暦表(1256,'建長',8). 西暦和暦表(1256,'康元',1). 西暦和暦表(1257,'康元',2). 西暦和暦表(1257,'正嘉',1). 西暦和暦表(1258,'正嘉',2). 西暦和暦表(1259,'正嘉',3). 西暦和暦表(1259,'正元',1). 西暦和暦表(1260,'正元',2). 西暦和暦表(1260,'文応',1). 西暦和暦表(1261,'文応',2). 西暦和暦表(1261,'弘長',1). 西暦和暦表(1262,'弘長',2). 西暦和暦表(1263,'弘長',3). 西暦和暦表(1264,'弘長',4). 西暦和暦表(1264,'文永',1). 西暦和暦表(1265,'文永',2). 西暦和暦表(1266,'文永',3). 西暦和暦表(1267,'文永',4). 西暦和暦表(1268,'文永',5). 西暦和暦表(1269,'文永',6). 西暦和暦表(1270,'文永',7). 西暦和暦表(1271,'文永',8). 西暦和暦表(1272,'文永',9). 西暦和暦表(1273,'文永',10). 西暦和暦表(1274,'文永',11). 西暦和暦表(1275,'文永',12). 西暦和暦表(1275,'建治',1). 西暦和暦表(1276,'建治',2). 西暦和暦表(1277,'建治',3). 西暦和暦表(1278,'建治',4). 西暦和暦表(1278,'弘安',1). 西暦和暦表(1279,'弘安',2). 西暦和暦表(1280,'弘安',3). 西暦和暦表(1281,'弘安',4). 西暦和暦表(1282,'弘安',5). 西暦和暦表(1283,'弘安',6). 西暦和暦表(1284,'弘安',7). 西暦和暦表(1285,'弘安',8). 西暦和暦表(1286,'弘安',9). 西暦和暦表(1287,'弘安',10). 西暦和暦表(1288,'弘安',11). 西暦和暦表(1288,'正応',1). 西暦和暦表(1289,'正応',2). 西暦和暦表(1290,'正応',3). 西暦和暦表(1291,'正応',4). 西暦和暦表(1292,'正応',5). 西暦和暦表(1293,'正応',6). 西暦和暦表(1293,'永仁',1). 西暦和暦表(1294,'永仁',2). 西暦和暦表(1295,'永仁',3). 西暦和暦表(1296,'永仁',4). 西暦和暦表(1297,'永仁',5). 西暦和暦表(1298,'永仁',6). 西暦和暦表(1299,'永仁',7). 西暦和暦表(1299,'正安',1). 西暦和暦表(1300,'正安',2). 西暦和暦表(1301,'正安',3). 西暦和暦表(1302,'正安',4). 西暦和暦表(1302,'乾元',1). 西暦和暦表(1303,'乾元',2). 西暦和暦表(1303,'嘉元',1). 西暦和暦表(1304,'嘉元',2). 西暦和暦表(1305,'嘉元',3). 西暦和暦表(1306,'嘉元',4). 西暦和暦表(1306,'徳治',1). 西暦和暦表(1307,'徳治',2). 西暦和暦表(1308,'徳治',3). 西暦和暦表(1308,'延慶',1). 西暦和暦表(1309,'延慶',2). 西暦和暦表(1310,'延慶',3). 西暦和暦表(1311,'延慶',4). 西暦和暦表(1311,'応長',1). 西暦和暦表(1312,'応長',2). 西暦和暦表(1312,'正和',1). 西暦和暦表(1313,'正和',2). 西暦和暦表(1314,'正和',3). 西暦和暦表(1315,'正和',4). 西暦和暦表(1316,'正和',5). 西暦和暦表(1317,'正和',6). 西暦和暦表(1317,'文保',1). 西暦和暦表(1318,'文保',2). 西暦和暦表(1319,'文保',3). 西暦和暦表(1319,'元応',1). 西暦和暦表(1320,'元応',2). 西暦和暦表(1321,'元応',3). 西暦和暦表(1321,'元亨',1). 西暦和暦表(1322,'元亨',2). 西暦和暦表(1323,'元亨',3). 西暦和暦表(1324,'元亨',4). 西暦和暦表(1324,'正中',1). 西暦和暦表(1325,'正中',2). 西暦和暦表(1326,'正中',3). 西暦和暦表(1326,'嘉暦',1). 西暦和暦表(1327,'嘉暦',2). 西暦和暦表(1328,'嘉暦',3). 西暦和暦表(1329,'嘉暦',4). 西暦和暦表(1329,'元徳',1). 西暦和暦表(1330,'元徳',2). 西暦和暦表(1331,'元徳',3). 西暦和暦表(1331,'元弘',1). 西暦和暦表(1332,'元弘',2). 西暦和暦表(1332,'正慶',1). 西暦和暦表(1333,'正慶',2). 西暦和暦表(1334,'正慶',3). 西暦和暦表(1334,'建武',1). 西暦和暦表(1335,'建武',2). 西暦和暦表(1336,'建武',3). 西暦和暦表(1337,'建武',4). 西暦和暦表(1338,'建武',5). 西暦和暦表(1338,'暦応',1). 西暦和暦表(1339,'暦応',2). 西暦和暦表(1340,'暦応',3). 西暦和暦表(1341,'暦応',4). 西暦和暦表(1342,'暦応',5). 西暦和暦表(1342,'康永',1). 西暦和暦表(1343,'康永',2). 西暦和暦表(1344,'康永',3). 西暦和暦表(1345,'康永',4). 西暦和暦表(1345,'貞和',1). 西暦和暦表(1346,'貞和',2). 西暦和暦表(1347,'貞和',3). 西暦和暦表(1348,'貞和',4). 西暦和暦表(1349,'貞和',5). 西暦和暦表(1350,'貞和',6). 西暦和暦表(1350,'観応',1). 西暦和暦表(1351,'観応',2). 西暦和暦表(1352,'観応',3). 西暦和暦表(1352,'文和',1). 西暦和暦表(1353,'文和',2). 西暦和暦表(1354,'文和',3). 西暦和暦表(1355,'文和',4). 西暦和暦表(1356,'文和',5). 西暦和暦表(1356,'延文',1). 西暦和暦表(1357,'延文',2). 西暦和暦表(1358,'延文',3). 西暦和暦表(1359,'延文',4). 西暦和暦表(1360,'延文',5). 西暦和暦表(1361,'延文',6). 西暦和暦表(1361,'康安',1). 西暦和暦表(1362,'康安',2). 西暦和暦表(1362,'貞治',1). 西暦和暦表(1363,'貞治',2). 西暦和暦表(1364,'貞治',3). 西暦和暦表(1365,'貞治',4). 西暦和暦表(1366,'貞治',5). 西暦和暦表(1367,'貞治',6). 西暦和暦表(1368,'貞治',7). 西暦和暦表(1368,'応安',1). 西暦和暦表(1369,'応安',2). 西暦和暦表(1370,'応安',3). 西暦和暦表(1371,'応安',4). 西暦和暦表(1372,'応安',5). 西暦和暦表(1373,'応安',6). 西暦和暦表(1374,'応安',7). 西暦和暦表(1375,'応安',8). 西暦和暦表(1375,'永和',1). 西暦和暦表(1376,'永和',2). 西暦和暦表(1377,'永和',3). 西暦和暦表(1378,'永和',4). 西暦和暦表(1379,'永和',5). 西暦和暦表(1379,'康暦',1). 西暦和暦表(1380,'康暦',2). 西暦和暦表(1381,'康暦',3). 西暦和暦表(1381,'永徳',1). 西暦和暦表(1382,'永徳',2). 西暦和暦表(1383,'永徳',3). 西暦和暦表(1384,'永徳',4). 西暦和暦表(1384,'至徳',1). 西暦和暦表(1385,'至徳',2). 西暦和暦表(1386,'至徳',3). 西暦和暦表(1387,'至徳',4). 西暦和暦表(1387,'嘉慶',1). 西暦和暦表(1388,'嘉慶',2). 西暦和暦表(1389,'嘉慶',3). 西暦和暦表(1389,'康応',1). 西暦和暦表(1390,'康応',2). 西暦和暦表(1390,'明徳',1). 西暦和暦表(1391,'明徳',2). 西暦和暦表(1392,'明徳',3). 西暦和暦表(1393,'明徳',4). 西暦和暦表(1394,'明徳',5). 西暦和暦表(1394,'応永',1). 西暦和暦表(1395,'応永',2). 西暦和暦表(1396,'応永',3). 西暦和暦表(1397,'応永',4). 西暦和暦表(1398,'応永',5). 西暦和暦表(1399,'応永',6). 西暦和暦表(1400,'応永',7). 西暦和暦表(1401,'応永',8). 西暦和暦表(1402,'応永',9). 西暦和暦表(1403,'応永',10). 西暦和暦表(1404,'応永',11). 西暦和暦表(1405,'応永',12). 西暦和暦表(1406,'応永',13). 西暦和暦表(1407,'応永',14). 西暦和暦表(1408,'応永',15). 西暦和暦表(1409,'応永',16). 西暦和暦表(1410,'応永',17). 西暦和暦表(1411,'応永',18). 西暦和暦表(1412,'応永',19). 西暦和暦表(1413,'応永',20). 西暦和暦表(1414,'応永',21). 西暦和暦表(1415,'応永',22). 西暦和暦表(1416,'応永',23). 西暦和暦表(1417,'応永',24). 西暦和暦表(1418,'応永',25). 西暦和暦表(1419,'応永',26). 西暦和暦表(1420,'応永',27). 西暦和暦表(1421,'応永',28). 西暦和暦表(1422,'応永',29). 西暦和暦表(1423,'応永',30). 西暦和暦表(1424,'応永',31). 西暦和暦表(1425,'応永',32). 西暦和暦表(1426,'応永',33). 西暦和暦表(1427,'応永',34). 西暦和暦表(1428,'応永',35). 西暦和暦表(1428,'正長',1). 西暦和暦表(1429,'正長',2). 西暦和暦表(1429,'永享',1). 西暦和暦表(1430,'永享',2). 西暦和暦表(1431,'永享',3). 西暦和暦表(1432,'永享',4). 西暦和暦表(1433,'永享',5). 西暦和暦表(1434,'永享',6). 西暦和暦表(1435,'永享',7). 西暦和暦表(1436,'永享',8). 西暦和暦表(1437,'永享',9). 西暦和暦表(1438,'永享',10). 西暦和暦表(1439,'永享',11). 西暦和暦表(1440,'永享',12). 西暦和暦表(1441,'永享',13). 西暦和暦表(1441,'嘉吉',1). 西暦和暦表(1442,'嘉吉',2). 西暦和暦表(1443,'嘉吉',3). 西暦和暦表(1444,'嘉吉',4). 西暦和暦表(1444,'文安',1). 西暦和暦表(1445,'文安',2). 西暦和暦表(1446,'文安',3). 西暦和暦表(1447,'文安',4). 西暦和暦表(1448,'文安',5). 西暦和暦表(1449,'文安',6). 西暦和暦表(1449,'宝徳',1). 西暦和暦表(1450,'宝徳',2). 西暦和暦表(1451,'宝徳',3). 西暦和暦表(1452,'宝徳',4). 西暦和暦表(1452,'享徳',1). 西暦和暦表(1453,'享徳',2). 西暦和暦表(1454,'享徳',3). 西暦和暦表(1455,'享徳',4). 西暦和暦表(1455,'康正',1). 西暦和暦表(1456,'康正',2). 西暦和暦表(1457,'康正',3). 西暦和暦表(1457,'長祿',1). 西暦和暦表(1458,'長祿',2). 西暦和暦表(1459,'長祿',3). 西暦和暦表(1460,'長祿',4). 西暦和暦表(1460,'寛正',1). 西暦和暦表(1461,'寛正',2). 西暦和暦表(1462,'寛正',3). 西暦和暦表(1463,'寛正',4). 西暦和暦表(1464,'寛正',5). 西暦和暦表(1465,'寛正',6). 西暦和暦表(1466,'寛正',7). 西暦和暦表(1466,'文正',1). 西暦和暦表(1467,'文正',2). 西暦和暦表(1467,'応仁',1). 西暦和暦表(1468,'応仁',2). 西暦和暦表(1469,'応仁',3). 西暦和暦表(1469,'文明',1). 西暦和暦表(1470,'文明',2). 西暦和暦表(1471,'文明',3). 西暦和暦表(1472,'文明',4). 西暦和暦表(1473,'文明',5). 西暦和暦表(1474,'文明',6). 西暦和暦表(1475,'文明',7). 西暦和暦表(1476,'文明',8). 西暦和暦表(1477,'文明',9). 西暦和暦表(1478,'文明',10). 西暦和暦表(1479,'文明',11). 西暦和暦表(1480,'文明',12). 西暦和暦表(1481,'文明',13). 西暦和暦表(1482,'文明',14). 西暦和暦表(1483,'文明',15). 西暦和暦表(1484,'文明',16). 西暦和暦表(1485,'文明',17). 西暦和暦表(1486,'文明',18). 西暦和暦表(1487,'文明',19). 西暦和暦表(1487,'長享',1). 西暦和暦表(1488,'長享',2). 西暦和暦表(1489,'長享',3). 西暦和暦表(1489,'延徳',1). 西暦和暦表(1490,'延徳',2). 西暦和暦表(1491,'延徳',3). 西暦和暦表(1492,'延徳',4). 西暦和暦表(1492,'明応',1). 西暦和暦表(1493,'明応',2). 西暦和暦表(1494,'明応',3). 西暦和暦表(1495,'明応',4). 西暦和暦表(1496,'明応',5). 西暦和暦表(1497,'明応',6). 西暦和暦表(1498,'明応',7). 西暦和暦表(1499,'明応',8). 西暦和暦表(1500,'明応',9). 西暦和暦表(1501,'明応',10). 西暦和暦表(1501,'文龜',1). 西暦和暦表(1502,'文龜',2). 西暦和暦表(1503,'文龜',3). 西暦和暦表(1504,'文龜',4). 西暦和暦表(1504,'永正',1). 西暦和暦表(1505,'永正',2). 西暦和暦表(1506,'永正',3). 西暦和暦表(1507,'永正',4). 西暦和暦表(1508,'永正',5). 西暦和暦表(1509,'永正',6). 西暦和暦表(1510,'永正',7). 西暦和暦表(1511,'永正',8). 西暦和暦表(1512,'永正',9). 西暦和暦表(1513,'永正',10). 西暦和暦表(1514,'永正',11). 西暦和暦表(1515,'永正',12). 西暦和暦表(1516,'永正',13). 西暦和暦表(1517,'永正',14). 西暦和暦表(1518,'永正',15). 西暦和暦表(1519,'永正',16). 西暦和暦表(1520,'永正',17). 西暦和暦表(1521,'永正',18). 西暦和暦表(1521,'大永',1). 西暦和暦表(1522,'大永',2). 西暦和暦表(1523,'大永',3). 西暦和暦表(1524,'大永',4). 西暦和暦表(1525,'大永',5). 西暦和暦表(1526,'大永',6). 西暦和暦表(1527,'大永',7). 西暦和暦表(1528,'大永',8). 西暦和暦表(1528,'享祿',1). 西暦和暦表(1529,'享祿',2). 西暦和暦表(1530,'享祿',3). 西暦和暦表(1531,'享祿',4). 西暦和暦表(1532,'享祿',5). 西暦和暦表(1532,'天文',1). 西暦和暦表(1533,'天文',2). 西暦和暦表(1534,'天文',3). 西暦和暦表(1535,'天文',4). 西暦和暦表(1536,'天文',5). 西暦和暦表(1537,'天文',6). 西暦和暦表(1538,'天文',7). 西暦和暦表(1539,'天文',8). 西暦和暦表(1540,'天文',9). 西暦和暦表(1541,'天文',10). 西暦和暦表(1542,'天文',11). 西暦和暦表(1543,'天文',12). 西暦和暦表(1544,'天文',13). 西暦和暦表(1545,'天文',14). 西暦和暦表(1546,'天文',15). 西暦和暦表(1547,'天文',16). 西暦和暦表(1548,'天文',17). 西暦和暦表(1549,'天文',18). 西暦和暦表(1550,'天文',19). 西暦和暦表(1551,'天文',20). 西暦和暦表(1552,'天文',21). 西暦和暦表(1553,'天文',22). 西暦和暦表(1554,'天文',23). 西暦和暦表(1555,'天文',24). 西暦和暦表(1555,'弘治',1). 西暦和暦表(1556,'弘治',2). 西暦和暦表(1557,'弘治',3). 西暦和暦表(1558,'弘治',4). 西暦和暦表(1558,'永祿',1). 西暦和暦表(1559,'永祿',2). 西暦和暦表(1560,'永祿',3). 西暦和暦表(1561,'永祿',4). 西暦和暦表(1562,'永祿',5). 西暦和暦表(1563,'永祿',6). 西暦和暦表(1564,'永禄',7). 西暦和暦表(1565,'永禄',8). 西暦和暦表(1566,'永禄',9). 西暦和暦表(1567,'永禄',10). 西暦和暦表(1568,'永禄',11). 西暦和暦表(1569,'永禄',12). 西暦和暦表(1570,'永禄',13). 西暦和暦表(1570,'元龜',1). 西暦和暦表(1571,'元龜',2). 西暦和暦表(1572,'元龜',3). 西暦和暦表(1573,'元龜',4). 西暦和暦表(1573,'天正',1). 西暦和暦表(1574,'天正',2). 西暦和暦表(1575,'天正',3). 西暦和暦表(1576,'天正',4). 西暦和暦表(1577,'天正',5). 西暦和暦表(1578,'天正',6). 西暦和暦表(1579,'天正',7). 西暦和暦表(1580,'天正',8). 西暦和暦表(1581,'天正',9). 西暦和暦表(1582,'天正',10). 西暦和暦表(1583,'天正',11). 西暦和暦表(1584,'天正',12). 西暦和暦表(1585,'天正',13). 西暦和暦表(1586,'天正',14). 西暦和暦表(1587,'天正',15). 西暦和暦表(1588,'天正',16). 西暦和暦表(1589,'天正',17). 西暦和暦表(1590,'天正',18). 西暦和暦表(1591,'天正',19). 西暦和暦表(1592,'天正',20). 西暦和暦表(1592,'文禄',1). 西暦和暦表(1593,'文禄',2). 西暦和暦表(1594,'文禄',3). 西暦和暦表(1595,'文禄',4). 西暦和暦表(1596,'文禄',5). 西暦和暦表(1596,'慶長',1). 西暦和暦表(1597,'慶長',2). 西暦和暦表(1598,'慶長',3). 西暦和暦表(1599,'慶長',4). 西暦和暦表(1600,'慶長',5). 西暦和暦表(1601,'慶長',6). 西暦和暦表(1602,'慶長',7). 西暦和暦表(1603,'慶長',8). 西暦和暦表(1604,'慶長',9). 西暦和暦表(1605,'慶長',10). 西暦和暦表(1606,'慶長',11). 西暦和暦表(1607,'慶長',12). 西暦和暦表(1608,'慶長',13). 西暦和暦表(1609,'慶長',14). 西暦和暦表(1610,'慶長',15). 西暦和暦表(1611,'慶長',16). 西暦和暦表(1612,'慶長',17). 西暦和暦表(1613,'慶長',18). 西暦和暦表(1614,'慶長',19). 西暦和暦表(1615,'慶長',20). 西暦和暦表(1615,'元和',1). 西暦和暦表(1616,'元和',2). 西暦和暦表(1617,'元和',3). 西暦和暦表(1618,'元和',4). 西暦和暦表(1619,'元和',5). 西暦和暦表(1620,'元和',6). 西暦和暦表(1621,'元和',7). 西暦和暦表(1622,'元和',8). 西暦和暦表(1623,'元和',9). 西暦和暦表(1624,'元和',10). 西暦和暦表(1624,'寛永',1). 西暦和暦表(1625,'寛永',2). 西暦和暦表(1626,'寛永',3). 西暦和暦表(1627,'寛永',4). 西暦和暦表(1628,'寛永',5). 西暦和暦表(1629,'寛永',6). 西暦和暦表(1630,'寛永',7). 西暦和暦表(1631,'寛永',8). 西暦和暦表(1632,'寛永',9). 西暦和暦表(1633,'寛永',10). 西暦和暦表(1634,'寛永',11). 西暦和暦表(1635,'寛永',12). 西暦和暦表(1636,'寛永',13). 西暦和暦表(1637,'寛永',14). 西暦和暦表(1638,'寛永',15). 西暦和暦表(1639,'寛永',16). 西暦和暦表(1640,'寛永',17). 西暦和暦表(1641,'寛永',18). 西暦和暦表(1642,'寛永',19). 西暦和暦表(1643,'寛永',20). 西暦和暦表(1644,'寛永',21). 西暦和暦表(1644,'正保',1). 西暦和暦表(1645,'正保',2). 西暦和暦表(1646,'正保',3). 西暦和暦表(1647,'正保',4). 西暦和暦表(1648,'正保',5). 西暦和暦表(1648,'慶安',1). 西暦和暦表(1649,'慶安',2). 西暦和暦表(1650,'慶安',3). 西暦和暦表(1651,'慶安',4). 西暦和暦表(1652,'慶安',5). 西暦和暦表(1652,'承応',1). 西暦和暦表(1653,'承応',2). 西暦和暦表(1654,'承応',3). 西暦和暦表(1655,'承応',4). 西暦和暦表(1655,'明暦',1). 西暦和暦表(1656,'明暦',2). 西暦和暦表(1657,'明暦',3). 西暦和暦表(1658,'明暦',4). 西暦和暦表(1658,'万治',1). 西暦和暦表(1659,'万治',2). 西暦和暦表(1660,'万治',3). 西暦和暦表(1661,'万治',4). 西暦和暦表(1661,'寛文',1). 西暦和暦表(1662,'寛文',2). 西暦和暦表(1663,'寛文',3). 西暦和暦表(1664,'寛文',4). 西暦和暦表(1665,'寛文',5). 西暦和暦表(1666,'寛文',6). 西暦和暦表(1667,'寛文',7). 西暦和暦表(1668,'寛文',8). 西暦和暦表(1669,'寛文',9). 西暦和暦表(1670,'寛文',10). 西暦和暦表(1671,'寛文',11). 西暦和暦表(1672,'寛文',12). 西暦和暦表(1673,'寛文',13). 西暦和暦表(1673,'延宝',1). 西暦和暦表(1674,'延宝',2). 西暦和暦表(1675,'延宝',3). 西暦和暦表(1676,'延宝',4). 西暦和暦表(1677,'延宝',5). 西暦和暦表(1678,'延宝',6). 西暦和暦表(1679,'延宝',7). 西暦和暦表(1680,'延宝',8). 西暦和暦表(1681,'延宝',9). 西暦和暦表(1681,'天和',1). 西暦和暦表(1682,'天和',2). 西暦和暦表(1683,'天和',3). 西暦和暦表(1684,'天和',4). 西暦和暦表(1684,'貞享',1). 西暦和暦表(1685,'貞享',2). 西暦和暦表(1686,'貞享',3). 西暦和暦表(1687,'貞享',4). 西暦和暦表(1688,'貞享',5). 西暦和暦表(1688,'元禄',1). 西暦和暦表(1689,'元禄',2). 西暦和暦表(1690,'元禄',3). 西暦和暦表(1691,'元禄',4). 西暦和暦表(1692,'元禄',5). 西暦和暦表(1693,'元禄',6). 西暦和暦表(1694,'元禄',7). 西暦和暦表(1695,'元禄',8). 西暦和暦表(1696,'元禄',9). 西暦和暦表(1697,'元禄',10). 西暦和暦表(1698,'元禄',11). 西暦和暦表(1699,'元禄',12). 西暦和暦表(1700,'元禄',13). 西暦和暦表(1701,'元禄',14). 西暦和暦表(1702,'元禄',15). 西暦和暦表(1703,'元禄',16). 西暦和暦表(1704,'元禄',17). 西暦和暦表(1704,'宝永',1). 西暦和暦表(1705,'宝永',2). 西暦和暦表(1706,'宝永',3). 西暦和暦表(1707,'宝永',4). 西暦和暦表(1708,'宝永',5). 西暦和暦表(1709,'宝永',6). 西暦和暦表(1710,'宝永',7). 西暦和暦表(1711,'宝永',8). 西暦和暦表(1711,'正徳',1). 西暦和暦表(1712,'正徳',2). 西暦和暦表(1713,'正徳',3). 西暦和暦表(1714,'正徳',4). 西暦和暦表(1715,'正徳',5). 西暦和暦表(1716,'正徳',6). 西暦和暦表(1716,'享保',1). 西暦和暦表(1717,'享保',2). 西暦和暦表(1718,'享保',3). 西暦和暦表(1719,'享保',4). 西暦和暦表(1720,'享保',5). 西暦和暦表(1721,'享保',6). 西暦和暦表(1722,'享保',7). 西暦和暦表(1723,'享保',8). 西暦和暦表(1724,'享保',9). 西暦和暦表(1725,'享保',10). 西暦和暦表(1726,'享保',11). 西暦和暦表(1727,'享保',12). 西暦和暦表(1728,'享保',13). 西暦和暦表(1729,'享保',14). 西暦和暦表(1730,'享保',15). 西暦和暦表(1731,'享保',16). 西暦和暦表(1732,'享保',17). 西暦和暦表(1733,'享保',18). 西暦和暦表(1734,'享保',19). 西暦和暦表(1735,'享保',20). 西暦和暦表(1736,'享保',21). 西暦和暦表(1736,'元文',1). 西暦和暦表(1737,'元文',2). 西暦和暦表(1738,'元文',3). 西暦和暦表(1739,'元文',4). 西暦和暦表(1740,'元文',5). 西暦和暦表(1741,'元文',6). 西暦和暦表(1741,'寛保',1). 西暦和暦表(1742,'寛保',2). 西暦和暦表(1743,'寛保',3). 西暦和暦表(1744,'寛保',4). 西暦和暦表(1744,'延享',1). 西暦和暦表(1745,'延享',2). 西暦和暦表(1746,'延享',3). 西暦和暦表(1747,'延享',4). 西暦和暦表(1748,'延享',5). 西暦和暦表(1748,'寛延',1). 西暦和暦表(1749,'寛延',2). 西暦和暦表(1750,'寛延',3). 西暦和暦表(1751,'寛延',4). 西暦和暦表(1751,'宝暦',1). 西暦和暦表(1752,'宝暦',2). 西暦和暦表(1753,'宝暦',3). 西暦和暦表(1754,'宝暦',4). 西暦和暦表(1755,'宝暦',5). 西暦和暦表(1756,'宝暦',6). 西暦和暦表(1757,'宝暦',7). 西暦和暦表(1758,'宝暦',8). 西暦和暦表(1759,'宝暦',9). 西暦和暦表(1760,'宝暦',10). 西暦和暦表(1761,'宝暦',11). 西暦和暦表(1762,'宝暦',12). 西暦和暦表(1763,'宝暦',13). 西暦和暦表(1764,'宝暦',14). 西暦和暦表(1764,'明和',1). 西暦和暦表(1765,'明和',2). 西暦和暦表(1766,'明和',3). 西暦和暦表(1767,'明和',4). 西暦和暦表(1768,'明和',5). 西暦和暦表(1769,'明和',6). 西暦和暦表(1770,'明和',7). 西暦和暦表(1771,'明和',8). 西暦和暦表(1772,'明和',9). 西暦和暦表(1772,'安永',1). 西暦和暦表(1773,'安永',2). 西暦和暦表(1774,'安永',3). 西暦和暦表(1775,'安永',4). 西暦和暦表(1776,'安永',5). 西暦和暦表(1777,'安永',6). 西暦和暦表(1778,'安永',7). 西暦和暦表(1779,'安永',8). 西暦和暦表(1780,'安永',9). 西暦和暦表(1781,'安永',10). 西暦和暦表(1781,'天明',1). 西暦和暦表(1782,'天明',2). 西暦和暦表(1783,'天明',3). 西暦和暦表(1784,'天明',4). 西暦和暦表(1785,'天明',5). 西暦和暦表(1786,'天明',6). 西暦和暦表(1787,'天明',7). 西暦和暦表(1788,'天明',8). 西暦和暦表(1789,'天明',9). 西暦和暦表(1789,'寛政',1). 西暦和暦表(1790,'寛政',2). 西暦和暦表(1791,'寛政',3). 西暦和暦表(1792,'寛政',4). 西暦和暦表(1793,'寛政',5). 西暦和暦表(1794,'寛政',6). 西暦和暦表(1795,'寛政',7). 西暦和暦表(1796,'寛政',8). 西暦和暦表(1797,'寛政',9). 西暦和暦表(1798,'寛政',10). 西暦和暦表(1799,'寛政',11). 西暦和暦表(1800,'寛政',12). 西暦和暦表(1801,'寛政',13). 西暦和暦表(1801,'享和',1). 西暦和暦表(1802,'享和',2). 西暦和暦表(1803,'享和',3). 西暦和暦表(1804,'享和',4). 西暦和暦表(1804,'文化',1). 西暦和暦表(1805,'文化',2). 西暦和暦表(1806,'文化',3). 西暦和暦表(1807,'文化',4). 西暦和暦表(1808,'文化',5). 西暦和暦表(1809,'文化',6). 西暦和暦表(1810,'文化',7). 西暦和暦表(1811,'文化',8). 西暦和暦表(1812,'文化',9). 西暦和暦表(1813,'文化',10). 西暦和暦表(1814,'文化',11). 西暦和暦表(1815,'文化',12). 西暦和暦表(1816,'文化',13). 西暦和暦表(1817,'文化',14). 西暦和暦表(1818,'文化',15). 西暦和暦表(1818,'文政',1). 西暦和暦表(1819,'文政',2). 西暦和暦表(1820,'文政',3). 西暦和暦表(1821,'文政',4). 西暦和暦表(1822,'文政',5). 西暦和暦表(1823,'文政',6). 西暦和暦表(1824,'文政',7). 西暦和暦表(1825,'文政',8). 西暦和暦表(1826,'文政',9). 西暦和暦表(1827,'文政',10). 西暦和暦表(1828,'文政',11). 西暦和暦表(1829,'文政',12). 西暦和暦表(1830,'文政',13). 西暦和暦表(1830,'天保',1). 西暦和暦表(1831,'天保',2). 西暦和暦表(1832,'天保',3). 西暦和暦表(1833,'天保',4). 西暦和暦表(1834,'天保',5). 西暦和暦表(1835,'天保',6). 西暦和暦表(1836,'天保',7). 西暦和暦表(1837,'天保',8). 西暦和暦表(1838,'天保',9). 西暦和暦表(1839,'天保',10). 西暦和暦表(1840,'天保',11). 西暦和暦表(1841,'天保',12). 西暦和暦表(1842,'天保',13). 西暦和暦表(1843,'天保',14). 西暦和暦表(1844,'天保',15). 西暦和暦表(1844,'弘化',1). 西暦和暦表(1845,'弘化',2). 西暦和暦表(1846,'弘化',3). 西暦和暦表(1847,'弘化',4). 西暦和暦表(1848,'弘化',5). 西暦和暦表(1848,'嘉永',1). 西暦和暦表(1849,'嘉永',2). 西暦和暦表(1850,'嘉永',3). 西暦和暦表(1851,'嘉永',4). 西暦和暦表(1852,'嘉永',5). 西暦和暦表(1853,'嘉永',6). 西暦和暦表(1854,'嘉永',7). 西暦和暦表(1854,'安政',1). 西暦和暦表(1855,'安政',2). 西暦和暦表(1856,'安政',3). 西暦和暦表(1857,'安政',4). 西暦和暦表(1858,'安政',5). 西暦和暦表(1859,'安政',6). 西暦和暦表(1860,'安政',7). 西暦和暦表(1860,'万延',1). 西暦和暦表(1861,'万延',2). 西暦和暦表(1861,'文久',1). 西暦和暦表(1862,'文久',2). 西暦和暦表(1863,'文久',3). 西暦和暦表(1864,'文久',4). 西暦和暦表(1864,'元治',1). 西暦和暦表(1865,'元治',2). 西暦和暦表(1865,'慶応',1). 西暦和暦表(1866,'慶応',2). 西暦和暦表(1867,'慶応',3). 西暦和暦表(1868,'慶応',4). 西暦和暦表(1868,'明治',1). 西暦和暦表(1869,'明治',2). 西暦和暦表(1870,'明治',3). 西暦和暦表(1871,'明治',4). 西暦和暦表(1872,'明治',5). 西暦和暦表(1873,'明治',6). 西暦和暦表(1874,'明治',7). 西暦和暦表(1875,'明治',8). 西暦和暦表(1876,'明治',9). 西暦和暦表(1877,'明治',10). 西暦和暦表(1878,'明治',11). 西暦和暦表(1879,'明治',12). 西暦和暦表(1880,'明治',13). 西暦和暦表(1881,'明治',14). 西暦和暦表(1882,'明治',15). 西暦和暦表(1883,'明治',16). 西暦和暦表(1884,'明治',17). 西暦和暦表(1885,'明治',18). 西暦和暦表(1886,'明治',19). 西暦和暦表(1887,'明治',20). 西暦和暦表(1888,'明治',21). 西暦和暦表(1889,'明治',22). 西暦和暦表(1890,'明治',23). 西暦和暦表(1891,'明治',24). 西暦和暦表(1892,'明治',25). 西暦和暦表(1893,'明治',26). 西暦和暦表(1894,'明治',27). 西暦和暦表(1895,'明治',28). 西暦和暦表(1896,'明治',29). 西暦和暦表(1897,'明治',30). 西暦和暦表(1898,'明治',31). 西暦和暦表(1899,'明治',32). 西暦和暦表(1900,'明治',33). 西暦和暦表(1901,'明治',34). 西暦和暦表(1902,'明治',35). 西暦和暦表(1903,'明治',36). 西暦和暦表(1904,'明治',37). 西暦和暦表(1905,'明治',38). 西暦和暦表(1906,'明治',39). 西暦和暦表(1907,'明治',40). 西暦和暦表(1908,'明治',41). 西暦和暦表(1909,'明治',42). 西暦和暦表(1910,'明治',43). 西暦和暦表(1911,'明治',44). 西暦和暦表(1912,'明治',45). 西暦和暦表(1912,'大正',1). 西暦和暦表(1913,'大正',2). 西暦和暦表(1914,'大正',3). 西暦和暦表(1915,'大正',4). 西暦和暦表(1916,'大正',5). 西暦和暦表(1917,'大正',6). 西暦和暦表(1918,'大正',7). 西暦和暦表(1919,'大正',8). 西暦和暦表(1920,'大正',9). 西暦和暦表(1921,'大正',10). 西暦和暦表(1922,'大正',11). 西暦和暦表(1923,'大正',12). 西暦和暦表(1924,'大正',13). 西暦和暦表(1925,'大正',14). 西暦和暦表(1926,'大正',15). 西暦和暦表(1926,'昭和',1). 西暦和暦表(1927,'昭和',2). 西暦和暦表(1928,'昭和',3). 西暦和暦表(1929,'昭和',4). 西暦和暦表(1930,'昭和',5). 西暦和暦表(1931,'昭和',6). 西暦和暦表(1932,'昭和',7). 西暦和暦表(1933,'昭和',8). 西暦和暦表(1934,'昭和',9). 西暦和暦表(1935,'昭和',10). 西暦和暦表(1936,'昭和',11). 西暦和暦表(1937,'昭和',12). 西暦和暦表(1938,'昭和',13). 西暦和暦表(1939,'昭和',14). 西暦和暦表(1940,'昭和',15). 西暦和暦表(1941,'昭和',16). 西暦和暦表(1942,'昭和',17). 西暦和暦表(1943,'昭和',18). 西暦和暦表(1944,'昭和',19). 西暦和暦表(1945,'昭和',20). 西暦和暦表(1946,'昭和',21). 西暦和暦表(1947,'昭和',22). 西暦和暦表(1948,'昭和',23). 西暦和暦表(1949,'昭和',24). 西暦和暦表(1950,'昭和',25). 西暦和暦表(1951,'昭和',26). 西暦和暦表(1952,'昭和',27). 西暦和暦表(1953,'昭和',28). 西暦和暦表(1954,'昭和',29). 西暦和暦表(1955,'昭和',30). 西暦和暦表(1956,'昭和',31). 西暦和暦表(1957,'昭和',32). 西暦和暦表(1958,'昭和',33). 西暦和暦表(1959,'昭和',34). 西暦和暦表(1960,'昭和',35). 西暦和暦表(1961,'昭和',36). 西暦和暦表(1962,'昭和',37). 西暦和暦表(1963,'昭和',38). 西暦和暦表(1964,'昭和',39). 西暦和暦表(1965,'昭和',40). 西暦和暦表(1966,'昭和',41). 西暦和暦表(1967,'昭和',42). 西暦和暦表(1968,'昭和',43). 西暦和暦表(1969,'昭和',44). 西暦和暦表(1970,'昭和',45). 西暦和暦表(1971,'昭和',46). 西暦和暦表(1972,'昭和',47). 西暦和暦表(1973,'昭和',48). 西暦和暦表(1974,'昭和',49). 西暦和暦表(1975,'昭和',50). 西暦和暦表(1976,'昭和',51). 西暦和暦表(1977,'昭和',52). 西暦和暦表(1978,'昭和',53). 西暦和暦表(1979,'昭和',54). 西暦和暦表(1980,'昭和',55). 西暦和暦表(1981,'昭和',56). 西暦和暦表(1982,'昭和',57). 西暦和暦表(1983,'昭和',58). 西暦和暦表(1984,'昭和',59). 西暦和暦表(1985,'昭和',60). 西暦和暦表(1986,'昭和',61). 西暦和暦表(1987,'昭和',62). 西暦和暦表(1988,'昭和',63). 西暦和暦表(1989,'昭和',64). 西暦和暦表(1989,'平成',1). 西暦和暦表(1990,'平成',2). 西暦和暦表(1991,'平成',3). 西暦和暦表(1992,'平成',4). 西暦和暦表(1993,'平成',5). 西暦和暦表(1994,'平成',6). 西暦和暦表(1995,'平成',7). 西暦和暦表(1996,'平成',8). 西暦和暦表(1997,'平成',9). 西暦和暦表(1998,'平成',10). 西暦和暦表(1999,'平成',11). 西暦和暦表(2000,'平成',12). 西暦和暦表(2001,'平成',13). 西暦和暦表(2002,'平成',14). 西暦和暦表(2003,'平成',15). 西暦和暦表(2004,'平成',16). 西暦和暦表(2005,'平成',17). 西暦和暦表(2006,'平成',18). 西暦和暦表(2007,'平成',19). 西暦和暦表(2008,'平成',20). 西暦和暦表(2009,'平成',21). 西暦和暦表(2010,'平成',22). 西暦和暦表(2011,'平成',23). 西暦和暦表(2012,'平成',24). 西暦和暦表(2013,'平成',25). 西暦和暦表(2014,'平成',26). 西暦和暦表(2015,'平成',27). 西暦和暦表(2016,'平成',28). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび), 連続する文字をカウントする(_文字ならび,_文字_連続数ならび), 出力する(_文字_連続数ならび). 連続する文字をカウントする(L4,_文字_連続数ならび) :- findall([_文字,_連続数],( append(L1,L2,L3,L4), 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数)), _文字_連続数ならび). 'L2は限界連続文字ならび'(L1,L2,L3,_文字,_連続数) :- all(L2,_文字), \+(nth1(1,L3,_文字)), \+(last(L1,_文字)), length(L2,_連続数). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). all([],_). all([A|R],A) :- all(R,A). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字ならび) :- length(S,100), write('In: '), '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字), 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(S,_文字,_文字ならび). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる,'([],_,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,end_of_file,[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_,'\n',[]) :- !. 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる'([_|S],_文字,[_文字|R]) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(S,_次の文字), 'アルファベットの小文字aからzで成り立つS(S,0≦S≦100)が標準入力から与えられる。'(S,_次の文字,R). '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(end_of_file) :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'('\n') :- !. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- get_char(_文字), 文字はアルファベットの小文字aからzで成り立つ(_文字),!. '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字) :- '文字を入力する。文字はアルファベットの小文字aからzで成り立つ'(_文字). 文字はアルファベットの小文字aからzで成り立つ(end_of_file) :- !. 文字はアルファベットの小文字aからzで成り立つ('\n') :- !. 文字はアルファベットの小文字aからzで成り立つ(_文字) :- _文字 @>= 'a', _文字 @=< 'z',!. 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,_出力文字列). writef('Out:\n%t\n',[_出力文字列]). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。' :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字列), 連続する文字をカウントする(_文字列,_出力文字列), writef('Out:\n%t\n',[_出力文字列]). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(_文字列) :- write('In: '), read(_文字列). 連続する文字をカウントする('','') :- !. 連続する文字をカウントする(_文字列,_出力文字列) :- 文字列の先頭から同一文字を切り取る(_文字列,_連続文字,_連続文字数,_残り文字列), 連続する文字をカウントする(_残り文字列,_残り出力文字列), atomic_list_concat([_連続文字,_連続文字数,_残り出力文字列],_出力文字列). 文字列の先頭から同一文字を切り取る(_文字列,_連続文字,_連続文字数,_残り文字列) :- sub_atom(_文字列,0,1,_,_連続文字), 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,_残り文字列). 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,_残り文字列) :- sub_atom(_文字列,_連続文字数,1,_,_文字), \+(_連続文字 = _文字), sub_atom(_文字列,_連続文字数,_,0,_残り文字列),!. 連続文字数と残り文字列を得る(_文字列,_連続文字,_連続文字数,'') :- atom_length(_文字列,_連続文字数). % 以下のサイトは # プログラミングのお題スレ Part4 #197 # アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 # 例に沿って連続する文字をカウントするプログラムを作成せよ。 # # 出力の最後に改行を挿入すること。 # 標準入力から以下の形式で与えられる。 # S # # 例) # In: # aaaaaaaaaabbbbbbbbbbbbcccccccddddddddddeeeeeeefffffffffghiiiiiiiii # # Out: # a10b12c7d10e7f9ghi9 # # In: # # Out: # 0 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。 例に沿って連続する文字をカウントするプログラムを作成せよ。 出力の最後に改行を挿入すること。 標準入力から以下の形式で与えられる。'(LL) :- 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line), atom_chars(Line,Chars), '連続する文字をカウントするプログラムを作成せよ。'(Chars,LL), 出力する(LL). 'アルファベットの小文字aからzで成り立つS(0≦S≦100)が標準入力から与えられる。'(Line) :- write('In: '), get_line(Line). '連続する文字をカウントするプログラムを作成せよ。'([],[]) :- !. '連続する文字をカウントするプログラムを作成せよ。'(Chars,[[_連続文字,_文字数]|R]) :- 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字), length(L1,_文字数), '連続する文字をカウントするプログラムを作成せよ。'(L2,R). 先頭からの連続文字(Chars,Chars1,Chars2,_連続文字) :- append(Chars1,Chars2,Chars), 連続文字(Chars1,_連続文字), \+((Chars2 = [A|R],_連続文字 = A)). 連続文字([],_). 連続文字([_連続文字|R],_連続文字) :- 連続文字(R,_連続文字). 出力する(LL) :- flatten(LL,L), atomic_list_concat(L,S), writef('Out:\n%t\n',[S]). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #132 # お題:ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。 # 例 # 110, 119 -> 2 # 1234, 214 -> 2 # 567, 23 -> 0 # :- op(600,xfx,'個数を求める。'). 'ふたつの整数が与えられたとき、数字が一致している桁の個数を求める。'(_数_1,_数_2,_数字が一致している桁の個数) :- ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2), '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数). ふたつの整数をふたつの数字文字列に変換(_数_1,_数_2,_数字文字列_1,_数字文字列_2) :- atom_number(_数字文字列_1,_数_1), atom_number(_数字文字列_2,_数_2). '数字が一致している桁の個数を求める。'(_数字文字列_1,_数字文字列_2,_数字が一致している桁の個数) :- 数字が一致している桁の(_数字文字列_1,_数字文字列_2) '個数を求める。' _数字が一致している桁の個数. '数字が一致している桁の'(_数字文字列_1,_数字文字列_2) :- sub_atom(_数字文字列_1,_,1,_残り文字数,_数字), sub_atom(_数字文字列_2,_,1,_残り文字数,_数字), \+(_数字 = '-'). '個数を求める。'(P,_個数). findall(1,P,L), length(L,_個数). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #81 # お題:0から9のうち8種類の数字を使って4桁の10進数を2個つくり、その積をとると # 4桁の2個の数に使用した8種類の数字はひとつも現れなかった。 # この4桁の2個の10進数を求める。 '0から9のうち8種類の数字を使って4桁の10進数を2個つくり、その積をとると 4桁の2個の数に使用した8種類の数字はひとつも現れなかった。 この4桁の2個の10進数を求める。'(_4桁の10進数_1,_4桁の10進数_2) :- '0から9のうち8種類の数字を使って4桁の10進数を2個つくり、'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2), 'その積をとると4桁の2個の数に使用した8種類の数字はひとつも現れなかった。'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2). '0から9のうち8種類の数字を使って4桁の10進数を2個つくり、'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2) :- select(_残り数字_1,['0','1','2','3','4','5','6','7','8','9'],_残りならび_1), select(_残り数字_2,_残りならび_1,_8種類の数字), '4桁の10進数を2個つくり、'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2). '4桁の10進数を2個つくり、'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2) :- select(_1,_8種類の数字,R_1), select(_2,R_1,R_2), select(_3,R_2,R_3), select(_4,R_3,R_4), select(_5,R_4,R_5), select(_6,R_5,R_6), select(_7,R_6,R_7), select(_8,R_7,_), number_chars(_4桁の10進数_1,[_1,_2,_3,_4]), number_chars(_4桁の10進数_2,[_5,_6,_7,_8]), _4桁の10進数_1 >= 1023, _4桁の10進数_2 >= 1023. 'その積をとると4桁の2個の数に使用した8種類の数字はひとつも現れなかった。'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2) :- _積 is _4桁の10進数_1 * _4桁の10進数_2, '4桁の2個の数に使用した8種類の数字はひとつも現れなかった。'(_8種類の数字,_積). '4桁の2個の数に使用した8種類の数字はひとつも現れなかった。'(_8種類の数字,_積) :- number_chars(_積,_積の数字ならび), forall(member(_積に現れる数字,_積の数字ならび),\+(member(_積に現れる数字,_8種類の数字))). % 以下のサイトは # 出典: twitter_by_@_ktwr_20140620 # 出典: Qiita::Prologカットについて # # stream を使って書きなおしてみる。 "findallterm_from_stream.pro"に保存。 # findallterm_from_stream(Stream,_):- at_end_of_stream(Stream),!. findallterm_from_stream(Stream,Term) :- read(Stream,Term0), process(Term0,Term), findallterm_from_stream(Stream,Term). process(Term0,Term) :- \+(Term0=Term),!. process(Term0,_) :- write(Term0), nl. :- open('findallterm_from_stream.pro',read,Input), findallterm_from_stream(Input,_), close(Input). findallterm_from_stream(_G1737,_G1738):-at_end_of_stream(_G1737),! findallterm_from_stream(_G1748,_G1749):-read(_G1748,_G1752),process(_G1752,_G1749),findallterm_from_stream(_G1748,_G1749) process(_G1769,_G1770):- \+_G1769=_G1770,! process(_G1783,_G1784):-write(_G1783),nl Input = (0x8e49350). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,_月,1,_前日_年,_前日_月,_前日_日) :- 誕生日の前月と月末日を得る(_年,_月,1,_前日_年,_前日_月,_前日_日). 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- \+(_日 = 1), succ(_前日_日,_日). 誕生日の前月と月末日を得る(_誕生日の年,1,1,_誕生日の前年,12,31) :- succ(_誕生日の前年,_誕生日の年). 誕生日の前月と月末日を得る(_年,3,1,_年,2,_誕生日の前月末日) :- '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,_誕生日の前月末日). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,30) :- '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月). 誕生日の前月と月末日を得る(_年,_誕生日の月,1,_年,_誕生日の前月,31) :- '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,29) :- うるう年(_年). '3月1日はうるう年であるか否かで誕生日の前月末日が変わる'(_年,28) :- \+(うるう年(_年)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '誕生日の前月が小の月(2月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[4,6,9,11]). '誕生日の前月が大の月(12月を除く)'(_誕生日の月,_誕生日の前月) :- succ(_誕生日の前月,_誕生日の月), member(_誕生日の前月,[1,3,5,7,8,10]). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. まだ誕生日の前日になっていない(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. 既に誕生日の前日を過ぎている(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出典: プログラムのお題スレ Part4 #38 # # 標準入力から与えられたフォーマットを元に年齢を求めて出力せよ # 標準入力から以下の形式で与えられます # YYYY/MM/dd # # 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。 '標準入力から与えられたフォーマットを元に年齢を求めて出力せよ 標準入力から以下の形式で与えられます YYYY/MM/dd 年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる。' :- '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日), '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢), 出力せよ(_年齢). '標準入力から与えられたフォーマット(YYYY/MM/dd)を元に'(_年,_月,_日) :- get_line(_文字列), read_term_from_atom(_文字列,_年/_月/_日,[]). '年齢を求めて(年齢は誕生日の前日に歳を重ねることに注意せよ。4/1生まれの場合は3/31に歳が増えることになる)'(_年,_月,_日,_年齢) :- date(date(_今日_年,_今日_月,_今日_日)), 誕生日の前日(_今日_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日), '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢). 誕生日の前日(_年,1,1,_前日_年,12,31) :- succ(_前日_年,_年),!. 誕生日の前日(_年,3,1,_年,2,29) :- うるう年(_年),!. 誕生日の前日(_年,3,1,_年,2,28) :- \+(うるう年(_年)),!. 誕生日の前日(_年,_月,1,_年,_前日_月,31) :- member(_月,[2,4,6,9,11]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,1,_年,_前日_月,30) :- member(_月,[5,7,8,10,12]), succ(_前日_月,_月),!. 誕生日の前日(_年,_月,_日,_年,_月,_前日_日) :- succ(_前日_日,_日). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 > _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 < _誕生日の前日_月, _年齢 is _誕生日の前日の年 - _年 - 1. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 >= _誕生日の前日_日, _年齢 is _誕生日の前日_年 - _年. '年齢を計算する(年齢は誕生日の前日に歳を重ねることに注意せよ)'(_年,_月,_日,_誕生日の前日_年,_誕生日の前日_月,_誕生日の前日_日,_年齢) :- _月 = _誕生日の前日_月, _日 < _誕生日の前日の日, _年齢 is _誕生日の前日_年 - _年 - 1. 出力せよ(_年齢) :- writef('%t歳です\n',[_年齢]). % 以下のサイトは # 出典: Regular Expression(正規表現)Part12 #561 # ●Regular Expressionの使用環境 # Perl # # ●検索か置換か? # 検索 # # ●説明 # 前に指定したデータを含まない、「スケート」だけマッチさせたい # # # ●対象データ # アイススケート # ローラースケート # スケート # '前に指定したデータを含まない、「スケート」だけマッチさせたい'(_文,_指定したデータならび,_前データ,スケート,_後データ) :- sub_atom(_文,_前データ,スケート,_後データ), 前に指定したデータを含まない(_前データ,_指定したデータならび). 前に指定したデータを含まない(_前データ,_指定したデータならび) :- \+(前に指定したデータを含む(_前データ,_指定したデータならび)). 前に指定したデータを含む(_前データ,_指定したデータならび) :- member(_指定したデータ,_指定したデータならび), sub_atom(_前データ,_,_,0,_指定したデータ). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは 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). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #429 # [1] 授業単元:配列 # [2] 問題文:文字列txtを"abcdefg"、 # 文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、 # 途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。 # (※txtとptnの値が変わっても正常動作するようにし、ptnが出現しない場合はそのことを出力せよ。) # [3] #  [3.2]linux #  [3.1] gcc #  [3.3] C言語 # [4] 期限:14/6/12 # [5] その他の制限:ポインタはまだ習っとりません。 # 先日for、whileによる繰り返し処理を習いました。 txt(abcdefg). ptn(ef). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。' :- txt(_対象文字列), ptn(_検索文字列), '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,0,_比較回数). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,'',_比較回数,_比較回数) :- !. '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_比較回数_1,_比較回数) :- sub_atom(_対象文字列,0,1,_,A), sub_atom(_検索文字列,0,1,_,B), succ(_比較回数_1,_比較回数_2), '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,B,_比較回数_2,_比較回数). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,_文字,_出現位置_2,_文字,_比較回数_2,_比較回数) :- writef('成功! %t[%t]=%t, %t[%t]= %t, %t\n',[_対象文字列,_出現位置_1,_文字,_検索文字列,_出現位置_2,_文字,_比較回数_2]). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,A,_比較回数_2,_比較回数) :- '一文字一致したら対象文字列、検索文字列ともに位置を移動して検索する'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,A,_比較回数_2,_比較回数). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,_文字_1,_出現位置_2,_文字_2,_比較回数_2,_比較回数) :- \+(_文字_1 = _文字_2), writef('失敗! %t[%t]=%t, %t[%t]=%t, %t\n',[_対象文字列,_出現位置_1,_文字_1,_検索文字列,_出現位置_2,_文字_2,_比較回数_2]). '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,B,_比較回数_2,_比較回数) :- '不一致の時は、対象文字列の位置だけ移動して検索する'(_対象文字列,_検索文字列,_出現位置_1,A,_出現位置_2,B,_比較回数_2,_比較回数). '一文字一致したら対象文字列、検索文字列ともに位置を移動して検索する'(_対象文字列,_検索文字列,_出現位置_1,_文字,_出現位置_2,_文字,_比較回数_2,_比較回数) :- _出現位置_1_2 is _出現位置_1 + 1, sub_atom(_対象文字列,_出現位置_1_2,_,0,_対象文字列_2), _出現位置_2_2 is _出現位置_2 + 1, sub_atom(_検索文字列,_出現位置_2_2,_,0,_検索文字列_2), '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列_2,_検索文字列_2,_比較回数_2,_比較回数). '不一致の時は、対象文字列の位置だけ移動して検索する'(_対象文字列,_検索文字列,_出現位置_1,_文字_1,_,_文字_2,_比較回数_2,_比較回数) :- \+(_文字_1 = _文字_2), _出現位置_1_2 is _出現位置_1 + 1, sub_atom(_対象文字列,1,_,0,_対象文字列_2), '文字列ptnを"ef"で初期化し、力任せ法を用いてtxt内でptnが最初に出現する位置を求め、途中経過、最初に出現する位置(txtの添え字)、比較回数を以下のように出力せよ。'(_対象文字列_2,_検索文字列,_比較回数_2,_比較回数). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), 描画する(W,H). 標準入力からWとHを得る(W,H) :- get_split_line([' '],[W,Y]). 描画する(W,H) :- between(1,H,N), 一行の像(N,W,H,_一行の像), 描画する(_一行の像), N = H. 一行の像(N,W,H,_一行の像) :- length(L,W), 一行分の文字ならび(N,H,_一行分の文字ならび), atomic_list_concat(_一行分の文字ならび,_一行の像). 一行分の文字ならび(1,H,_一行分の文字ならび) :- '最初と最後の行は行全体が+'(N,_一行分の文字ならび),!. 一行分の文字ならび(N,H,_一行分の文字ならび) :- '最初と最後の行以外は、行の先頭と最後が+,それ以外は@'(N,H,_一行分の文字ならび). '最初と最後の行は行全体が+'(1,_,_一行分の文字ならび) :- all(_一行分の文字ならび,'+'). '最初と最後の行は行全体が+'(H,H,_一行分の文字ならび) :- all(_一行分の文字ならび,'+'). '最初と最後の行以外は、行の先頭と最後が+,それ以外は@'(N,H,_一行分の文字ならび) :- \+(N = H), append(['*'],L2,['*'],_一行分の文字ならび), all(L2,'@'). 描画する(_一行の像) :- writef('%t\n',[_一行の像]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #935 # # W=横の長さ、H=縦の長さ # 2<=W<=1000、2<=H<=1000 # 箱の枠は「+」、箱の中は「@」で出力しなさい # # 入力は以下の形式で標準入力から与えられます # W H # # 例 # --------------------- # 2 2 # ++ # ++ # --------------------- # 10 4 # ++++++++++ # +@@@@@@@@+ # +@@@@@@@@+ # ++++++++++ '# W=横の長さ、H=縦の長さ 2<=W<=1000、2<=H<=1000 箱の枠は「+」、箱の中は「@」で出力しなさい 入力は以下の形式で標準入力から与えられます W H' :- 標準入力からWとHを得る(W,H), split(Line,[' '],[W,H]), 全体像(W,H,_全体像), 全体像を描画する(_全体像). 標準入力からWとHを得る(W,H) :- read_line_to_codes(Codes,[]), 中間の32を一個のの44に置き換える(Codes,Codes2), string_to_atom(Codes2,Atom), read_term_from_atom(Atom,(W,H,[]). 中間の32を一個のカンマに置き換える(Codes,Codes2) :- append(L1,L2,L3,Codes), all(L2,32), \+(member(32,L1)), \+(member(32,L2)), append(L1,[44|L3],Codes2). 全体像(W,H,_全体像) :- findall(L,( between(1,H,_), findall(_,( between(1,W,_)), L)), _全体像), 全体像(_全体像). 全体像(_全体像) :- append([_第一行],_中間行ならび,[_最終行],_全体像), all(_第一行,'+'), all(_最終行,'+'), '内側は先頭要素と最後の要素が+、中間要素は@となる'(_中間行ならび). '内側は先頭要素と最後の要素が+、中間要素は@となる'([]). '内側は先頭要素と最後の要素が+、中間要素は@となる'([L|R]) :- '先頭要素と最後の要素が+、中間要素は@となる'(L), '内側は先頭要素と最後の要素が+、中間要素は@となる'(R). '先頭要素と最後の要素が+、中間要素は@となる'(L) :- append(['+'],L2,['+'],L), all(L2,'@'),!. 全体像を描画する([]). 全体像を描画する([L|R]) :- atom_chars(_行表示,L), writef('%t\n',[_行表示]), 全体像を描画する(R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% all([]). all([A|R],A) :- all(R,A). append([],L2,L3,L4) :- append(L2,L3,L4). append([A|L1],L2,L3,[A|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典: スレ立てるまでもない質問はここで 134匹目 #717 # ある病院で4と13(例えば104とか113とか)を使わないで全ての病室に番号を振りたいと考えている # この場合1000室目は何番になるか答えなさい(´・ω・`) 'ある病院で4と13(例えば104とか113とか)を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか答えなさい(´・ω・`) '(_何番) :- '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(1,1,_何番). '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(1000,_何番,_何番) :- !. '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(_室数_1,_何番_1,_何番) :- '数の中に4という数字と1,3という数字の連続が共に含まれていない時は_室数_と_何番_かの両方を更新して、それで1000室目は何番になるか'(_室数_1,_何番_1,_何番). '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(_室数_1,_何番_1,_何番) :- '数の中に4という数字か1,3という数字の連続が含まれていれば_室数_は更新せず_何番_のみを更新して、それで1000室目は何番になるか'(_室数_1,_何番_1,_何番). '数の中に4という数字と1,3という数字の連続が共に含まれていない時は_室数_と_何番_かの両方を更新して、それで1000室目は何番になるか'(_室数_1,_何番_1,_何番) :- '数の中に4という数字か1,3という数字の連続が含まれていない'(_何番_1), _室数_2 is _室数_1 + 1, _何番_2 is _何番_1 + 1, '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(_室数_2,_何番_2,_何番). '数の中に4という数字か1,3という数字の連続が含まれていれば_室数_は更新せず_何番_のみを更新して、それで1000室目は何番になるか'(_室数_1,_何番_1,_何番) :- '数の中に4という数字か1,3という数字の連続が含まれる'(_何番_1), _何番_2 is _何番_1 + 1, '4と13を使わないで全ての病室に番号を振りたいと考えている。この場合1000室目は何番になるか'(_室数_1,_何番_2,_何番). '数の中に4という数字か1,3という数字の連続が含まれる'(_数) :- number_chars(_数,_数字ならび), '_数字ならびには4という数字か1,3という数字の連続が含まれる'(_数字ならび). '数の中に4という数字か1,3という数字の連続が含まれていない'(_数) :- \+('数の中に4という数字か1,3という数字の連続が含まれる'(_数)). '_数字ならびには4という数字か1,3という数字の連続が含まれる'(_数字ならび) :- member('4',_数字ならび),!. '_数字ならびには4という数字か1,3という数字の連続が含まれる'(_数字ならび) :- append(_,['1','3'|_],_数字ならび),!. % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- atom_chars(_文字列,_文字ならび), 要素の重複を取り除いた文字ならび(_文字ならび,_要素に重複のない文字ならび), 組合せ(_要素に重複のない文字ならび,_n,_組合せ), atom_chars(_文字列集合要素,_組合せ). 要素の重複を取り除いた文字ならび(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 組合せ(L,1,[A]) :- !, member(A,L). 組合せ([A|R1],N,[A|R2]) :- N_1 is N - 1, 組合せ(R1,N_1,R2). 組合せ([_|R1],N,L) :- 組合せ(R1,N,L). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- atom_chars(_文字列,_文字ならび), 文字列の要素の重複を取り除いた文(_文字ならび,_要素に重複のない文字ならび), 組合せ(_要素に重複のない文字ならび,_n,_組合せ), atom_chars(_文字列集合要素,_組合せ). 文字列の要素の重複を取り除いた文(_文字ならび,_要素に重複のない文字ならび) :- findall(_文字,( append(L1,[_文字|_],_文字ならび), \+(member(_文字,L1))), _要素に重複のない文字ならび). 組合せ(L,1,[A]) :- member(A,L). 組合せ([_先頭要素|_残りならび],N,[_先頭要素|_組合せ]) :- 'Nが1より大きい時、_残りならびから、一個少ない選択の組合せの前に先頭要素を付加する'(_残りならび,N,L). 組合せ([_|_残りならび],N,_組合せ) :- 'Nが1より大きい時、ならびの先頭要素を取り去った_残りならびから同じくN個取り出す組合せ'(_残りならび,N,L). 'Nが1より大きい時、_残りならびから、一個少ない選択の組合せの前に先頭要素を付加する'(_残り要素,N,_組合せ) :- N > 1, _一個少ない選択 is N - 1, 組合せ(_残りならび,_一個少ない選択,_組合せ). 'Nが1より大きい時、ならびの先頭要素を取り去った_残りならびから同じくN個取り出す組合せ'(_残りならび,N,_組合せ) :- N > 1, 組合せ(_残りならび,N,_組合せ). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列), 文字列組合せ(_重複を取り除いた文字列,_n,_文字列集合要素). 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列) :- findall(_文字,( 既に採用されていない文字(_文字列,_文字)), _重複を取り除いた文字ならび), atom_chars(_重複を取り除いた文字列,_重複を取り除いた文字ならび). 既に採用されていない文字(_文字列,_文字) :- sub_atom(_文字列,S,1,_,_文字), sub_atom(_文字列,0,S,_,_前文字列), \+(sub_atom(_前文字列,_,1,_,_文字)). 文字列組合せ(_文字列,1,_文字) :- sub_atom(_文字列,_,1,_,_文字). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列), 文字列組合せ(_残り文字列,M,_残り文字列_2), atom_concat(_先頭文字,_残り文字列_2,_文字列). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列), 文字列組合せ(_残り文字列,N,_文字列). 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列) :- N > 1, M is N - 1, sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,1,_,0,_残り文字列). 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列) :- N > 1, sub_atom(_文字列,1,_,0,_残り文字列). % 以下のサイトは # # 2×2の升を3色で塗り分ける。 # # _1 | _2 # ---+--- # _3 | _4 # 隣接(赤,青). 隣接(赤,白). 隣接(青,赤). 隣接(青,白). 隣接(白,赤). 隣接(白,青). 色塗り(_1,_2,_3,_4) :- '_1の隣接'(_1,_2,_3,_4), '_2の隣接'(_1,_2,_3,_4), '_3の隣接'(_1,_2,_3,_4), '_4の隣接'(_1,_2,_3,_4), '二箇所が同じ色、残り二箇所は別の色'(_1,_2,_3,_4). '_1の隣接'(_1,_2,_3,_4) :- 隣接(_1,_2), 隣接(_1,_3). '_2の隣接'(_1,_2,_3,_4) :- 隣接(_2,_1), 隣接(_2,_4). '_3の隣接'(_1,_2,_3,_4) :- 隣接(_3,_1), 隣接(_3,_4). '_4の隣接'(_1,_2,_3,_4) :- 隣接(_4,_2), 隣接(_4,_3). '二箇所が同じ色、残り二箇所は別の色'(_1,_2,_3,_4) :- '二箇所が同じ色、'(_1,_2,_3,_4,_二箇所が同じ色,_残りの色_1,_残りの色_2), '残り二箇所は別の色'(_二箇所が同じ色,_残りの色_1,_残りの色_2),!. '二箇所が同じ色、'(_1,_2,_3,_4,_二箇所が同じ色,_残りの色_1,_残りの色_2) :- select(_二箇所が同じ色,[_1,_2,_3,_4],R), select(_二箇所が同じ色,R,[_残りの色_1,_残りの色_2]). '残り二箇所は別の色'(_二箇所が同じ色,_残りの色_1,_残りの色_2) :- \+(member(_二箇所が同じ色,[_残りの色_1,_残りの色_2])), \+(_残りの色_1=_残りの色_2). % 以下のサイトは # # 2×2の升を3色で塗り分ける。 # # _1 | _2 # ---+--- # _3 | _4 # 隣接(赤,青). 隣接(赤,白). 隣接(青,赤). 隣接(青,白). 隣接(白,赤). 隣接(白,青). 色塗り(_1,_2,_3,_4) :- 隣接(_1,_2), 隣接(_1,_3), 隣接(_2,_1), 隣接(_2,_4), 隣接(_3,_1), 隣接(_3,_4), 隣接(_4,_2), 隣接(_4,_3), \+((_1=_4,_2=_3)). % 以下のサイトは # 複数の持ち回りのタスクを、同じ人が連続しないとかの条件付きでスケヂュールしてくれるプログラム作るとしたら言語は何で作る? # あーエクセルでも出来そうだなー。なんか解の探索?みたいな問題になって、使ったことないけどLispとかPrologとかそういうプログラムで作ると良いのかなとか考えてたんだよね。 # 具体的に言えば、輪講・論文紹介・研究進捗報告、の3種のタスクを毎週こなしましょう。学生のリストがあってそれぞれ持ちまわります。ただしドクターの人は輪講はやらない。なるべく2週続けてタスクが割り振られないようにしたい。という感じですね。 # # @tonno727 具体的に言えば、輪講・論文紹介・研究進捗報告、の3種のタスクを # 毎週こなしましょう。学生のリストがあってそれぞれ持ちまわります。 # ただしドクターの人は輪講はやらない。 # なるべく2週続けてタスクが割り振られないようにしたい。という感じですね。 学生(馬場,学生). 学生(横溝,学生). 学生(円谷,ドクター). 学生(船井,学生). 学生(金井,ドクター). 学生(山内,学生). 学生(林田,学生). 学生(沢木,学生). スケジュール(_輪講回数,_論文紹介回数,_研究進捗報告回数,_スケジュール) :- 輪講者ならびを生成(_輪講者ならび), 論文紹介者ならびを生成(_論文紹介者ならび), 研究進捗報告者ならびを生成(_研究進捗報告者ならび), スケジュール(_輪講回数,_論文紹介回数,_研究進捗報告回数,[],_輪講者ならび,_論文紹介者ならび,_研究進捗報告者ならび,_スケジュール). スケジュール(0,0,0,_,_,_,_,[]) :- !. スケジュール(_輪講残り回数,_論文紹介残り回数,_研究進捗報告残り回数,_前週ならび,_輪講者,_論文紹介者,_研究進捗報告者,[[_輪講者,_論文紹介者,_研究進捗報告者]|R]) :- 輪講者候補(_輪講残り回数,_前週ならび,_輪講者ならび,_輪講残り回数_2,_輪講者,_輪講者ならび_2), 論文紹介者候補(_論文紹介残り回数,_前週ならび,_論文紹介者ならび,_論文紹介残り回数_2,_論文紹介者,_論文紹介者ならび_2), 研究進捗報告者候補(_研究進捗報告残り回数,_前週ならび,_研究進捗報告者ならび,_研究進捗報告残り回数_2,_研究進捗報告者,_研究進捗報告者ならび_2), スケジュール(_輪講残り回数_2,_論文紹介残り回数_2,_研究進捗報告残り回数_2,[_輪講者,_論文紹介者,_研究進捗報告者],_輪講者ならび_2,_論文紹介者ならび_2,_研究進捗報告報告者ならび_2,R). 輪講者候補(0,_,_,0,'',_) :- !. 輪講者候補(M,_前週ならび,[],N,_輪講者,_輪講者ならび_2) :- 輪講者ならびを生成してから候補を得る(M,_前週ならび,[],N,_輪講者,_輪講者ならび_2). 輪講者候補(M,_前週ならび,_輪講者ならび,N,_輪講者,_輪講者ならび_2) :- 現在の輪講者ならびから候補を得る(M,_前週ならび,_輪講者ならび,N,_輪講者,_輪講者ならび_2). 輪講者ならびを生成してから候補を得る(M,_前週ならび,[],N,_輪講者,_輪講者ならび_2) :- 輪講者ならびを生成(_輪講者ならび), 現在の輪講者ならびから候補を得る(M,_前週ならび,_輪講者ならび,N,_輪講者,_輪講者ならび_2). 現在の輪講者ならびから候補を得る(M,_前週ならび,_輪講者ならび,N,_輪講者,_輪講者ならび_2) :- select(_輪講者,_輪講者ならび,_輪講者ならび_2), \+(member(_輪講者,_前週ならび)), succ(N,M). 論文紹介者候補(0,_,_,0,'',_) :- !. 論文紹介者候補(M,_前週ならび,[],N,_論文紹介者,_論文紹介者ならび_2) :- 論文紹介者ならびを生成してから候補を得る(M,_前週ならび,[],N,_論文紹介者,_論文紹介者ならび_2). 論文紹介者候補(M,_前週ならび,_論文紹介者ならび,N,_論文紹介者,_論文紹介者ならび_2) :- 現在の論文紹介者ならびから候補を得る(M,_前週ならび,_論文紹介者ならび,N,_論文紹介者,_論文紹介者ならび_2). 論文紹介者ならびを生成してから候補を得る(M,_前週ならび,[],N,_論文紹介者,_論文紹介者ならび_2) :- 論文紹介者ならびを生成(_論文紹介者ならび), 論文紹介者ならびを生成してから候補を得る(M,_前週ならび,_論文紹介者ならび,N,_論文紹介者,_論文紹介者ならび_2). 現在の論文紹介者ならびから候補を得る(M,_前週ならび,_論文紹介者ならび,N,_論文紹介者,_論文紹介者ならび_2) :- select(_論文紹介者,_論文紹介者ならび,_論文紹介者ならび_2), \+(member(_論文紹介者,_前週ならび)), succ(N,M). 研究進捗報告者候補(0,_,_,0,'',_) :- !. 研究進捗報告者候補(M,_前週ならび,[],N,_研究進捗報告者,_研究進捗報告者ならび_2) :- 研究進捗報告者ならびを生成してから候補を得る(M,_前週ならび,[],N,_研究進捗報告者,_研究進捗報告者ならび_2). 研究進捗報告者候補(M,_前週ならび,_研究進捗報告者ならび,N,_研究進捗報告者,_研究進捗報告者ならび_2) :- 現在の研究進捗報告者ならびから候補を得る(M,_前週ならび,_研究進捗報告者ならび,N,_研究進捗報告者,_研究進捗報告者ならび_2). 研究進捗報告者ならびを生成してから候補を得る(M,_前週ならび,[],N,_研究進捗報告者,_研究進捗報告者ならび_2) :- 研究進捗報告者ならびを生成(_研究進捗報告者ならび), 現在の研究進捗報告者ならびから候補を得る(M,_前週ならび,_研究進捗報告者ならび,N,_研究進捗報告者,_研究進捗報告者ならび_2). 現在の研究進捗報告者ならびから候補を得る(M,_前週ならび,_研究進捗報告者ならび,N,_研究進捗報告者,_研究進捗報告者ならび_2) :- select(_研究進捗報告者,_研究進捗報告者ならび,_研究進捗報告者ならび_2), \+(member(_研究進捗報告者,_前週ならび)), succ(N,M). 輪講者ならびを生成(_輪講者ならび) :- findall(_学生,( 学生(_学生,_クラス), \+(_クラス = ドクター)), _輪講者ならび). 論文紹介者ならびを生成(_論文紹介者ならび) :- findall(_学生,学生(_学生,_),_論文紹介者ならび). 研究進捗報告者ならびを生成(_研究進捗報告者ならび) :- findall(_学生,学生(_学生,_),_研究進捗報告者ならび). % 以下のサイトは # # 野球豚河内 @baseballbooo 3時間 # # 「ホモが嫌いな女子はいません」を表すProlog事実 # # female(someone). # fujoshi(X) :- female(X). # like(someone,homo) :- fujoshi(X). # ホモが嫌いな女子はいません :- forall(女子(_女子),好き(_女子,ホモ)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ホモが嫌いな女子はいません :- \+((嫌い(_女子,ホモ),女子(_女子))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ホモが嫌いな女子はいません :- \+(ホモが嫌いな女子(_女子)). ホモが嫌いな女子(_女子) :- ホモが(_ホモ), 嫌いな(_女子,_ホモ), 女子(_女子). % 以下のサイトは 'UTF8文字のバイト数'(_第一文字の文字コード,1) :- (between(0x00,0x1f,_第一文字の文字コード);_第一文字の文字コード=0x7f),!. 'UTF8文字のバイト数'(_第一文字の文字コード,1) :- between(0x20,0xbf,_第一文字の文字コード),\+(_第一文字のコード=0x7f),!. 'UTF8文字のバイト数'(_第一文字の文字コード,2) :- between(0xc0,0xdf,_第一文字の文字コード). 'UTF8文字のバイト数'(_第一文字の文字コード,3) :- between(0xe0,0xef,_第一文字の文字コード). 'UTF8文字のバイト数'(_第一文字の文字コード,4) :- between(0xf0,0xf7,_第一文字の文字コード). 'UTF8文字のバイト数'(_第一文字の文字コード,5) :- between(0xf8,0xfb,_第一文字の文字コード). 'UTF8文字のバイト数'(_第一文字の文字コード,6) :- between(0xfc,0xff,_第一文字の文字コード). % 以下のサイトは # お題:[B下の端に一本だけ当たりが付いているあみだくじについて、 # 当たりくじを引く手を求めよ。橋と橋の交差はないと仮定する。 # 入力データ:くじの本数num。左から数えた当たりくじの位置mark。各橋の両端のくじの位置(left,right)を上から並べたリスト。 # 'お題:下の端に一本だけ当たりが付いているあみだくじについて、 当たりくじを引く手を求めよ。橋と橋の交差はないと仮定する。 入力データ:くじの本数num。左から数えた当たりくじの位置mark。各橋の両端のくじの位置(left,right)を上から並べたリスト。'(_くじの本数,_当たり) :- あみだくじ(_くじの本数,_当たり). 経路((1,1),(1,2)). 経路((1,2),(1,3)). 経路((1,2),(2,3)). 経路((2,1),(2,2)). 経路((2,2),(2,3)). 経路((2,3),(2,4)). 経路((2,2),(3,2)). 経路((3,1),(3,2)). 経路((3,2),(3,3)). ゴール((1,3)). ゴール((2,4)). ゴール((3,3)). 当たりくじ((2,4)). あみだくじ(_くじの本数,_当たり) :- between(1,_くじの本数,_当たり), 経路((_当たり,1),_次の点), あみだくじ(_次の点). あみだくじ(_現在点) :- ゴール(_現在点),!. あみだくじ(_現在点) :- 次の点(_現在点,_次の点), あみだくじ(_現在点). 次の点(_現在点,_次の点) :- 左から右へ橋を渡る(_現在点,_次の点),!. 次の点(_現在点,_次の点) :- 右から左へ橋を渡る(_現在点,_次の点),!. 次の点(_現在点,_次の点) :- 下方へ移動する(_現在点,_次の点). 左から右へ橋を渡る((X,Y),(X_2,Y_2)) :- 経路((X,Y),(X_2,Y_2)), \+(X = X_2),!. 右から左へ橋を渡る((X,Y),(X_2,Y_2)) :- 経路((X_2,Y_2),(X,Y)), \+(X = X_2),!. 下方へ移動する((X,Y),(X,Y_2)) :- 経路((X,Y),(X,Y_2)), Y_2 > Y. % 以下のサイトは 覆面算(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). % 以下のサイトは 'FizzBuzzはやさしい課題です。やさしいからこそどのプログラム言語でも 書けますし、それぞれの言語の特長が微妙に表れます。それで最近好まれる課題です。 課題としてのFizzBuzzは、整数を1からある数まで数え上げて、その数が、 3で割り切れたらFizzを5で割り切れたらBuzzをどちらでも割り切れない時はその数を 表示します。3と5の両数で割り切れる場合はFizzBuzzと続けて表示することになります。 ひとつの数を表示したら改行し、ある数まで表示し終わったら終了します。'(_ある数) :- '整数を1からある数まで数え上げて'(_ある数,_数), '数が、3で割り切れたらFizzを 5で割り切れたらBuzzを どちらでも割り切れない時はその数を'(_数,_Fizzの表示枠,_Buzzの表示枠,_数の表示枠), '表示します。ひとつの数を表示したら改行し、'(_Fizzの表示枠,_Buzzの表示枠,_数の表示枠), 'ある数まで表示し終わったら終了します。'(_ある数,_数). '整数を1からある数まで数え上げて'(_ある数,_数) :- between(1,_ある数,_数). '数が、3で割り切れたらFizzを 5で割り切れたらBuzzを どちらでも割り切れない時はその数を'(_数,_Fizzの表示枠,_Buzzの表示枠,_数の表示枠) :- '数が、3で割り切れたらFizzを'(_数,_Fizzの表示枠), '数が、5で割り切れたらBuzzを'(_数,_Buzzの表示枠), 'どちらでも割り切れない時はその数を'(_数,_数の表示枠). '数が、3で割り切れたらFizzを'(_数,'Fizz') :- 0 is _数 mod 3,!. '数が、3で割り切れたらFizzを'(_,''). '数が、5で割り切れたらBuzzを'(_数,'Buzz') :- 0 is _数 mod 5,!. '数が、5で割り切れたらBuzzを'(_,''). 'どちらでも割り切れない時はその数を'(_数,_数の表示枠) :- \+(0 is _数 mod 3), \+(0 is _数 mod 5), swritef(_数の表示枠,'%t',[_数]),!. 'どちらでも割り切れない時はその数を'(_,''). '表示します。ひとつの数を表示したら改行し、'(_Fizzの表示枠,_Buzzの表示枠,_数の表示枠) :- writef('%w%w%w',[_Fizzの表示枠,_Buzzの表示枠,_数の表示枠]), nl. 'ある数まで表示し終わったら終了します。'(_数,_数). % 以下のサイトは 規則性のある部分ならび(_ならび,_規則,_部分ならび) :- append(L1,_部分ならび,L3,_ならび), \+(_部分ならび = []), 部分ならびは規則に適合する(_部分ならび,_規則), その前後を含むと規則に適合しなくなる(L1,_部分ならび,L3,_規則). 部分ならびは規則に適合する(_部分ならび,_規則) :- P =.. [_規則,_部分ならび], call(P). その前後を含むと規則に適合しなくなる(L1,_部分ならび,L3,_規則) :- 'L1の最後の要素を含むと規則に適合しない'(L1,_部分ならび,_規則), 'L3の最初の要素を含むと規則に適合しない'(L3,_部分ならび,_規則). 'L1の最後の要素を含むと規則に適合しない'(L1,_部分ならび,_規則) :- \+((append(_,[A],L1),部分ならびは規則に適合する([A|_部分ならび],_規則))). 'L3の最初の要素を含むと規則に適合しない'(L3,_部分ならび,_規則) :- P =.. [_規則,A], \+((L3 = [A|_],append(_部分ならび,[A],_部分ならび_2),部分ならびは規則に適合する(_部分ならび_2,_規則))). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典 :: SQL質疑応答スレ 14問目 #896 # 質問です。 # PostgreSQL9.3 # # テーブル # DATE, VALUE # 20140401,-13 # 20140402,-11 # 20140403, 12 # 20140404, 13 # 20140405, 12 # 20140406,-11 # # 欲しい結果 # DATE, VALUE ,COUNT # 20140401,-13, 1 # 20140402,-11, 2 # 20140403, 12, 1 # 20140404, 13, 2 # 20140405, 12, 3 # 20140406,-11, 1 # # このように、VALUEの値の正負の連続数をCOUNTし出力するようなSQLは書けるのですか? 'VALUEの値の正負の連続数をCOUNTし出力する' :- テーブルデータをならびに取得(LL), 'VALUEの値の正負の連続数をCOUNTし出力する'(LL). テーブルデータをならびに取得(LL) :- findall([_DATE,_VALUE],テーブル(_DATE,_VALUE),LL). 'VALUEの値の正負の連続数をCOUNTし出力する'(LL) :- 同一の符号の最大連続(LL,LL2), 'COUNTして出力する'(LL2). 同一の符号の最大連続(LL,LL2) :- append([LL1,LL2,LL3],LL), 'LL2が同一符号の最大連続である'(LL1,LL2,LL3). 'LL2が同一符号の最大連続である'(LL1,LL2,LL3) :- 全てが同一符号(LL2,_符号), 'LL1の最後の要素の符号は異なる'(LL1,_符号), 'LL3の最初の要素の符号は異なる'(LL3,_符号). 全てが同一符号([],_). 全てが同一符号([[_,_VALUE]|R],_符号) :- 符号(_VALUE,_符号), 全てが同一符号(R,_符号). 符号(_VALUE,+) :- _VALUE >= 0. 符号(_VALUE,-) :- _VALUE < 0. 'LL1の最後の要素の符号は異なる'(LL1,_符号) :- \+((last(LL1,[_,_VALUE]),符号(_VALUE,_符号))). 'LL3の最初の要素の符号は異なる'(LL3,_符号) :- \+((LL3 = [[_,_VALUE]|_],符号(_VALUE,_符号))). 'COUNTして出力する'(LL2) :- forall( nth1(_nth1,LL2,[_DATE,_VALUE]), writef('%t,%t,%t\n',[_DATE,_VALUE,_nth1])). % 以下のサイトは # 出典 :: SQL質疑応答スレ14問目 #890 # 質問させてください。MySQLです。 # 上位100件を抽出してその中から10件をランダムに抽出したい。 # SELECT文はどう書けばいいですか?1行でできますか? '上位100件を抽出してその中から10件をランダムに抽出したい。'(_10件をランダムに抽出) :- 上位100件を抽出して(_上位100件), length(_10件をランダムに抽出,10), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[],_10件をランダムに抽出). '上位100件を抽出して'(_上位100件) :- findall(_値,テーブル(_値),_値ならび), 降順整列(_値ならび,_降順整列した値ならび), length(_上位100件,100), append(_上位100件,_,_降順整列した値ならび). '上位100件の中から10件をランダムに抽出したい。'(_,_,[]). '上位100件の中から10件をランダムに抽出したい。'(_上位100件,_既に選択した位置,[_選択値|R]) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値), '上位100件の中から10件をランダムに抽出したい。'(_上位100件,[_選択した位置|_既に選択した位置],R). 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値),!. 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- 重複なくランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値). ランダムに一件抽出する(_上位100件,_既にに選択した位置,_選択値) :- _選択する位置 is random(100) + 1, \+(member(_選択する位置,_既に選択した位置)), nth1(_選択する位置,_上位100件,_選択値). 降順整列([],[]). 降順整列([A|R1],L) :- 降順分割(A,R1,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[A|L2_2],L). 降順分割(_,[],[],[]). 降順分割(A,[B|R],[B|L1],L2) :- B @> A, 降順分割(A,R,L1,L2). 降順分割(A,[B|R],L1,[B|L2]) :- B @=< A, 降順分割(A,R,L1,L2). % 以下のサイトは # このディレクトリの索引 # 出典 :: スレ立てるまでもない質問はここで135代目 #755 # **--* # ***-* # *---* # **-** # **-** # # var a=[ # "**--*", # "***-*", # "*---*", # "**-**", # "**-**", # ]; # ハイフンの位置を取得して連想配列に入れる方法おしえてください # var ithi = [ # [2,3], # [3], # [1,2,3], # [2], # [2], # ] ハイフンの位置を取得して連想配列に入れる方法おしえてください(_文字列,_行ならび,_ハイフンの位置ならび) :- ハイフンの位置を取得して連想配列に入れる(_文字列,_行ならび,_ハイフンの位置ならび). ハイフンの位置を取得して連想配列に入れる(_文字列,_行ならび,_ハイフンの位置ならび) :- 行ならびを得る(_文字列,_行ならび), findall(_各行のハイフン位置ならび,( member(_各行,_行ならび), ハイフンの位置を取得して(_各行,_各行のハイフン位置ならび)),_ハイフンの位置ならび). ハイフンの位置を取得して(_副文字列,_ハイフンの位置ならび) :- findall(_位置0オリジン,( sub_atom(_副文字列,_位置0オリジン,1,_,'-')),_ハイフンの位置ならび). 行ならびを得る(_文字列,L) :- 停止条件は文字列が空となるか改行を含まない場合(_文字列,L),!. 行ならびを得る(_文字列,[_改行までの文字列|R]) :- 改行までの文字列を切り取りながら行ならびを得る(_文字列,_改行までの文字列,R). 停止条件は文字列が空となるか改行を含まない場合('',[]) :- !. 停止条件は文字列が空となるか改行を含まない場合(_文字列,[_文字列]) :- 改行を含まない(_文字列). 改行を含まない(_文字列) :- \+(sub_atom(_文字列,_,1,_,'\n')). 改行までの文字列を切り取りながら行ならびを得る(_文字列,_改行までの文字列,R) :- 改行までの文字列を得る(_文字列,_改行までの文字列,_後文字列), 行ならびを得る(_後文字列,R). 改行までの文字列を得る(_文字列,_改行までの文字列,_後文字列) :- sub_atom(_文字列,S,1,R,'\n'), sub_atom(_文字列,0,S,_,_改行までの文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # # 先頭の連続した文字を別の文字列に置換した文字列 # 先頭の連続した文字を別の文字列に置換した文字列(_文字列,_別の文字列,_置換した文字列) :- 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数), 別の文字列に置換した文字列(_文字列,_先頭の連続した文字数,_別の文字列,_置換した文字列). 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_先頭の連続した文字数,1,_,_先頭文字とは異なる文字), \+(_先頭文字 = _先頭文字とは異なる文字),!. 別の文字列に置換した文字列(_文字列,_先頭の連続した文字数,_別の文字列,_置換した文字列) :- sub_atom(_文字列,_先頭の連続した文字数,_,0,_残り文字列), atomic_list_concat([_別の文字列,_残り文字列],_置換した文字列),!. % 以下のサイトは # # 先頭の連続した文字を一文字に置換した文字列 # 先頭の連続した文字を一文字に置換した文字列(_文字列,_置換した文字列) :- 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数), 一文字に置換した文字列(_文字列,_先頭文字,_先頭の連続した文字数,_置換した文字列). 先頭の連続した文字を(_文字列,_先頭文字,_先頭の連続した文字数) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_先頭の連続した文字数,1,_,_先頭文字とは異なる文字), \+(_先頭文字 = _先頭文字とは異なる文字),!. 一文字に置換した文字列(_文字列,_先頭文字,_先頭の連続した文字数,_置換した文字列) :- sub_atom(_文字列,_先頭の連続した文字数,_,0,_残り文字列), atomic_list_concat([_先頭文字,_残り文字列],_置換した文字列),!. % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- atom_chars(_文字列,Chars_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(Chars_1,Chars_2), atom_chars(_置換した文字列,Chars_2). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([],[]). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(L1,L2) :- ならびの同じ文字要素の4回以上の繰り返しを(L1,_同じ要素,R1_1), '3回にしたい'(R1_1,_同じ要素,R1_2,L2,R2), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1_2,R2),!. ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A|R1],[A|R2]) :- ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1,R2),!. ならびの同じ文字要素の4回以上の繰り返しを([A,A,A,A|R],A,R). '3回にしたい'(R1_1,_同じ要素,R1_2,L2,R2) :- ならびの先頭からの指定要素を読み飛ばす(R1_1,_同じ要素,R1_2), L2 = [_同じ要素,_同じ要素,_同じ要素|R2]. ならびの先頭からの指定要素を読み飛ばす([],_,[]) :- !. ならびの先頭からの指定要素を読み飛ばす([A|R],B,[A|R]) :- \+(A = B),!. ならびの先頭からの指定要素を読み飛ばす([A|R1],A,R2) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R2). % 以下のサイトは # ●Regular Expressionの使用環境 # サクラエディタ 2.1.1.1 # # ●検索か置換か? # 置換 # # ●説明 # []内の文字だけにしたい # ※ [ と ] と (半角スペース)の3つを消したい # # ●対象データ # [あいうえお] ←最後に半角スペースあり(以下同じ) # [カキクケコ] # [AIUEO] # [漢字等々] # # ●希望する結果 # あいうえお←最後の半角スペースも消したい(以下同じ) # カキクケコ # AIUEO # 漢字等々 '[]内の文字だけとしたい'(_文字列,_変換されたデータ) :- '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3), '[]内の文字だけにしたい'(S3,S3_2), atomic_list_concat([S1,S2_2,S3_2],_変換されたデータ),!. '[]内の文字だけとしたい'(_文字列,_文字列). '[]内の文字だけとしたい'(_文字列,S1,S2_2,S3) :- sub_atom(_文字列,S1,S2,S3,L1,L2,L3), sub_atom(S2,0,1,_,'['), sub_atom(S2,_,1,0,']'), '[]とスペースを削除する'(S2,S2_2),!. '[]とスペースを削除する'(S2,S2_2) :- '[]を削除する'(S2,S2_1), スペースを削除する(S2_1,S2_2). '[]を削除する'(S2,S2_1) :- sub_atom(S2,1,_,1,S2_2). スペースを削除する(S2_1,S2_2) :- findall(A,( スペースでない文字を取り出す(S2_1,A)), L), atom_chars(S2_2,L). スペースでない文字を取り出す(S2,A) :- sub_atom(S2,_,1,_,A), \+(A = ' ')). % 以下のサイトは 行は前半の文字列と後半の数値で構成される(_行,_前半の文字列,_後半の数値) :- sub_atom(_行,0,Len,_,_前半の文字列), 文字列は数字とピリオドを含まない(_前半文字列), sub_atom(_行,Len,_,0,_後半の数字文字列), 文字列は数字かピリオドだけで構成されている(_後半の数字文字列), read_term_from_atom(_後半の数字文字列,_後半の数値,[]). 文字列は数字とピリオドを含まない(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),\+(数字かピリオド(_文字))). 文字列は数字かピリオドだけで構成されている(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),数字かピリオド(_文字)). 数字かピリオド('0'). 数字かピリオド('1'). 数字かピリオド('2'). 数字かピリオド('3'). 数字かピリオド('4'). 数字かピリオド('5'). 数字かピリオド('6'). 数字かピリオド('7'). 数字かピリオド('8'). 数字かピリオド('9'). 数字かピリオド('0'). 数字かピリオド('.'). % 以下のサイトは # # 出典 :: 竹渕瑛一氏のtwitter 20140417より # 各駅下り(_駅) :- 下り起点駅(_下り起点駅), 下り終点駅(_下り起点駅,_下り終点駅), 各駅下り(_下り起点駅,_下り終点駅,_駅). 下り起点駅(_下り起点駅) :- 駅が隣接する(_下り起点駅,_),!. 下り終点駅(_駅,_下り終点駅) :- 駅が隣接する(_駅,_次の駅), 下り終点駅(_次の駅,_下り終点駅). 下り終点駅(_下り終点駅,_下り終点駅). 各駅上り(_駅) :- 上り終点駅(_上り終点駅), 上り起点駅(_上り終点駅,_下り起点駅), 各駅上り(_上り起点駅,_上り終点駅,_駅). 上り終点駅(_上り終点駅) :- 駅が隣接する(_上り終点駅,_),!. 上り起点駅(_駅,_上り起点駅) :- 駅が隣接する(_駅,_次の駅), 上り起点駅(_次の駅,_上り起点駅). 上り起点駅(_上り起点駅,_上り起点駅). 各駅下り(_起点駅,_終点駅,_終点駅) :- 起点駅が終点駅に到達(_起点駅,_終点駅),!. 各駅下り(_起点駅,_終点駅,_駅) :- 駅が隣接する(_起点駅,_駅_2), この先に終点駅がある(_起点駅,_終点駅), 各駅下り(_起点駅,_終点駅,_駅_2,_駅). 各駅下り(_駅,_,_駅) :- \+(駅が隣接する(_駅,_)). 各駅下り(_駅,_,_,_駅). 各駅下り(_,_終点駅,_駅_2,_駅) :- 各駅下り(_駅_2,_終点駅,_駅). この先に終点駅がある(_,_終点駅) :- var(_終点駅),!. この先に終点駅がある(_起点駅,_) :- var(_起点駅),!. この先に終点駅がある(_終点駅,_終点駅) :- !. この先に終点駅がある(_駅,_終点駅) :- 駅が隣接する(_駅,_次の駅), この先に終点駅がある(_次の駅,_終点駅). 各駅上り(_起点駅,_終点駅,_終点駅) :- 起点駅が終点駅に到達(_起点駅,_終点駅),!. 各駅上り(_起点駅,_終点駅,_駅) :- 駅が隣接する(_駅_2,_起点駅), この前に終点駅がある(_起点駅,_終点駅), 各駅上り(_起点駅,_終点駅,_駅_2,_駅). 各駅上り(_駅,_,_駅) :- \+(駅が隣接する(_,_駅)). 各駅上り(_駅,_,_,_駅). 各駅上り(_,_終点駅,_駅_2,_駅) :- 各駅上り(_駅_2,_終点駅,_駅). この前に終点駅がある(_,_終点駅) :- var(_終点駅),!. この前に終点駅がある(_起点駅,_) :- var(_起点駅),!. この前に終点駅がある(_終点駅,_終点駅) :- !. この前に終点駅がある(_駅,_終点駅) :- 駅が隣接する(_次の駅,_駅), この前に終点駅がある(_次の駅,_終点駅). 起点駅が終点駅に到達(_起点駅,_終点駅) :- var(_起点駅), var(_終点駅),!,fail. 起点駅が終点駅に到達(_起点駅,_終点駅) :- var(_起点駅),!,fail. 起点駅が終点駅に到達(_起点駅,_終点駅) :- \+(var(_起点駅)), \+(var(_終点駅)), _起点駅 = _終点駅,!. 駅(相模大野). 駅(東林間). 駅(中央林間). 駅(南林間). 駅(鶴間). 駅(大和). 駅(桜ヶ丘). 駅(高座渋谷). 駅(長後). 駅(湘南台). 駅(六会日大前). 駅(善行). 駅(藤沢本町). 駅(藤沢). 駅(本鵠沼). 駅(鵠沼海岸). 駅(片瀬江ノ島). 駅が隣接する(相模大野, 東林間). 駅が隣接する(東林間, 中央林間). 駅が隣接する(中央林間, 南林間). 駅が隣接する(南林間, 鶴間). 駅が隣接する(鶴間, 大和). 駅が隣接する(大和, 桜ヶ丘). 駅が隣接する(桜ヶ丘, 高座渋谷). 駅が隣接する(高座渋谷, 長後). 駅が隣接する(長後, 湘南台). 駅が隣接する(湘南台, 六会日大前). 駅が隣接する(六会日大前, 善行). 駅が隣接する(善行, 藤沢本町). 駅が隣接する(藤沢本町, 藤沢). 駅が隣接する(藤沢, 本鵠沼). 駅が隣接する(本鵠沼, 鵠沼海岸). 駅が隣接する(鵠沼海岸, 片瀬江ノ島). /* 各駅下り(相模大野, 東林間). 各駅下り(東林間, 中央林間). 各駅下り(中央林間, 南林間). 各駅下り(南林間, 鶴間). 各駅下り(鶴間, 大和). 各駅下り(大和, 桜ヶ丘). 各駅下り(桜ヶ丘, 高座渋谷). 各駅下り(高座渋谷, 長後). 各駅下り(長後, 湘南台). 各駅下り(湘南台, 六会日大前). 各駅下り(六会日大前, 善行). 各駅下り(善行, 藤沢本町). 各駅下り(藤沢本町, 藤沢). 各駅下り(藤沢, 本鵠沼). 各駅下り(本鵠沼, 鵠沼海岸). 各駅下り(鵠沼海岸, 片瀬江ノ島). 各駅上り(片瀬江ノ島, 鵠沼海岸). 各駅上り(鵠沼海岸, 本鵠沼). 各駅上り(本鵠沼, 藤沢). 各駅上り(藤沢, 藤沢本町). 各駅上り(藤沢本町, 善行). 各駅上り(善行, 六会日大前). 各駅上り(六会日大前, 湘南台). 各駅上り(湘南台, 長後). 各駅上り(長後, 高座渋谷). 各駅上り(高座渋谷, 桜ヶ丘). 各駅上り(桜ヶ丘, 大和). 各駅上り(大和, 鶴間). 各駅上り(鶴間, 南林間). 各駅上り(南林間, 中央林間). 各駅上り(中央林間, 東林間). 各駅上り(東林間, 相模大野). */ 急行停車駅(相模大野). 急行停車駅(藤沢). 急行停車駅(片瀬江ノ島). 急行停車駅(長後). 急行停車駅(本鵠沼). 急行停車駅(鵠沼海岸). 急行停車駅(南林間). 急行停車駅(大和). 急行停車駅(南林間). 急行停車駅(湘南台). 駅間距離(相模大野, 東林間, 1.7). 駅間距離(東林間, 中央林間, 1.3). 駅間距離(中央林間, 南林間, 1.5). 駅間距離(南林間, 鶴間, 0.6). 駅間距離(鶴間, 大和, 2.5). 駅間距離(大和, 桜ヶ丘, 2.2). 駅間距離(桜ヶ丘, 高座渋谷, 2.0). 駅間距離(高座渋谷, 長後, 2.2). 駅間距離(長後, 湘南台, 1.8). 駅間距離(湘南台, 六会日大前, 1.5). 駅間距離(六会日大前, 善行, 2.4). 駅間距離(善行, 藤沢本町, 1.6). 駅間距離(藤沢本町, 藤沢, 1.8). 駅間距離(藤沢, 本鵠沼, 1.5). 駅間距離(本鵠沼, 鵠沼海岸, 1.3). 駅間距離(鵠沼海岸, 片瀬江ノ島, 1.7). 駅のならびを得る([_起点となる駅|L]) :- 駅が隣接する(_起点となる駅,_),!, findall(_駅,駅が隣接する(_,_駅),L). 全ての急行区間(_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :- 駅のならびを得る(_駅のならび), 全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび). 全ての急行区間(_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび) :- 駅のならびを得る(_駅のならび), reverse(_駅のならび,_反転した駅のならび), 全ての急行区間(_反転した駅のならび,_終点駅,_始点駅,_急行区間駅ならび,_急行停車駅ならび). 全ての急行区間(_駅のならび,_始点駅,_終点駅,_急行区間駅ならび,_急行停車駅ならび) :- append(L1,[_始点駅|R],_駅のならび), last(R,_終点駅), _急行区間駅ならび = [_始点駅|R], findall(_駅,( member(_駅,[_始点駅|R]), 急行停車駅(_駅)), _急行停車駅ならび). last([A],A) :- !. last([_|R],A) :- last(R,A). 急行を使って停車駅を最小にする(_出発点駅,_到着点駅,_駅のならび,_出発駅から急行区間までの各駅停車駅ならび,_急行区間駅ならび,_終点急行停止駅から到着駅までの各駅停車駅ならび) :- append(L1,_急行区間駅ならび,L2,_駅のならび), 全ての急行区間(_,_,_急行区間駅ならび,_), 出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび), 終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび). 出発駅から急行区間までの駅ならび(_出発駅,L1,_出発駅から急行区間までの各駅停車駅ならび) :- append(_,[_出発駅|_出発駅から急行区間までの各駅停車駅ならび],L1), \+((member(_駅,_出発駅から急行区間までの各駅停車駅ならび),急行停車駅(_駅))). 終点急行停止駅から到着駅までの各駅停車駅ならび(_到着点駅,L2,_終点急行停止駅から到着駅までの各駅停車駅ならび) :- append(_終点急行停止駅から到着駅までの駅ならび,[_到着点駅|_],L2), \+((member(_駅,_終点急行停止駅から到着駅までの駅ならび),急行停車駅(_駅))). 区間距離(_起点駅,_終点駅,_区間距離) :- 区間距離(_起点駅,_終点駅,0.0,_区間距離),!. 区間距離(_起点駅,_終点駅,_区間距離) :- 区間距離(_終点駅,_起点駅,_区間距離). 区間距離(_終点駅,_終点駅,_区間距離,_区間距離) :- !. 区間距離(_駅,_終点駅,_区間距離_1,_区間距離) :- 駅間距離(_駅,_次の駅,_駅間距離), _区間距離_2 is _区間距離_1 + _駅間距離, 区間距離(_次の駅,_終点駅,_区間距離_2,_区間距離). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい. # # 出力形 # 8192 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 # 因子数:13 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 3月30日まで # [5] その他の制限: # ヒントを教授に聞きに行ったら自分で考えろと一蹴されました # よろしくお願いします '10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい.' :- '10000以下の素数を求める'(_10000以下の素数ならび), '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび), 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数), 'その数,因子の数,素因数分解の結果を表示する'(_素因子分解ならび,_最多因子数). '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび) :- findall([_10000以下の自然数,_10000の素因子の数,_素因子ならび],( between(1,10000,_10000以下の自然数), '10000の素因子分解'(_10000以下の素数ならび,_素因子ならび), length(_素因子ならび,_10000の素因子の数)), _素因子分解ならび). '10000以下の素数を求める'(_10000以下の素数ならび) :- エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび). エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび) :- findall(N,between(1,10000,N),_10000以下の自然数ならび), エラトステネスの篩(_10000以下の自然数ならび,_10000以下の素数ならび). '10000以下の自然数のうち素因数分解を行ったときに'(_,[],[]) :- !. '10000以下の自然数のうち素因数分解を行ったときに'(M,[N|R1],[N|R2]) :- 0 is M mod N, M_1 is M // N, '10000以下の自然数のうち素因数分解を行ったときに'(M_1,[N|R1],R2). '10000以下の自然数のうち素因数分解を行ったときに'(M,[_|R1],R2) :- '10000以下の自然数のうち素因数分解を行ったときに'(M,R1,R2). 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数) :- findmax(_素因子の数,( member([_,_因子の数,_],_素因子分解ならび)), _最多因子数). 'その数,因子の数,素因子分解の結果を表示する'(_素因子分解ならび,_最多因子数) :- forall( member([_数,_最多因子数,_素因子分解の結果],_素因子分解ならび), writef('%t,%t,%t\n',[_数,_最多因子数,_素因子分解の結果])). findmax(_選択項,_評価項,_最大値) :- findall(_選択項,_評価項,_評価ならび), 最大値(_評価ならび,_最大値). 最大値(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), ならび要素に最大値を超えるものはない(L1,_最大値), ならび要素に最大値を超えるものはない(L2,_最大値). ならびの要素に最大値を超えるものはない(_ならび,_最大値) :- \+((member(_要素,_ならび),_要素 @> _最大値)). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). % 以下のサイトは mecab(文,_文,LL) :- tmpnam(TMPNAM), tell(TMPNAM), writef('%t\n',[_文]), told, mecab(TMPNAM,LL). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,_,_,_,S1,'\t',S3,_,_,_)), LL). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). mecab(_ファイル,LL) :- atomic_list_concat(['cat ',_ファイル,' | mecab'],S), sh(S,LL_1), findall([S1,S3],( member([U|_],LL_1), sub_atom(U,S1,'\t',S3)), LL). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). split(_文字列,_区切り文字ならび,L) :- atom_chars(_文字列,_文字ならび), split_list(_文字ならび,_区切り文字ならび,L). split_list([],_,[]). split_list(L1,_区切り文字ならび,[_文字列|R]) :- split_list_2(_区切り文字ならび,L1,_文字列), split_list(L3,_区切り文字ならび,R),!. split_list(L1,_区切り文字ならび,[_文字列]) :- atom_chars(_文字列,L1). split_list_2(_区切り文字ならび,L,_文字列,L3) :- append(L1,L2,L3,L), member(_区切り文字,_区切り文字ならび), split_list_3(_区切り文字,L1,L2,L3), atom_chars(_文字列,L1),!. split_list_3(_区切り文字,L1,L2,L3) :- all(L2,_区切り文字), \+(append(_,[_区切り文字],L1)), \+(L3 = [_区切り文字|_]),!. tmpnam(TMPNAM) :- 'TMPNAM'(TMPNAM), \+(exist_file(TMPNAM)),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 'TMPNAM'(TMPNAM) :- '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび), atomic_list_concat(['/tmp/file'|_6要素の文字ならび],TMPNAM). '英小文字大文字数字からなる6要素の文字ならび'(_6要素の文字ならび) :- findall(_任意の文字,( between(1,6,_), '英小文字大文字数字から任意の文字'(_任意の文字)), _6要素の文字ならび). '英小文字大文字数字から任意の文字'(_任意の文字) :- _文字コード is random(75) + 48, '文字コード48-122の範囲で記号のコードではない'(_文字コード), char_code(_任意の文字,_文字コード),!. '英小文字大文字数字から任意の文字'(_任意の文字) :- '英小文字大文字数字から任意の文字'(_任意の文字). '文字コード48-122の範囲で記号のコードではない'(_文字コード) :- '文字コード範囲58-64ではない'(_文字コード), '文字コード範囲91-96ではない'(_文字コード). '文字コード範囲58-64ではない'(_文字コード) :- \+((_文字コード>=58,_文字コード=<64)). '文字コード範囲91-96ではない'(_文字コード) :- \+((_文字コード>=91,_文字コード=<96)). sub_atom(A,H,X,T) :- atom(A), sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), sub_atom(A,_,R,0,T). % 以下のサイトは % % 非決定性の 降順に順位付け/3 % 降順に順位付け(_先頭に整列対象要素のある要素ならび,_順位,_要素) :- 降順整列(_先頭に整列対象要素のある要素ならび,_降順に整列したならび), append(L1,L2,L3,_降順に整列したならび), 'L2は同一の整列対象要素の最大集合'(L1,L2,L3), 順位と要素(L1,L2,_順位,_要素). 'L2は同一の整列対象要素の最大集合'(L1,L2,L3) :- 先頭の整列対象要素は全て同一(L2,_整列対象要素), 前後には整列対象要素はない(_整列対象要素,L1,L3),!. 前後には整列対象要素はない(_整列対象要素,L1,L3) :- \+(append(_,[[_整列対象要素|_]],L1)), \+(L3 = [[_整列対象要素|_]|_]). 順位と要素(L1,L2,_順位,_要素) :- length([_|L1],_順位), member(_要素,L2). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). 先頭の整列対象要素は全て同一([],_). 先頭の整列対象要素は全て同一([[_要素|_]|R],_要素) :- 先頭の整列対象要素は全て同一(R,_要素). 降順整列([],[]). 降順整列([_軸要素|R],L) :- 降順整列の分割(_軸要素,R,L1,L2), 降順整列(L1,L1_2), 降順整列(L2,L2_2), append(L1_2,[_軸要素|L2_2],L). 降順整列の分割(_,[],[],[]). 降順整列の分割(_軸要素,[_要素|R],[_要素|L1],L2) :- A @>= _軸要素, 降順整列の分割(_軸要素,R,L1,L2). 降順整列の分割(_軸要素,[_要素|R],L1,[_要素|L2]) :- A @< _軸要素, 降順整列の分割(_軸要素,R,L1,L2). % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 連続文字列を切り出す(_文字列,_前文字列,_連続文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_連続文字列,_後文字列), '前後には文字がないか、あるいは異なった文字がある連続文字列'(_前文字列,_後文字列,_文字). '前後には文字がないか、あるいは異なった文字がある連続文字列'(_前文字列,_後文字列,_文字) :- 連続文字列(_同じ文字の文字列,_文字), '前後には文字がないか、あるいは異なった文字がある'(_前文字列,_後文字列,_文字). '前後には文字がないか、あるいは異なった文字がある'(_前文字列,_後文字列,_文字) :- '前文字列が空であるか、前文字列の最後の文字は異なった文字である'(_前文字列,_文字), '後文字列が空であるか、後文字列の最初の文字は異なった文字である'(_後文字列,_文字). '前文字列が空であるか、前文字列の最後の文字は異なった文字である'(_前文字列,_文字) :- \+(sub_atom(_前文字列,_,1,0,_文字)). '後文字列が空であるか、後文字列の最初の文字は異なった文字である'(_後文字列,_文字) :- \+(sub_atom(_後文字列,0,1,_,文字)). 連続文字列(_文字列,_文字) :- 先頭文字(_文字列,_先頭文字), 全て同一文字の文字列(_文字列,_文字,_残り文字列). 先頭文字(_文字列,_先頭文字) :- sub_atom(_文字列,0,1,_,_先頭文字). 全て同一文字の文字列(_文字列,_文字,_残り文字列) :- forall(( sub_atom(_文字列,_,1,_,_文字_1),_文字=_文字_1). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 文字列の先頭から同じ文字による文字列を切り出す(_文字列,_同じ文字の文字列,_残り文字列) :- sub_atom(_文字列,0,1,_,_文字), 同じ文字による文字列の文字数を得る(_文字列,_文字,_文字数), sub_atom(_文字列,0,_文字数,R,_同じ文字の文字列), sub_atom(_文字列,_,R,0,_残り文字列). 同じ文字による文字列の文字数を得る(_文字列,_文字,_文字数) :- findall(_,( sub_atom(_文字列,_,1,_,_文字_1), ( \+(_文字_1 = _文字),!,fail;true)), L), length(L,_文字数). % 以下のサイトは # 出題: http://toro.2ch.net/test/read.cgi/tech/1387257592/395 # ●Regular Expressionの使用環境 # JavaScript # # ●検索か置換か? # 置換 # # ●説明 # 同じ文字の4回以上の繰り返しを3回にしたい # # ●対象データ # ああああああああああああああああああいいいいいいいいいいいいいいいうえおおおおおおおおおおおおおお # # ●希望する結果 # あああいいいうえおおお 同じ文字の4回以上の繰り返しを3回にしたい(_文字列,_置換した文字列) :- atom_chars(_文字列,Chars_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(Chars_1,Chars_2), atom_chars(_置換した文字列,Chars_2). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([],[]). ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A,A,A,A|R1],[A,A,A|R2]) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R1_1), ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1_1,R2),!. ならびの同じ文字要素の4回以上の繰り返しを3回にしたい([A|R1],[A|R2]) :- ならびの同じ文字要素の4回以上の繰り返しを3回にしたい(R1,R2),!. ならびの先頭からの指定要素を読み飛ばす([],_,[]) :- !. ならびの先頭からの指定要素を読み飛ばす([A|R],B,[A|R]) :- \+(A = B),!. ならびの先頭からの指定要素を読み飛ばす([A|R1],A,R2) :- ならびの先頭からの指定要素を読み飛ばす(R1,A,R2). % 以下のサイトは # 出典: http://toro.2ch.net/test/read.cgi/tech/1392388003/167 # 文字列(string型)の先頭から数字として有効な文字数を返す関数ってどうやって作れば良いですか? # 例 # "126AB"→3 # "-(1+2)"→0 # "-9.25ABC"→5 文字列の先頭から数字として有効な文字数を得る(_文字列,_先頭から数字として有効な文字数) :- atom_length(_文字列,_長さ), 文字列の先頭から数字として有効な文字数を得る(_文字列,_長さ,_先頭から数字として有効な文字数). 文字列の先頭から数字として有効な文字数を得る(_文字列,_先頭から数字として有効な文字数,_先頭から数字として有効な文字数) :- 文字列の先頭から数字として有効な文字数(_文字列,_先頭から数字として有効な文字数),!. 文字列の先頭から数字として有効な文字数を得る(_文字列,_文字数,_先頭から数字として有効な文字数) :- _文字数 > 0, _文字数_1 is _文字数 - 1, 文字列の先頭から数字として有効な文字数を得る(_文字列,_文字数_1,_先頭から数字として有効な文字数). 文字列の先頭から数字として有効な文字数(_文字列,_先頭から数字として有効な文字数) :- _先頭から数字として有効な文字数 > 0, sub_atom(_文字列,0,_先頭から数字として有効な文字数,_,_副文字列), catch(read_term_from_atom(_副文字列,_項,[]),_,fail), number(_項),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列の先頭から数字として有効な文字列を切り出す(_文字列,_先頭から数字として有効な文字列) :- sub_atom(_文字列,0,Len,R,_先頭から数字として有効な文字列), (catch(read_term_from_atom(_先頭から数字として有効な文字列,_項,[]),_,fail),number(_項)), succ(Len,Len2), \+((sub_atom(_文字列(0,Len2,_,_副文字列2),catch(read_term_from_atom(_副文字列2,_項,[]),_,fail)),!. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/351 # ●Regular Expressionの使用環境 # サクラエディタ # # ●検索か置換か? # 置換 # # ●説明 # Exampleの文字列を含まない行を削除したい # # ●対象データ # ABCA Test # BCAA Example # CABA Abc # # ●希望する結果 # BCAA Example # # # ネットで検索して出てきた^(?!.*Example).+$や^((?!Example).)*$ # で試したんですが空行が残ってしまいました # # 'Exampleの文字列を含まない行を削除したい'(_文字列,_Exampleの文字列を含まない行を削除された文字列) :- 改行記号付きの行ならびを得る(_文字列,_改行記号付きの行ならび), findall(_行,( member(_行,_文字列ならび), \+(sub_atom(_行,_,_,_,'Example'))), _Exampleの文字列を含まない行を削除された行ならび), atomic_list_concat(_Exampleの文字列を含まない行を削除された行ならび,_Exampleの文字列を含まない行を削除された文字列). 改行記号付きの行ならびを得る('',[]) :- !. 改行記号付きの行ならびを得る(_文字列,[_改行記号付き行|R]) :- 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列), 改行記号付きの行ならびを得る(_残り文字列,R). 改行記号を含む行を得る(_文字列,_改行記号付き行,_残り文字列) :- sub_atom(_文字列,S,1,R,'\n'), sub_atom(_文字列,0,_,R,_改行記号付き行), sub_atom(_文字列,_,R,0,_残り文字列),!. 改行記号を含む行を得る(_文字列,_文字列,''). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[],[_数_1,_数_2]), 'とりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[A,B],[A,B]) :- !. 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,L1,L) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[_適当に選んだ数|L1],L). 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- length(_シャッフルした1からnのn個の連続した整数,Len), R1 is random(Len), nth0(R1,_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), \+(member(_適当に選んだ数,L1)),!. 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数). 'とりのぞく。'(_数_1,_数_2,_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- select(_数_1,_シャッフルした1からnのn個の連続した整数,L1), select(_数_2,L1,_2個をとりのぞいたのこりの数). 'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :- length(L,2),!. 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- select(_n,L1,L1_2),!, _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L). 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L). % 以下のサイトは # 出題場所 :: 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,_最大値). % 以下のサイトは ?- 'a##'. # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/212 # お題:与えられた数列を以下のルールで縮小せよ # (a) 4つ以上連続した数を消す (複数ある場合は一番左を優先する) # (b) (a)を繰り返す # 例: # ------- # in : 11233344433331111143322211 # out: # 11233344433331111143322211 # 1123334441111143322211 # 11233344443322211 # 1123333322211 # 11222211 # 1111 # # ------- # in : 1122224411112222 # out: # 1122224411112222 # 114411112222 # 11442222 # 1144 # ------- # in : 211222211333312 # out: # 211222211333312 # 21111333312 # 2333312 # 212 # # '4つ以上連続した数を消す (複数ある場合は一番左を優先する)'(_数_1,_数_2) :- number_chars(_数_1,Chars_1), '4要素以上の連続した文字ならびを切り取る'(Chars_1,Chars_2), number_chars(_数_2,Chars_2),!. '4要素以上の連続した文字ならびを切り取る'(Chars_1,Chars_2) :- '4要素以上の連続する最初の文字ならびを切り取る'(Chars_1,Chars_3), '4要素以上の連続した文字ならびを切り取る'(Chars_3,Chars_2). '4要素以上の連続した文字ならびを切り取る'(Chars,Chars). '4要素以上の連続する最初の文字ならびを切り取る'(Chars_1,Chars_3) :- '4要素以上の連続する最初の文字ならびを'(Chars_1,L1,L3), 切り取る(L1,L3,Chars_3). '4要素以上の連続する最初の文字ならびを'(Chars_1,L1,L3) :- append(L1,L2,L3,Chars_1), all(L2,_文字), \+(L3 = [_文字|_]), L2 = [_,_,_,_|_],!. 切り取る(L1,L3,Chars_3) :- append(L1,L3,Chars_3). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # teitter by @SaitoAtsushi 2014-02-16 # 問題 三人の年齢(_1,_2,_3) :- 'Bの年齢'(Bの年齢), '36の約数の重複組合せから年齢候補を得る'(_1,_2,_3), Bの年齢 is _1 + _2 + _3, 最も高い年齢の子供は一人(_1,_2,_3). 'Bの年齢'(Bの年齢) :- '36の約数の重複組合せから年齢候補を得る'(_1,_2,_3), 最も高い年齢の子供が複数いる(_1,_2,_3), Bの年齢 is _1 + _2 + _3. '36の約数の重複組合せから年齢候補を得る'(_1,_2,_3) :- '36の約数を得る'(1,_36の約数ならび), 重複組合せ(_36の約数ならび,3,[_1,_2,_3]), 36 is _1 * _2 * _3. '36の約数を得る'(36,[36]) :- !. '36の約数を得る'(N,[N|R]) :- 0 is 36 mod N,!, N_2 is N + 1, '36の約数を得る'(N_2,R). '36の約数を得る'(N,[N|R]) :- N_2 is N + 1, '36の約数を得る'(N_2,R). 重複組合せ(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). 最も高い年齢の子供は一人(_1,_2,_3) :- append(L1,[_最大年齢|L2],[_1,_2,_3]), \+((member(A1,L1),A1 >= _最大年齢)), \+((member(A2,L2),A2 >= _最大年齢)),!. 最も高い年齢の子供が複数いる(_1,_2,_3) :- append(L1,[_最大年齢|L2],[_1,_2,_3]), \+((member(A1,L1),A1 > _最大年齢)), \+((member(A2,L2),A2 > _最大年齢)), (member(_最大年齢,L1);member(_最大年齢,L2)). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/170 # お題:分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。 # m=3 -> 1/3,1/2,2/3 # m=5 -> 1/5,1/4,1/3,2/5,1/2,3/5,2/3,3/4,4/5 # # '分母が自然数m以下の既約分数で0より大きく1より小さいものを小さい順にならべる。'(_m,_整列した分数ならび) :- findall(_分子 rdiv _分母,分母ごとの既約分数(_m,_分母,_分子),_分数ならび), sort(_分数ならび,_整列した分数ならび). 分母ごとの既約分数(_m,_分母,_分子) :- between(2,_m,_分母), 分子候補を篩に掛ける(2,_分母,_篩に掛けられた分子ならび), member(_分子,_篩に掛けられた分子ならび). 分子候補を篩に掛ける(M,_分母,_篩に掛けられた分子ならび) :- 分子候補を生成(_分母,_数ならび), 分子候補を篩に掛ける(M,_分母,_数ならび,_篩に掛けられた分子ならび). 分子候補を生成(_分母,_数ならび) :- succ(_分母_1,_分母), findall(N,between(1,_分母_1,N),_数ならび). 分子候補を篩に掛ける(_分母,_分母,_篩に掛けられた分子ならび,_篩に掛けられた分子ならび) :- !. 分子候補を篩に掛ける(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび). 'Mが2から分母になるまで分子候補を篩に掛ける'(M,_分母,_数ならび_1,_篩に掛けられた分子ならび) :- 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2), succ(M,M_2), 分子候補を篩に掛ける(M_2,_分母,_数ならび_2,_篩に掛けられた分子ならび). 'Mの篩'(M,_分母,_数ならび_1,_数ならび_2) :- findall(_分子候補,分子候補(M,_分母,_数ならび_1,_分子候補),_数ならび_2). 分子候補(M,_分母,_数ならび_1,_分子候補) :- member(_分子候補,_数ならび_1), 約分できない(M,_分母,_分子候補). 約分できない(M,_分母,_分子候補) :- \+(約分できる(M,_分母,_分子候補)). 約分できる(M,_分母,_分子候補) :- 0 is _分母 mod M, 0 is _分子候補 mod M. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/103 # お題:与えられた年月のカレンダーを表示せよ。 # '与えられた年月のカレンダーを表示せよ。'(_年,_月) :- カレンダー矩形(_年,_月,_カレンダー矩形), カレンダーを表示する(_年,_月,_カレンダー矩形). カレンダー矩形(_年,_月,_カレンダー矩形) :- '1日の曜日を表す値'(_年,_月,_1日の曜日を表す値), 月末日(_年,_月,_月末日), 日付を埋めて週カレンダーならびを作る(_1日の曜日を表す値,_月末日,_カレンダー矩形). '1日の曜日を表す値'(_年,_月,_曜日を表す値) :- 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_). 'Zellerの公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, 'Zellerの公式'(_年,_月,_日,_曜日を表す値), 'Zellerの公式で曜日を表す値と曜日'(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 'Zellerの公式で曜日を表す値と曜日'(0,日曜). 'Zellerの公式で曜日を表す値と曜日'(1,月曜). 'Zellerの公式で曜日を表す値と曜日'(2,火曜). 'Zellerの公式で曜日を表す値と曜日'(3,水曜). 'Zellerの公式で曜日を表す値と曜日'(4,木曜). 'Zellerの公式で曜日を表す値と曜日'(5,金曜). 'Zellerの公式で曜日を表す値と曜日'(6,土曜). 月末日(_年,2,29) :- うるう年(_年),!. 月末日(_年,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]). 月末日(_,_月,30) :- member(_月,[4,6,9,11]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- \+(0 is _年 mod 100),!. うるう年(_年) :- 0 is _年 mod 4. 日付を埋めて週カレンダーならびを作る(_1日の曜日を表す値,_月末日,_週カレンダーならび) :- 日付を埋める(_1日の曜日を表す値,_月末日,_42日分の日枠), 週ごとに折り返す(_42日分の日枠,_週カレンダーならび). 日付を埋める(_1日の曜日を表す値,_月末日,_42日分の日枠) :- findall(A,( between(1,42,N), _日付 is N - _1日の曜日を表す値, 日付か空白を選択(_日付,_月末日,A)), _42日分の日枠). 日付か空白を選択(_日付,_月末日,' ') :- _日付 < 0,!. 日付か空白を選択(_日付,_月末日,' ') :- _日付 > _月末日,!. 日付か空白を選択(_日付,_月末日,_日付). 週ごとに折り返す([],[]). 週ごとに折り返す([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 週ごとに折り返す(R1,R2). カレンダーを表示する(_年,_月,_週カレンダーならび) :- カレンダーの年月を表示する(_年,_月), カレンダーの日付部を表示する(_週カレンダーならび). カレンダーの年月を表示する(_年,_月) :- writef('\n%10R年%3R月 \n\n',[_年,_月]). カレンダーの日付部を表示する([]) :- !. カレンダーの日付部を表示する([_週カレンダー|R]) :- writef('%3R%3R%3R%3R%3R%3R%3R\n',_週カレンダー), カレンダーの日付部を表示する(R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/940 # [1] 授業単元:アルゴリズム概論 # ヒープソートについての課題です # # [2] 問題文 # 以下のプログラムは、整列する配列の添え字の下限が1であることを仮定している. # この過程を除いたプログラムを書け. # すなわち、整列する範囲の下限、上限ともに可変とした場合のヒープソートの手続きを書け。 # ソースコード: http://ime.nu/ideone.com/HOlaTT # 引数に整列した木を形成する(_整列対象となるならび,_整列木) :- _整列対象となるならび = [_最初の要素|R], 引数に整列した木を形成する(R,(_最初の要素,_,_),_整列木). 引数に整列した木を形成する([],_木,_木) :- !. 引数に整列した木を形成する([A|R],_木_1,_木) :- 木に挿入する(A,_木_1,_木_2), 引数に整列した木を形成する(R,_木_2,_木). 木に挿入する(A,_枝,(A,_,_)) :- var(_枝),!. 木に挿入する(A,(_葉,_左枝,_右枝_1),(_葉,_左枝,_右枝_2)) :- A @>= _葉, 木に挿入する(A,_右枝_1,_右枝_2). 木に挿入する(A,(_葉,_左枝_1,_右枝),(_葉,_左枝_2,_右枝)) :- A @< _葉, 木に挿入する(A,_左枝_1,_左枝_2). 整列した木から整列順に要素を取り出す((_葉,_左枝,_右枝),_要素) :- \+(var(_左枝)), 整列した木から整列順に要素を取り出す(_左枝,_要素). 整列した木から整列順に要素を取り出す((_葉,_,_),_葉). 整列した木から整列順に要素を取り出す((_葉,_左枝,_右枝),_要素) :- \+(var(_右枝)), 整列した木から整列順に要素を取り出す(_右枝,_要素). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/541 # 質問です教えてください # # データベース = access # テーブル名 = T_DATA # # SQLで取得したい結果は、KEYごとに日数を取得したいのですが # 重複する日数はカウントから除外したいです。 # どんなSQLを書けばいいですか? # # ・キーは、日数=5日 # ・キーは、日数=1日 # # ---------------------------------- # キー, 開始日, 終了日 # ---------------------------------- # 1, 2014/01/01, 2014/01/01 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=1日 # 1, 2014/01/02, 2014/01/02 |→ 日数=0日(重複) # 1, 2014/01/03, 2014/01/03 |→ 日数=1日 # 1, 2014/01/04, 2014/01/05 |→ 日数=2日、合計=5日 # --- # 2, 2014/01/01, 2014/01/01 |→ 日数=1日 # 2, 2014/01/01, 2014/01/01 |→ 日数=0日(重複)、合計=1日 # # ↓これだと重複がカウントされてしまいます。 # SELECT # キー # ,SUM(DATEDIFF('d', 開始日, 終了日)+1) AS 日数 # FROM # T_DATA # GROUP BY # キー # 'データベース = access テーブル名 = T_DATA SQLで取得したい結果は、KEYごとに日数を取得したいのですが 重複する日数はカウントから除外したいです。'(_キーごとの日数) :- setof(_キー,[_キー,_開始日,_終了日] ^ 'T_DATA'(_キー,_開始日,_終了日),_キーならび), findall([_キー,_日数],( member(_キー,_キーならび), キーの日数を得る(_キー,_日数)), _キーごとの日数). キーの日数を得る(_キー,_日数) :- findall(_日,( 'T_DATA'(_キー,_開始日,_終了日), 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造), 範囲の日を引出す(_開始日整数構造,_終了日整数構造,_日)), L1), 重複日を取り除いた日数(L1,_日数). 整数構造に変換(_開始日,_終了日,_開始日整数構造,_終了日整数構造) :- read_term_from_atom(_開始日,_開始日整数構造), read_term_from_atom(_終了日,_終了日整数構造). 範囲の日を引出す(_終了日,_終了日,_終了日) :- !. 範囲の日を引出す(_日,_終了日,_日). 範囲の日を引出す(_日_1,_終了日,_日) :- 翌日(_日_1,_翌日), 範囲の日を引出す(_翌日,_終了日,_日). 翌日(_年/12/_31,_翌年/1/1) :- _翌年 is _年 + 1,!. 翌日(_年/_月/_日,_年/_翌月/1) :- 月末日(_年/_月/_日), _翌月 is _月 + 1,!. 翌日(_年/_月/_日,_年/_月/_翌日の日) :- _翌日の日 is _日 + 1,!. 月末日(_年/2/29) :- うるう年(_年),!. 月末日(_年/2/28) :- \+(うるう年(_年)),!. 月末日(_年/_月/30) :- member(_月,[4,6,9,11]),!. 月末日(_年/_月/31) :- member(_月,[1,3,5,7,8,10,12]). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 重複日を取り除いた日数(L1,_日数) :- sort(L1,L2), length(L2,_日数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/263 # ●Regular Expressionの使用環境 # Javascript # # ●検索か置換か? # 置換 # # ●説明 # '1'を含まないABCからDEFまでを削除したいです # # ●対象データ # ABC # 1 # DEF # # ABC # 2 # DEF # # ABC # 3 # DEF # # ●希望する結果 # ABC # 1 # DEF # # '''1''を含まないABCからDEFまでを削除したいです'(_文字列,_希望する結果) :- atom_char(_文字列,_文字ならび), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L), atomic_list_concat(L,_希望する結果). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'([],[]). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(_文字ならび,L) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3), '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(L3,L),!. '''1''を含まないABCからDEFまでを削除したいです'([A|R1],[A|R2]) :- '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までをならびから削除したいです'(R1,R2). '''1''を含まない''A'',''B'',''C''から''D'',''E'',''F''までを'(_文字列,L3) :- append(['A','B','C'|L2],['D','E','F'|L3],_文字ならび), \+(append(_,['A','B','C'|_],L2)), \+(append(_,['D','E','F'|_],L2)), \+(append(_,['1'|_],L2)),!. % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #24 # お題: # リストを与え、昇順でソートされている部分列のリスト出力する # [8,3,4,9,9,10,6,1,4,3] => [[8],[3,4,9,9,10],[6],[1,4],[3]] # [1,3,3,4,4,6,8,9,9,10] => [[1,3,3,4,4,6,8,9,9,10]] # [10,9,9,8,6,4,4,3,3,1] => [[10],[9,9],[8],[6],[4,4],[3,3],[1]] # [1,1,1,1,1,1,1,1,1,1] => [[1,1,1,1,1,1,1,1,1,1]] # [] => [] # [1] => [[1]] 'リストを与え、昇順でソートされている部分列のリスト出力する'(L) :- 'リストを与え、昇順でソートされている部分列のリストを'(L,LL), 出力する(LL) :- 'リストを与え、昇順でソートされている部分列のリストを'(L,LL) :- findall(L2,( append(L1,L2,L3,L), 昇順(L2), 'L1,L3とL2は昇順の接続になっていない'(L1,L2,L3)), LL). 昇順([A]) :- !. 昇順([A,B|R]) :- A =< B, 昇順([B|R]). 'L1,L3とL2は昇順の接続になっていない'(L1,L2,L3) :- 'L1とL2は昇順の接続になっていない'(L1,L2), 'L1とL3は昇順の接続になっていない'(L1,L3). 'L1とL2は昇順の接続になっていない'(L1,L2) :- \+((L2=[A|_],最後の要素(L1,B),A >= B)). 'L1とL3は昇順の接続になっていない'(L1,L3) :- \+((最後の要素(L2,A),L3=[B|_],A =< B))). 最後の要素(_ならび,_最後の要素) :- append(_,[_最後の要素],_ならび). 出力する(L,LL) :- writef('%t => %t\n',[L,LL]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_n,_自然数nの階乗の素因数2の個数) :- findsum(_素因数2の個数,( between(1,_n,N), findsum(1,( nth1(_nth1,_,_), (\+(0 is N mod (2 ^ _nth1)),!,fail;true)), _素因数2の個数)), _自然数nの階乗の素因数2の個数). findsum(A,B,C) :- findall(A,B,L), sumlist(L,C). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/955 # お題:自然数nの階乗の素因数2の個数を求める。(2014年センター試験) # n=5 -> 3 # n=13 -> 10 # # '自然数nの階乗の素因数2の個数を求める。(2014年センター試験)'(_自然数n,_自然数nの階乗の素因数2の個数) :- findsum(_ある自然数の素因数2の個数,( between(1,_自然数n,_ある自然数), ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数)), _自然数nの階乗の素因数2の個数). ある自然数の素因数2の個数を求める(_ある自然数,_ある自然数の素因数2の個数) :- nth0(_ある自然数の素因数2の個数,_,_), \+(0 is _ある自然数 mod (2 ^ (_ある自然数の素因数2の個数 + 1))),!. findsum(_選択項,_副目標,_合計) :- findall(_選択項,_副目標,_選択項ならび), sumlist(_選択項ならび,_合計). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/868 # [2] 入力した5文字までの文字列を5個まで格納して表示する。 # 5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。 # '入力した5文字までの文字列を5個まで格納して表示する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。' :- '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納), '入力したすべての文字列を表示。'(_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納) :- length(Ln,5), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'([_|Ln],[_5文字までの文字列|R]) :- 入力した5文字までの文字列を(_5文字までの文字列), \+(_文字列=''), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,R). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_,_,[]). 入力した5文字までの文字列を(_5文字までの文字列) :- findall(_文字,( nth1(Nth1,_,_), ( Nth1 > 5,!,fail; get_char(_文字), ( _文字 = '\n',!,fail; true))), _入力文字ならび), atomic_list_concat(_入力文字ならび,_5文字までの文字列). '入力したすべての文字列を表示。'(_文字列を5個まで格納) :- forall(member(_文字列,_文字列を5個まで格納),writef('%t\n',[_文字列])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1387257592/189 # ●Regular Expressionの使用環境 # ruby # # ●検索か置換か? # 置換 # # ●説明 # 行中の改行を削除したい # 以下でやると改行だけでなく改行の前の一文字も何故か消えてうまくいきません # 対象データの場合は「元」が消えてしまいます # # ruby -e 'puts open("input.txt").read.gsub(/[^。¥n]¥n/,"")' > output.txt # # ●対象データ # こんにちはお元 # 気ですか。 # 私は元気です。 # # ●希望する結果 # こんにちはお元気ですか。 # 私は元気です。 # # 文字列中の改行を削除したい(_文字列,_改行を削除された文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字 = '\n')), _改行を削除された文字ならび), atomic_list_concat(_改行を削除された文字ならび,_改行を削除された文字列). % 以下のサイトは 語候補(2,_,_,尾崎,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,隆大) :- sub_atom(_前文字列,_,_,_,尾崎). 語候補(3,_前文字列,_後文字列,太加夫,太加夫) :- \+(sub_atom(_前文字列,_,_,_,尾崎)). 文字列から最長一致法を用いて語候補を検索する(_文字列,_前文字列,_適合文字列,_後文字列) :- 候補文字列長さならび(_候補文字列長さならび), 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_文字列,_候補文字列長さならび,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り長さ,_適合文字列_1), member(_長さ,_候補文字列長さならび), 文字列の長さと候補文字列を得る(_文字列,_候補文字列長さならび,_長さ,_適合文字列_1,_適合文字列_1_2), 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_文字列長により降順整列した語候補ならび,_前文字列_1,_適合文字列_1_2,_後文字列_1,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). 文字列から最長一致法を用いて語候補を検索する(_候補文字列長さならび,_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- 文字列から最長一致法を用いて語候補を検索する(_後文字列_1,_候補文字列長さならび,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 候補文字列長さならび(_候補文字列長さならび) :- findall(_長さ,( setof(_長さ,語候補(_長さ,_,_,_,_),[_長さ])), _候補文字列長さならび_1), reverse(_候補文字列長さならび_1,_候補文字列長さならび),!. '文字列の長さと前文字列・適合文字列・後文字列を得る'(_文字列,_開始位置,_長さ,_残り長さ,_語候補,_前文字列_1,_適合文字列_1,_後文字列_1) :- 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1), 語候補(_長さ,_前文字列,_後文字列,_語候補,_適合文字列_1). 前文字列と後文字列を得る(_文字列,_開始位置,_長さ,_残り長さ,_前文字列_1,_後文字列_1) :- sub_atom(_文字列,0,_開始位置,_,_前文字列_1), sub_atom(_文字列,_,_残り長さ,0,_後文字列_1). % 以下のサイトは # 出題場所 http://toro.2ch.net/test/read.cgi/tech/1363769640/325 # xyz を含まないものにマッチする正規表現 # # [regexp 60]より # # |fmcat =(retofm <<<'(x+y+z+a)*xyz(x+y+z+a)*'|fmcment) =(retofm <<<'xyz')|fmdeterm|fmmin|fmtore|perl -pe 'y/+/|/; s/a/[^xyz]/g' # |として、 # |([^xyz]|y|z)*x(z([^xyz]|y|z)*x|[^xyz]([^xyz]|y|z)*x|x|yx|y[^xyz]([^xyz]|y|z)*x|yy([^xyz]|y|z)*x)*yz # # 遷移図は # # x # <-----------+ # [^x] | x | # <----+ <----+ | # | | | | | # \/ x \/ y | z # 0 ----> 1 ----> 2 ----> 3(DEAD) # | | | # | [^xy] | | # <----------+ | # | [^xz] | # <--------------------- # # 「xyz を含まない文字列」の答は、 # # ([^x]|x(y?x)*([^xy]|y[^xz]))*(x(y?x)*x?)? # # (x(y?x)*x?)? の部分はこの場合に限り (x|y)* で代用できるかな # 後、つるかめ算の様に「勘」で書いたのが # # [^x]*(x+(y|y[^xz][^x]*|[^xy][^x]*))* # # ですがちょっと自信無し # 'xyz を含まないものにマッチする'(_文字列,_副文字列) :- sub_atom(_文字列,_,Len,_,_副文字列), Len > 0, \+(sub_atom(_副文字列,_,_,_,xyz)). % 以下のサイトは # 出題場所 http://toro.2ch.net/test/read.cgi/tech/1387257592/131 # すいません。VBScriptで # 抽出した文字列にダブりがあります。 # 例: # AAA # BBB # AAA # CCC # BBB # CCC # これを # AAA # BBB # CCC # のように抽出し直すにはどうすればいいでしょうか? '抽出した文字列にダブりがあります。\\n例:\\nAAA\\nBBB\\nAAA\\nCCC\\nBBB\\nCCC\\nこれを\\nAAA\\nBBB\\nCCC\\nのように抽出し直すにはどうすればいいでしょうか?'(_文字列ならび,_抽出し直した文字列ならび) :- findall(_文字列,( append(L1,[_文字列|R],_文字列ならび), \+(member(_文字列,L1))), _抽出し直した文字列ならび). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/576 # 西暦何年かを入力するとその年に月曜日が何回あるか数え # 52回なら1を、53回なら0を出力するプログラムお願いします… # # 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします # (0を入力したら終わりです) # # 入力できるのは1989〜5000です # # '西暦何年かを入力するとその年に月曜日が何回あるか数え 52回なら1を、53回なら0を出力するプログラムお願いします… 1回1回判定するのではなく、一気に何回か入力し、一気に判定を出力するものでお願いします (0を入力したら終わりです) 入力できるのは1989〜5000です' :- '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_西暦ならび). '西暦何年かを一気に何回か入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_西暦ならび) :- findall(_西暦,( '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('西暦(1989~5000)を入力して下さい',_西暦),( _西暦=0,!,fail;true)),_西暦ならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([]). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'([_西暦|_残りならび]) :- 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1), writef('%t年 %t\n',[_西暦,_0または1]), 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を出力する'(_残りならび). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,_0または1). 'その年に月曜日が何回あるか数え52回なら1を、53回なら0を'(_西暦,_0または1) :- うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,_0または1). うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,0) :- うるう年(_西暦), '1月1日が日曜か月曜の時は'(_西暦),!. うるう年で1月1日が日曜か月曜の時は0それ以外は1(_西暦,1) :- うるう年(_西暦). '1月1日が日曜か月曜の時は'(_西暦) :- 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,_曜日), member(_曜日,[日曜,月曜]). うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,0) :- \+(うるう年(_西暦)), 'Zellerの公式を用いて曜日を得る'(_西暦,1,1,_曜日を表す値,月曜),!. うるう年でない年は1月1日が月曜の時は0それ以外は1(_西暦,1) :- \+(うるう年(_西暦)). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日). 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 > 2, _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7, 曜日を表す値(_曜日を表す値,_曜日). 'Zellerの公式では1月と2月はそれぞれ前年の13月と14月に変換して計算する'(_年,_月,_日,_曜日を表す値,_曜日) :- _月 =< 2, _年_1 is _年 - 1, _月_2 is _月 + 12, 'Zellerの公式を用いて曜日を得る'(_年_1,_月_2,_日,_曜日を表す値,_曜日). 曜日を表す値(0,日曜). 曜日を表す値(1,月曜). 曜日を表す値(2,火曜). 曜日を表す値(3,水曜). 曜日を表す値(4,木曜). 曜日を表す値(5,金曜). 曜日を表す値(6,土曜). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- writef('%t ',[_催促文]), get_line(_入力行), '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦). '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦) :- '西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_催促文,_西暦). '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'('0',0) :- !. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_西暦) :- read_term_from_atom(_入力行,_西暦,[]), integer(_西暦), between(1989,5000,_西暦),!. '診断 :: 西暦を入力し(0を入力したら終わりです) 入力できるのは1989〜5000です'(_入力行,_) :- writef('入力された文字列"%t"から1899年から5000年範囲の西暦が得られませんでした\n再入力をお願いします\n',[_入力行]), fail. get_line(Line) :- get_line(user_input,Line). get_line(Instream,Line) :- get_char(Instream,C), get_line_1(Instream,C,Chars), atom_chars(Line,Chars) . get_line_1(_,'\n',[]) :- !. get_line_1(_,end_of_file,[]) :- !. get_line_1(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_1(Instream,C2,R). % 以下のサイトは 'A + B + C'(X) :- '二元一次連立方程式が A+B=15, A+2B=35 の時 A,B を求める'(A,B), 'A + B + C'(A + B + C,X). 'A + B + C'(A + B + C,_A_plus_B + C) :- var(C), _A_plus_B is A + B. 'A + B + C'(A + B + C,X) :- \+(var(C)), X is A + B + C. '二元一次連立方程式が A+B=15, A+2B=35 の時 A,B を求める'(A,B) :- 既約ガウス行列に変形([[1,1,15],[1,2,35]],[[_,_,A],[_,_,B]]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 葉と飾り(20,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b]). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_何段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー) :- length(_クリスマスツリー,_何段), append([☆|L1],['||'],_クリスマスツリー), findall(_段,( nth1(_段目,_クリスマスツリー,_段), 一段生成(_段目,_段)), _クリスマスツリー). 一段生成(_段目,_飾りを含む葉) :- var(_飾りを含む葉), length(_段,_段目), 飾りを含む葉の生成(_段,_飾りを含む葉),!. 一段生成(_,_既に存在するもの) :- \+(var(_既に存在するもの)). 飾りを含む葉の生成(_段,_一段の葉飾り) :- 葉と飾り(_基数,_葉と飾りならび), findall(_葉または飾り,( 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り)), _葉または飾りならび), atomic_list_concat(_葉または飾りならび,_一段の葉飾り),!. 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り) :- member(_葉または飾り,_段), _乱数 is random(_基数), nth0(_乱数,_葉と飾りならび,_葉または飾り). クリスマスツリーの表示(_クリスマスツリー) :- forall(member(_段,_クリスマスツリー), writef('%t\n',[_段])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー) :- length(L,_段), append([☆|L1],['||'],L), findall(A,( nth1(_nth1,L,A), '一段生成'(_nth1,A)), L). '一段生成'(_nth1,A) :- var(A), length(L,_nth1), 飾りを含む葉の生成(L,A),!. '一段生成'(_,A) :- \+(var(A)). 飾りを含む葉の生成(L,A) :- findall(B,( member(B,L), _乱数 is random(20), nth0(_乱数,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b],B)), L), atomic_list_concat(L,A),!. クリスマスツリーの表示(_クリスマスツリー) :- forall(member(A,_クリスマスツリー), writef('%t\n',[A])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。' :- この操作([],'1',Ln,_文字列), writef('%w\n',[_文字列]), length(Ln,10),!. この操作(Ln,_文字列,Ln,_文字列). この操作(Ln_1,_文字列_1,Ln,_文字列) :- 連続数連続記号が列んだ行を生成する(Ln_1,_文字列_1,Ln,_文字列). 連続数連続記号が列んだ行を生成する(Ln_1,_文字列_1,Ln,_文字列) :- 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列_1,_文字構成ならび), atomic_list_concat(_文字構成ならび,_文字列_2), この操作([_|Ln_1],_文字列_2,Ln,_文字列). 連続記号を切り取って連続数と連続記号が交互に来るならびを生成する(_文字列,_文字構成ならび) :- findall([_連続数,_連続記号],( 連続記号を切り取る(_文字列,_連続数,_連続記号)),LL), flatten(LL,_文字構成ならび). 連続記号を切り取る(_文字列,_連続数,_連続記号) :- '前文字列・後文字列'(_文字列,_前文字列の文字数,_,_前文字列,_後文字列), 前文字列は全部同じ記号で構成され後文字列の先頭記号はこれとは異なる(_前文字列,_後文字列,_同じ記号), 連続記号を切り取る(_後文字列,_前文字列の文字数,_同じ記号,_連続数,_連続記号). 連続記号を切り取る(_後文字列,_連続数,_連続記号,_連続数,_連続記号). 連続記号を切り取る(_後文字列,_,_,_連続数,_連続記号) :- 連続記号を切り取る(_後文字列,_連続数,_連続記号). '前文字列・後文字列'(_文字列,_前文字列の長さ,_後文字列の長さ,_前文字列,_後文字列) :- sub_atom(_文字列,0,_前文字列の長さ,_後文字列の長さ,_前文字列), sub_atom(_文字列,_,_後文字列の長さ,0,_後文字列). 前文字列は全部同じ記号で構成され後文字列の先頭記号はこれとは異なる(_前文字列,_後文字列,_同じ記号) :- 前文字列は全部同じ記号で構成され(_前文字列,_同じ記号), 後文字列の先頭記号はこれとは異なる(_後文字列,_同じ記号). 前文字列は全部同じ記号で構成され(_前文字列,_同じ記号) :- sub_atom(_前文字列,0,1,_,_同じ記号), forall(sub_atom(_前文字列,_,1,_,_記号),_記号=_同じ記号). 後文字列の先頭記号はこれとは異なる(_後文字列,_同じ記号) :- \+(sub_atom(_後文字列,0,1,_,_同じ記号)). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append([L1,L2,L3],_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/642 # お題:"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。 # "11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を # 返す。"1"から始めてこの操作を10回繰り返し、途中経過を表示する。 # 例 # 1 # 11 # 21 # 1211 # 111221 # 312211 # 13112221 # 1113213211 # 31131211131221 # 13211311123113112211 # 11131221133112132113212221 # # '"1"を「1個の"1"」として数字だけ抜き出し並べて"11"を返す。"11"なら「2個の"1"」で"21"を返す。"21"なら「1個の"2"、1個の"1"」で"1211"を返す。"1"から始めてこの操作(以下、"この操作"とする)を10回繰り返し、途中経過を表示する。' :- length(Ln,10), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,'1'). '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([],_文字列) :- !. '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'([_|Ln],_文字列) :- writef('%t\n',[_文字列]), この操作を(_文字列,_次の文字列), '"1"から始めてこの操作を10回繰り返し、途中経過を表示する。'(Ln,_次の文字列). この操作を(_文字列,_次の文字列) :- findall(_個数と連続した記号の結合文字列,( '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数), atomic_list_concat([_個数,_連続した記号],_個数と連続した記号の結合文字列)), _個数と連続した記号の結合文字列ならび), 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列). '文字列の連続した記号(1個を含む)とその個数を得る'(_文字列,_連続した記号,_個数) :- atom_chars(_文字列,_文字ならび), 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数). 'ならびの連続した記号(1個を含む)とその個数を得る'(_文字ならび,_連続した記号,_個数) :- append(L1,L2,L3,_文字ならび), 'L2は_記号が_個数連続している'(L2,_連続した記号,_個数), '両隣は_連続した記号と異なる'(_連続した記号,L1,L3). '両隣は_連続した記号と異なる'(_連続した記号,L1,L3) :- \+((last(L1,A0),A0=_連続した記号)), \+((nth1(1,L3,A3),A3=_連続した記号)). 次の文字列は個数と連続した記号の結合文字列ならびを結合したもの(_個数と連続した記号の結合文字列ならび,_次の文字列) :- atomic_list_concat(_個数と連続した記号の結合文字列ならび,_次の文字列). 'L2は_記号が_個数連続している'(L2,_記号,_個数) :- L2 = [_記号|R], all(R,_記号), length([_記号|R],_個数). all([],_). all([V|R],V) :- all(R,V). append([],L2,L3,L) :- append(L2,L3,L). append([U|R1],L2,L3,[U|R4]) :- append(R1,L2,L3,R4). % 以下のサイトは フィボナッチ数(Nth,X) :- フィボナッチ数(0,0,1,Nth,X). フィボナッチ数(Nth,M,N,Nth,M). フィボナッチ数(Nth_1,M,N,Nth,X) :- フィボナッチ数は事実上の決定性状態にあるとは言えない(Nth_1,Nth,M,X), M2 is M + N, Nth_2 is Nth_1 + 1, フィボナッチ数(Nth_2,N,M2,Nth,X). フィボナッチ数は事実上の決定性状態にあるとは言えない(Nth_1,Nth,M,X) :- \+(フィボナッチ数出現位置が既に事実上の決定性状態(Nth_1,Nth)), \+(フィボナッチ数が既に事実上の決定性状態(M,X)). フィボナッチ数出現位置が既に事実上の決定性状態(Nth_1,Nth) :- integer(Nth), Nth_1 > Nth. フィボナッチ数が既に事実上の決定性状態(M,X) :- number(X), M > X. % 以下のサイトは # # length/2をsucc/2を使って定義してみる。 # length(L,0) :- \+(var(L)), L = [],!. length(L,Len) :- \+(var(L)), \+(var(Len)), L = [_|R], length(R,Len_1), succ(Len_1,Len),!. length(L,Len) :- \+(var(L)), var(Len), L = [_|R], length(R,Len_1), succ(Len_1,Len). length(L,Len) :- var(L), \+(var(Len)),!, length([],0,L,Len),!. length(L,Len) :- var(L), var(Len), length([],0,L,Len). length(L,Len,L,Len). length(L_1,Len_1,L,Len) :- succ(Len_1,Len_2), length([_|L_1],Len_2,L,Len). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/854 # ●Regular Expressionの使用環境 # Becky! Internet Mail Ver.2 # # ●検索か置換か? # 検索 # # ●説明 # +0900を含まないものを検索したい # # ●対象データ # +0900 # +0500 # +0630 # # ●希望する結果 # +0500 # +0630 # # よろしくお願いします。 # # '+0900を含まないものを検索したい'(_文字列) :- 行ならび入力(_行ならび), '+0900を含まないものを検索したい'(_行ならび,_文字列). '+0900を含まないものを検索したい'(_行ならび,_文字列) :- member(_文字列,_行ならび), '+0900を含まないものを'(_文字列). '+0900を含まないものを'(_文字列) :- \+(sub_atom(_文字列,_,_,_,'+0900')). 行ならび入力([]) :- at_end_of_stream(user_input),!. 行ならび入力(_行ならび) :- 行を入力して行く(_行ならび) :- 行を入力して行く([_行|_残り行ならび]) :- 行入力(_行), 行ならび入力(_残り行ならび). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/844 # たぶんやりたいことはこうだろう。数字以外の文字が1文字でもあればエラーを出す。# # [[ "$A" =~ [^0-9] ]] && echo "not number" # 数字以外の文字が1文字でもあればエラーを出す(_文字列) :- forall(sub_atom(_文字列,_,1,_,A),member(A,['0','1','2','3','4','5','6','7','8','9'])),!. 数字以外の文字が1文字でもあればエラーを出す(_) :- write('エラー\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/843 # ^[^0-9]+$ は数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '(_文字列) :- forall(sub_atom(_文字列,_,1,_,A),\+(member(A,['0','1','2','3','4','5','6','7','8','9']))). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/843 # ^[^0-9]+$ は数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '(_文字列) :- \+((sub_atom(_文字列,_,1,_,A),member(A,['0','1','2','3','4','5','6','7','8','9']))). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/423 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 問題(戻り値がある場合の引数あり) # 円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 # ただし、main関数で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 # 円錐の体積の計算はtaisekiという関数で行うこと。 # また、円周率は3.14を使用すること。 # # ../test/read.cgi/tech/1381909900/422に続きます # '円錐の半径rと高さhを入力し、円錐の体積を求めるプログラムを作りなさい。 ただし、主述語で円錐の半径rと高さhの入力と計算された円錐の体積の表示を行い、 円錐の体積の計算は体積という述語で行うこと。 また、円周率は3.14を使用すること。' :- 数を得る(円錐の半径r,_円錐の半径r), 数を得る(円錐の高さh,_円錐の高さh), '円錐の体積の計算と表示は体積という述語で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積), writef('半径%t,高さ%t の円錐の体積は %t\n',[_円錐の半径r,_円錐の高さh,_円錐の体積]). '円錐の体積の計算は体積という関数で行うこと。 また、円周率は3.14を使用すること。'(_円錐の半径r,_円錐の高さh,_円錐の体積) :- _円周率 = 3.14, 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積). 体積(_円錐の半径r,_円錐の高さh,_円周率,_円錐の体積) :- _円錐の体積 is _円周率 * _円錐の半径r * _円錐の半径r * _円錐の高さh / 3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). 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([]. % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # '一文字ずつスペースが入っている文字列のスペースを削除したい'(_文字列,_スペースを削除された文字列) :- atom_chars(_文字列,_文字ならび), '一文字ずつスペースが入っている文字ならびのスペースを削除したい'(_文字ならび,_スペースを削除された文字ならび), atom_chars(_スペースを削除された文字列,_スペースを削除された文字ならび). '一文字ずつスペースが入っている文字ならびのスペースを削除したい'([_文字],[_文字]) :- \+(_文字=' '). '一文字ずつスペースが入っている文字ならびのスペースを削除したい'([_文字,' '|R1],[_文字|R2]) :- '一文字ずつスペースが入っている文字ならびのスペースを削除したい'(R1,R2). % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # 均等割りにしているスペースを削除したい(_文字列,_均等割文字列長さ,_スペースを削除した文字列) :- 均等割文字列(_文字列,_均等割文字列長さ,_均等割文字列ならび), atomic_list_concat(_均等割文字列ならび,_スペースを削除した文字列). 均等割文字列(_文字列,_均等割文字列長さ,[_文字列]) :- '文字列が均等割文字長さであり、構成する文字全てがスペースではない'(_文字列,_均等割文字列長さ). 均等割文字列(_文字列,_均等割文字列長さ,[_前文字列|R]) :- 均等割副文字列を得る(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ), 均等割文字列(_後文字列,_均等割文字列長さ,R). '文字列が均等割文字長さであり、構成する文字全てがスペースではない'(_文字列,_均等割文字列長さ) :- 文字列を構成する文字全てがスペースではない(_文字列), atom_length(_文字列,_均等割文字列長さ). 均等割副文字列を得る(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ) :- '前文字列・スペース文字列・後文字列候補'(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ), '前文字列は空文字でなく全て文字、スペース文字列は空文字でなく全てスペース'(_前文字列,_スペース文字列), 後文字列の先頭文字はスペースではない(_後文字列). '前文字列・スペース文字列・後文字列候補'(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ) :- sub_atom(_文字列,_均等割文字列長さ,_,R,_スペース文字列), sub_atom(_文字列,0,_均等割文字列長さ,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '前文字列は空文字でなく全て文字、スペース文字列は空文字でなく全てスペース'(_前文字列,_スペース文字列) :- 前文字列は空文字でなく全て文字(_前文字列), スペース文字列は空文字でなく全てスペース(_スペース文字列). 前文字列は空文字でなく全て文字(_前文字列) :- 空文字ではなく(_前文字列), 文字列を構成する文字全てがスペースではない(_前文字列). スペース文字列は空文字でなく全てスペース(_スペース文字列) :- 空文字ではなく(_スペース文字列), 文字列を構成する文字全てがスペースである(_スペース文字列). 空文字ではなく(_文字列) :- \+(_文字列=''). 後文字列の先頭文字はスペースではない(_後文字列) :- \+(sub_atom(_後文字列,0,1,_,' ')). 文字列を構成する文字全てがスペースではない(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),\+(_文字=' ')). 文字列を構成する文字全てがスペースである(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),_文字=' '). % 以下のサイトは # twitter_by_@ketcho0o_20131129 # # excelで仕事割出すやつ作ったけど、javaで作った方がよかったかなあ。 # むしろバンド名質問してそれに属する人達を除いたセクションメンバーを表示するってことでprologで作れたらかっこいいね。 セクションメンバー(ビートルズ,'ジョン・レノン'). セクションメンバー(ビートルズ,'ポール・マッカートニー'). セクションメンバー(ビートルズ,'ジョージ・ハリスン'). セクションメンバー(ビートルズ,'リンゴ・スター'). セクションメンバー(クラッシュ,'ジョー・ストラマー'). セクションメンバー(クラッシュ,'ミック・ジョーンズ'). セクションメンバー(クラッシュ,'ポール・シムノン'). セクションメンバー(クラッシュ,'トッパー・ヒードン'). 'バンド名質問してそれに属する人達を除いたセクションメンバーを表示する' :- バンド名質問して(_バンド名), それに属する人達を除いたセクションメンバーを表示する(_バンド名). バンド名質問して(_バンド名) :- write('バンド名は '), read(_バンド名). それに属する人達を除いたセクションメンバーを表示する(_バンド名) :- forall(それに属する人達を除いたセクションメンバーを(_バンド名,_セクション,_メンバー), 表示する(_セクション,_メンバー)). それに属する人達を除いたセクションメンバーを(_バンド名,_セクション,_メンバー) :- セクションメンバー(_セクション,_メンバー), \+(_セクション = _バンド名). 表示する(_セクション,_メンバー) :- writef('%t,%t\n',[_セクション,_メンバー]). % 参考 % 以下のサイトは # twitter_by_@ketcho0o_20131129 # # excelで仕事割出すやつ作ったけど、javaで作った方がよかったかなあ。 # むしろバンド名質問してそれに属する人達を除いたセクションメンバーを表示するってことでprologで作れたらかっこいいね。 セクションメンバー(ビートルズ,'ジョン・レノン'). セクションメンバー(ビートルズ,'ポール・マッカートニー'). セクションメンバー(ビートルズ,'ジョージ・ハリスン'). セクションメンバー(ビートルズ,'リンゴ・スター'). セクションメンバー(クラッシュ,'ジョー・ストラマー'). セクションメンバー(クラッシュ,'ミック・ジョーンズ'). セクションメンバー(クラッシュ,'ポール・シムノン'). セクションメンバー(クラッシュ,'トッパー・ヒードン'). 'バンド名質問してそれに属する人達を除いたセクションメンバーを表示する' :- write('バンド名は '), read(_バンド名), forall(それに属する人達を除いたセクションメンバーを(_バンド名,_セクション,_メンバー),表示する(_セクション,_メンバー)). それに属する人達を除いたセクションメンバーを(_バンド名,_セクション,_メンバー) :- セクションメンバー(_セクション,_メンバー), \+(_セクション = _バンド名). 表示する(_セクション,_メンバー) :- writef('%t,%t\n',[_セクション,_メンバー]). % 参考 % 以下のサイトは 加算の覆面演算行列([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). % 以下のサイトは # お題:あるCUIプログラムの標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する。 # 'あるCUIプログラムの標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(_あるCUIプログラム) :- open(pipe(_あるCUIプログラム),read,Instream), '標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(Instream), close(Instream). '標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(Instream) :- at_end_of_stream(Instream),!. '標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(Instream) :- 小文字をすべて大文字に変換して出力する(Instream). 小文字をすべて大文字に変換して出力する(Instream) :- get_char(Instream,_文字), 小文字を大文字に変換して出力する(文字), '標準出力を少しずつ読み込みながら、小文字をすべて大文字に変換して出力する'(Instream). 小文字を大文字に変換して出力する(文字) :- 小文字を大文字に変換して(_文字,_大文字), 出力する(_文字). 小文字を大文字に変換して(_小文字,_大文字) :- 小文字ならば大文字に変換する(_小文字,_大文字). 大文字に変換する(_文字,_文字) :- 小文字以外は変換しない(_文字). 小文字ならば大文字に変換する(_小文字,_大文字) :- 小文字(_小文字), 大文字に変換する(_小文字,_大文字). 小文字(_小文字) :- _小文字 @>= a, _小文字 @=< z. 大文字に変換する(_小文字,_大文字) :- char_code(_小文字,_小文字コード), _大文字コード is _小文字コード - 32, char_code(_大文字,_大文字コード). 小文字以外は変換しない(_文字) :- \+(小文字(_文字)). 出力する(_文字) :- put_char(_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_四桁の西暦,_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_年整数,_小計_年月日整数ならび) :- 年の組みの合計(_年整数,_年の組みの合計), forall((for(43,N,2),_小計 is _年の組みの合計 + N,member([_小計,_年月日整数],_小計_年月日整数ならび)),writef('%t = %t\n',[_年月日整数,_小計])). 年の組みの合計(_年整数,_年の組みの合計) :- _年の組みの合計 is _年整数 // 100 + _年整数 mod 100. % for/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび) :- 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), forall(member([_小計,_年月日整数],_大きいものから順に整列した_小計_年月日整数ならび),writef('%t = %t\n',[_年月日整数,_小計])). 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび) :- sort(_小計_年月日整数ならび,_小さいものから順に整列した_小計_年月日整数ならび), reverse(_小さいものから順に整列した_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/68 # # お題:文字列をランダムに並べ替える。 # ただし、どの文字も元と同じ位置ではないこと。 '文字列をランダムに並べ替える。 ただし、どの文字も元と同じ位置ではないこと。'(_文字列,_ランダムに並べ替えた文字列) :- 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび), 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列). 文字列の置換位置ならび(_文字列,_文字列の置換位置ならび) :- atom_length(_文字列,_文字列の長さ), length(_位置決めならび,_文字列の長さ), findall(N,between(1,_文字列の長さ,N),_整数順ならび), 位置を置換する(_整数順ならび,_文字列の置換位置ならび). 位置を置換する([],_位置決めならび) :- !. 位置を置換する([_位置1,_位置2,_位置3],_位置決めならび) :- 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび). 位置決めならび(L,_位置決めならび) :- 位置の交換(L,R,_位置決めならび), 位置を置換する(R,_位置決めならび). 三つ巴交換(_位置1,_位置2,_位置3,_位置決めならび) :- nth1(_位置1,_位置決めならび,_位置2), nth1(_位置2,_位置決めならび,_位置3), nth1(_位置3,_位置決めならび,_位置1),!. 位置の交換(L,L2,_位置決めならび) :- 位置選択(L,N1,L1), 位置選択(N2,L1,L2), nth1(N1,_位置決めならび,N2), nth1(N2,_位置決めならび,N1),!. 位置選択(L,_位置,L2) :- length(L,Len), _乱数値 is random(Len), length(L0,Len), append(L0,[_位置|R],L), append(L0,R,L2),!. 文字列の置換位置ならびからランダムに並び替えた文字列を得る(_文字列の置換位置ならび,_文字列,_ランダムに並べ替えた文字列) :- findall(_文字,( member(_位置,_文字列の置換位置ならび), _位置_1 is _位置 - 1, sub_atom(_文字列,_位置_1,1,_,_文字)), _ランダムに並べ替えた文字ならび), atomic_list_concat(_ランダムに並べ替えた文字ならび,_ランダムに並べ替えた文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/779 # # ●Regular Expressionの使用環境 # Perl(Emeditor) # # ●検索か置換か? # 検索 # # ●説明 # 各行の1番目のAまでを検索したい # # ●対象データ # お肉料理 # お魚料理 # 料理 # # # ●希望する結果 # 3行目の"料理"のみマッチさせたいです。 '各行の1番目のAまでを検索したい。ただし前部に忌避する連接した語が存在します。'(_文字列,_A,_前文字列,_A,_後文字列) :- sub_atom(_文字列,_前文字列,_A,_後文字列), forall(忌避する連接した語(_A,_忌避する連接した語),\+(sub_atom(_前文字列,_,_,0,_忌避する連接した語))),!. 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/779 # # ●Regular Expressionの使用環境 # Perl(Emeditor) # # ●検索か置換か? # 検索 # # ●説明 # 各行の1番目のAまでを検索したい # # ●対象データ # お肉料理 # お魚料理 # 料理 # # # ●希望する結果 # 3行目の"料理"のみマッチさせたいです。 # '各行の1番目のAまでを検索したい。ただし前部に忌避する連接した語が存在します。'(_文字列,_A,_前文字列,_A,_後文字列) :- sub_atom(_文字列,S,Len,R,_A), sub_atom(_文字列,0,S,0,_前文字列), forall(忌避する連接した語(_A,_忌避する連接した語),\+(sub_atom(_前文字列,_,_,0,_忌避する連接した語))), sub_atom(_文字列,_,R,0,_後文字列). 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # # 系列の整合性 # # a. スタックの実装と応用a. ( ), [ ], {}は整合している. # b. 系列wが整合しているとき,(w), [w], {w} は整合している. # c. 系列vとwが整合しているとき,vwは整合している. # d. 上のa.〜c.で整合しているとされた系列のみが整合している. # # 整合 (a), [a(b)c], {a(b)cd}{e} 不整合 (a}, [a(bc], {a(b)cd}[e} # # # スタックによる整合性判定 # # ・ 左括弧に出会ったら,スタックにpushする. # ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる #   ・違う種類・スタックが空 → 不整合 # ・ 括弧の列が終わったとき,スタックが空なら整合, # スタックによる整合性判定(_ならび) :- スタックによる整合性判定(_ならび,[]). スタックによる整合性判定([],[]). スタックによる整合性判定([_左括弧|R],_スタック_1) :- '左括弧に出会ったら,スタックにpushする.'(_左括弧,_スタック_1,_スタック_2), スタックによる整合性判定(R,_スタック_2). スタックによる整合性判定([_右括弧|R],_スタック_1) :- '右括弧に出会ったら,スタックからpopして同種類の括弧か調べる'(_右括弧,_スタック_1,_スタック_2), スタックによる整合性判定(R,_スタック_2). スタックによる整合性判定([A|R],_スタック) :- 左括弧でも右括弧でもない(A), スタックによる整合性判定(R,_スタック). '左括弧に出会ったら,スタックにpushする.'(_左括弧,_スタック_1,[_左括弧|_スタック_2]) :- 括弧(_左括弧,_). '右括弧に出会ったら,スタックからpopして同種類の括弧か調べる'(_右括弧,[_対応する左括弧|_スタック],_スタック) :- 括弧(_対応する左括弧,_右括弧). 括弧('(',')'). 括弧('{','}'). 括弧('[',']'). 左括弧でも右括弧でもない(A) :- \+(括弧(A,_)), \+(括弧(_,A)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/236 # # # 系列の整合性 # # a. スタックの実装と応用a. ( ), [ ], {}は整合している. # b. 系列wが整合しているとき,(w), [w], {w} は整合している. # c. 系列vとwが整合しているとき,vwは整合している. # d. 上のa.〜c.で整合しているとされた系列のみが整合している. # # 整合 (a), [a(b)c], {a(b)cd}{e} 不整合 (a}, [a(bc], {a(b)cd}[e} # # # スタックによる整合性判定 # # ・ 左括弧に出会ったら,スタックにpushする. # ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる #   ・違う種類・スタックが空 → 不整合 # ・ 括弧の列が終わったとき,スタックが空なら整合, # '系列の整合性 a. スタックの実装と応用a. ( ), [ ], {}は整合している. b. 系列wが整合しているとき,(w), [w], {w} は整合している. c. 系列vとwが整合しているとき,vwは整合している. d. 上のa.〜c.で整合しているとされた系列のみが整合している. 整合 (a), [a(b)c], {a(b)cd}{e} 不整合 (a}, [a(bc], {a(b)cd}[e} スタックによる整合性判定 ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'(_ならび) :- 'スタックによる整合性判定 ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'(_ならび,[]). ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'([],[]). ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'([_左括弧|R],_スタック_1) :- '左括弧に出会ったら,スタックにpushする.'(_左括弧,_スタック_1,_スタック_2), 'スタックによる整合性判定 ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'(R,_スタック_2). ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'([_右括弧|R],_スタック_1) :- '右括弧に出会ったら,スタックからpopして同種類の括弧か調べる'(_右括弧,_スタック_1,_スタック_2), 'スタックによる整合性判定 ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'(R,_スタック_2). ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'([A|R],_スタック) :- 左括弧でも右括弧でもない(A), 'スタックによる整合性判定 ・ 左括弧に出会ったら,スタックにpushする. ・ 右括弧に出会ったら,スタックからpopして同種類の括弧か調べる   ・違う種類・スタックが空 → 不整合 ・ 括弧の列が終わったとき,スタックが空なら整合'(R,_スタック). 括弧(_左括弧,_). 括弧(_対応する左括弧,_右括弧). 括弧('(',')'). 括弧('{','}'). 括弧('[',']'). \+(括弧(A,_)), \+(括弧(_,A)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/861 # # # お題:たとえば整数20010307なら21370000のように0を右側に寄せ集めた整数を返す # 'たとえば整数20010307なら21370000のように0を右側に寄せ集めた整数を返す'(_整数,_0を右側に寄せ集めた整数) :- number_chars(_整数,_整数文字ならび), '0を右側に寄せ集めた'(_整数文字ならび,_0以外の文字ならび,_0の文字ならび), 整数を返す(_0以外の文字ならび,_0の文字ならび,_0を右側に寄せ集めた整数). '0を右側に寄せ集めた'(_整数文字ならび,_0以外の文字ならび,_0の文字ならび) :- findall('0',member('0',_整数文字ならび),_0の文字ならび), findall(_整数文字,( member(_整数文字,_整数文字ならび), \+(_整数文字='0')), _0以外の文字ならび). 整数を返す(_0以外のならび,_0のならび,_0を右側に寄せ集めた整数) :- append(_0以外のならび,_0のならび,_0を右側に寄せ集めたならび), number_chars(_0を右側に寄せ集めた整数,_0を右側に寄せ集めたならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/758 # # あるシステムにデバイスのシリアルを登録するのですが、シリアルに半角スペースが入っていると正常に登録ができません。 # 正規表現が使えるようなので、質問ですが、下記のシリアルを正規表現で表記するにはどう表記すれば良いでしょうか。 # # 上記シリアルは二つの文字列間に半角スペースが12個含んでいます。 # よろしくお願いします。 '二つの文字列間に半角スペースが12個含んでいます。'(_文字列,_一つ目の文字列,_二つ目の文字列) :- sub_atom(_文字列,_一つ目の文字列,' ',_二つ目の文字列,[A|L1],L2,[B|L3]), \+(member(' ',[A|L1])), \+(member(' ',[B|L3])). sub_atom(A,H,X,T,HL,XL,TL) :- sub_atom(A,_,_,_,H,X,T,HL,XL,TL). % 以下のサイトは # お題:値が整数のn個の数列がある。隣同士の項の和の数列をつくる。 # この操作を繰り返して項が1個になったらその値を返す。 # 例 # 31,41,59,2 -> 333 # 31,41,59,2 # →(31+41),(41+59),(59+2) # →(31+41+41+59),(41+59+59+2) # →(31+41+41+59+41+59+59+2) # 三角数と初めの数列の長さに関係してる。数学問題だな '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'([_1個になったらその値],_1個になったらその値) :- !. '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'(_値が整数の数列,_1個になったらその値) :- \+(_値が整数の数列 = []), findall(_隣同士の項の和,( append(_,[_項_1,_項_2|_],_値が整数の数列), _隣同士の項の和 is _項_1 + _項_2), _隣同士の項の和の数列), '値が整数のn個の数列がある。隣同士の項の和の数列をつくる。この操作を繰り返して項が1個になったらその値を返す。'(_隣同士の項の和の数列,_1個になったらその値). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/832 # # 【課題】X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび),!, forall(member([_X,_Y],_X_Y_組合せならび), 表示しなさい(_X,_Y)). 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- writef('解がありません!\n'), fail. 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび) :- '125以下の素数ならびを得る'(_125以下の素数ならび), findall([_X,_Y],( 組合せ(_125以下の素数ならび,2,[_X,_Y]), 125 is X * Y), _X_Y_組合せならび), \+(_X_Y_組合せならび=[]). '125以下の素数ならびを得る'(_125以下の素数ならび) :- findall(N,between(2,125,N),_2から125までの整数ならび), エラトステネスの篩(_2から125までの整数ならび,_125以下の素数ならび). 組合せ(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). エラトステネスの篩([],[]) :- !. エラトステネスの篩([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). 表示しなさい(_X,_Y) :- writef('%t %t\n',[_X,_Y]). % 以下のサイトは # # fx = exp(x)- 3x において、区間{0,1}の根を二分法で求める。 # ただし、収束判定条件には|b-a|εを用いて ε=10^-5 # func(X,FX) :- FX is exp(X) - 3 * X. 収束判定条件(FX) :- abs(FX) < 1.0e-05. 'fx = exp(x)- 3x において、区間{0,1}の根を二分法で求める。ただし、収束判定条件には|b-a|ε を用いてε=10^-5'(X) :- 二分法(0.0,1.0,X). 二分法(S,E,X) :- 二分法の初期値(S,H,E,FX1,FX2,FX3), 二分法(S,H,E,FX1,FX2,FX3,X). 二分法の初期値(S,H,E,FX1,FX2,FX3) :- func(S,FX1), func(E,FX3), 二分して関数に適用する(S,E,H,FX2). 二分して関数に適用する(S,E,H,FX) :- H is ( S + E ) / 2, func(H,FX). 二分法(S,X,E,FX1,FX2,FX3,X) :- 収束判定条件(FX3),!. 二分法(S,H,E,FX1,FX2,FX3,X) :- '前半区間、後半区間の解のある方に二分法を適用する'(S,H,E,FX1,FX2,FX3,X). '前半区間、後半区間の解のある方に二分法を適用する'(S,H,E,FX1,FX2,FX3,X) :- 二分法を前半区間に適用(S,H,FX1,FX2,FX4,X). '前半区間、後半区間の解のある方に二分法を適用する'(S,H,E,FX1,FX2,FX3,X) :- 二分法を後半区間に適用(H,E,FX2,FX3,FX4,X). 二分法を前半区間に適用(S,H,FX1,FX2,FX4,X) :- こちらの区間に解はある(FX1,FX2), 二分法を適用する(S,H,FX1,FX2,FX4,X). 二分法を後半区間に適用(H,E,FX2,FX3,FX4,X) :- こちらの区間に解はある(FX2,FX3), 二分法を適用する(H,E,FX2,FX3,FX4,X). 二分法を適用する(S,H,FX1,FX2,FX4,X) :- 二分して関数に適用する(S,H,H2,FX4), 二分法(S,H2,H,FX1,FX4,FX2,X). こちらの区間に解はある(A,B) :- ふたつの値の絶対値が異なれば0を跨ぐことになるからこちらの区間に解がある(A,B). ふたつの値の絶対値が異なれば0を跨ぐことになるからこちらの区間に解がある(A,B) :- 絶対値が異なる(A,B). 絶対値が異なる(A,B) :- 'AとBの絶対値を取る'(A,B,A1,B1), 絶対値が異なる(A,A1,B,B1). 'AとBの絶対値を取る'(A,B,A1,B1) :- A1 is abs(A), B1 is abs(B). 絶対値が異なる(A,A,B,B1) :- 'BとB1が異なる'(B,B1). 絶対値が異なる(A,A1,B,B) :- 'AとA1が異なる'(A,A1). 'BとB1が異なる'(B,B1) :- \+(B=B1). 'AとA1が異なる'(A,A1) :- \+(A=A1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/689 # # ●Java1.5 # ●検索 # ●真ん中のAを否定 かつ Aが含まれる にマッチするか # # ●対象データ 3桁限定 # ABC true # BAC false # CBA true # DEF false # # .*1.* & ^.[^9].* # こんな正規を使ったのですができませんでした。 # 宜しくお願いします。 # # '真ん中のAを否定 かつ Aが含まれる にマッチするか(対象データ 3桁限定)'(_対象データ,_A) :- '真ん中のAを否定(対象データ 3桁限定)'(_対象データ,_A), 'Aが含まれる(対象データ 3桁限定)'(_対象データ,_A). '真ん中のAを否定(対象データ 3桁限定)'(_対象データ,_A) :- \+(sub_atom(_対象データ,1,1,1,_A)). 'Aが含まれる(対象データ 3桁限定)'(_対象データ,_A) :- sub_atom(_対象データ,_,1,_,_A). % 以下のサイトは # 西暦年を入力してそれ以後の閏年を10個表示させる 西暦年を入力してそれ以後の閏年を10個表示させる :- 西暦年を入力して(_西暦年), それ以後の閏年を10個(_西暦年,_それ以後の閏年を10個), 表示させる(_それ以後の閏年を10個). 西暦年を入力して(_西暦年) :- write('西暦年を入力 '), read(_西暦年). それ以後の閏年を10個(_年,_それ以後の閏年を10個) :- '10個'(_それ以後の閏年を10個), それ以後の閏年を(_年,_それ以後の閏年を10個). '10個'(_10個のならび) :- length(_10個のならび,10). それ以後の閏年を(_,[]). それ以後の閏年を(_閏年,[_閏年|_残り閏年ならび]) :- 閏年(_閏年), _閏年の翌年 is _閏年 + 1, それ以後の閏年を(_閏年の翌年,_残り閏年ならび),!. それ以後の閏年を(_閏年ではない年,_残り閏年ならび) :- _閏年ではない年の翌年 is _閏年ではない年 + 1, それ以後の閏年を(_閏年ではない年の翌年,_残り閏年ならび). 表示させる(_それ以後の閏年を10個) :- atomic_list_concat(_それ以後の閏年を10個,'\n',_表示文字列), writef('%t\n',[_表示文字列]). 閏年(_閏年) :- 0 is _閏年 mod 400,!. 閏年(_閏年) :- \+(0 is _閏年 mod 100), 0 is _閏年 mod 4. % 以下のサイトは # "0000000000"のような文字列を用意しておいて、"123" のような # 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? # 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。 # # C言語でいうsprintf(%10d, 123)みたいなフォーマットを正規表現で簡単に # 再現できますか? '"0000000000"のような文字列を用意しておいて、"123" のような 任意の文字列を"0000000123"のように置き換えるのって簡単にできますか? 置き換える方の文字列は3桁じゃなくて、いろんな数字があり得ます。'(_置換対象文字列,_置換文字列,_置換された文字列) :- atom_length(_置換文字列,_文字長), sub_atom(_置換対象文字列,S1,S2,S3), atom_length(S2,_文字長), atomic_list_concat([S1,_置換文字列,S3],_置換された文字列). % *** user: sub_atom / 4 *** sub_atom(A,H,X,T) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,H,X,T) :- var(X), atom_chars(A,L), sub_atom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). % 以下のサイトは % % 再帰を使わず、かつ、バックトラックを駆使したハノイの塔 % :- dynamic(ハノイの塔/3). :- dynamic(ハノイの塔/1). :- dynamic(ハノイの塔/0). :- dynamic(履歴/3). ハノイの塔(N) :- ハノイの塔列の生成(N), ハノイの塔_2(1), listing(履歴). ハノイの塔列の生成(N) :- findall(M,between(1,N,M),A), assertz(履歴(A,[],[])), assertz(ハノイの塔(A,[],[])), between(1,1000000,N2), N3 is N2 + 1, assertz((ハノイの塔_2(N2) :- ハノイの塔,ハノイの塔_2(N3))), N3 = 1000000, assertz(ハノイの塔_2(1000000)). ハノイの塔 :- ハノイの塔([],[],_),!. ハノイの塔 :- ハノイの塔([A|R],B,C), \+(履歴(R,[A|B],C)), 重ね検査(A,B), ( asseretz(ハノイの塔(R,[A|B],C)), retract(ハノイの塔([A|R],B,C)), asserz(履歴(R,[A|B],C)); retract(履歴(R,[A|B],C)), asseretz(ハノイの塔([A|R],B,C)), retract(ハノイの塔(R,[A|B],C)), fail). ハノイの塔 :- ハノイの塔([A|R],C,B), \+(履歴(R,C,[A|B])), 重ね検査(A,B), ( asseretz(ハノイの塔(R,C,[A|B])), retract(ハノイの塔([A|R],C,B)), asserz(履歴(R,C,[A|B])); retract(履歴(R,C,[A|B])), asseretz(ハノイの塔([A|R],C,B)), retract(ハノイの塔(R,C,[A|B])), fail). ハノイの塔 :- ハノイの塔(B,[A|R],C), \+(履歴([A|B],R,C)), 重ね検査(A,B), ( asseretz(ハノイの塔([A|B],R,C)), retract(ハノイの塔(B,[A|R],C)), asserz(履歴([A|B],R,C)); retract(履歴([A|B],R,C)), asseretz(ハノイの塔(B,[A|R],C)), retract(ハノイの塔([A|B],R,C)), fail). ハノイの塔 :- ハノイの塔(B,C,[A|R]), \+(履歴([A|B],C,R)), 重ね検査(A,B), ( asseretz(ハノイの塔([A|B],C,R)), retract(ハノイの塔(B,C,[A|R])), asserz(履歴([A|B],C,R)); retract(履歴([A|B],C,R)), asseretz(ハノイの塔(B,C,[A|R])), retract(ハノイの塔([A|B],C,R)), fail). ハノイの塔 :- ハノイの塔(C,[A|R],B), \+(履歴(C,R,[A|B])), 重ね検査(A,B), ( asseretz(ハノイの塔(C,R,[A|B])), retract(ハノイの塔(C,[A|R],B)), asserz(履歴(C,R,[A|B])); retract(履歴(C,R,[A|B])), asseretz(ハノイの塔(C,[A|R],B)), retract(ハノイの塔(C,R,[A|B])), fail). ハノイの塔 :- ハノイの塔(C,B,[A|R]), \+(履歴(C,[A|B],R)), 重ね検査(A,B), ( asseretz(ハノイの塔(C,[A|B],R)), retract(ハノイの塔(C,B,[A|R])), asserz(履歴(C,[A|B],R)); retract(履歴(C,[A|B],R)), asseretz(ハノイの塔(C,B,[A|R])), retract(ハノイの塔(C,[A|B],R)), fail). 重ね検査(A,[]). 重ね検査(A,[B|_]) :- A @< B. % 以下のサイトは # お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り # 合計を同じフォーマット文字列で返す。 # 例 # "18,446,744,073,709,551,616" # "1,099,511,627,776" #   ↓ # "18,446,745,173,221,179,392" # 'お題:数字を3桁ごとにカンマ区切りでフォーマットした文字列をふたつ取り合計を同じフォーマット文字列で返す。'(_文字列_1,_文字列_2,_文字列_3) :- カンマ区切り文字列を数値に戻す(_文字列_1,_数値_1), カンマ区切り文字列を数値に戻す(_文字列_2,_数値_2), _数値_3 is _数値_1 + _数値_2, 数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値_3,_文字列_3). カンマ区切り文字列を数値に戻す(_文字列,_数値) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(_文字=',')), _数字文字ならび), number_chars(_数値,_数字文字ならび). 数値を3桁ごとにカンマ区切りでフォーマットした文字列とする(_数値,_カンマが挿入された文字列) :- number_chars(_数値,_数字ならび), length(_数字ならび,_桁), atomic_list_concat(_数字ならび,_カンマが挿入されていない数字文字列), _剰余 is _桁 mod 3, 数字文字列にカンマを挿入(_剰余,_カンマが挿入されていない数字文字列,_カンマが挿入された文字列). 数字文字列にカンマを挿入(0,_カンマが挿入されていない数字文字列,_カンマが挿入された数字文字列) :- findall(_3字文字列,( sub_atom(_カンマが挿入されていない数字文字列,St,3,R,_3字文字列), 0 is St mod 3), L), atomic_list_concat(L,',',_カンマが挿入された数字文字列),!. 数字文字列にカンマを挿入(N,_数字文字列,_カンマが挿入された数字文字列) :- sub_atom(_数字文字列,0,N,R,_先頭文字列), sub_atom(_数字文字列,_,R,0,_残り文字列), 数字文字列にカンマを挿入(0,_残り文字列,_カンマが挿入された数字文字列_1), atomic_list_concat([_先頭文字列,',',_カンマが挿入された数字文字列_1],_カンマが挿入された数字文字列). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%% sub_atom/7 %%%%%%%% sub_atom(A,H,X,T,HL,XL,TL) :- atom(A), atom_chars(A,Chars), append(HL,XL,TL,Chars), 'HL_XL_TL_H_X_T'(HL,XL,TL,H,X,T). 'HL_XL_TL_H_X_T'(HL,XL,TL,H,X,T) :- \+(XL=[]), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). %%%%%%%% append/4 %%%%%%%% append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- sub_atom(_テキスト,_,_,_,'AA',S2,'AA',_,_,_), \+(sub_atom(S2,_,_,_,'AA')). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- atomic(X), atom_chars(A,L), atom_chars(X,XL), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,Len,R,H,X,T,HL,XL,TL) :- var(X), atom_chars(A,L), subatom_2(L,S,Len,R,HL,XL,TL), atom_chars(H,HL), atom_chars(X,XL), \+(XL = []), atom_chars(T,TL). sub_atom_2(L,S,Len,R,L1,XL,L2) :- append(L1,XL,L2,L), length_cut(L1,S), length_cut(L2,R), length_cut(XL,Len). length_cut(L,Len) :- length(L,Len),!. % 以下のサイトは # いろいろな環境の中には、先読みの否定である (?! ) が # 使えない環境があります。 このような環境では、 # 「ABC」 という文字列を含まない # というような、文字列の否定をする正規表現を作るのは # とても難しい作業になります # ※ (?! ) が使える環境での作り方は こちら 。 # # では、例として、 # 以下のようなテキストにマッチする正規表現を考えてみましょう★ # ・ テキストの先頭が AA から始まる # ・ テキストの末尾が AA で終わる # ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない # # ちなみに、 # "AAAAA" というテキストの場合、中に挟まれた文字列が #  A の1文字だけなので、マッチするものとします # # ▽ マッチさせたいテキストの図 # # このような場合、 # まず、以下のように正規表現に使えそうなパーツを書き出します # ^AA ・・・ テキストの先頭にある AA にマッチする表現 # AA$ ・・・ テキストの末尾にある AA にマッチする表現 # A[^A] ・・・ ”A 1文字” の後ろに ”A以外の1文字” が #           あれば、この2文字にマッチする表現 # [^A]  ・・・ ”A以外の1文字” にマッチする表現 # (重要) A[^A] は 2文字 にマッチするということを忘れないで下さい # # ちなみに、 A[^A] と [^A] は以下のような関係になっています # ・ ある文字が A 以外ならば、 [^A] にマッチする # ・ ある文字が A であり、次の文字が A 以外ならば、 #  この2文字が A[^A] にマッチする # ・ ある文字が AA の A ならば、A[^A] にも [^A] にもマッチしない # # これを図にすると下のようになります # # ▽ A[^A] と [^A] の関係図 # # この図を見ると、ある文字にマッチさせるには、 # A[^A] または [^A] にマッチさせればいいことが分かります # # つまり、以下のようになります # (A[^A]|[^A]) # # そして、これを繰り返せば AA を含まない文字列となります # (A[^A]|[^A])* # # 最後に、 # テキストの先頭と末尾の AA にマッチする表現を付け足し、 # 以下のようにすれば完成・・のはずですね # ^AA(A[^A]|[^A])*AA$ # # では、試しに動かしてみましょう! # ※ テキストエディタの OtbEdit では ^ と $ が行頭、行末にも # マッチするので、1行につき1つのテキストをテストします # '・ テキストの先頭が AA から始まる ・ テキストの末尾が AA で終わる ・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- '・ テキストの先頭が AA から始まる'(_テキスト), '・ テキストの末尾が AA で終わる'(_テキスト), '・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト). '・ テキストの先頭が AA から始まる'(_テキスト) :- sub_atom(_テキスト,0,_,_,'AA'). '・ テキストの末尾が AA で終わる'(_テキスト) :- sub_atom(_テキスト,_,_,0,'AA'). '・ 先頭の AA と、末尾の AA との間に挟まれた文字列の中にはAA が存在しない'(_テキスト) :- '・ 先頭の AA と、末尾の AA との間に挟まれた文字列'(_テキスト,_先頭のAAと末尾のAAとの間に挟まれた文字列), 'の中にはAA が存在しない'(_先頭のAAと末尾のAAとの間に挟まれた文字列). '・ 先頭の AA と、末尾の AA との間に挟まれた文字列'(_テキスト,_先頭のAAと末尾のAAとの間に挟まれた文字列) :- sub_atom(_テキスト,0,Len1,_,'AA'), sub_atom(_テキスト,_,Len2,0,'AA'), sub_atom(_テキスト,Len1,_,Len2,_先頭のAAと末尾のAAとの間に挟まれた文字列). 'の中にはAA が存在しない'(_先頭のAAと末尾のAAとの間に挟まれた文字列) :- \+(sub_atom(_先頭のAAと末尾のAAとの間に挟まれた文字列,_,_,_,'AA')). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/700 # # お題:重複した文字のうち最初に現れた文字だけ削除する。 # 例 # "Hello, world" -> "Hel, world" 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- 重複した文字のうち最初に現れた文字だけ削除する(_文字列,[],_重複した文字のうち最初に現れた文字だけ削除された文字列). 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_既に削除対象となった文字列ならび,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字の前方文字列・後方文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列), 重複した文字のうち最初に現れた文字だけ削除する(_後方文字列,[_削除対象文字列|_既に削除対象となった文字列ならび],_重複した文字のうち最初に現れた文字だけ削除された後方文字列), atomic_list_concat([_前方文字列,_重複した文字のうち最初に現れた文字だけ削除された後方文字列],_重複した文字のうち最初に現れた文字だけ削除された文字列),!. 重複した文字のうち最初に現れた文字だけ削除する(_文字列,_,_文字列). '重複した文字のうち最初に現れた文字の前方文字列・後方文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列) :- '文字列を検索し前方文字列・後方文字列を得る'(_文字列,_前方文字列,_削除対象文字列,_後方文字列), \+(member(_削除対象文字列,_既に削除対象となった文字列ならび)), sub_atom(_後方文字列,_,_,_,_削除対象文字列),!. '文字列を検索し前方文字列・後方文字列を得る'(_文字列,_前方文字列,_対象文字列,_後方文字列) :- sub_atom(_文字列,_開始位置,_,_残り長さ,_対象文字列), sub_atom(_文字列,0,_開始位置,_,_前方文字列), sub_atom(_文字列,_,_残り長さ,0,_後方文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% p_1(_1,_2) :- p_2(_1,[],_2). p_2(_1,_2,_3) :- p_3(_1,_4,_2,_5,_6), p_2(_6,[_4|_2],_7), atomic_list_concat([_4,_7],_3),!. p_2(_1,_,_1). p_3(_1,_2,_3,_4,_5) :- p_4(_1,_4,_2,_5), \+(member(_2,_3)), sub_atom(_5,_,_,_,_2),!. p_4(_1,_2,_3,_4) :- sub_atom(_1,_5,_,_6,_3), sub_atom(_1,0,_5,_,_2), sub_atom(_1,_,_,0,_4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/700 # # お題:重複した文字のうち最初に現れた文字だけ削除する。 # 例 # "Hello, world" -> "Hel, world" '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,[],_重複した文字のうち最初に現れた文字だけ削除された文字列). '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_既に削除対象となった文字列ならび,_重複した文字のうち最初に現れた文字だけ削除された文字列) :- '重複した文字のうち最初に現れた文字の前後文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列), '重複した文字のうち最初に現れた文字だけ削除する。'(_後方文字列,[_削除対象文字列|_既に削除対象となった文字列ならび],_重複した文字のうち最初に現れた文字だけ削除された後方文字列), atomic_list_concat([_前方文字列,_重複した文字のうち最初に現れた文字だけ削除された後方文字列],_重複した文字のうち最初に現れた文字だけ削除された文字列),!. '重複した文字のうち最初に現れた文字だけ削除する。'(_文字列,_,_文字列). '重複した文字のうち最初に現れた文字の前後文字列'(_文字列,_削除対象文字列,_既に削除対象となった文字列ならび,_前方文字列,_後方文字列) :- sub_atom(_文字列,_,_,_,_前方文字列,_削除対象文字列,_後方文字列,_,_,_), \+(member(_削除対象文字列,_既に削除対象となった文字列ならび)), sub_atom(_後方文字列,_,_,_,_削除対象文字列),!. % 以下のサイトは :- dynamic(階乗保存計算/2). 'ウィルソンの定理を使って素数を判定する関数is_primeを実装し、100000以下の素数以外をリストに得る'(_10000以下の素数リスト) :- findall(_p,( between(1,10000,_p), \+(is_prime(_p))), _10000以下の素数リスト). is_prime(_p) :- 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p). 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p) :- _p > 0, Y is _p - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod _p,!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # # 問題 14-13 ある文字列から特定の文字列に含まれる文字を削除するアルゴリズムを示せ。 # # 入門「データ構造とアルゴリズム」Narasimha Karumanchi著 黒川利明/木下哲也訳 オライリージャパン刊 p385 より # 'ある文字列から特定の文字列に含まれる文字を削除する'(_ある文字列,_特定の文字列,_特定の文字列に含まれる文字を削除した文字列) :- 文字選択された文字列(_ある文字列,_文字,\+(sub_atom(_特定の文字列,_,1,_,_文字)),_特定の文字列に含まれる文字を削除した文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字選択された文字列(_文字列,_構成する文字,_文字選択条件,_文字選択された文字列) :- findall(_構成する文字,( sub_atom(_文字列,_,1,_,_構成する文字), _文字選択条件), _文字選択された文字ならび), atomic_list_concat(_文字選択された文字ならび,_文字選択された文字列). % 以下のサイトは # # 問題 14-13 ある文字列から特定の文字列に含まれる文字を削除するアルゴリズムを示せ。 # # 入門「データ構造とアルゴリズム」Narasimha Karumanchi著 黒川利明/木下哲也訳 オライリージャパン刊 p385 より # 'ある文字列から特定の文字列に含まれる文字を削除する'(_ある文字列,_特定の文字列,_特定の文字列に含まれる文字を削除した文字列) :- findall(_文字,( ある文字列から(_ある文字列,_文字), \+(特定の文字列に含まれる文字(_特定の文字列,_文字))), _特定の文字列に含まれる文字を削除した文字ならび), atomic_list_concat(_特定の文字列に含まれる文字を削除した文字ならび,_特定の文字列に含まれる文字を削除した文字列). ある文字列から(_ある文字列,_文字) :- sub_atom(_ある文字列,_,1,_,_文字). 特定の文字列に含まれる文字を(_特定の文字列,_特定の文字列に含まれる文字) :- sub_atom(_特定の文字列,_,1,_,_特定の文字列に含まれる文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字選択された文字列(_文字列,_文字,_文字選択条件,_文字選択された文字列) :- findall(_文字,_文字選択条件,_文字選択された文字ならび), atomic_list_concat(_文字選択された文字ならび,_文字選択された文字列). % 以下のサイトは # # お題:テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示するプログラム # 'テキストファイルを読み込み、その中で最もよく使われている単語ベスト3を表示する'(_テキストファイル) :- テキストファイルを読み込み(_テキストファイル,_文), 'その中で最もよく使われている単語ベスト3を表示する'(_文). テキストファイルを読み込み(_テキストファイル,_文) :- get_lines(_テキストファイル,_行ならび), atomic_list_concat(_行ならび,_文). 'その中で最もよく使われている単語ベスト3を表示する'(_文) :- 形態素解析(文,_文,_形態素ならび), 最もよく使われている単語ベスト3を(_形態素ならび,_最もよく使われている単語ベスト3), 表示する(_最もよく使われている単語ベスト3). その中で最もよく使われている単語ベスト3を(_形態素ならび,[_単語1,_単語2,_単語3]) :- setof(A,member(A,_形態素ならび),_単語ならぴ), findall([_度数,_単語],( member(_単語,_単語ならび), count(_単語,_形態素ならび,_度数)), LL), sort(LL,_整列したLL), append(_,[[_,_単語3],[_,_単語2],[_,_単語1]],_整列したLL). 表示する([_単語1,_単語2,_単語3]) :- writef('%t %t %t\n',[_単語1,_単語2,_単語3]). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 形態素解析サーバー(mecab). 形態素解析([],[]) :-!. 形態素解析([['EOS'|_]|_],[]) :-!. 形態素解析([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析(R2,R3),!. 形態素解析([[A|_]|R],[B|R2]) :- 形態素解析サーバー(mecab), make_list(A,['\t'],AL), AL = [B|_], 形態素解析(R,R2),!. 形態素解析([[A|_]|R],[A|R2]) :- 形態素解析サーバー(juman), 形態素解析(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X). 形態素解析(ファイル,_テキストファイル,L) :- 形態素解析サーバー(_形態素解析サーバー), concat(['cat ',_テキストファイル,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析(文,S,L) :- tmpnam(_仮のファイル), tell(_仮のファイル), wr('%t',[S]), told, 形態素解析(ファイル,_仮のファイル,L) . 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), 形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y) , split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). tmpnam(TMPNAM) :- 乱数からTMPNAMを得る(TMPNAM),!. tmpnam(TMPNAM) :- tmpnam(TMPNAM). 乱数からTMPNAMを得る(TMPNAM) :- アルファベットに変換([_1,_2,_3,_4,_5,_6]), atomic_list_concat(['/tmp/file'|[_1,_2,_3,_4,_5,_6]],TMPNAM), \+(exists_file(TMPNAM)). アルファベットに変換([]). アルファベットに変換([A|R]) :- C is random(62), アルファベットに変換の二(C,A), アルファベットに変換(R). アルファベットに変換の二(N,A) :- '基数62のコード・アルファベットコード変換表'(S,E,B), between(S,E,N), C is N - S + B, char_code(A,C). '基数62のコード・アルファベットコード変換表'(0,9,48). '基数62のコード・アルファベットコード変換表'(10,35,65). '基数62のコード・アルファベットコード変換表'(36,60,97). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1377511459/294 # # 縦横6マスのボックスがあります。 # 全てのマスを○×で埋めます。 # ○と×はそれぞれ連続2個まで繋がっててOK。 # 縦横の各列は○と×の数は同じにならなければいけない。 # ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) # これはどうやって解けばいいのか教えてください。 # # '縦横6マスのボックスがあります。 全てのマスを○×で埋めます。 ○と×はそれぞれ連続2個まで繋がっててOK。 縦横の各列は○と×の数は同じにならなければいけない。 ○と×の並び方が他の列と重複するのはNG。(縦と横を比較して同じなのはOK。縦と縦、横と横が同じ並びって言うのがNG) これはどうやって解けばいいのか教えてください。'(LL) :- 行候補ならびを得る(_行候補ならび), 面を規定する(LL), 転置(LL,_転置されたLL), 面候補を得る(_行候補ならび,LL), 転置診断(_転置されたLL,_行候補ならび). 行候補ならびを得る(_行候補ならび) :- findall(L,( 順列([○,○,○,×,×,×],6,L), \+(append(_,[A,A,A|_],L))), _重複があり得る行候補ならび), sort(_重複があり得る行候補ならび,_行候補ならび). 面を規定する(LL) :- length(LL,6), findall(L,( member(L,LL), length(L,6)), LL). 面候補を得る(_行候補ならび,[L1,L2,L3,L4,L5,L6]) :- member(L1,_行候補ならび), member(L2,_行候補ならび), member(L3,_行候補ならび), member(L4,_行候補ならび), member(L5,_行候補ならび), member(L6,_行候補ならび), sort([L1,L2,L3,L4,L5,L6],[_,_,_,_,_,_]). 転置診断(_転置されたLL,_行候補ならび) :- sort(_転置されたLL,[_,_,_,_,_,_]), findall(_,( member(L,_転置されたLL), member(L,_行候補ならび), \+(append(_,[A,A,A|_],L))), [_,_,_,_,_,_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- 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). % 以下のサイトは :- dynamic(tmp/2). 入力された点数の相加平均を表示する :- 点に999が入るまで入力を続ける([],Ln), 点数を合計する([],Ln,0,_合計), length(Ln,_人数), _相加平均 is _合計 / 人数, writef('平均点は %t です\n',[_相加平均]). 点に999が入るまで入力を続ける(Ln_1,Ln_2) :- 整数を得る('点数(999の入力で終了)',_点数), \+(_点数 = 999), assertz(tmp(Ln_1,_点数)), 点に99が入るまで入力を続ける([_|Ln_1],Ln_2). 点に999が入るまで入力を続ける(Ln,Ln). 点数を合計する(Ln,Ln,_合計,_合計) :- !. 点数を合計する(Ln_1,Ln_2,_合計_1,_合計) :- tmp(Ln_1,_数), _合計_2 is _合計_1 + _数, 点数を合計する([_|Ln_1],Ln_2,_合計_2,_合計). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび) :- '81以下の自然数ならび'(_81以下の自然数ならび), 九九に現れる数ならび(_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数ならび,_九九に現れる数ならび,_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). 九九に現れる数ならび(_九九に現れる数ならび) :- findall(_九九,( 九九(_九九)), _九九に現れる数ならび). 九九(_九九) :- between(1,9,_数_1), between(1,9,_数_2), _九九 is _数_1 * _数_2. '81以下の自然数で九九に現れない数を昇順にすべて'([],_,[]) :- !. '81以下の自然数で九九に現れない数を昇順にすべて'([_数|R1],_九九に現れる数ならび,[_数|R3]) :- 九九に現れない数(_数,_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3),!. '81以下の自然数で九九に現れない数を昇順にすべて'([_|R1],_九九に現れる数ならび,R3) :- '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3). 九九に現れない数(_数,_九九に現れる数ならび) :- \+(member(_数,_九九に現れる数ならび)). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数ならび'(_81以下の自然数ならび), 九九に現れる数ならび(_九九に現れる数ならび), '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数ならび,_九九に現れる数ならび,_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数ならび'(_81以下の自然数ならび) :- findall(_数,between(1,81,_数),_81以下の自然数ならび). 九九に現れる数ならび(_九九に現れる数ならび) :- findall(_九九,( 九九(_九九)), _九九に現れる数ならび). 九九(_九九) :- between(1,9,_数_1), between(1,9,_数_2), _九九 is _数_1 * _数_2. '81以下の自然数で九九に現れない数を昇順にすべて'([],_,[]) :- !. '81以下の自然数で九九に現れない数を昇順にすべて'([_数|R1],_九九に現れる数ならび,[_数|R3]) :- \+(member(_数,_九九に現れる数ならび)), '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3),!. '81以下の自然数で九九に現れない数を昇順にすべて'([_|R1],_九九に現れる数ならび,R3) :- '81以下の自然数で九九に現れない数を昇順にすべて'(R1,_九九に現れる数ならび,R3). '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- between(1,81,_自然数), 九九に現れない数を(_自然数), 表示せよ(_自然数), _自然数 = 81. 九九に現れない数を(_自然数) :- \+(九九に現れる数(_自然数)). 九九に現れる数(_自然数) :- between(1,9,_n1), between(1,9,_n2), _自然数 is _n1 * _n2,!. 表示せよ(_自然数) :- writef('%t ',[_自然数]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で'(_81以下の自然数), 九九に現れない数を(_81以下の自然数), '表示せよ。'(_81以下の自然数), _81以下の自然数 = 81. '81以下の自然数で'(_81以下の自然数) :- between(1,81,_81以下の自然数). 九九に現れない数を(_81以下の自然数) :- \+(九九に現れる数を(_81以下の自然数)). 九九に現れる数を(_81以下の自然数) :- 重複組合せ([1,2,3,4,5,6,7,8,9],2,[M,N]), _81以下の自然数 is M * N,!. '表示せよ。'(_81以下の自然数) :- writef('%t ',[_81以下の自然数]). 重複組合せ(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). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/650 # # # 81以下の自然数で九九に現れない数を昇順にすべて表示せよ。 # '81以下の自然数で九九に現れない数を昇順にすべて表示せよ。' :- '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび), '表示せよ。'(_81以下の自然数で九九に現れない数ならび). '81以下の自然数で九九に現れない数を昇順にすべて'(_81以下の自然数で九九に現れない数ならび) :- findall(_81以下の自然数,( '81以下の自然数で'(_81以下の自然数), 九九に現れない数(_81以下の自然数)),_81以下の自然数で九九に現れない数ならび). '81以下の自然数で'(_81以下の自然数) :- between(1,81,_81以下の自然数). 九九に現れない数(_81以下の自然数) :- \+(九九に現れる数(_81以下の自然数)). 九九に現れる数(_九九に現れる数) :- between(1,9,_数_1), between(1,9,_数_2), _九九に現れる数 is _数_1 * _数_2. '表示せよ。'(_81以下の自然数で九九に現れない数ならび) :- atomic_list_concat(_81以下の自然数で九九に現れない数ならび,' ',_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは 重複要素を削る(_ならび,_重複要素を削ったならび) :- findall(_要素,( append(L0,[_要素|R],_ならび), \+(member(_要素,L0))), _重複要素を削ったならび). 重複要素を削って表示する(_ならび) :- forall(( append(L0,[要素|_],_ならび), \+(member(要素,L0))), writef('%t ',[_要素])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/714 # # 【 課題 】3で割り切れる数の自然数の中で、7で割ったとき「2余らない数」を求めて下さい。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】9月6日 # 【 Ver  】javac 1.7.0_25 # 【 補足 】 # 1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する # 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する # # # よろしくお願いします。 # # '3で割り切れる数の自然数の中で、7で割ったとき「2余らない数」を求めて下さい。 1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する' :- 個数と行数を数える([_],[_],[_],_総個数ならび,_行個数ならび,_行数ならび), '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数), '7で割ったとき「2余らない数」を求めて下さい。'(_3で割り切れる数の自然数,_3で割り切れる数の自然数の中で7で割ったとき2余らない数), '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_総個数ならび,_行個数ならび,_行数ならび,_3で割り切れる数の自然数の中で7で割ったとき2余らない数), length(_総個数ならび,90). 個数と行数を数える(_総個数,_行個数,_行数,_総個数,_行個数,_行数). 個数と行数を数える(L1,[_,_,_,_,_,_,_,_,_,_],L3) :- 個数と行数を数える([_|L1],[_],[_|L3],_総個数,_行個数,_行数),!. 個数と行数を数える(L1,L2,L3,_総個数,_行個数,_行数) :- 個数と行数を数える([_|L1],[_|L2],L3,_総個数,_行個数,_行数),!. '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数) :- '3で割り切れる数の自然数の中で、'(1,_3で割り切れる数の自然数). '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数,_3で割り切れる数の自然数) :- 0 is _3で割り切れる数の自然数 mod 3. '3で割り切れる数の自然数の中で、'(_自然数_1,_3で割り切れる数の自然数) :- _自然数_2 is _自然数_1 + 1, '3で割り切れる数の自然数の中で、'(_自然数_2,_3で割り切れる数の自然数). '7で割ったとき「2余らない数」を求めて下さい。'(_数,_7で割ったとき2余らない数). \+(2 is _数 mod 7). '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_,[_],_行番号ならび,_) :- '行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_行番号ならび), fail. '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_,[_,_,_,_,_,_,_,_,_,_],_,_数) :- writef(' %t\n',[_数]),!. '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_,_,_,_数) :- writef(' %t',[_数]). '行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_行番号ならび) :- length(_行番号ならび,_行番号), writef('%t:',[_行番号]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/714 # # 【 課題 】3で割り切れる数の自然数の中で、7で割ったとき「2余らない数」を求めて下さい。 # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】制限なし # 【 期限 】9月6日 # 【 Ver  】javac 1.7.0_25 # 【 補足 】 # 1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する # 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する # # # よろしくお願いします。 # # '3で割り切れる数の自然数の中で、7で割ったとき「2余らない数」を求めて下さい。 1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する' :- between(1,90,_個), '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数), '7で割ったとき「2余らない数」を求めて下さい。'(_3で割り切れる数の自然数,_3で割り切れる数の自然数の中で7で割ったとき2余らない数), '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個,_3で割り切れる数の自然数の中で7で割ったとき2余らない数), _個 = 90. '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数) :- '3で割り切れる数の自然数の中で、'(1,_3で割り切れる数の自然数). '3で割り切れる数の自然数の中で、'(_3で割り切れる数の自然数,_3で割り切れる数の自然数) :- 0 is _3で割り切れる数の自然数 mod 3. '3で割り切れる数の自然数の中で、'(_自然数_1,_3で割り切れる数の自然数) :- _自然数_2 is _自然数_1 + 1, '3で割り切れる数の自然数の中で、'(_自然数_2,_3で割り切れる数の自然数). '7で割ったとき「2余らない数」を求めて下さい。'(_数,_7で割ったとき2余らない数). \+(2 is _数 mod 7). '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個,_数) :- '行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個). '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個,_数) :- 0 is _個数 mod 10, writef(' %t\n',[_数]). '1、出力は小さい順に、かつ1行に10個ずつ、合計90個出力する 2、行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個,_数) :- \+(0 is _個数 mod 10), writef(' %t',[_数]). '行の先頭には、行番号(1からスタート)とコロン(:)を出力する'(_個) :- 1 is _個 mod 10, _行 is (_個 // 10) + 1, writef('%t:',[_行]), fail. % 以下のサイトは % % SWI-Prologに於いてfindall/3と同等の述語をmesage_queueを使って定義してみる。 % % findall/3と同じ機能の述語をメッセージキューを利用して定義する。 % メッセージキューを使って全解を収集する(_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), ( call(_副目標), thread_send_message(_キュー番号,_選択項), fail; メッセージを回収する(_キュー番号,_回収値ならび)), message_queue_destroy(_キュー番号). メッセージを回収する(_キュー番号,[]) :- \+(thread_peek_message(_キュー番号,_)),!. メッセージを回収する(_キュー番号,[_回収値|R]) :- thread_get_message(_キュー番号,_回収値), メッセージを回収する(_キュー番号,R). % 以下のサイトは 全順列(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 順列(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). 全組合せ(L,LL) :- length(L,Len), ダミー要素を付加する(Len,L,L_2), findall(L_4,( 組合せ(L_2,3,L_3), findall(A,(member(A,L_3),\+(var(A))),L_4)), LL_1), sort(LL_1,LL). ダミー要素を付加する(Len,L_1,L_2) :- length(L_v,Len), append(L_1,L_v,L_2),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/782 # # 読み込むiniファイルのセクション名を、string配列にpushし続けて、 # セクション名すべてpushしたらループから外れるって仕組みなんですけど、tmp = strtok_s()の代入がうまくいきません # どうしたらいいですか # # char SectionNames[1024]; # GetPrivateProfileSectionNames(SectionNames,1024,FilePath.c_str()); # # char *WTF;//謎の内部パラメータ,strtok_sの仕様 # vector<string> SquadNameList; # SquadNameList.push_back(strtok_s( SectionNames, "0" ,&WTF)); # # for(int i=0; i < SquadNameList.size();i++){ # char tmp[256]; # tmp = strtok_s( NULL, "0" ,&WTF); # if( tmp != NULL){ # SquadNameList.push_back(tmp); # } # } # # '読み込むiniファイルのセクション名を、string配列にpushし続けて、 セクション名すべてpushしたらループから外れるって仕組みなんですけど、 tmp = strtok_s()の代入がうまくいきませんどうしたらいいですか'(_iniファイル,_セクション名ならび) :- 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,[],_セクション名ならび). 読み込むiniファイルの(_iniファイル,_iniファイル文字ならび) :- get_chars(_iniファイル,_iniファイル文字ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,L1,_セクション名ならび) :- セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび), 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_セクション名後の文字ならび,[_セクション名|L1],_セクション名ならび). 'セクション名を、string配列にpushし続けて、セクション名すべてpushしたらループから外れる'(_iniファイル文字ならび,_セクション名ならび,_セクション名ならび). セクション名を(_iniファイル文字ならび,_セクション名,_セクション名後の文字ならび) :- append(L0,['['|_セクション名からの文字ならび],_iniファイル文字ならび), 'L0に[も]も存在しない'(L0), append(L0_1,[']'|_セクション名後の文字ならび],_セクション名からの文字ならび), 'L0_1に]が存在しない'(_セクション名後の文字ならび), atom_chars(_セクション名,_セクション名後の文字ならび). 'L0に[も]も存在しない'(L0) :- \+(member('[',L0)), \+(member(']',L0)),!. 'L0_1に]が存在しない'(L0_1) :- \+(member(']',L0_1)). % 以下のサイトは % % a \+b % --------------------------> ---------------- % 状態_0 状態_1 | % <-------------------------- <--------------- % b % % 言語(a*b)*を受理する非決定性有限オートマトンの遷移 % '言語(a*b)*を受理する非決定性有限オートマトン'(_記号ならび) :- '言語(a*b)*初期状態'(_状態), '言語(a*b)*を受理する非決定性有限オートマトン'(_状態,_記号ならび). '言語(a*b)*を受理する非決定性有限オートマトン'(_状態,[_記号|R]) :- '言語(a*b)*'(_状態,_記号,_状態_1), '言語(a*b)*を受理する非決定性有限オートマトン'(_状態_1,R). '言語(a*b)*を受理する非決定性有限オートマトン'(_状態,[]) :- '言語(a*b)*終了状態'(_状態). '言語(a*b)*'(状態_0,a,状態_1). '言語(a*b)*'(状態_1,b,状態_0). '言語(a*b)*'(状態_1,C,状態_1) :- \+(C = b). '言語(a*b)*初期状態'(状態_0). '言語(a*b)*終了状態'(状態_0). % 以下のサイトは # プログラム: 言語(a) を受理するNDFA # # a # ------------------------- # 状態_0 | # <------------------------ # # # 図 簡単なオートマトン # '次の文字列を非決定性有限オートマトンが言語(a)を受理するまで検索する'(_文字列,_前文字列,_受理された文字列,_後文字列) :- '文字列を、前・受理された・後文字ならび候補に分解する'(_文字列,_前文字ならび,_受理された文字ならび,_後文字ならび), '言語(a)を受理する非決定性有限オートマトン'(_受理された文字ならび), '各部文字ならびを文字列に変換する'(_前文字ならび,_受理された文字ならび,_後文字ならび,_前文字列,_受理された文字列,_後文字列). '文字列を、前・受理された・後文字ならび候補に分解する'(_文字列,_前文字ならび,_受理された文字ならび,_後文字ならび) :- atom_chars(_文字列,_文字ならび), append([_前文字ならび,_受理された文字ならび,_後文字ならび],_文字ならび), \+(_受理された文字ならび=[]). '各部文字ならびを文字列に変換する'(_前文字ならび,_受理された文字ならび,_後文字ならび,_前文字列,_受理された文字列,_後文字列) :- atom_chars(_前文字列,_前文字ならび), atom_chars(_受理された文字列,_受理された文字ならび), atom_chars(_後文字列,_後文字ならび). '言語(a)を受理する非決定性有限オートマトン'(_記号ならび) :- '言語(a)初期状態'(_状態), '言語(a)を受理する非決定性有限オートマトン'(_状態,_記号ならび). '言語(a)を受理する非決定性有限オートマトン'(_状態,[_記号|R]) :- '言語(a)'(_状態,_記号,_状態_1), '言語(a)を受理する非決定性有限オートマトン'(_状態_1,R). '言語(a)を受理する非決定性有限オートマトン'(_状態,[]) :- '言語(a)終了状態'(_状態). '言語(a)初期状態'(状態_0). '言語(a)終了状態'(状態_0). '言語(a)'(状態_0,a,状態_0). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/419 # # ●Regular Expressionの使用環境 # sakura editor # # ●検索か置換か? # 置換 # # ●説明 # xmlのtaxiwaypath要素のなかに # type="TAXI"と centerLineLighted="FALSE"が存在するときに、 他の属性を書き換えずにcenterLineLighted="TRUE"に書き換えたいです # # ●対象データ # <TaxiwayPath # type="TAXI" # … # centerLineLighted="FALSE" # … # /> # # ●希望する結果 # <TaxiwayPath # type="TAXI" # … # centerLineLighted="TRUE" # … # /> # # …は省略していると言う意味です # # ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_置換された文字列) :- sPLIT(_文字列,['>',' ','\n','\t'],_区切りを含む要素ならび), ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" にする'(R2,R2_2), atomic_list_concat(_置換された区切りを含む要素ならび,_置換された文字列),!. ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(_文字列,_文字列). ' までの間に type="TAXI" とcenterLineLighted="FALSE" が存在する時、centerLineLighted="FALSE" を centerLineLighted="TRUE" に置換する'(R2,_置換された区切りを含む要素ならび) :- append(L1,[''|R3],_区切りを含む要素ならび), \+(member('>',R2)), member('type="TAXI"',R2), ならびの置換(R2,'centerLineLighted="FALSE"','centerLineLighted="TRUE"',R2_2), append(L1,[''|R3],_置換された区切りを含む要素ならび),!. % 以下のサイトは 集合に要素を加える(_要素,_集合,[_要素|_集合]) :- \+(member(_要素,_集合)),!. 集合に要素を加える(_要素,_集合,_集合). % 以下のサイトは not_member(_要素,_ならび) :- 要素が存在しない(_要素,_ならび). 要素が存在しない(_要素,[]). 要素が存在しない(_要素,[_要素|_]) :- !,fail. 要素が存在しない(_要素,[_|_残りならび]) :- 要素が存在しない(_要素,_残りならび). % 以下のサイトは '差集合 A-B とは、Aの要素からBの要素を取り去った集合である'(A,B,_差集合) :- findall(_要素,'Aの要素がBの要素ではない'(A,B,_要素),_差集合). 'Aの要素がBの要素ではない'(A,B,_要素) :- member(_要素,A), \+(member(_要素,B)). % 以下のサイトは '差集合 A-B とは、Aの要素からBの要素を取り去った集合である'(A,B,_差集合) :- 'Aの要素からBの要素を取り去った集合'(A,B,_差集合). 'Aの要素からBの要素を取り去った集合'([],_,[]). 'Aの要素からBの要素を取り去った集合'([X|R1],B,R3) :- member(X,B), 'Aの要素からBの要素を取り去った集合'(R1,B,R3). 'Aの要素からBの要素を取り去った集合'([X|R1],B,[X|R3]) :- \+(member(X,B)), 'Aの要素からBの要素を取り去った集合'(R1,B,R3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/429 # # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/430 # # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/431 # # [1] 授業単元:アルゴリズム # [2] 問題文(含コード&リンク):次レスで # # ランダムな整数がデータとして保存されたファイルから,まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する. # 次に整数を一つだけキーボードから入力する. # そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する. # さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する. # いろいろなデータについて実行し,yes/noの判定と最小値の結果が正しいことを確認すること. # # ファイルの中身はこんな感じです。 # 10は要素数を表します。 # # 10 # # 27446 # 58007 # 103 # 56548 # 21869 # 21538 # 7867 # 65552 # 91919 # 76211 # # 'ランダムな整数がデータとして保存されたファイルから,まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する. 次に整数を一つだけキーボードから入力する. そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する. さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.' :- 'ランダムな整数がデータとして保存されたファイルから,'(Instream), 'まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する.'(Instream,_2分探索木), '次に整数を一つだけキーボードから入力する.'(_整数), 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(_2分探索木,_整数), 'さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.'.(_2分探索木). 'ランダムな整数がデータとして保存されたファイルから,'(Instream) :- 'ランダムな整数がデータとして保存されたファイル'(_ファイル), open(_ファイル,read,Instream). 'ランダムな整数がデータとして保存されたファイル'('save_binary_tree.txt'). 'まず,データの個数nを読み込み,その数だけデータを読み込み2分探索木に格納する.'(Instream,_2分探索木) :- 'まず,データの個数nを読み込み,'(Instream,_データの個数n), 'その数だけデータを読み込み2分探索木に格納する.'(Instream,_データの個数n,_2分探索木). 'まず,データの個数nを読み込み,'(Instream,_データの個数n) :- get_line(Instream,Line), atom_number(Line,_データの個数n). 'その数だけデータを読み込み2分探索木に格納する.'(Instream,N,_データの個数n,_2分探索木) :- データを読み込み(N), 'その数だけデータを読み込み2分探索木に格納する.'(Instream,0,_データの個数n,[_,_,_],_2分探索木). 'その数だけデータを読み込み2分探索木に格納する.'(Instream,_データの個数n,_データの個数n,_2分探索木,_2分探索木) :- close(Instream),!. 'その数だけデータを読み込み2分探索木に格納する.'(Instream,N,_データの個数n,_2分探索木_1,_2分探索木) :- データを読み込み(Instream,_データ), '2分探索木に格納する.'(_データ,_2分探索木_1,_2分探索木_2), N_2 is N + 1, 'その数だけデータを読み込み2分探索木に格納する.'(Instream,1,_データの個数n,_2分探索木_2,_2分探索木). データを読み込み(Instream,_データ) :- get_line(Instream,Line), \+(Line = ''), atom_number(Line,N),!. データを読み込み(Instream,_データ) :- データを読み込み(Instream,_データ). '2分探索木に格納する.'(_データ,[A,B,C],[A,_データ,C]) :- var(B),!. '2分探索木に格納する.'(_データ,[A,B,C],_2分探索木) :- 左枝の探索木に格納する(_データ,A,B,C,_2分探索木). '2分探索木に格納する.'(_データ,[A,B,C],_2分探索木) :- 右枝の探索木に格納する(_データ,A,B,C,_2分探索木). 左枝の探索木に格納する(_データ,A,B,C,[[_,_データ,_],B,C]) :- _データ =< B, var(A),!. 左枝の探索木に格納する(_データ,A,B,C,[A_1,B,C]) :- _データ =< B, '2分探索木に格納する.'(_データ,A,A_1). 右枝の探索木に格納する(_データ,A,B,C,[A,B,[_,_データ,_]]) :- _データ > B, var(C),!. 右枝の探索木に格納する(_データ,[A,B,C],[A,B,C_1]) :- _データ > B, '2分探索木に格納する.'(_データ,C,C_1). '次に整数を一つだけキーボードから入力する.'(_整数) :- 整数を得る(整数,_整数). 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,_整数,C],_整数) :- write('yes\n'),!. 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :- var(B), write('no\n'),!. 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :- 左の探索木の探索(B,A,_整数). 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'([A,B,C],_整数) :- 右の探索木の探索(B,C,_整数). 左の探索木の探索結果表示(B,A,_整数) :- _整数 =< B, 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(A,_整数),!. 右の探索木の探索(B,C,_整数) :- _整数 > B, 'そしてその整数が保存した2分探索木内に存在する場合にはyes,存在しない場合にはnoを2分探索により判定し,結果をディスプレイ上に表示する.'(C,_整数),!. 'さらに,読み込んだデータの中で最小の値を表示し,プログラムを終了する.'([A,B,C]) :- 'さらに,読み込んだデータの中で最小の値を表示し,'(_2分探索木), 'プログラムを終了する.'. 'さらに,読み込んだデータの中で最小の値を表示し,'([A,B,C]) :- var(A), writef('最小の値は %t です\n',[B]),!. 'さらに,読み込んだデータの中で最小の値を表示し,'([A,B,C]) :- \+(var(A)), 'さらに,読み込んだデータの中で最小の値を表示し,'(A). 'プログラムを終了する.' :- true. % 以下のサイトは # # お題:20桁の10進数が与えられたとき、任意の10個の数字を消してできる # 10桁の最大の数を求めよ # '20桁の10進数が与えられたとき、任意の10個の数字を消してできる10桁の最大の数を求めよ'(_20桁の10進数,_任意の数字ならび,_10桁の最大の数) :- '任意の10個数字を消す'(_20桁の10進数,_任意の数字ならび,_10桁の昇順ならび), '10桁の昇順ならびから最大数を得る'(_10桁の昇順ならび,_10桁の最大の数). '任意の10個数字を消す'(_20桁の10進数,_任意の数字ならび,_10桁の昇順ならび) :- number_chars(_20桁の10進数,_20桁の数字ならび), 整列(_20桁の数字ならび,_整列した20桁の数字ならび), 整列(_任意の数字ならび,_整列した任意の数字ならび), 小さい順に削る(_整列した任意の数字ならび,_整列した20桁の数字ならび,Chars3). 小さい順に削る([],Chars2,Chars2). 小さい順に削る([N|R1],[N|R2],R3) :- 小さい順に削る(R1,R2,R3). 小さい順に削る([N|R1],[M|R2],R3) :- \+(M = N), 小さい順に削る([N|R1],R2,R3). '10桁の昇順ならびから最大数を得る'(_10桁の昇順ならび,_10桁の最大の数) :- 降順ならびに変換して数値に戻す(_10桁の昇順ならび,_10桁の最大の数). 降順ならびに変換して数値に戻す(_10桁の昇順ならび,_10桁の最の数) :- reverse(_10桁の昇順ならび,_10桁の降順ならび), number_chars(_10桁の最大の数,_10桁の降順ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/413 # # ああもう訳が分からない # # あいうえおあいうえおあいうえお # # という「あいうえお」の繰り返し文字があったら # 1番最後の「うえ」だけ一致させる方法と # 2番目の「うえ」だけ一致させる方法が解らない # それぞれどういう方法があるんでしょうか? # すみません教えて下さい '1番最後の「うえ」だけ一致させる方法'(_文字列,_前文字列,うえ,_後文字列) :- sub_atom(_文字列,S,2,R,うえ), 前文字列と後文字列を得る(_文字列,S,R,_前文字列,_後文字列), \+(sub_atom(_後文字列,_,2,_,うえ)). '2番目の「うえ」だけ一致させる方法'(_文字列,_前文字列,うえ,_後文字列) :- '2番目の「うえ」だけ一致させる'(_文字列,S_2,R_2), 前文字列と後文字列を得る(_文字列,S_2,R_2,_前文字列,_後文字列). '2番目の「うえ」だけ一致させる'(_文字列,S_2,R_2) :- sub_atom(_文字列,S_1,2,_,うえ), sub_atom(_文字列,S_2,2,R_2,うえ), S_2 > S_1,!. 前文字列と後文字列を得る(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは 解釈実行((_目標_1 , _目標_2)) :- !, 解釈実行連言(_目標_1,_目標_2). 解釈実行((_目標_1 ; _目標_2)) :- !, 解釈実行選言(_目標_1,_目標_2). 解釈実行(_副目標) :- 定義述語(_副目標), !, 定義述語解釈実行(_副目標). 解釈実行(_副目標) :- call(_副目標). 解釈実行連言(_目標_1,_目標_2) :- 解釈実行置換((_目標_1 , _目標_2),_目標), call(_目標). 解釈実行選言(_目標_1,_目標_2) :- 解釈実行置換((_目標_1 , _目標_2),_目標), call(_目標). 定義述語(_副目標) :- predidate_property(_副目標,_述語の属性), \+(_述語の属性=builtin), \+(_述語の属性=undefined),!. 定義述語解釈実行(_副目標) :- clause(_副目標,_本体), 解釈実行置換(_本体,_置換された本体), call(_置換された本体). 解釈実行置換(((!) , Q),((!) , Q2)) :- 解釈実行置換(Q,Q2),!. 解釈実行置換((_副目標 , Q),(解釈実行(_副目標) , Q2)) :- 解釈実行置換(Q,Q2),!. 解釈実行置換((_副目標 ; Q),(解釈実行(_副目標) ; Q2)) :- 解釈実行置換(Q,Q2),!. 解釈実行置換(!,!) :- !. 解釈実行置換(_副目標,解釈実行(_副目標)). % 以下のサイトは ある文字数以上の単語をすべて抽出する(_ある文字数以上の単語ならび) :- 形態素解析(_文字列,_形態素ならび), findall(_ある文字数以上の単語,( member(_ある文字数以上の単語,_形態素ならび), atom_length(_ある文字数以上の単語,_文字数), _文字数 >= _ある文字数), _ある文字数以上の単語ならび). 形態素解析(S,L) :- tmpnam(F), tell(F), writef('%t',[S]), told, 形態素解析サーバによる形態素解析(ファイル,F,L) . 形態素解析サーバによる形態素解析(_ファイル名,_形態素ならび) :- 形態素解析サーバー(_形態素解析サーバー), atomic_list_concat(['cat ',_ファイル名,' | ',_形態素解析サーバー],S), sh(S,L1), 形態素解析(L1,L2), 形態素解析_3(L2,L). 形態素解析_1([],[]) :- !. 形態素解析_1([['EOS'|_]|_],[]) :- !. 形態素解析_1([[A|_],[@,B|_]|R],[R1_1|R3]) :- 形態素解析_2(R,R1,R2), 形態素解析_2_重複削除([A,B|R1],[],R1_1), 形態素解析_1(R2,R3),!. 形態素解析_1([[A|_]|R],[B|R2]) :- mecabサーバーによる形態素解析(A,B,R,R2),!. 形態素解析_1([[A|_]|R],[A|R2]) :- jumanサーバーによる形態素解析(A,B,R,R2). mecabサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(mecab), split(A,['\t'],AL), AL = [B|_], 形態素解析_1(R,R2),!. jumanサーバーによる形態素解析(A,B,R,R2) :- 形態素解析サーバー(juman), 形態素解析_1(R,R2),!. 形態素解析_2([],[],[]) :- !. 形態素解析_2([[A|R1]|R],[],[[A|R1]|R]) :- \+(A = (@)),!. 形態素解析_2([[@,A|_]|R],[A|R2],R3) :- 形態素解析_2(R,R2,R3),!. 形態素解析_3([],[]). 形態素解析_3([A|R],[A|R2]) :- \+(list(A)), '形態素解析_3(R,R2) . 形態素解析_3([A|R],[B|R2]) :- list(A), member(B,A), 形態素解析_3(R,R2) . 形態素解析_2_重複削除([],L1,L) :- reverse(L1,L),!. 形態素解析_2_重複削除([A|R],Y,X) :- member(A,Y), 形態素解析_2_重複削除(R,Y,X),!. 形態素解析_2_重複削除([A|R],Y,X) :- \+(member(A,Y)), 形態素解析_2_重複削除(R,[A|Y],X) . sh(Command,X) :- shs(Command,Y), findall(U,( member(V,Y), split(V,[' ',','],U)), X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは '[1-9]?[0-9]'(_文字列,_前文字列,_適合文字列,_後文字列) :- '0から99までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列). '0から99までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), '2文字以下の数字ならび'(L2), 前後の文字は数字ではない(L1,L3). '2文字以下の数字ならび'(L2) :- length(L2,_文字数), _文字数 =< 2, forall(member(A,L2),数字(A)). 前後の文字は数字ではない(L1,L3) :- \+((last(L1,_直前の文字),数字(_直前の文字))), \+((L3=[_直後の文字|_],数字(_直後の文字))),!. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # # 部分文字列が二回以上出現するかどうか調べる # 部分文字列の重複検査(_文字列) :- 部分文字列が二回以上出現するか調べる(_文字列,_二回以上出現する部分文字列),!. 部分文字列が二回以上出現するか調べる(_文字列,_二回以上出現する部分文字列) :- sub_atom(_文字列,S,Len,E,_二回以上出現する部分文字列), \+(_二回以上出現する部分文字列 = ''), 部分文字列が二回以上出現する(_文字列,S,Len,_二回以上出現する部分文字列). 部分文字列が二回以上出現する(_文字列,S,Len,_二回以上出現する部分文字列) :- S_2 is S + Len, sub_atom(_文字列,S_2,_,0,_残り文字列), sub_atom(_残り文字列,_,_,_,_二回以上出現する部分文字列),!. % 以下のサイトは # 例題の1つに、すべての製品を注文したすべての顧客の平均の売掛残高、および # すべての製品を注文していない顧客の平均の売掛残高を求めるといったものがありました。 % 単位節データベースを抽象するならば、 すべての製品を注文していない顧客の平均の売掛残高を求める(_すべての製品を注文していない顧客の平均の売掛残高) :- findall(_売掛残高,( すべての製品を注文していない顧客の売掛残高(_売掛残高)),_売掛残高ならび), 平均の売掛残高を求める(_売掛残高ならび,_すべての製品を注文していない顧客の平均の売掛残高). すべての製品を注文していない顧客の売掛残高(_売掛残高) :- すべての製品を注文していない顧客(_顧客), 売掛残高(_顧客,_売掛残高). すべての製品を注文していない顧客(_顧客) :- 顧客(_顧客), すべての製品を注文していない(_顧客). すべての製品を注文していない(_顧客) :- forall(商品(_商品),注文していない(_顧客,_商品)). 注文していない(_顧客,_商品) :- \+(注文(_顧客,_商品)). 平均の売掛残高を求める(_売掛残高ならび,_すべての製品を注文していない顧客の平均の売掛残高) :- 顧客数と売掛残高合計を得る(_売掛残高ならび,_顧客数,_売掛残高合計), 売掛残高合計と顧客数から平均売掛残高を求める(_売掛残高合計,_顧客数,_すべての製品を注文していない顧客の平均の売掛残高). 顧客数と売掛残高合計を得る(_売掛残高ならび,_顧客数,_売掛残高合計) :- length(_売掛残高ならび,_顧客数), sum_list(_売掛残高ならび,_売掛残高合計). 売掛残高合計と顧客数から平均売掛残高を求める(_売掛残高合計,_顧客数,_すべての製品を注文していない顧客の平均の売掛残高) :- _顧客数 > 0, _すべての製品を注文していない顧客の平均の売掛残高 is _売掛残高合計 / _顧客数. % 以下のサイトは # @seagull_kamome:のtwitter(20130630)に思いめぐらし # # sleep 1 unless x=0 # より # # if (x = 0) { # } else { # sleep 1; # } # # の方が読みやすいといっている変態の脳味噌を一度解剖してみたいわ 'sleep 1 unless x=0'(_x) :- 'xが0以外の時、1単位停止し、xが0の時は何もしない'(_x). 'if (x = 0) { } else { sleep 1; }'(_x) :- 'xが0以外の時、1単位停止し、xが0の時は何もしない'(_x). 'xが0以外の時、1単位停止し、xが0の時は何もしない'(_x) :- xが0以外の時(_x), '1単位停止し'. 'xが0以外の時、1単位停止し、xが0の時は何もしない'(_x) :- xが0の時(_x), 何もしない. xが0以外の時(_x) :- \+(_x=0). xが0の時(_x) :- _x = 0. '1単位停止し' :- sleep(1). 何もしない. % 以下のサイトは # @seagull_kamome:のtwitter(20130630)に思いめぐらし # # sleep 1 unless x=0 # より # # if (x = 0) { # } else { # sleep 1; # } # # の方が読みやすいといっている変態の脳味噌を一度解剖してみたいわ 'sleep 1 unless x=0'(_x) :- 'xが0以外の時、1単位停止し、xが0の時は何もしない'(_x). 'if (x = 0) { } else { sleep 1; }'(_x) :- 'xが0以外の時、1単位停止し、xが0の時は何もしない'(_x). 'xが0以外の時、1単位停止し、xが0の時は何もしない'(_x) :- xが0以外の時(_x), sleep(1). 'xが0以外の時、1単位停止し、xが0の時は何もしない'(_x) :- xが0の時(_x). xが0以外の時(_x) :- \+(_x=0). xが0の時(_x) :- _x = 0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/397 # # 質問です # # ●正規表現の使用環境 # PHP5.3.3 # # ●検索か置換か? # 置換 # # ●説明 # ・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 # ・それ以外ならaタグへ変換。 # ・URLに日本語が含まれていた場合も、スペースや改行、文字列の終端にくるまでのものも上記のようにリンク化 # # ●対象データ # [1] こちらへ→http://ime.nu/example.com/index.html # [2] 写真はこれです→https://example.com/写真.jpg # # ●希望する結果 # [1] こちらへ→<a href="http://ime.nu/example.com/index.html">http://example.com/index.html</a> # [2] 写真はこれです→<img src="https://example.com/写真.jpg" /> # # '・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 ・それ以外ならaタグへ変換。 '(_文字列,_imgタグ) :- 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列), 'jpg,png,gifならimgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ),!. '・URLが含まれていたときに、jpg,png,gifならimgタグへ変換。 ・それ以外ならaタグへ変換。 '(_文字列,_imgタグ) :- 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列), 'それ以外ならaタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_imgタグ). 'jpg,png,gifならimgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ) :- 'jpg,png,gifなら'(_URL部分文字列), 'imgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ). 'jpg,png,gifなら'(_URL部分文字列) :- sub_atom(_URL部分文字列,_,4,0,_サフィックス部分文字列), member(_サフィックス部分文字列,['.jpg','.png','.gif']). 'imgタグへ変換。'(_前文字列,_URL部分文字列,_後文字列,_imgタグ) :- atomic_list_concat([_前文字列,'',_後文字列],_imgタグ). 'それ以外ならaタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ) :- 'それ以外なら'(_URL部分文字列), 'aタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ). 'それ以外なら'(_URL部分文字列) :- sub_atom(_URL部分文字列,_,4,0,_サフィックス部分文字列), \+(member(_サフィックス部分文字列,['.jpg','.png','.gif'])). 'aタグへ変換'(_前文字列,_URL部分文字列,_後文字列,_aタグ) :- atomic_list_concat([_前文字列,'',_URL部分文字列,'',_後文字列],_aタグ). 'URL部分の切り出し'(_文字列,_前文字列,_URL部分文字列,_後文字列) :- sub_atom(_文字列,S,Len,R,A), member(A,['http://','file://','ftp://']), S_2 is S + Len, 'URL部分の切り出し'(_文字列,S,S_2,_前文字列,_URL部分文字列,_後文字列). 'URL部分の切り出し'(_文字列,S,S_2,_前文字列,_URL部分文字列,_後文字列) :- sub_atom(_文字列,S_2,_,0,_副文字列), 区切り文字で分割(_副文字列,_URL部分文字列,_後文字列), sub_atom(_文字列,0,S,_,_前文字列),!. 区切り文字で分割(_副文字列,_URL部分文字列,_後文字列) :- sub_atom(_副文字列,S,1,R,_文字), member(_文字,[' ','\t','\n']), sub_atom(_副文字列,0,S,R,_URL部分文字列), sub_atom(_副文字列,_,R,0,_後文字列),!. 区切り文字で分割(_URL部分文字列,_URL部分文字列,''). % 以下のサイトは ダイクストラ法による最短距離探索(_出発点,_距離,_最短経路,_確定集合) :- _確定集合_1 = [[_出発点,0,[_出発点]]], 初期の未確定集合を得る(_出発点,_未確定集合), ダイクストラ法による最短距離探索(_確定集合_1,_未確定集合,_確定集合). 初期の未確定集合を得る(_出発点,_初期未確定集合) :- setof([_出発点,9999,[]],[_点,_隣接点,_距離,_出発点] ^ ( 経路(_点,_隣接点,_距離), \+(_点 = _出発点)), _初期未確定集合). ダイクストラ法による最短距離探索(_確定集合,[],_確定集合). ダイクストラ法による最短距離探索([[_直前に確定した点,_距離,_経路]|R],_未確定集合_1,_確定集合) :- 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2), 未確定集合から最小距離点を抜き取る(_未確定集合_2,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_3), 確定集合に追加(_最小距離点,_最小距離,_最小経路点の経路,[[_直前に確定した点,_距離,_経路]|R],_確定集合_2), ダイクストラ法による最短距離探索(_確定集合_2,_未確定集合_3,_確定集合). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2) :- findall([_隣接点,_距離], 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離), LL), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,LL,_未確定集合_1,_未確定集合_2). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,[[_隣接点,_距離]|R],_未確定集合_1,_未確定集合_2) :- 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_3), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,R,_未確定集合_3,_未確定集合_2). 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離) :- 経路(_直前に確定した点,_隣接点,_距離), member([_隣接点,_,_],_未確定集合). 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_2) :- _距離_2 is _直前に確定した点までの距離 + _距離, append(L1,[[_隣接点,_距離_1,_経路_1]|L2],_未確定集合_1), _距離_1 > _距離_2, append(L1,[[_隣接点,_距離_1,[_隣接点|_直前に確定した点までの経路]]|L2],_未確定集合_2),!. 未確定集合の更新(_,_,_,_,_,_未確定集合,_未確定集合). 未確定集合から最小距離点を抜き取る(_未確定集合_1,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_2) :- append(L1,[[_最小距離点,_最小距離,_最小距離の経路]|L2],_未確定集合_1), forall(member([_,_距離_1,_],L1),_距離_1 >= _最小距離), forall(member([_,_距離_2,_],L1),_距離_2 >= _最小距離), append(L1,L2,_未確定集合_2),!. 確定集合に追加(_点,_距離,_経路,_確定集合_1,[[_点,_距離,_経路]|_確定集合_1]). % 以下のサイトは # # 文字列から数字列を検索する # 数字文字列を検索してその数値を得る(_文字列,_前文字列,_数字文字列,_後文字列,_数値) :- 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列), その数値を得る(_数字文字列,_数値). 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列) :- 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列). その数値を得る(_数字文字列,_数値) :- atom_number(_数字文字列,_数値). 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列) :- '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列), 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列), 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列). '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列) :- sub_atom(_文字列,_開始点,_長さ,_残り長さ,_数字文字列), _長さ > 0, 数字文字列である(_数字文字列), sub_atom(_文字列,0,_開始点,_,_前文字列), sub_atom(_文字列,_,_残り長さ,0,_後文字列). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(''). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列) :- sub_atom(_前文字列,_,1,0,_文字), 符号とピリオドを含む数字ではない(_文字). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(''). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列) :- sub_atom(_後文字列,0,1,_,_文字), 符号とピリオド含む数字ではない(_文字). 符号とピリオドを含む数字である('+'). 符号とピリオドを含む数字である('-'). 符号とピリオドを含む数字である('.'). 符号とピリオドを含む数字である(_文字) :- 数字である(_文字). 符号とピリオドを含む数字ではない(_文字) :- \+(符号とピリオドを含む数字である(_文字)). 数字である(_文字) :- _文字 @>= '0', _文字 @=< '9'. 数字ではない(_文字) :- \+(数字である(_文字)). 数字文字列である(_数字文字列) :- 'IEEE974等の浮動小数点数表示形式'(_数字文字列). 数字文字列である(_数字文字列) :- 全ての文字が数字である(_数字文字列), \+(数字列の禁則(_数字文字列)). 全ての文字が符号とピリオドを含む数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),符号とピリオドを含む数字である(_文字)). 全ての文字が数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),数字である(_文字)). 'IEEE974等の浮動小数点数表示形式'(_数字文字列) :- sub_atom(_数字文字列,S,2,R,_二文字), member(_二文字,['E+','E-','e+','e-']), 二文字は先頭または末尾にはこない(S,R), 前後文字列の形式が正しい(_数字文字列,S,R). 二文字は先頭または末尾にはこない(S,R) :- S > 0, R > 0. 前後文字列の形式が正しい(_数字文字列,S,R) :- sub_atom(_数字文字列,0,S,_,_数字文字列_1), sub_atom(_数字文字列,_,S,0,_数字文字列_2), 全ての文字が符号とピリオドを含む数字である(_数字文字列_1), 全ての文字が数字である(_数字文字列_2). 数字列の禁則(_数字文字列) :- ピリオドが2個以上ある(_数字文字列),!. 数字列の禁則(_数字文字列) :- ピリオドが先頭文字か末尾文字にある(_数字文字列),!. 数字列の禁則(_数字文字列) :- 'ピリオドの前後に+か-がある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '+が先頭文字以外にある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '-が先頭文字以外にある'(_数字文字列),!. ピリオドが2個以上ある(_数字文字列) :- findall(1,sub_atom(_数字文字列,_,1,_,'.'),L), length(L,_度数), _度数 > 1,!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,0,1,_,'.'),!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,_,1,0,'.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'+.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'-.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.+'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.-'),!. '+が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'+'), _開始点 > 0,!. '-が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'-'), _開始点 > 0,!. % 以下のサイトは 偶数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,Len1,_,Len2,_適合文字列), 適合文字列は数字だけで構成される(_適合文字列), 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列), 適合文字列を数値に変換すると偶数になる(_適合文字列). 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列) :- sub_atom(_文字列,0,Len1,_,_前文字列), sub_atom(_文字列,_,Len2,0,_後文字列). 適合文字列は数字だけで構成される(_文字列) :- \+(_文字列=''), forall(sub_atom(_文字列,_,1,_,_数字),数字(_数字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列) :- \+((sub_atom(_前文字列,_,1,0,A),数字(A))), \+((sub_atom(_後文字列,0,1,_,B),数字(B))). 適合文字列を数値に変換すると偶数になる(_適合文字列) :- 適合文字列を数値に変換すると(_適合文字列,_数値), 偶数になる(_数値). 適合文字列を数値に変換すると(_適合文字列,_数値) :- atom_chars(_適合文字列,Chars), number_chars(_数値,Chars). 偶数になる(N) :- 1 is N mod 2. 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 奇数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,Len1,_,Len2,_適合文字列), 適合文字列は数字だけで構成される(_適合文字列), 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列), 適合文字列を数値に変換すると奇数になる(_適合文字列). 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列) :- sub_atom(_文字列,0,Len1,_,_前文字列), sub_atom(_文字列,_,Len2,0,_後文字列). 適合文字列は数字だけで構成される(_文字列) :- \+(_文字列=''), forall(sub_atom(_文字列,_,1,_,_数字),数字(_数字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列) :- \+((sub_atom(_前文字列,_,1,0,A),数字(A))), \+((sub_atom(_後文字列,0,1,_,B),数字(B))). 適合文字列を数値に変換すると奇数になる(_適合文字列) :- 適合文字列を数値に変換すると(_適合文字列,_数値), 奇数になる(_数値). 適合文字列を数値に変換すると(_適合文字列,_数値) :- atom_chars(_適合文字列,Chars), number_chars(_数値,Chars). 奇数になる(N) :- 1 is N mod 2. 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 奇数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- 数値候補の取り出し(L,L1,L2,L3,N), 1 is N mod 2, atom_chars(_前文字列,L1), atom_chars(_適合文字列,L2), atom_chars(_後文字列,L3). 数値候補の取り出し(L,L1,L2,L3,N) :- atom_chars(_文字列,L), append(L1,L2,L3,L), すべてが数字(L2), 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2), number_chars(N,L2). すべてが数字([]). すべてが数字([A|R]) :- 数字(A), すべてが数字(R). 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2) :- \+((last(L1,A),数字(A))), \+((L=[B|_],数字(B))). 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 偶数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- 数値候補の取り出し(L,L1,L2,L3,N), 0 is N mod 2, atom_chars(_前文字列,L1), atom_chars(_適合文字列,L2), atom_chars(_後文字列,L3). 数値候補の取り出し(L,L1,L2,L3,N) :- atom_chars(_文字列,L), append(L1,L2,L3,L), すべてが数字(L2), 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2), number_chars(N,L2). すべてが数字([]). すべてが数字([A|R]) :- 数字(A), すべてが数字(R). 'L1の最後の文字とL2の最初の文字は数字ではない'(L1,L2) :- \+((last(L1,A),数字(A))), \+((L=[B|_],数字(B))). 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/159 # # [1] 授業単元:タンシバへの挑戦状 # [2] 問題文:入力された正の整数をローマ数字に変換するプログラムを作れ。 # 正の整数をローマ数字に変換(_正の整数,_ローマ数字) :- 正の整数をローマ数字に変換([1,4,5,9,10,40,50,90,100,400,500,900,1000],['I','IV','V','IX','X','XL','L','XC','C','CD','D','CM','M'],_正の整数,_ローマ数字). 正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :- '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字). 正の整数をローマ数字に変換(L1,L2,_正の整数,_ローマ数字) :- '正の整数がL1に存在しない場合はL2から正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_1), '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2), concat_atom(_ローマ数字_1,_ローマ数字_2,_ローマ数字). '正の整数がL1に存在した時はL2から対応するローマ数字を得る'(L1,L2,_正の整数,_ローマ数字) :- nth1(_nth1,L1,_正の整数), nth1(_nth1,L2,_ローマ数字),!. '正の整数がL1に存在しない場合は正の整数より小さくかつ最大のローマ数字単位とローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字) :- 正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位), 正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字). 正の整数より小さくかつ最大のローマ数字単位(L1,L0,_ローマ数字単位) :- append(L0,[_ローマ字数字単位|R],L1), _ローマ字数字単位 < _正の整数, \+((member(_ローマ字数字単位_1,R),_ローマ字数字単位_1 < _正の整数)). 正の整数より小さくかつ最大のローマ数字(L2,L0,_ローマ数字) :- length(L0,_nth0), nth0(_nth0,L2,_ローマ数字). '正の整数からローマ数字単位を引いた整数のローマ数字を得る'(L1,L2,_正の整数,_ローマ数字単位,_ローマ数字_2) :- _差分整数 is _正の整数 - _ローマ数字単位, 正の整数をローマ数字に変換(L1,L2,_差分整数,_ローマ数字_2). % 以下のサイトは 素数生成(_素数) :- 素数生成(2,[],_素数). 素数生成(N,L,_素数) :- 素数検査(N,L,L_2,_診断), 素数生成(N,L_2,_診断,_素数). 素数検査(_素数,L,[_素数|L],素数) :- forall(member(_素数_1,L),\+(0 is _素数 mod _素数_1)),!. 素数検査(N,L,L,素数ではない). 素数生成(_素数,_,素数,_素数). 素数生成(N,L,_診断,_素数) :- N_2 is N + 1, 素数生成(N_2,L,_素数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1370255305/119 # # [1] 授業単元:課題 # [2] 問題文(含コード&リンク): # 自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき # 最終的に 1 収束するものを Happy number と呼ぶ。 # # 28…〇 # 2^2 + 8^2 = 68 # 6^2 + 8^2 = 100 # 1^2 + 0^2 + 0^2 = 1 # # 89…× # 8^2 + 9^2 = 145 # 1^2 + 4^2 + 5^2 = 42 # 4^2 + 2^2 = 20 # 2^2 + 0^2 = 4 # # 1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。 # '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき 最終的に 1 収束するものを Happy number と呼ぶ。 28…〇 2^2 + 8^2 = 68 6^2 + 8^2 = 100 1^2 + 0^2 + 0^2 = 1 89…× 8^2 + 9^2 = 145 1^2 + 4^2 + 5^2 = 42 4^2 + 2^2 = 20 2^2 + 0^2 = 4 1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび) :- '1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび). '1 <= n <= 10000 とした時の全ての Happy number を列挙せよ。'(_Happy_numberならび) :- findall(_n,( between(1,1000,_n), 'Happy number'(_n)), _Happy_numberならび). 'Happy number'(_n) :- '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_n,[]). '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(1,_) :- !. '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_n,L) :- \+(member(_n,L)), '自然数 n の各桁の数を2乗しその和を求める。'(_n,0,_各桁の数の2乗の和), '自然数 n の各桁の数を2乗しその和を求める。できた数値も同様に繰り返していき最終的に 1 収束するものを Happy number と呼ぶ。'(_各桁の数の2乗の和,[_n|L]). '自然数 n の各桁の数を2乗しその和を求める。'(0,_各桁の数の2乗の和,_各桁の数の2乗の和) :- !. '自然数 n の各桁の数を2乗しその和を求める。'(_n,_s_1,_各桁の数の2乗の和) :- _n_1 is _n mod 10, _n_2 is _n // 10, _s_2 is _s_1 + (_n_1 * _n_1), '自然数 n の各桁の数を2乗しその和を求める。'(_n_2,_s_2,_各桁の数の2乗の和). % 以下のサイトは 順に置換していく(_置換対象要素,_置換要素,_置換対象ならび,_置換されたならび) :- _置換対象ならび = [_要素_1|_残りならび], 要素が置換対象要素の場合は置換する(_置換対象要素,_置換要素,_要素_1,_要素_2), 順に置換していく(_置換対象要素,_置換要素,_要素_2,_残りならび,_置換されたならび). 順に置換していく(_置換対象要素,_置換要素,_置換要素,_残りならび,[_置換要素|_残りならび]). 順に置換していく(_置換対象要素,_置換要素,_要素,_残りならび_1,[_要素|_残りならび_2]) :- 順に置換していく(_置換対象要素,_置換要素,_残りならび_1,_残りならび_2). 要素が置換対象要素の場合は置換する(_置換対象要素,_置換要素,_置換対象要素,_置換要素). 要素が置換対象要素の場合は置換する(_置換対象要素,_,_要素,_要素) :- \+(_置換対象要素=_要素). % ?- 順に置換していく(a,x,[f,a,y,a,b],L). % % L = [f,x,y,a,b]; % L = [f,x,y,x,b]; % false. % ?- % 以下のサイトは # # Aを置換対象要素 # Bを置換要素 # 第三引数に対象リスト # 第四引数に置換されたリスト # 置換(_置換対象要素,_置換要素,[_置換対象要素|R],L) :- 置換_1(_置換対象要素,_置換要素,R,L). 置換(_置換対象要素,_置換要素,[_要素|R1],[_要素|R2]) :- \+(_置換対象要素=_要素), 置換(_置換対象要素,_置換要素,R1,R2). 置換_1(_,_置換要素,R,[_置換要素|R]). 置換_1(_置換対象要素,_置換要素,R1,[_置換要素|R2]) :- 置換(_置換対象要素,_置換要素,R1,R2). % ?- 置換(a,x,[f,a,y,a,b],L). % % L = [f,x,y,a,b]; % L = [f,x,y,x,b]; % false. % ?- % 以下のサイトは # # Aを置換対象要素 # Bを置換要素 # 第三引数に対象リスト # 第四引数に置換されたリスト # 置換(A,B,[A|R],L) :- 置換_1(A,B,R,L). 置換(A,B,[C|R1],[C|R2]) :- \+(A=C), 置換(A,B,R1,R2). 置換_1(A,B,R,[B|R]). 置換_1(A,B,R1,[B|R2]) :- 置換(A,B,R1,R2). % ?- 置換(a,x,[f,a,y,a,b],L). % % L = [f,x,y,a,b]; % L = [f,x,y,x,b]; % false. % ?- % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/370 # # ●Regular Expressionの使用環境 # ActivePerl5.8 # # ●検索か置換か? # 検索 # # ●説明 # 連続する数を検索したい(1965から2011までの数) # # ●対象データ(配列内に格納) # 1952 # 1965 # 1986 # 2012 # 1972 # 2011 #  ・ #  ・ # ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) # 1965 # 1986 # 1972 # 2011 #  ・ #  ・ # # 配列の各要素が1955から2011までの数の場合にマッチする正規表現を教えてください # # '●検索か置換か? 検索 ●説明 連続する数を検索したい(1965から2011までの数) ●対象データ(配列内に格納) 1952 1965 1986 2012 1972 2011  ・  ・ ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) 1965 1986 1972 2011  ・  ・'(_文字列,_前文字列,_適合文字列,_後文字列) :- '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列). '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列). '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列) :- '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N), atom_chars(_前文字列,L1), atom_chars(_後文字列,L3), atom_chars(_適合文字列,L2). '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N) :- append(L1,L2,L3,_文字ならび), 全てが数字(L2), 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3), number_chars(_数,L2), '1965から2011までの数'(_数). 全てが数字(_ならび) :- forall(member(_数字,_ならび),数字(_数字)). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3) :- 'L1の最後の文字は数字ではない'(L1), 'L3の最初の文字は数字では無い'(L3). 'L1の最後の文字は数字ではない'(L1) :- \+((last(L1,A),数字(A))). 'L3の最初の文字は数字では無い'(L3) :- \+(([B|_]=L3,数字(B))). '1965から2011までの数'(_数) :- between(1965,2011,_数). % 以下のサイトは # 出典:: http://stackoverflow.com/questions/17029097/prolog-creating-list-with-consecutive-numbers # # I'm newbie in Prolog and I've tried to create a list. # For example when I write mazeCreator(3,List). # I want to push every number like 1/1,1/2,1/3,2/1,2/2,2/3,3/1,3/2,3/3 in a list.To do this, # I wrote a predicate but It does not work, # Is there anyone who can help me ? Thanks in advance!. mazeCreater(M,L) :- mazeCreater(1,M,L). mazeCreater(N,M,[]) :- N > M,!. mazeCreater(N,M,L) :- mazeCreater(1,N,M,L1,L), N_2 is N + 1, mazeCreater(N_2,M,L1). mazeCreater(J,N,M,L,L) :- J > M,!. mazeCreater(J,N,M,L1,[N/J|R]) :- J_2 is J + 1, mazeCreater(J_2,N,M,L1,R). % 以下のサイトは # 出典:: http://stackoverflow.com/questions/17029097/prolog-creating-list-with-consecutive-numbers # # I'm newbie in Prolog and I've tried to create a list. # For example when I write mazeCreator(3,List). # I want to push every number like 1/1,1/2,1/3,2/1,2/2,2/3,3/1,3/2,3/3 in a list.To do this, # I wrote a predicate but It does not work, # Is there anyone who can help me ? Thanks in advance!. mazeCreater(M,L) :- findall(J/K,( between(1,M,J), between(1,M,K)),L). ?- nojiri('stackoverflow_17029097.html'). yes. ?- % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/952 # # MySQLについての質問です。 # # highscoreというテーブルに、id, scoreという2つのカラムがあります。 # idのインデックスはPRIMARYです。 # # POSTでidとscoreの値が送られてきたとき、 # そのidが既に登録されている場合、送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、 # 送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたいのですが、 # 条件分岐の部分でどのようなSQLを書けばよいのか検討がつきません。 # # 何かヒントをいただければ幸いです。よろしくお願いします。 # # :- dynamic(highscore/2). 'highscoreというテーブルに、id, scoreという2つのカラムがあります。 idのインデックスはPRIMARYです。 POSTでidとscoreの値が送られてきたとき、 そのidが既に登録されている場合、 送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、 送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたい'(_id,_score) :- 'そのidが既に登録されている場合、 送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、 送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたい'(_id,_score). 'そのidが既に登録されている場合、 送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、 送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたい'(_id,_score) :- 'そのidが既に登録されている場合、 送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し'(_id,_score). 'そのidが既に登録されている場合、 送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し、 送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたい'(_id,_score) :- '送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたい'(_id,_score). 'そのidが既に登録されている場合、 送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し'(_id,_score) :- 'そのidが既に登録されている場合'(_id), '送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し'(_id,_score). '送られてきたidがまだテーブルに存在しなければ、新規レコードとしてINSERTしたい'(_id,_score) :- '送られてきたidがまだテーブルに存在しなければ'(_id), '新規レコードとしてINSERTしたい'(_id,_score). 'そのidが既に登録されている場合'(_id) :- highscore(_id,_). '送られてきたidがまだテーブルに存在しなければ'(_id) :- \+(highscore(_id,_)). '送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し'(_id,_score) :- '送られてきたscoreが登録されているscoreより大きければ'(_id,_score), 'そのidのscoreを更新し'(_id,_score). '送られてきたscoreが登録されているscoreより大きければ、そのidのscoreを更新し'(_,_). '送られてきたscoreが登録されているscoreより大きければ'(_id,_score) :- highscore(_id,_score_1), _score @> _score_1. 'そのidのscoreを更新し'(_id,_score) :- retract(highscore(_id,_)), assertz(highscore(_id,_score)),!. '新規レコードとしてINSERTしたい'(_id,_score) :- assertz(highscore(_id,_score)). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 色(赤). 色(青). 色(緑). 塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,塗り分け(_塗り分けならび),_塗り分けならび). 全色塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,全色塗り分け(_塗り分けならび),_塗り分けならび). 塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名と色の対ならび(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), 色ならび(_色ならび), 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 色ならび(_色ならび) :- findall(_色,色(_色),_色ならび). 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび) :- length(_領域名ならび,Len), length(_塗り分けならび,Len), findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),領域が隣接している(A,B)),\+(member([B,C],_塗り分けならび))). 領域が隣接している(A,A) :- 領域が孤立している,!,fail. 領域が隣接している(A,B) :- 隣接(A,B). 領域が孤立している. % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(_塗り分けならび,Len), findall(_塗り分けならび,塗り分け(_領域名ならび,_色ならび,_塗り分けならび),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),隣接(A,B)),\+(member([B,C],_塗り分けならび))). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), 色検査(LL). 全色塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), forall(member(_色,_色ならび),member([_,_色],LL)), 色検査(LL). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,LL) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,LL,_色)), LL). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(L) :- forall((member([A,C],L),隣接(A,B)),\+(member([B,C],L))). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/855 # # [1]C言語初級課題 # [2]次のコードは、キーボードから0から9までの4つの数を # 受け取って小さい順から書き出すプログラムの未完成版である。 # コードを完成させなさい。fgetsでキーボードから文字列を受け取り、 # それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、 # 範囲にない場合は再入力を促し再入力させること。 # # #include <stdio.h> # #inckude <stdlib.h> # int main(void){ # char s[1024];//fgets関数に与える文字列バッファ # char *t;//fgets戻り値格納用 # int n;//atoi関数の戻り値格納用 # { # //この部分にコードを追加してコードを完成させてください。 # return(0); # } # [3] Windows 7/Microsoft SDK/C言語 # [4]5/31まで # [5]簡単な課題だそうですが、手こずってます。どうかよろしくお願いします。 # # 'キーボードから0から9までの4つの数を受け取って小さい順から書き出す。キーボードから文字列を受け取り、それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、範囲にない場合は再入力を促し再入力させること' :- キーボードから0から9までの4つの数を受け取って(_4つの数ならび), 小さい順から書き出す(_4つの数ならび),!. キーボードから0から9までの4つの数を受け取って([]) :- !. キーボードから0から9までの4つの数を受け取って([_整数|R]) :- キーボードから文字列を受け取り(_文字列), 整数に変換し(_文字列,_整数), キーボードから0から9までの4つの数を受け取って(R). キーボードから0から9までの4つの数を受け取って(L) :- キーボードから0から9までの4つの数を受け取って(L). キーボードから文字列を受け取り(_文字列) :- write('0から9の範囲の整数を入力して下さい : '), get_line(_文字列). 整数に変換し(_文字列,_整数) :- atom_to_term(_文字列,_整数,_), integer(_整数), 0から9までの範囲にあるか確認し(_整数),!. 0から9までの範囲にあるか確認し(_整数) :- _整数 >= 0, _整数 =< 9,!. 0から9までの範囲にあるか確認し(_整数) :- write('受け取った%tは0から9の範囲にありません。再入力をお願いします。\n'), fail. 小さい順から書き出す([]) :- write('\n'). 小さい順から書き出す(L) :- 最小値(L,A,L1), writef('%t ',[_最小値]), 小さい順から書き出す(L1). 最小値(L,A,L1) :- append(L0,[A|R],L), \+((member(B,L0),B @< A)), \+((member(C,R),C @< A)), append(L0,R,L1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/855 # # [1]C言語初級課題 # [2]次のコードは、キーボードから0から9までの4つの数を # 受け取って小さい順から書き出すプログラムの未完成版である。 # コードを完成させなさい。fgetsでキーボードから文字列を受け取り、 # それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、 # 範囲にない場合は再入力を促し再入力させること。 # # #include <stdio.h> # #inckude <stdlib.h> # int main(void){ # char s[1024];//fgets関数に与える文字列バッファ # char *t;//fgets戻り値格納用 # int n;//atoi関数の戻り値格納用 # { # //この部分にコードを追加してコードを完成させてください。 # return(0); # } # [3] Windows 7/Microsoft SDK/C言語 # [4]5/31まで # [5]簡単な課題だそうですが、手こずってます。どうかよろしくお願いします。 # # 'キーボードから0から9までの4つの数を受け取って小さい順から書き出す。キーボードから文字列を受け取り、それをatoi関数で整数に変換し、0から9までの範囲にあるか確認し、範囲にない場合は再入力を促し再入力させること' :- キーボードから0から9までの4つの数を受け取って(_4つの数ならび), 小さい順から書き出す(_4つの数ならび),!. キーボードから0から9までの4つの数を受け取って([]) :- !. キーボードから0から9までの4つの数を受け取って([_整数|R]) :- キーボードから文字列を受け取り(_文字列), 整数に変換し(_文字列,_整数), キーボードから0から9までの4つの数を受け取って(R). キーボードから0から9までの4つの数を受け取って(L) :- キーボードから0から9までの4つの数を受け取って(L). キーボードから文字列を受け取り(_文字列) :- write('0から9の範囲の整数を入力して下さい : '), get_line(_文字列). 整数に変換し(_文字列,_整数) :- atom_to_term(_文字列,_整数,_), integer(_整数), 0から9までの範囲にあるか確認し(_整数),!. 0から9までの範囲にあるか確認し(_整数) :- _整数 >= 0, _整数 =< 9,!. 0から9までの範囲にあるか確認し(_整数) :- write('受け取った%tは0から9の範囲にありません。再入力をお願いします。\n'), fail. 小さい順から書き出す([]) :- write('\n'). 小さい順から書き出す(L) :- 最小値(L,A,L1), writef('%t ',[_最小値]), 小さい順から書き出す(L1). 最小値(L,A,L1) :- append(L0,[A|R],L), \+((member(B,L0),B @< A)), \+((member(C,R),C @< A)), append(L0,R,L1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/835 # # お願いします。 # [1] 授業単元:情報処理演習 # [2] 問題文:3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表 # 示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表 # 示するようにすること. # '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.' :- '3 つの整数a, b, s を入力として'(_a,_b,_s), 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y), それらを表示する(_a,_b,_s,_x,_y),!. '3 つの整数a, b, s を入力として, ax + by = s を満たす整数x, y を一組求めてそれらを表示するプログラムを作成せよ. ただし, 望みの整数x, y が存在しないときは, その旨を表示するようにすること.'(_a,_b,_s) :- 'ただし、望みの整数x, y が存在しないときは, その旨を表示する'. '3 つの整数a, b, s を入力として'(_a,_b,_s) :- 整数を得る('ax+by=s のa',true,_a), 整数を得る('ax+by=s のb',true,_b), 整数を得る('ax+by=s のs',true,_s). 'ax + by = s を満たす整数x, y を一組求めて'(_a,_b,_s,_x,_y) :- _a_1 is _a * -1, _b_1 is _b * -1, for(_a_1,_x,_a), for(_b_1,_y,_b), _s is _a * _x + _b * _y. それらを表示する(_a,_b,_s,_x,_y) :- write(' ax + by = s\n'), writef('%t*%t + %t*%t = %t\n',[_a,_x,_b,_y,_s]). 'ただし, 望みの整数x, y が存在しないときは, その旨を表示する' :- writef('望みのx,yが存在しません。\n'). for(S,N,E) :- E >= S, for_2(S,N,E). for(S,N,E) :- E < S, 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). 整数を得る(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([]. % 以下のサイトは # http://toro.2ch.net/test/read.cgi/tech/1364009659/344 # # uniq :: Eq a => [a] -> [a] # uniq [] = [] # uniq [x] = [x] # uniq (x1:xs@(x2:_)) # | x1 == x2 = uniq xs # | otherwise = x1 : uniq xs # 'uniq :: Eq a => [a] -> [a] uniq [] = [] uniq [x] = [x] uniq (x1:xs@(x2:_)) | x1 == x2 = uniq xs | otherwise = x1 : uniq xs'(L1,L2) :- uniq(L1,L2). uniq(L1,L2) :- findall(E,( append(_,[E|R],L1), \+(member(E,R))), L2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354393458/ # # # お題:ヴィジュネル暗号で暗号・復号化する関数を作成せよ。 # ・平文は "programming" とする。 # ・鍵は任意とする。 # ヴィジュネル復号化(_平文,_鍵,_暗号文) :- \+(atom(_平文)), atom_chars(_暗号文,_暗号文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_平文,_平文文字ならび). ヴィジュネル暗号化(_平文,_鍵,_暗号文) :- atom(_平文), atom_chars(_平文,_平文文字ならび), atom_chars(_鍵,_鍵文字ならび), ヴィジュネル暗号(_平文文字ならび,_鍵文字ならび,_暗号文文字ならび), atom_chars(_暗号文,_暗号文文字ならび). ヴィジュネル暗号([],_,[]). ヴィジュネル暗号([_文字|R1],_鍵文字ならび,[_暗号文字|R3]) :- ヴィジュネル暗号の文字変換(_文字,_鍵文字ならび,_一文字回転した鍵文字ならび,_暗号文字), ヴィジュネル暗号(R1,_一文字回転した鍵文字ならび,R3). ヴィジュネル暗号の文字変換(_文字,[_鍵文字|R2],_一文字回転した鍵文字ならび,_暗号文字) :- ならびの回転(左方向,_,['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'],[_鍵文字|R]), nth1(_nth1,[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],_文字), nth1(_nth1,[_鍵文字|R],_暗号文字), ならびの回転(左方向,1,[_鍵文字|R2],_一文字回転した鍵文字ならび),!. % 以下のサイトは # phpなんですが # enarikazukiって文字列にマッチするのを作りたいんですが # testenarikazukwwww→i○ # #enarikazuki→× # enarikazukiって→○ # enarikazuki→○ # みたいに前後に何がついてもいいんですが、前に#がついた場合のみ # マッチしないようにするってのはどうすりゃいいんでしょうか? # 'enarikazukiって文字列にマッチするのを作りたいんですが testenarikazukwwww→i○ #enarikazuki→× enarikazukiって→○ enarikazuki→○ みたいに前後に何がついてもいいんですが、前に#がついた場合のみ マッチしないようにするってのはどうすりゃいいんでしょうか?'(_文字列,_前文字列,enarikazuki,_後文字列) :- sub_atom(_文字列,_開始文字位置,_長さ,_残り文字数,enarikazuki), sub_atom(_文字列,0,_開始文字位置,_,_前文字列), \+(sub_atom(_前文字列,_,1,0,#)), sub_atom(_文字列,_,_残り文字数,0,_後文字列). % 以下のサイトは # phpなんですが # enarikazukiって文字列にマッチするのを作りたいんですが # testenarikazukwwww→i○ # #enarikazuki→× # enarikazukiって→○ # enarikazuki→○ # みたいに前後に何がついてもいいんですが、前に#がついた場合のみ # マッチしないようにするってのはどうすりゃいいんでしょうか? # 'enarikazukiって文字列にマッチするのを作りたいんですが testenarikazukwwww→i○ #enarikazuki→× enarikazukiって→○ enarikazuki→○ みたいに前後に何がついてもいいんですが、前に#がついた場合のみ マッチしないようにするってのはどうすりゃいいんでしょうか?'(_文字列,_前文字列,_適合文字列,_後文字列) :- 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_文字列,_前文字列,_適合文字列,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列_1,enarikazuki,_後文字列_1,L1,L2,L3), \+(last(L1,#)), 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列_1,enarikazuki,_後文字列_1,_前文字列,_適合文字列,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列,enarikazuki,_後文字列,_前文字列,enarikazuki,_後文字列). 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_前文字列_1,enarikazuki,_後文字列_1,_前文字列,enarikazuki,_後文字列) :- 'enarikazukiって文字列にマッチするのを作りたい。ただし#enarikazukiは避ける'(_後文字列,_前文字列_2,enarikazuki,_後文字列), atomic_list_concat([_前文字列_1,erarikazuki,_前文字列_2],_前文字列). % 以下のサイトは # ●問題文 # <b>タグのように開始タグの部分にマッチする正規表現を最小限の階数のキャプチャを用いて書きなさい。 # タグ名は1文字以上の英単語であり、属性には「>」以外の任意の文字を使えるものとする。 # ●例文 # <b>ゴレイヌさん</b>は、えげつねぇ・・・<font color="red">ゴレイヌさん</font>は # えげつねぇ。。。<font color="blue">富樫仕事</font>しろ。 # ●マッチする例 # <b> # <font color="red"> # <font color="blue"> # # ●答え # <(?:\w+)(?:\s+[^>]*)*> # ●解説 # 「<」と「>」に囲まれた部分にマッチさせればよいのですが、属性付きのタグを考慮しなくてはいけません。 # また、最小限のキャプチャという条件があるため、グループ化のみでキャプチャを必要としない場所では「(?:)」を使います。 # この問題の場合には、1回もキャプチャを使わずに記述する事が可能です。 # # と、あるのですが # <\w+(?:\s+[^>]*)*> # でないかと思っています。 # \w+はグループ化する必要がそもそもあるのでしょうか? # '<b>タグのように開始タグの部分にマッチする'(_文字列,_前文字列,_開始タグ,_後文字列) :- 開始タグを切り出す(_文字列,_前文字列_1,_開始タグ_1,_後文字列_1), 開始タグ名は1文字以上の英単語であり(_開始タグ_1), '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_開始タグ_1,_後文字列_1,_前文字列,_開始タグ,_後文字列). '<b>タグのように開始タグの部分にマッチする'(_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- '<b>タグのように開始タグの部分にマッチする'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 開始タグを切り出す(_前文字列,_開始タグ,_後文字列) :- sub_atom(_文字列,St,Len,R,_開始タグ), 開始タグ(_開始タグ), sub_atom(_文字列,0,St,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. 開始タグ(_開始タグ) :- sub_atom(_開始タグ,0,1,_,<), \+(sub_atom(_開始タグ,0,2,_,'). '開始タグの情報部分は>を含まない'(_開始タグ) :- sub_atom(_開始タグ,1,_,1,_開始タグの情報部分), \+(sub_atom(_開始タグの情報部分,_,1,_,>)),!. 開始タグ名は1文字以上の英単語であり(_開始タグ) :- 開始タグ名は(_開始タグ,_開始タグ名), '1文字以上の英単語である'(_開始タグ名),!. 開始タグ名は(_開始タグ,_開始タグ名) :- sub_atom(_開始タグ,1,_,1,_開始タグの情報部分), 開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名),!. 開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名) :- sub_atom(_開始タグの情報部分,St,1,_,' '), sub_atom(_開始タグの情報部分,0,St,_,_開始タグ名),!. 開始タグ名を切り出す(_開始タグ名,_開始タグ名). '1文字以上の英単語である'(_タグ名の文字ならび) :- forall(sub_atom(_開始タグ名,_,1,_,A),英文字か数字(A)). 英文字か数字(A) :- 英文字(A). 英文字か数字(A) :- 数字(A). 英文字(A) :- A @>= 'a', A @=< 'z',!. 英文字(A) :- A @>= 'A', A @=< 'Z',!. 数字(A) :- A @>= '0', A @=< '9',!. % 以下のサイトは # 無題 投稿者:774 投稿日:2013/04/16(Tue) 17:04 No.6 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # 一次配列を指定した数参照(例だと3つ),配列の終わりに到達したら,最初に戻る. # これを数回繰り返すプログラム(例1) # また,例1で特定の条件を満たす場合,次回はその条件を満たした配列の次からスタート. # ※例2:条件を満たす数が複数含まれている場合,後ろを優先 # 例1 # a[4]={1,2,3,4,5} # 回数3 # 1回目 a[0]=1,a[1]=2,a[2]=3 # 2回目 a[3]=4,a[4]=5,a[0]=1 # 3回目 a[1]=2,a[2]=3,a[3]=4 # # 例2 # 条件:2の倍数→2と4 # a[5]={1,2,3,4,5,6} # 回数5 # 1回目 a[0]=1,a[1]=2,a[2]=3 # ※a[1]が条件を満たすので,次回はa[2]から # 2回目 a[2]=3,a[3]=4,a[4]=5 # ※a[3]が条件を満たすので,次回はa[4]から # 3回目 a[4]=5,a[5]=6,a[0]=1 # 4回目 a[1]=2,a[2]=3,a[3]=4 # ※a[1],a[3]が条件を満たすので,次回はa[4]から # 5回目 a[4]=5,a[5]=6,a[0]=1 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン:gcc v3.3 #  [3.3] 言語:C # [4] 期限: 4/18 # [5] その他の制限:stdio.h stdlib.hのみ # わかりにくい問題でごめんなさい。ヒントだけでもよろしくお願いします。 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(_参照) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照), Ln = [],!. 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,_参照) :- ならびを入力する(_ならび), 繰り返し回数を入力する(_回数,_限界回数L), 参照限界数を入力する(_参照限界数,_参照限界数L), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],_参照限界数L,[],_回数L,_ならび,_ならび,[],_参照), _回数L = _限界回数L. ならびを入力する(_ならび) :- write('ならびを項として入力してください(ピリオドで終わる) : '), read(_ならび). 繰り返し回数を入力する(_回数,Ln) :- 整数を得る(繰り返し回数,_回数 > 0,_回数), length(Lmax,_回数). 参照限界数を入力する(_参照限界数,Lmax) :- 整数を得る(参照限界数,_参照限界数 > 0,_参照限界数), length(Ln,_参照限界数). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L,_回数L,_,_,L1,L) :- reverse(L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Lmax,Lmax,_回数L_1,_回数L,_ならび_1,_ならび,L1,L) :- 次の開始ならびを決める(L1,_ならび,_ならび_2), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([],Lmax,[_|_回数L_1],_回数L,_ならび_2,_ならび,[],L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[],_ならび,L1,L) :- 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,_ならび,_ならび,L1,L). 'ならびを指定した数参照,終わりに到達したら,最初に戻る'(Ln,Lmax,_回数L_1,_回数L,[_値|R1],_ならび,L1,L) :- 参照位置を得る([_値|R1],_ならび,_参照位置), 'ならびを指定した数参照,終わりに到達したら,最初に戻る'([_|Ln],Lmax,_回数L_1,_回数L,R1,_ならび,[[_参照位置,_値]|R2],L). 参照位置を得る(L1,_ならび,N) :- append(L0,L1,_ならび), length(L0,N),!. 次の開始ならびを決める(L1,_ならび,_ならび_2) :- 値が偶数でそれより後にリセットされていない(L1,_nth0,_値,L0), length(L0_1,_nth0), append([_|L0_1],_ならび_2,_ならび),!. 次の開始ならびを決める(L1,_,L1). 値が偶数でそれより後にリセットされていない(L1,_nth0,_値,L0) :- append(L0,[[_nth0,_値]|R],L1), 偶数(_値), \+(member([0,_],L0)),!. 偶数(_値) :- 0 is _値 mod 2. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/747 # # MySQL 5.5.29 # # ┏━┳━━┳━━┓ # ┃no┃.date┃名前┃ # ┣━╋━━╋━━┫ # ┃.1 ┃12-3┃榊  ┃ # ┣━╋━━╋━━┫ # ┃.2 ┃12-3┃山下┃ # ┣━╋━━╋━━┫ # ┃.3 ┃12-3┃斎藤┃ # ┣━╋━━╋━━┫ # ┃.4 ┃12-4┃山下┃ # ┣━╋━━╋━━┫ # ┃.5 ┃12-4┃斎藤┃ # ┗━┻━━┻━━┛ # # result: # no:1 # 名前:榊 # # このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したいと思っています。 # 当初は2回SQLを実行しPHPで配列に流しこみそこで比較していたのですが処理の遅さが気になり、どうにかデータベース内で完結出来ないかと思い質問に来ました。 # 宜しくお願いします。 # 'このようなテーブルデータから、12-4に対して絞込みを行った際、前日に名前があり、当日に名前の消えているデータを抽出したい'(_絞込みdate,_名前) :- 前日に名前があり(_絞込みdate,_前日に名前があり), 当日に名前の消えている(_絞込みdate,_前日に名前があり,_当日に名前の消えている), データを抽出したい(_当日に名前の消えている,_名前). 前日に名前があり(_当日,_前日に名前があり) :- findmax(_date,( テーブル(_no,_date,_), _date @< _当日), _事実上の前日), setof(_名前,[_no,_事実上の前日,_名前] ^ ( テーブル(_no,_事実上の前日,_名前)), _前日に名前があり). 当日に名前の消えている(_当日,_前日に名前があり,_当日に名前の消えている) :- setof(_名前,[_no,_当日,_名前] ^ ( member(_名前,_前日に名前があり), \+(テーブル(_no,_当日,_名前))), _当日に名前の消えている). データを抽出したい(_当日に名前の消えている,_名前) :- member(_名前,_当日に名前の消えている). % 以下のサイトは # ^.*\d{2}[a-zA-Z]?\.gif # という表現がマッチする文字列があるとします。 # 例えば、img01A.gifです。 # この文字列から、頭のゼロを外した数字を抜き出したいです。 # 上の例では、「1」を抜き出したいです。 # 「01」を抜き出すのでよければ、 # ^.*(\d{2})[a-zA-Z]?\.gif # として、「$1」で受ければいいですが、 # 頭のゼロをスマートに取り除く方法を模索しています。 # よろしくお願いします。有難うございます。 '^.*\d{2}[a-zA-Z]?\.gif という表現がマッチする文字列があるとします。 例えば、img01A.gifです。 この文字列から、頭のゼロを外した数字を抜き出したいです。 上の例では、「1」を抜き出したいです。 「01」を抜き出すのでよければ、 ^.*(\d{2})[a-zA-Z]?\.gif として、「$1」で受ければいいですが、 頭のゼロをスマートに取り除く方法を模索しています。 よろしくお願いします。有難うございます。'(_文字列,_頭部のゼロを取り除いた数字文字列) :- '文字列から、頭のゼロを外した数字を抜き出したいです。'(_文字列,_頭のゼロを取り除いた数字文字列). '文字列から、頭のゼロを外した数字を抜き出したいです。'(_文字列,_頭のゼロを取り除いた数字文字列) :- 数字文字ならびを切り取る(_文字列,_数字文字ならび), 頭のゼロを取り除く(_数字文字ならび,_頭のゼロを取り除いた数字文字ならび), atom_chars(_頭のゼロを取り除いた数字文字列,_頭のゼロを取り除いた数字文字ならび). 数字文字ならびを切り取る(_文字列,_数字文字ならび) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,_数字文字ならび,L3), '_数字文字ならびは数字のみで構成され、L1に数字は含まず、L3の先頭文字は数字ではない'(L1,_数字文字ならび,L3). '_数字文字ならびは数字のみで構成され、L1に数字は含まず、L3の先頭文字は数字ではない'(L1,_数字文字ならび,L3) :- forall(member(_数字文字,_数字文字ならび),数字(_数字文字)), forall(member(_文字,L1),\+(数字(_文字))), \+((L3 = [_文字|_],数字(_文字))),!. 頭のゼロを取り除く([],[]). 頭のゼロを取り除く([A|R],[A|R]) :- \+(A='0'),!. 頭のゼロを取り除く(['0'|R1],R2) :- 頭のゼロを取り除く(R1,R2). 頭のゼロを取り除く([A|R1],[A|R2]) :- 頭のゼロを取り除く(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/735 # # 日記のテーブル(tD) # id,title,main_text # 日記の写真のテーブル(tF) # id,diaryId,file_path,is_deleted,is_finished # # 以上のようなテーブルがあり、tD.id = tD.diaryIdの関係です # この状況で、日記のタイトル・文章とその日記に属する写真情報のセットを取得したいとき # left joinで on tD.id = tD.diaryId としてクエリしたら良いと思いますが # 以下の条件がついた時にどうしたら良いかわかりません # # 条件1:tFのデータは、一つの日記に対して複数のデータを持ち、そのうちis_finishedが1かつis_deletedが0のモノだけを取得 # 条件2:条件1を満たせる写真情報がなければ、写真情報は必要ない。日記のテキスト情報だけを取得する。 # 条件3:写真情報をもたないテキスト情報も存在する。 # # 条件1はwhereに tF.is_finished = 1 AND tF.is_deleted =0 として書けば満たせますが、 # こう書いてしまうと条件2と3を満たせなくなります(写真情報のない日記を抜き出せなくなる) # どうしたら良いんでしょうか、すみませんがよろしくお願いします # # '日記テキスト・日記写真の取得'(_diaryId,_title,_main_text,_id,_diaryId,_file_path,_is_deleted,_is_finished) :- 日記(_diaryId,_title,_main_text), 条件(_diaryId,_title,_main_text,_id,_diaryId,_file_path,_is_deleted,_is_finished). 条件(_diaryId,_title,_main_text,_id,_diaryId,_file_path,0,1) :- '条件1:tFのデータは、一つの日記に対し複数のデータを持ち、そのうちis_finishedが1かつis_deletedが0のモノだけを取得'(_diaryId,_title,_main_text,_id,_diaryId,_file_path,0,1). 条件(_diaryId,_title,_main_text,_id,_diaryId,_file_path,_is_deleted,_is_finished) :- '条件2:条件1を満たせる写真情報がなければ、写真情報は必要ない。日記のテキスト情報だけを取得する。'(_diaryId,_title,_main_text,_id,_diaryId,_file_path,_is_deleted,_is_finished). 条件(_diaryId,_title,_main_text,_id,_diaryId,_file_path,_is_deleted,_is_finished) :- '条件3:写真情報をもたないテキスト情報も存在する。'(_diaryId,_title,_main_text,_id,_diaryId,_file_path,_is_deleted,_is_finished). '条件1:tFのデータは、一つの日記に対し複数のデータを持ち、そのうちis_finishedが1かつis_deletedが0のモノだけを取得'(_diaryId,_title,_main_text,_id,_diaryId,_file_path,0,1) :- 日記の写真(_id,_diaryId,_file_path,0,1). '条件2:条件1を満たせる写真情報がなければ、写真情報は必要ない。日記のテキスト情報だけを取得する。'(_diaryId,_title,_main_text,'','','','','') :- 日記の写真(_id,_diaryId,_file_path,_is_deleted,_is_finished), \+((_is_deleted=0,_is_finished=1)). '条件3:写真情報をもたないテキスト情報も存在する。'(_diaryId,_title,_main_text,'','','','','') :- \+(日記の写真(_,_diaryId,_,_,_)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364009659/125 # # # 質問、 # ave関数でなぜかIntが返されます。[1.0, 2.0, 3.0]ならばsumはで、lengthは3なので戻りは1.0のはずなのですが。 # # value :: [Float] -> [Float] # value [] = [] # value (x:xs) = case (ave (x:xs) /= 0) of # True -> (x/ave (x:xs)) : value xs # False -> [] # # ave :: [Float] -> Float # ave (x:xs) = (sum (x:xs)) / (fromIntegral (length (x:xs))) # ave [] = 0 # value([_x|_xs],[_y|_ys]) :- ave([_x|_xs],_ave), \+(_ave = 0.0), value(_xs,_ys), _y is _x / _ave,!. value(_,[]). ave([_x|_xs],_ave) :- sum([_x|_xs],_sum), length([_x|_xs],_length), _ave is _sum / _length. sum([],0). sum([M|R],S) :- sum(R,S_1), S is M + S_1. % 以下のサイトは # 1)西暦年から11を引き、その値を19で割った余りを求め、11を掛ける。 # 2)月の値から、以下の表に従って値を求める。 # 月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 # 値 0 2 0 2 2 4 5 6 7 8 9 10 # このうち6月までの値を「おにおににし」と覚える、と、多くの暦解説書に書かれている。 # 上記1),2)の値と日の値をそれぞれ加える。 # 求めた値を30で割った余りが、その日のおおよその月齢である。 # 但し、最大2程度の誤差がある。 以下はこれを数式化したものである。 # y年m月d日の月齢a日を求める。 # 但し、%は剰余演算子とし、c(m)は上の表に従った定数とする。例、62%30=2、c(5)=2。 月齢の月係数(1,0). 月齢の月係数(2,2). 月齢の月係数(3,0). 月齢の月係数(4,2). 月齢の月係数(5,2). 月齢の月係数(6,4). 月齢の月係数(7,5). 月齢の月係数(8,6). 月齢の月係数(9,7). 月齢の月係数(10,8), 月齢の月係数(11,9). 月齢の月係数(12,10). '月齢・月名'(1,朔). '月齢・月名'(1,新月). '月齢・月名'(2,既朔). '月齢・月名'(3,三日月). '月齢・月名'(7,上弦). '月齢・月名'(8,上弦). '月齢・月名'(13,十三夜). '月齢・月名'(14,小望月). '月齢・月名'(15,望). '月齢・月名'(15,満月). '月齢・月名'(15,望月). '月齢・月名'(16,十六夜). '月齢・月名'(16,既望). '月齢・月名'(17,立待月). '月齢・月名'(18,居待月). '月齢・月名'(19,寝待月). '月齢・月名'(19,臥待月). '月齢・月名'(20,更待月). '月齢・月名'(22,下弦). '月齢・月名'(23,下弦). '月齢・月名'(29,晦). '月齢・月名'(30,晦). 月名(_年整数,_月整数,_日整数,_月名) :- 月齢(_年整数,_月整数,_日整数,_月齢), '月齢・月名'(_月齢,_月名). 月齢(_年整数,_月整数,_日整数,_月齢) :- 年月日範囲検査(_年整数,_月整数,_日整数), '1)西暦年から11を引き、その値を19で割った余りを求め、11を掛ける。 2)月の値から、以下の表に従って値を求める。 月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 値 0 2 0 2 2 4 5 6 7 8 9 10 このうち6月までの値を「おにおににし」と覚える、と、多くの暦解説書に書かれている。 上記1),2)の値と日の値をそれぞれ加える。 求めた値を30で割った余りが、その日のおおよその月齢である。'(_年整数,_月整数,_日整数,_月齢). 年月日範囲検査(_年整数,_月整数,_日整数) :- 年月が存在する(_年整数,_月整数), 日が存在する(_年整数,_月整数,_日整数). 年月が存在する(_年整数,_月整数) :- between(1900,2099,_年整数), between(1,12,_月整数). 日が存在する(_年整数,_月整数,_日整数) :- 月末日整数(_年整数,_月整数,_月末日整数), between(1,_月末日整数,_日整数). 月末日整数(_年整数,2,29) :- うるう年(_年整数). 月末日整数(_年整数,2,28) :- \+(うるう年(_年整数)). 月末日整数(_年整数,_月整数,30) :- member(_月整数,[4,6,8,10]). 月末日整数(_年整数,_月整数,31) :- member(_月整数,[1,3,5,7,8,10,12]). うるう年(_年整数) :- '_年整数が400で割り切れる年は無条件でうるう年であるが、これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数). '_年整数が400で割り切れる年は無条件でうるう年であるが、これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数) :- '_年整数が400で割り切れる年は無条件でうるう年であるが、'(_年整数),!. '_年整数が400で割り切れる年は無条件でうるう年であるが、これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数) :- 'これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数). '_年整数が400で割り切れる年は無条件でうるう年であるが、'(_年整数) :- 0 is _年整数 mod 400. 'これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数) :- 0 is _年整数 mod 4, \+(0 is _年整数 mod 100). '1)西暦年から11を引き、その値を19で割った余りを求め、11を掛ける。 2)月の値から、以下の表に従って値を求める。 月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 値 0 2 0 2 2 4 5 6 7 8 9 10 このうち6月までの値を「おにおににし」と覚える、と、多くの暦解説書に書かれている。'上記1),2)の値と日の値をそれぞれ加える。 求めた値を30で割った余りが、その日のおおよその月齢である。'(_年整数,_月整数,_日整数,_月齢) :- '1)西暦年から11を引き、その値を19で割った余りを求め、11を掛ける。'(_年整数,_1), '2)月の値から、以下の表に従って値を求める。 月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 値 0 2 0 2 2 4 5 6 7 8 9 10 このうち6月までの値を「おにおににし」と覚える、と、多くの暦解説書に書かれている。'(_月整数,_2), '上記1),2)の値と日の値をそれぞれ加える。 求めた値を30で割った余りが、その日のおおよその月齢である。'(_1,_2,_日整数,_月齢). '1)西暦年から11を引き、その値を19で割った余りを求め、11を掛ける。'(_年整数,_1) :- _1 is ((_年整数 - 11) mod 19) * 11. '2)月の値から、以下の表に従って値を求める。 月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 値 0 2 0 2 2 4 5 6 7 8 9 10 このうち6月までの値を「おにおににし」と覚える、と、多くの暦解説書に書かれている。'(_月整数,_2) :- 月齢の月係数(_月整数,_2). '上記1),2)の値と日の値をそれぞれ加える。 求めた値を30で割った余りが、その日のおおよその月齢である。'(_1,_2,_日整数,_月齢) :- _月齢 is (_1 + _2 + _日整数) mod 30. % 以下のサイトは # 1)西暦年から11を引き、その値を19で割った余りを求め、11を掛ける。 # 2)月の値から、以下の表に従って値を求める。 # 月 1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 # 値 0 2 0 2 2 4 5 6 7 8 9 10 # このうち6月までの値を「おにおににし」と覚える、と、多くの暦解説書に書かれている。 # 上記1),2)の値と日の値をそれぞれ加える。 # 求めた値を30で割った余りが、その日のおおよその月齢である。 # 但し、最大2程度の誤差がある。 以下はこれを数式化したものである。 # y年m月d日の月齢a日を求める。 # 但し、%は剰余演算子とし、c(m)は上の表に従った定数とする。例、62%30=2、c(5)=2。 月名(_年整数,_月整数,_日整数,_月名) :- 月齢(_年整数,_月整数,_日整数,_月齢), '月齢・月名'(_月齢,_月名). 月齢(_年整数,_月整数,_日整数,_月齢) :- 年月日範囲検査(_年整数,_月整数,_日整数), 月齢の月係数(_月整数,_月係数), _月齢 is (((_年整数 - 11) mod 19) * 11 + _月係数 + _日整数) mod 30. 年月日範囲検査(_年整数,_月整数,_日整数) :- 年月が存在する(_年整数,_月整数), 日が存在する(_年整数,_月整数,_日整数). 年月が存在する(_年整数,_月整数) :- between(1900,2099,_年整数), between(1,12,_月整数). 日が存在する(_年整数,_月整数,_日整数) :- 月末日整数(_年整数,_月整数,_月末日整数), between(1,_月末日整数,_日整数). 月齢の月係数(1,0). 月齢の月係数(2,2). 月齢の月係数(3,0). 月齢の月係数(4,2). 月齢の月係数(5,2). 月齢の月係数(6,4). 月齢の月係数(7,5). 月齢の月係数(8,6). 月齢の月係数(9,7). 月齢の月係数(10,8), 月齢の月係数(11,9). 月齢の月係数(12,10). '月齢・月名'(1,朔). '月齢・月名'(1,新月). '月齢・月名'(2,既朔). '月齢・月名'(3,三日月). '月齢・月名'(7,上弦). '月齢・月名'(8,上弦). '月齢・月名'(13,十三夜). '月齢・月名'(14,小望月). '月齢・月名'(15,望). '月齢・月名'(15,満月). '月齢・月名'(15,望月). '月齢・月名'(16,十六夜). '月齢・月名'(16,既望). '月齢・月名'(17,立待月). '月齢・月名'(18,居待月). '月齢・月名'(19,寝待月). '月齢・月名'(19,臥待月). '月齢・月名'(20,更待月). '月齢・月名'(22,下弦). '月齢・月名'(23,下弦). '月齢・月名'(29,晦). '月齢・月名'(30,晦). 月末日整数(_年整数,2,29) :- うるう年(_年整数). 月末日整数(_年整数,2,28) :- \+(うるう年(_年整数)). 月末日整数(_年整数,_月整数,30) :- member(_月整数,[4,6,8,10]). 月末日整数(_年整数,_月整数,31) :- member(_月整数,[1,3,5,7,8,10,12]). うるう年(_年整数) :- '_年整数が400で割り切れる年は無条件でうるう年であるが、これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数). '_年整数が400で割り切れる年は無条件でうるう年であるが、これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数) :- '_年整数が400で割り切れる年は無条件でうるう年であるが、'(_年整数),!. '_年整数が400で割り切れる年は無条件でうるう年であるが、これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数) :- 'これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数). '_年整数が400で割り切れる年は無条件でうるう年であるが、'(_年整数) :- 0 is _年整数 mod 400. 'これらの年を除いた中で、4で割り切れてかつ100で割り切れない年もうるう年である。'(_年整数) :- 0 is _年整数 mod 4, \+(0 is _年整数 mod 100). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/172 # # ●Regular Expressionの使用環境 # PHP5 # # ●検索か置換か? # 置換 # # ●説明 # Javaのコメント・文字列を抽出してタグで囲みたいです。 # /**/, "", '' が入れ子になってる場合に外側だけ適応するのができません # 失敗例 <ダブル>"これは<シングル>'ペン'</シングル>です"</ダブル> # 成功例 <ダブル>"これは'ペン'です"</ダブル> # # ●対象データ() # /* "hello" 'world' */ # String var="これは'ペン'です"; # String apos='apopo "/* moge'; # # ●希望する結果 # <コメント>/* "hello" 'world' */</コメント> # String var=<ダブル>"これは'ペン'です"</ダブル>; # String apos=<シングル>'apopo "/* moge'</シングル>; # # 'Javaのコメント・文字列を抽出してタグで囲みたいです。'(_文字列,_置換された文字列) :- atom_chars(_文字列,Chars), '文字ならびからコメント・文字列を抽出してタグで囲む'(Chars,_置換された文字ならび), atom_chars(_置換された文字列,_置換された文字ならび). '文字ならびからコメント・文字列を抽出してタグで囲む'([],[]). '文字ならびからコメント・文字列を抽出してタグで囲む'([''''|R1],[<,シ,ン,グ,ル,>,''''|L1]) :- 'シングルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'(['"'|R1],[<,ダ,ブ,ル,>,'"'|L1]) :- 'ダブルクォートの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([/,*|R1],[<,コ,メ,ン,ト,>,/,*|L1]) :- 'コメントの外側入れ子を変換'(R1,L1,R2),!, '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). '文字ならびからコメント・文字列を抽出してタグで囲む'([A|R1],[A|R2]) :- '文字ならびからコメント・文字列を抽出してタグで囲む'(R1,R2). シングルクォートの外側入れ子を変換(L,L1,R) :- append(L0,[''''|R],L), \+(member('''',R)), append(L0,['''',<,/,シ,ン,グ,ル,>|R],L1),!. ダブルクォートの外側入れ子を変換(L,L1,R) :- append(L0,['"'|R],L), \+(member('"',R)), append(L0,['"',<,/,ダ,ブ,ル,>|R],L1),!. コメントの外側入れ子を変換(L,L1,R) :- append(L0,[*,/|R],L), \+(append(_,[*,/|_],R)), append(L0,[*,/,<,/,コ,メ,ン,ト,>|R],L1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_文字列) :- 'ランダムでユニークなn文字数の文字コードならびを作る'(_n,[],Chars), atom_codes(_文字列,Code). 'ランダムでユニークなn文字数の文字コードならびを作る'(0,L,L). 'ランダムでユニークなn文字数の文字コードならびを作る'(M,L1,L) :- ユニークな文字コードを選択する(L1,Code), M_1 is M - 1, 'ランダムでユニークなn文字数の文字コードならびを作る'(M_1,[Code|L1],L). ユニークな文字を選択する(L,Code) :- Code is random(75) + 48, アルファベットの範囲(Code), \+(member(Code,L)),!. ユニークな文字を選択する(L,Code) :- ユニークな文字を選択する(L,Code). アルファベットの範囲(Code) :- between(48,57,Code). アルファベットの範囲(Code) :- between(65,90,Code). アルファベットの範囲(Code) :- between(97,122,Code). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/727 # # [1] 授業単元: 暇つぶし # [2] 問題文:迷路を解くプログラム。 #  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 # ----- ここからテキスト ----- # 5 5 # sxrrr # rxrrr # rrrxr # rrxgr # ----- ここまでテキスト ----- #  テキストの1行目は順番に迷路の横幅と縦幅を表します。 #  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。 #  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。 #  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 # 1 step # sxrrr # +xrrr # rrrxr # rrxgr # <中略> # 9 step # sxrrr # +x+++ # +++x+ # rrxg+ # '問題文:迷路を解くプログラム。  下記のようなテキストを入力とし、スタートからゴールまでの道を表示してください。 ----- ここからテキスト ----- 5 5 sxrrr rxrrr rrrxr rrxgr ----- ここまでテキスト -----  テキストの1行目は順番に迷路の横幅と縦幅を表します。  二行目以降は迷路を表しており、sはスタート、gはゴール、xは壁、rは道を表します。  壁は通り抜けることはできず、道を通る必要があります。迷路の端は壁として扱います。  表示の仕様は以下の通り。ゴールまでの道がないと判断した場合はNot Foundと表示。 1 step sxrrr +xrrr rrrxr rrxgr <中略> 9 step sxrrr +x+++ +++x+ rrxg+ '(_テキスト) :- 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト). 'テキストを入力とし、スタートからゴールまでの道を表示してください。'(_テキスト) :- テキストを入力とし(_テキスト,LL1,LL2), スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順), '道を表示してください。'(_スタートからゴールまでの道順,LL1). スタートからゴールまでの(LL1,LL2,_スタートからゴールまでの道順) :- スタートを探す(LL1,LL2,_スタートの行,_スタートの列), ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列), 隣に移動する(_スタートの行,_スタートの列,_ゴールの行,_ゴールの列,LL1,LL2,[],_スタートからゴールまでの道順). テキストを入力とし(_テキスト,LL1,LL2) :- get_lines(_テキスト,[_不要要素|_行ならび]), findall(_文字ならび,( member(_一行,_行ならび), atom_chars(_一行,_文字ならび)), LL1), 転置(LL1,LL2). スタートを探す(LL1,LL2,_スタートの行,_スタートの列) :- nth1(_スタートの行,LL1,L), nth1(_スタートの列,L,s). ゴールを探す(LL1,LL2,_ゴールの行,_ゴールの列) :- nth1(_ゴールの行,LL1,L), nth1(_ゴールの列,L,g). 隣に移動する(_ゴールの行,_ゴールの列,_ゴールの行,_ゴールの列,LL1,LL2,_,[[_ゴールの行,_ゴールの列]]). 隣に移動する(_行,_列,_ゴールの行,_ゴールの列,LL1,LL2,_履歴1,[[_行,_列]|R]) :- 移動可能な隣接点を得る(_行,_列,LL1,LL2,_隣の行,_隣の列), \+(member([_隣の行,_隣の列],_履歴1)), 隣に移動する(_隣の行,_隣の列,_ゴールの行,_ゴールの列,LL1,LL2,[[_行,_列]|_履歴1],R). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 移動可能な隣接点を得る(_行,_列,LL1,LL2,_行,_隣の列) :- 列の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列). 行の移動可能な隣接点(_行,_列,LL1,LL2,_行,_隣の列) :- nth1(_行,LL1,L), length([_|L0],_列), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の列). 列の移動可能な隣接点(_行,_列,LL1,LL2,_隣の行,_隣の列) :- nth1(_列,LL2,L), length([_|L0],_行), append(L0,[_|R],L), 移動可能な隣接点(L0,R,_隣の行). 移動可能な隣接点(L0,R,_隣) :- last(L0,r), length(L0,_隣). 移動可能な隣接点(L0,R,_隣) :- R = [r|_], length([_,_|L0],_隣). '道を表示してください。'(_スタートからゴールまでの道順,LL) :- append(LL0,[[_行,_列]|RR],_スタートからゴールまでの道順), length([_|LL0],_ステップ), write('%t\n',[_ステップ]), '通過点を+に置換してLLを表示する'(_行,_列,LL), R = []. '通過点を+に置換してLLを表示する'(_行,_列,LL) :- append(L0,[L1|R],LL), length([_|L0],_行_1), 列の置換(_行_1,_行,_列,L1,L2), ならびを文字列に変換して表示(L2), R = []. 列の置換(_行,_行,_列,L1,L2) :- length([_|L0],_列), append(L0,[_|R],L1), append(L0,[+|R],L2),!. 列の置換(_,_,_,L,L). ならびを文字列に変換して表示(L) :- atomic_list_concat(L,S), writef('%t\n',[S]). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1363522503/91 # # Youtubeみたいなランダムでユニークなn文字数の文字列を作る方法を教えてください 'Youtubeみたいなランダムでユニークなn文字数の文字列を作る'(_n,_文字列) :- 'ランダムでユニークなn文字数の文字コードならびを作る'(_n,[],Chars), atom_codes(_文字列,Code). 'ランダムでユニークなn文字数の文字コードならびを作る'(0,L,L). 'ランダムでユニークなn文字数の文字コードならびを作る'(M,L1,L) :- ユニークな文字コードを選択する(L1,Code), M_1 is M - 1, 'ランダムでユニークなn文字数の文字コードならびを作る'(M_1,[Code|L1],L). ユニークな文字を選択する(L,Code) :- Code is random(75) + 48, アルファベットの範囲(Code), \+(member(Code,L)),!. ユニークな文字を選択する(L,Code) :- ユニークな文字を選択する(L,Code). アルファベットの範囲(Code) :- between(48,57,Code). アルファベットの範囲(Code) :- between(65,90,Code). アルファベットの範囲(Code) :- between(97,122,Code). % 以下のサイトは # このディレクトリの索引 # ●Regular Expressionの使用環境 # Ruby 1.9 # # ●検索か置換か? # 検索 # # ●説明 # red または blue が含まれてない行を検索したい。 # # ●対象データ # yellow red blue green orange # red green yellow orange # black yellow orange white # green yellow blue orange # # ●希望する結果 # black yellow orange white # 'red または blue が含まれてない行を検索したい。'([_文字列|R],_文字列) :- \+(sub_atom(_文字列,_,_,_,red)), \+(sub_atom(_文字列,_,_,_,blue)). 'red または blue が含まれてない行を検索したい。'([_|R],_文字列) :- 'red または blue が含まれてない行を検索したい。'(R,_文字列). % 以下のサイトは % ユーティリティ述語 sub_atom/10 の提案 % % A .. 文字列 (atom) % S .. 検索文字列開始変位 (integer) % L .. 検索文字列の長さ (integer) % R .. 残り長さ (integer) % H .. 検索文字列より前側の文字列 (atom) % X .. 検索文字列 (atom) % T .. 検索文字列より後の残り文字列 (atom) % HL .. 検索文字列より前側の文字ならび (chars) % XL .. 検索文字列文字ならび (chars) % TL .. 検索文字列より後の残り文字ならび (chars) % A がvarである時はH-HL,X-XL,T-TLの3組の中にvar-varの組があってはなりません。 sub_atom_12(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,V,W,S,L,R,H,X,T,HL,XL,TL). '文字列W1から始まりW2で終わる。W1,W2の間にW1,W2は現れない'(A,W1,W2,S,L,R,H,X,T,HL,XL,TL) :- sub_atom(A,S,L,R,H,X,T,HL,XL,TL), 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2), 'W1,W2の間の文字列にW1,W2は現れない'(X,S1,S2,W1,W2). 文字列W1から始まりW2で終わる(X,W1,W2,S1,S2) :- sub_atom(X,0,S1,_,W1), sub_atom(X,S2,_,0,W2). 'W1,W2の間の文字列にW1,W2は現れない'(X,W1,W2,S1,S2) :- sub_atom(X,S1,_,S2,_W1とW2の間の文字列), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W1)), \+(sub_atom(_W1とW2の間の文字列,_,_,_,W2)). count(P,N) :- findsum(1,P,F), N is truncate(F). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum(_値ならび,_合計値),!. sum([],0). sum([N|R],S) :- sum(R,S1), S is N + S1. sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- atom(A), !, sub_atom(A,S,L,R,X), sub_atom(A,0,S,_,H), N is S + L, sub_atom(A,N,R,_,T), atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL). sub_atom(A,S,L,R,H,X,T,HL,XL,TL) :- var(A), !, atom_chars(H,HL), atom_chars(X,XL), atom_chars(T,TL), length(HL,S), length(XL,L), length(TL,R), concat_atom([H,X,T],A), sub_atom(A,S,L,R,H,X,T,HL,XL,TL). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/684 # # ・DBMS名とバージョン # Oracle 10g # ・テーブルデーた # create table aaa ( # id number(5,0) primary key, -- 主キー # nendo char(4), -- 年度 # tsuki char(2) -- 月 # ); # insert into aaa values (1, '2012', '01'); # insert into aaa values (2, '2012', '02'); # insert into aaa values (3, '2012', '03'); # insert into aaa values (4, '2012', '04'); # insert into aaa values (5, '2012', '05'); # ・欲しい結果 # id, nendo, tsuki # -------------------- # 4, '2012', '04' # 5, '2012', '05, # 1, '2012', '01' # 2, '2012', '02' # 3, '2012', '03' # # ・説明 # 年度/月の昇順に並べたいです。 # 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。 # '・テーブルデータ create table aaa ( id number(5,0) primary key, -- 主キー nendo char(4), -- 年度 tsuki char(2) -- 月 ); insert into aaa values (1, '2012', '01'); insert into aaa values (2, '2012', '02'); insert into aaa values (3, '2012', '03'); insert into aaa values (4, '2012', '04'); insert into aaa values (5, '2012', '05'); ・欲しい結果 id, nendo, tsuki -------------------- 4, '2012', '04' 5, '2012', '05, 1, '2012', '01' 2, '2012', '02' 3, '2012', '03' ・説明 年度/月の昇順に並べたいです。 2012年度3月は2013年3月、2012年度4月は2012年4月となるのでただの大小比較では無理でした。'(_id,_年度,_月) :- 欲しい結果(_id,_年度,_月). 年度の場合の月順('04','05'). 年度の場合の月順('05','06'). 年度の場合の月順('06','07'). 年度の場合の月順('07','08'). 年度の場合の月順('08','09'). 年度の場合の月順('09','10'). 年度の場合の月順('10','11'). 年度の場合の月順('11','12'). 年度の場合の月順('12','01'). 年度の場合の月順('01','02'). 年度の場合の月順('02','03'). 年度の場合の月順('03','04'). 欲しい結果(_id,_年度,_月) :- setof(_年度,[_id,_年度,_月] ^ aaa(_id,_年度,_月),_年度ならび), member(_年度,_年度ならび), 年度順に並べる('04',_id,_年度,_月). 年度順に並べる(_月,_id,_年度,_月) :- aaa(_id,_年度,_月). 年度順に並べる(_月_1,_id,_年度,_月) :- \+(_月_1 = '03'), 年度の場合の月順(_月,_次の月), 年度順に並べる(_次の月,_id,_年度,_月). % 以下のサイトは # # 「キミならどう書く 2.0 ? 2007 ? その 1」より # # 斗桶 (a) に油が 1 斗 (10 升) ある。これを等分したい。7 升枡 (b) と 3 升枡 (c) しかない。この 2 つの枡だけで、5 升ずつ等分する方法を記述せよ。 # '斗桶 (a) に油が 1 斗 (10 升) ある。これを等分したい。7 升枡 (b) と 3 升枡 (c) しかない。この 2 つの枡だけで、5 升ずつ等分する方法を記述せよ。'(_履歴) :- 移動(10,0,0,[[10,0,0]],_履歴_1), reverse(_履歴_1,_履歴). 移動(5,5,0,_履歴,[[5,5,0]|_履歴]) :- !. 移動(A,B,C,_履歴_1,_履歴) :- 順列([a,b,c],2,[X,Y]), 移動(X,Y,A,B,C,A2,B2,C2), \+(member([A2,B2,C2],_履歴_1)), 移動(A2,B2,C2,[[A2,B2,C2]|_履歴_1],_履歴). 移動(a,b,A,B,C,0,B2,C) :- A =< (7 - B), B2 is A + B,!. 移動(a,b,A,B,C,A2,7,C) :- A > (7 - B), A2 is A - (7 - B),!. 移動(a,c,A,B,C,0,B,C2) :- A =< (3 - C), C2 is A + C,!. 移動(a,c,A,B,C,A2,B,3) :- A > (3 - C), A2 is A - (3 - C),!. 移動(b,a,A,B,C,A2,0,C) :- A2 is A + B,!. 移動(c,a,A,B,C,A2,B,0) :- A2 is A + C,!. 移動(b,c,A,B,C,A,0,C2) :- B =< (3 - C), C2 is B + C,!. 移動(b,c,A,B,C,A,B2,3) :- B > (3 - C), B2 is B - (3 - C),!. 移動(c,b,A,B,C,A,B2,0) :- C =< (7 - B), B2 is B + C,!. 移動(c,b,A,B,C,A,7,C2) :- C > (7 - B), C2 is C - (7 - B),!. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % (10-0-0)>(3-7-0)>(3-4-3)>(6-4-0)>(6-1-3)>(9-1-0)>(9-0-1)>(2-7-1)>(2-5-3)>(5-5-0) % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/103 # # # 無理だろうね # バカバカしいはOKでバカはNGみたいなのは正規表現では無理 # バカバカしいはOKでバカはNG(_文字列,'NG') :- sub_atom(_文字列,S,2,_,バカ), \+(sub_atom(_文字列,S,6,_,バカバカしい)),!. バカバカしいはOKでバカはNG(_文字列,'OK'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/103 # # # 無理だろうね # バカバカしいはOKでバカはNGみたいなのは正規表現では無理 # バカバカしいはOKでバカはNG('') :- !. バカバカしいはOKでバカはNG(_文字列) :- sub_atom(_文字列,0,2,_,バカ), \+(sub_atom(_文字列,0,6,_,バカバカしい)),!, fail. バカバカしいはOKでバカはNG(_文字列) :- sub_atom(_文字列,0,6,R,バカバカしい), sub_atom(_文字列,_,R,0,_副文字列), バカバカしいはOKでバカはNG(_副文字列),!. バカバカしいはOKでバカはNG(_文字列) :- sub_atom(_文字列,1,_,0,_副文字列), バカバカしいはOKでバカはNG(_副文字列). % 以下のサイトは # # abを含まない、かつ、bcを含まない、かつ、cdを含む行を検索する。 # 'abを含まない、かつ、bcを含まない、かつ、cdを含む行を検索する。'(_文字列,_行ならび,_行) :- member(_行,_行ならび), \+(sub_atom(_行,_,_,_,ab)), \+(sub_atom(_行,_,_,_,bd)), sub_atom(_行,_,_,_,cd). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/21 # # # ●Regular Expressionの使用環境 # Ruby 1.9 # # ●検索か置換か? # 検索 # # ●説明 # red または blue が含まれてない行を検索したい。 # # ●対象データ # yellow red blue green orange # red green yellow orange # black yellow orange white # green yellow blue orange # # ●希望する結果 # black yellow orange white 'red または blue が含まれてない行を検索したい。'(Lines,Line) :- member(Line,Lines), 'red または blue が含まれてない'(Line). 'red または blue が含まれてない'(Line) :- \+(sub_atom(Line,_,_,_,red)), \+(sub_atom(Line,_,_,_,blue)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/635 # # 質問です、お願いします # id|col1|col2 という構成のテーブルがあります # # これに対して、以下のような条件と動作を実現したいと思います # 1)更新できるのはcol2が0の場合のみ # 2)更新できた場合、'updated'を返す # 3)もし、col2が0以外の場合、'update_fail' という値を返す # # どんなクエリ文を書いたら良いんでしょうか # (利用してるDBはmysql5です) # # 'id|col1|col2 という構成のテーブルがあります これに対して、以下のような条件と動作を実現したいと思います 1)更新できるのはcol2が0の場合のみ 2)更新できた場合、\'updated\'を返す 3)もし、col2が0以外の場合、\'update_fail\' という値を返す どんなクエリ文を書いたら良いんでしょうか'(_id,_新しい_col1,_新しい_col2) :- クエリ文(_id,_新しい_col1,_新しい_col2). クエリ文(_id,_新しい_col1,_新しい_col2) :- '更新できるのはcol2が0の場合のみそれ以外は\'update_fail\'を返す'(_id),!. クエリ文(_id,_新しい_col1,_新しい_col2) :- '更新できた場合、\'updated\'を返す'(_id,_新しい_col1,_新しい_col2),!. クエリ文(_id,_新しい_col1,_新しい_col2) :- 'idが存在しない場合、\'update_fail not found id\'を返す'(_id). '更新できるのはcol2が0の場合のみそれ以外は\'update_fail\'を返す'(_id) :- table(_id,_col1,_col2), \+(_col2 = 0), writef('update_fail :: table(%q,%q,%q).\n',[_id,_col1,_col2]),!. '更新できた場合、\'updated\'を返す'(_id,_新しい_col1,_新しい_col2) :- retract(table(_id,_col1,0)), asserta(table(_id,_新しい_col1,_新しい_col2)), writef('updated :: table(%q,%q,%q).\n',[_id,_新しい_col1,_新しい_col2]),!. 'idが存在しない場合、\'update_fail not found id\'を返す'(_id) :- writef('update_fail not found id :: %q\n',[_id]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/311 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク): # 以下のような入力が与えられたときに # 3 # 11010 # 01111 # 10101 # 01110 # 01100 # # 01011 # 01010 # 00100 # 00110 # 10100 # # 11110 # 01110 # 01101 # 01110 # 00001 # # 以下のように出力されるプログラムを作成してください。よろしくお願いします。 # 4 # 3 # 8 # '以下のような入力が与えられたときに 3 11010 01111 10101 01110 01100 01011 01010 00100 00110 10100 11110 01110 01101 01110 00001 以下のように出力されるプログラムを作成してください。よろしくお願いします。 4 3 8'(LL) :- プログラム(LL,_解), writef('%t\n',[_解]). プログラム(LL,_解) :- 転置(LL,LL1), '1の最大連続数を得る'(LL1,_最大連続数), '最大連続数の連続は何か所にあるか'(LL1,_最大連続数,_何か所), _解 is _最大連続数 * _何か所. '1の最大連続数を得る'(LL1,_最大連続数) :- '1の最大連続数を得る'(LL1,0,_最大連続数). '1の最大連続数を得る'([],_最大連続数,_最大連続数) :- !. '1の最大連続数を得る'([L|R],_最大連続数_1,_最大連続数) :- 'Lの最大連続数'(L,_連続数), _連続数 > _最大連続数_1, '1の最大連続数を得る'(R,_連続数,_最大連続数),!. '1の最大連続数を得る'([_|R],_最大連続数_1,_最大連続数) :- '1の最大連続数を得る'(R,_最大連続数_1,_最大連続数). 'Lの最大連続数'(L,_Lの最大連続数) :- findmax(_連続数,( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_連続数)), _Lの最大連続数). '1の連続数'(L1,L2,L3,_連続数) :- all(L2,1), \+(last(L1,1)), \+(L3 = [1|_]), length(L2,_連続数). '最大連続数の連続は何か所にあるか'([],_最大連続数,0) :- !. '最大連続数の連続は何か所にあるか'([L|R],_最大連続数,_何か所) :- length(L2,_最大連続数), count(( append(L1,L2,L3,L), '1の連続数'(L1,L2,L3,_最大連続数)), Count), '最大連続数の連続は何か所にあるか'(R,_最大連続数,_何か所_1), _何か所 is _何か所_1 + Count. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/628 # # t_guest、t_address、t_friend という3つのテーブルがあって、 # t_guestを基本にして、left joinをt_jushoとt_friendにそれぞれ仕掛けてselectのクエリを作りたいと考えています # # SELECT g.namae, a.prefecture, f.namae # FROM t_guest AS g # LEFT JOIN t_address AS a #  ON g.id = a.guestId # LEFT JOIN t_friend AS f #  ON g.id = f.guestId # WHERE g.age = 20; # # こんなイメージなんですが、ここで、t_addressに住所を登録していないguestのユーザーを検索しないようにするには # どうしたら良いんでしょうか # それぞれのテーブルのカラムへの条件付けはできるんですが、「登録していない状況」をどう表現したら良いのか # わかりません # # 't_guest、t_address、t_friend という3つのテーブルがあって、 t_guestを基本にして、left joinをt_jushoとt_friendにそれぞれ仕掛けてselectのクエリを作りたいと考えています SELECT g.namae, a.prefecture, f.namae FROM t_guest AS g LEFT JOIN t_address AS a  ON g.id = a.guestId LEFT JOIN t_friend AS f  ON g.id = f.guestId WHERE g.age = 20; こんなイメージなんですが、ここで、t_addressに住所を登録していないguestのユーザーを検索しないようにするにはどうしたら良いんでしょうか それぞれのテーブルのカラムへの条件付けはできるんですが、「登録していない状況」をどう表現したら良いのかわかりません'(_namae,_prefecture,_namae) :- t_guest(_id,g_namae), t_address(_id,_address,_prefecture), \+(_address = ''), t_friend(_id,f_namae). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1340383120/600 # # お願いします。 # # ●正規表現の使用環境 # Javascript # # ●検索か置換か? # 検索 # # ●説明 # HMVの商品IDらしき番号を取得したい # # ●対象データ # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889 # # http://ime.nu/www.hmv.co.jp/artist_松平健_000000000039225/item_マツケンサンバ-2-リミックス-トラックス-dvd_1789889/ref/1448035_8 # # ●希望する結果 # 1789889 # # 説明 # アンダーバー以降の末尾の自然数が商品IDなのですが(これなら簡単) # リファラー付きの場合は末尾じゃなくなるので初心者の自分には難しいです。 # なお、商品IDは0(ゼロ)で桁合わせはしていません # # 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- sub_atom(_文字列,S,5,_,'/ref/'), sub_atom(_文字列,0,S,_,_文字列_1), '商品IDは最後の_から末尾までの副文字列'(_文字列_1,_商品ID),!. 'HMVの商品IDらしき番号を取得したい'(_文字列,_商品ID) :- '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID),!. '商品IDは最後の_から末尾までの副文字列'(_文字列,_商品ID) :- atom_chars(_文字列,Chars), append(_,['_'|R1],Chars), \+(member('_',R1)), atom_chars(_商品ID,R1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1361082416/48 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # '1から100までの整数をかいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする' :- '1から100までの整数を'(_整数), 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(_整数), _整数 = 100. '1から100までの整数を'(_整数) :- between(1,100,_整数). 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 3, writef('%t',['Fizz']), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 7, writef('%t',['Buzz']), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- 0 is N mod 13, writef('%t',[hoge]), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(N) :- \+(0 is N mod 3), \+(0 is N mod 7), \+(0 is N mod 13), writef('%t',[N]), fail. 'かいぎょう区切りで出力せよ、ただし、3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、数値の代わりに出力することとする'(_) :- write('\n'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/874 # # ../test/read.cgi/tech/1357748713/775 # http://pc11.2ch.net/test/read.cgi/tech/1202135539/607 # [1] 授業単元:プログラミング # [2] 問題文 :キーボードから西暦と月を入力するとカレンダーを #       表示するプログラムを作成せよ # キーボードから西暦と月を入力するとカレンダーを表示する :- キーボードから西暦と月を入力すると(_西暦,_月), カレンダーを表示する(_西暦,_月). キーボードから西暦と月を入力すると(_西暦,_月) :- 整数を得る(西暦,true,_西暦), 整数を得る(月,between(1,12,_月),_月). カレンダーを表示する(_西暦,_月) :- カレンダーを(_西暦,_月,_カレンダー), 表示する(_西暦,_月,_カレンダー). カレンダーを(_西暦,_月,_カレンダー) :- 月末日(_西暦,_月,_月末日), 'Zellerの公式を用いて曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), findall(D,between(1,_月末日,D),L1), カレンダーの先頭に0を詰める(L1,L2), '7個組に分解'(L2,_カレンダー). 月末日(_西暦,2,29) :- うるう年(_西暦),!. 月末日(_,2,28) :- !. 月末日(_,_月,31) :- member(_月,[1,3,5,7,8,10,12]),!. 月末日(_,_月,30) :- member(_月,[4,6,9,11]),!. うるう年(_年) :- 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, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,日曜). 'Zellerの公式で使う曜日を表す値'(1,月曜). 'Zellerの公式で使う曜日を表す値'(2,火曜). 'Zellerの公式で使う曜日を表す値'(3,水曜). 'Zellerの公式で使う曜日を表す値'(4,木曜). 'Zellerの公式で使う曜日を表す値'(5,金曜). 'Zellerの公式で使う曜日を表す値'(6,土曜). all([],_). all([V|R],V) :- all(R,V). カレンダーの先頭に0を詰める(L1,L2) :- length(L0,_曜日を表す値), append(L0,L1,L2), all(L0,0),!. '7個組に分解'([],[]) :- !. '7個組に分解'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '7個組に分解'(R1,R2),!. '7個組に分解'(L,[L]). 表示する(_西暦,_月,_カレンダー) :- writef('\n%8r年 %t月\n\n',[_西暦,_月]), member(L,_カレンダー), 一行表示する(L), fail. 表示する(_西暦,_月,_カレンダー) :- write('\n'). 一行表示する([]) :- write('\n'). 一行表示する([0|R]) :- writef('%3r',[' ']), 一行表示する(R),!. 一行表示する([N|R]) :- writef('%3r',[N]), 一行表示する(R). % 以下のサイトは # Prolog 21世紀における0〜3の数字を2個ずつ使ってできる年月日の個数 # # 【出典】https://twitter.com/c_oi/status/301346035094126593 # https://twitter.com/c_oi/status/301346039590436864 # 【引用】「0〜3の数字を2個ずつ使ってできる年月日は21世紀(2001/01/01〜2100/12/31)の間に何日間あるでしょう?」 # '21世紀における0〜3の数字を2個ずつ使ってできる年月日の個数'(_個数) :- setof(_年月日ならび,( 重複を許す年月日ならびの選択(_年月日ならび)), LL), length(LL,_個数). 重複を許す年月日ならびの選択(_年月日ならび) :- 順列([0,0,1,1,2,2,3,3],8,_年月日ならび), _年月日ならび @>= [2,0,0,1,0,1,0,1], _年月日ならび @=< [2,1,0,0,1,2,3,1], \+(禁則(_年月日ならび)). 禁則([_,_,_,_,0,2,3,_]) :- !. 禁則([_,_,_,_,2,_,_,_]) :- !. 禁則([_,_,_,_,3,_,_,_]) :- !. 禁則([_,_,_,_,1,3,_,_]) :- !. 禁則([_,_,_,_,_,_,3,3]) :- !. 禁則([_,_,_,_,_,_,3,2]) :- !. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- 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://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- member(L1,[[_指定された要素,_指定された要素,_指定された要素|_],[_指定された要素,_指定された要素|_],[_指定された要素|_]]), append(L0,L1,_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1) :- 要素がコンテナ中に見つからない場合(_指定された要素,_コンテナ). 要素がコンテナ中に見つからない場合(_指定された要素,_コンテナ) :- \+(member(_指定された要素,_コンテナ)). % 以下のサイトは # http://d.hatena.ne.jp/E_Mattsan/20130211/1360590408 # 「E.Mattsan氏のブログ 20130211より」 # # 設問 # # まず、パタンマッチングの部分だけが見やすくなるように、「どう書く」の問題からいろいろ取り去ってより簡単な問題を作りました。 # # # 要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。 # コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。 # 要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。 # 要素が2つ連続した場所がない場合、最初の要素の位置を返す。 # 要素がコンテナ中に見つからない場合、-1を返す。 # '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '先頭の位置は0とする。要素が2つ連続した場所がない場合、最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置),!. '要素を格納する順序付きのコンテナを考える。先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。要素が2つ連続した場所がない場合、最初の要素の位置を返す。要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- '要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1). '先頭の位置は0とする。コンテナ中にある指定された要素が3つ連続している場所がある場合、最初の3つ連続した要素の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- append(L0,[_指定された要素,_指定された要素,_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '先頭の位置は0とする。要素が3つ連続した場所がない場合、要素が2つ連続している最初の場所の最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 要素が3つ連続した場所がない場合(_コンテナ,_指定された要素), append(L0,[_指定された要素,_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '先頭の位置は0とする。要素が2つ連続した場所がない場合、最初の要素の位置を返す。'(_コンテナ,_指定された要素,_最初の場所の最初の要素の位置) :- 要素が2つ連続した場所がない場合(_コンテナ,_指定された要素), append(L0,[_指定された要素|_],_コンテナ), length(L0,_最初の場所の最初の要素の位置),!. '要素がコンテナ中に見つからない場合、-1を返す。'(_コンテナ,_指定された要素,-1) :- \+(member(_指定された要素,_コンテナ)). 要素が3つ連続した場所がない場合(_コンテナ,_指定された要素) :- \+(append(_,[_指定された要素,_指定された要素,_指定された要素|_],_コンテナ)). 要素が2つ連続した場所がない場合(_コンテナ,_指定された要素) :- \+(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) が'(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/705 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク) # [3] 環境 # 問題1メイン関数でキーボードから二つの整数n1とn2を読み込み,それらをexponent関数を呼び出して, # n1のn2乗を計算し,結果をメイン関数で表示するプログラムを書きなさい. # <実行例> # 二つの整数を入力してください. # n1 = 5 # n2 = 2 # 5の2乗は25です. # 問題2 5人の点数を読み込んでいき、その最高点を表示するプログラムを作成しなさい。 # 問題3 円の面積の一覧表を計算するプログラムを作成しなさい。 # <実行結果> # 半径 --- 面積 # 1.0 --- 3.14 # 1.1 --- 3.80 # 1.2 --- 4.52 # 1.3 --- 5.31 # 問題4 球の体積を計算するプログラムを作成しなさい。 # 実行例 # 体積 = 1766.25 # [3.1] OS: unix #  [3.2] コンパイラ名とバージョン: gcc #  [3.3] 言語: C # [4] 期限:2月19日 # [5] その他の制限: なし # よろしくお願いします。 '5人の点数を読み込んでいき、その最高点を表示する' :- findall(_点数,( between(1,5,_), 数を得る(点数,true,_点数)), _5人の点数ならび), 最高点(_5人の点数ならび,_最高点), writef('最高点は%tです\n',[_最高点). 最高点(_5人の点数ならび,_最高点) :- append(_,[_最高点|R],_5人の点数ならび), \+((member(A,R),A > _最高点)),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/587 # # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):キーボードより本体価格と税率を入力し、その税込価格を #                表示するプログラムを作成せよ。 # #                任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意) # 'キーボードより本体価格と税率を入力し、その税込価格を 表示するプログラムを作成せよ。 任意の数値xを小数点以下第n位で四捨五入する作れ(nは任意)'(_小数点以下第n位で四捨五入) :- 'キーボードより本体価格と税率を入力し'(_本体価格,_税率), その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率). 'キーボードより本体価格と税率を入力し'(_本体価格,_税率) :- 数を得る(本体価格,_本体価格 >= 0.0,_本体価格), 数を得る(税率,_税率 >= 0.0,_税率),!. その税込み価格を表示する(_小数点以下第n位で四捨五入,_本体価格,_税率) :- V is 10 ^ (_小数点以下第n位で四捨五入 - 1), _税込み価格 is floor(_本体価格 * (1 + _税率) * V + 0.5) / V, writef('%w\n',[_税込み価格]). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). 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([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/619 # # [1] 情報処理 # [2] 2. # 下記のような2次元空間の点を表す構造体\texttt{struct point2d}と # 線分を表す構造体struct linesegmentを使い,2つの線分 # struct linesegment line1とstruct linesegment line2とが交点を # 持つかどうかを判定し,交点を持つ場合には1,持たない場合には0を返す関数 # int if_intersect(struct linesegment line1,struct linesegment line2)を作成せよ. # # struct point2d {/*2次元空間の点のx座標とy座標をそれぞれdoubleに格納*/ # double x; double y; # }; # struct linesegment {/*線分の始点sと終点eをそれぞれstruct point2dに格納*/ # struct point2d s; struct point2d e; # }: # '2つの線分は交点を持つ'(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4) :- '2つの線分のxの係数を得る'(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3), 交点を得る(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3,_x,_y), 交点は2つの線分上にある(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3,_x,_y). 交点を得る(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3,_x,_y) :- \+(_a1 - _a3 = 0), \+(_x2 - _x1 = 0), _x is (_a1 * _x1 - _y1 - _a3 * _x3 + _y3) / (_a1 - _a3), _y is (_y2 - _y1) / (_x2 - _x1) * (_x - _x1) + _y1. '2つの線分のxの係数を得る'(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3) :- _a1 is (_y2 - _y1) / (_x2 - _x1), _a3 is (_y4 - _y3) / (_x4 - _x3). 交点は2つの線分上にある(_x1,_y1,_x2,_y2,_x3,_y3,_x4,_y4,_a1,_a3,_x,_y) :- 範囲にある(_x,_x1,_x2), 範囲にある(_x,_x3,_x4), 範囲にある(_y,_y1,_y2), 範囲にある(_y,_y3,_y4). 範囲にある(M,N1,N2) :- N1 =< N2, M >= N1, M =< N2,!. 範囲にある(M,N1,N2) :- N1 < N2, M >= N2, M =< N1. % 以下のサイトは うるう年は何回来るか(_年起点,_年終点,_うるう年の回数) :- count(( between(_年起点,_年終点,_年), うるう年(_年)), _うるう年の回数). 'ある日から後の年のある日は何日目か(起点日と終点日はそれぞれ日数に含める)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はそれぞれ日数に含める, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2. 'ある日から後の年のある日は何日目か(起点日と終点日はともに日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 2. 'ある日から後の年のある日は何日目か(起点日と終点日のどちらかは日数に含めない)'(_年起点,_月起点,_日起点,_年終点,_月終点,_日終点,_何日目) :- 起点日と終点日はともに日数に含めない, 大晦日は何日目か(_年起点,_月起点,_日起点,_大晦日は何日目), 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目_1), 大晦日は何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _大晦日は何日目 + _何日目_1 - _何日目_2 - 1. ある年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- うるう年は何回来るか(_年起点,_年終点,_うるう年の回数), '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目). '基本は一年365日で計算し、それにうるう年の回数(日数)を加える'(_年起点,_年終点,_うるう年の回数,_何日目) :- _何日目 is _うるう年の回数 + 365 * (_年終点 - _年起点 + 1). 翌年の元旦から後の年の大晦日は何日目か(_年起点,_年終点,_何日目) :- _翌年 is _年起点 + 1, ある年の元旦から後の年の大晦日は何日目か(_翌年,_年終点,_何日目). ある年の元旦から後の年のある日は何日目か(_年起点,_年終点,_月終点,_日終点,_何日目) :- _前年 is _年終点 - 1, ある年の元旦から後の年の大晦日は何日目か(_年起点,_前年,_何日目_1), ある年月日はその年の元旦から何日目か(_年終点,_月終点,_日終点,_何日目_2), _何日目 is _何日目_1 + _何日目_2. ある年月日はその年の元旦から何日目か(_年,_月,_日,_元旦から何日) :- 月日数ならび(_年,_月日数ならび), _前月 is _月 - 1, length(L0,_月), append(L0,_,_月日数ならび), sum(L0,_前月末日までの日数), _元旦から何日 is _前月末日までの日数 + _日. 大晦日は何日目か(_年,_月,_日,_大晦日は何日目) :- 月日数ならび(_年,_月日数ならび), 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_翌月の一日から大晦日は何日目), 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数), _大晦日は何日目 is _今日を含めて今月の末日までの日数 + _翌月の一日から大晦日は何日目. 翌月から一日から大晦日は何日目か(_年,_月,_日,_月日数ならび,_何日目) :- length(L0,_月), append(L0,_翌月からの月日数ならび,_月日数ならび), sum(_翌月からの月日数ならび,_何日目). 今日を含めて今月末日までの日数(_年,_月,_日,_月日数ならび,_今日を含めて今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _今日を含めて今月の末日までの日数 is _今月の日数 - _日 + 1. 明日から今月末日までの日数(_年,_月,_日,_月日数ならび,_明日から今月の末日までの日数) :- nth1(_月,_月日数ならび,_今月の日数), _明日から今月の末日までの日数 is _今月の日数 - _日. 月日数ならび(_年,[31,29,31,30,31,30,31,31,30,31,30,31]) :- うるう年(_年),!. 月日数ならび(_年,[31,28,31,30,31,30,31,31,30,31,30,31]). うるう年(_年文字列) :- atom(_年文字列), atom_to_term(_年文字列,_年整数,_),!, うるう年(_年整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. 起点日と終点日はそれぞれ日数に含める. 起点日と終点日はともに日数に含めない. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/56 # # t1 # id str # 1 a # 2 b # 3 c # # t2 # id str # 1 d # 2 e # 3 f # # t3 # id t1.id t2.id # 1  1  1 # 2  1  2 # 3  1  3 # 4  2  1 # 5  3  1 # 6  3  3 # # こういうテーブルがあります # left joinで結合したところ # # t1.id t1.str t2.id t2.str t3.id # 1   a   1   d   1 # 1   a   2   e   2 # 1   a   3   f   3 # 2   b   1   d   4 # 3   c   1   d   5 # 3   c   3   f   6 # # こうなりました # これを # # t1.idが2でt2.idが2か3はnullなので入っていません # 同様にt1.idが3でt2.idが2のとこもnullなので入っていません # これを入れて # # t1.id t1.str t2.id t2.str t3.id # 1   a   1   d   1 # 1   a   2   e   2 # 1   a   3   f   3 # 2   b   1   d   4 # 2   b   2   e  null # 2   b   3   f  null # 3   c   1   d   5 # 3   c   2   e  null # 3   c   3   f   6 # # こんな感じのを取得したいのですがどのようなSQLをかけばいいでしょうか? # 使用DB SQLite3 # # 't1,t2,t3を結合するがt3が結合対象がない時は_t3_idは[]とする'(_t1_id,_t1_str,_t2_id,_t2_str,_t3_id) :- t1(_t1_id,_t1_str), t2(_t2_id,_t2_str), 't3が結合対象がない時は_t3_idは[]とする'(_t1_id,_t2_id,_t3_id). 't3が結合対象がない時は_t3_idは[]とする'(_t1_id,_t2_id,_t3_id) :- t3(_t3_id,_t1_id,_t2_id). 't3が結合対象がない時は_t3_idは[]とする'(_t1_id,_t2_id,_t3_id) :- \+(t3(_t3_id,_t1_id,_t2_id)), _t3_id = []. % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m remdup(L1,L2) :- atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,L2). atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,L2) :- atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,[],L2). atomに重複があれば最初のatomは残して後ろの重複したatomは消す([],_,[]). atomに重複があれば最初のatomは残して後ろの重複したatomは消す([H|R1],L2,R3) :- member(H,L2), atomに重複があれば最初のatomは残して後ろの重複したatomは消す(R1,L2,R3). atomに重複があれば最初のatomは残して後ろの重複したatomは消す([H|R1],L2,[H|R3]) :- \+(member(H,L2)), atomに重複があれば最初のatomは残して後ろの重複したatomは消す(R1,[H|L2],R3). % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L1,L2) :- remdup(L1,L2). remdup(L1,L2) :- dupacc(L1,[],L2). dupacc([],_,[]). dupacc([H|R1],L2,R3) :- member(H,L2), dupacc(R1,L2,R3). dupacc([H|R1],L2,[H|R3]) :- \+(member(H,L2)), dupacc(R1,[H|L2],R3). % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m remdup(L,X) :- atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X). atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X) :- findall(A,( append(L0,[A|_],L), \+(member(A,L0))), X). % 以下のサイトは # 出典:: http://viva2ch.net/tech/976462999.html # # プロローグについて質問です。 # SWI-Prologのplwin Version5.2.13でプログラムを組んでいます。 # atomに重複があれば最初のatomは残して後ろの重複したatomは消す、という # プログラムを作りたいのですが…できません。 # # 動作は # remdup([a, b, c, a, d, c], X). # は # X=[a, b, c, d] # となるはずです。 # # 本に載っていたのを試したのですが # 順番が逆になってしまいます。↓ # # remdup(L, M) :- dupacc(L, [], M). # dupacc([], A, A). # dupacc([H|T], A, L) :- member(H, A), dupacc(T, A, L). # dupacc([H|T], A, L) :- dupacc(T, [H|A], L). # # 結果: # 1 ?- remdup([a, b, c, a, d, c], X). # X = [d, c, b, a] # # reverse()を「使わずに」どうにか完成させたいのですが # できますでしょうか? # ちなみにmember()やappend()、atomp()、listp()、last()など基本的な関数は既に作りました、 # ですからそれらは使えます。 # どうかお助けください。m(__)m atomに重複があれば最初のatomは残して後ろの重複したatomは消す(L,X) :- remdup(L,X). remdup(L,X) :- findall(A,( append(L0,[A|_],L), \+(member(A,L0))), X). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/512 # # [1] 授業単元:C言語基礎実習 # [2] 問題文(含コード&リンク):ある整数 a をその数自身を除く約数をすべて足したときに # その合計の値がaと同じになるとき、その数を和の完全数といいます。 # 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 # 出力は以下のようにする事。 # 6=1+2+3 # 28=1+2+4+7+14 # ・ # ・ # ・ # # 'ある整数 a をその数自身を除く約数をすべて足したときに その合計の値がaと同じになるとき、その数を和の完全数といいます 512以下の和の完全数を見つけて表示するプログラムを作成しなさい。 出力は以下のようにする事。 6=1+2+3 28=1+2+4+7+14 ・ ・ ・ ' :- between(1,512,_a), 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(_診断,_a,_約数ならび), 完全数を表示する(_診断,_a,_約数ならび), _a = 512,!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数,_a,_約数ならび), _a_1 is _a - 1, findsum(_約数,( between(1,_a_1,_約数), 0 is _a mod _約数), _a),!. 'ある整数 a をその数自身を除く約数をすべて足したときにその合計の値がaと同じになるとき、その数を和の完全数といいます'(和の完全数ではない,_,_). 完全数を表示する(和の完全数,_a,_約数ならび) :- atomic_list_concat(_約数ならび,' + ',_式表現文字列), writef('%t=%t\n',[_a,_式表現文字列]),!. 完全数を表示する(和の完全数ではない,_,_). % 以下のサイトは 加算器型相加平均(_累計,_相加平均) :- 加算器型相加平均([],0,_累計,_相加平均). 加算器型相加平均(Ln,_累計_1,_累計,_相加平均) :- 数を得る(_数), _累計_2 is _累計_1 + _数, 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均). 加算器型相加平均_1(Ln,_累計,_累計,_相加平均) :- length([_|Ln],Len), _相加平均 is _累計 / Len. 加算器型相加平均_1(Ln,_累計_2,_累計,_相加平均) :- 加算器型相加平均([_|Ln],_累計_2,_累計,_相加平均). 数を得る(Instream,_催促文ならび,_数を含む条件,_数ならび) :- list(_催促文ならび), findall(_数,( member(_催促文,_催促文ならび), 数を得る(Instream,_催促文,_数を含む条件,_数)), _数ならび),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 催促文の出力(_催促文), get_line(Instream,Line), '診断: 数を得る'(Line,_数を含む条件,_数),!. 数を得る(Instream,_催促文,_数を含む条件,_数) :- 数を得る(Instream,_催促文,_数を含む条件,_数). 催促文の出力('') :- !. 催促文の出力(_催促文) :- writef('%tを入力してください : ',[_催促文]). '診断: 数を得る'(end_of_file,_,end_of_file) :- !. '診断: 数を得る'('',_,_) :- !,fail. '診断: 数を得る'(Line,_数を含む条件,_数) :- atom_to_term(Line,_数,_), number(_数), '診断: 数を含む条件'(_数,_数を含む条件),!. '診断: 数を得る'(Line,_数を含む条件,_数) :- \+((atom_to_term(Line,_数,_),number(_数))), writef('入力された %t からは数が得られません。再入力をお願いします。\n',[Line]),!, fail. '診断: 数を含む条件'(_数,_数を含む条件) :- number(_数), call(_数を含む条件),!. '診断: 数を含む条件'(_数,_数を含む条件) :- writef('入力された %t は %t が偽となります。\n',[_数,_数を含む条件]),!, fail. 数を得る(_催促文,_数を含む条件,_数) :- 数を得る(user_input,_催促文,_数を含む条件,_数). 数を得る(_催促文,_数) :- 数を得る(user_input,_催促文,true,_数). 数を得る(_数) :- 数を得る(user_input,'',true,_数). 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([]. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/425 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # クイックソート、バブルソート、選択ソートの三種のソート関数 # それぞれ、void qusort(int[]), busort(int[]) sesort(int[]),を作れ。 #   並び順は、降順。ソートした結果は引数配列と同じ配列に返してやる。 # 選択ソート([A],[A]) :- !. 選択ソート(L1,[_最小値|R2]) :- 最小値の抜き取り(L1,_最小値,R1), 選択ソート(R1,R2). 最小値の抜き取り(L1,_最小値,R1) :- append(L0,[_最小値|R2],L1), \+((member(D,R2),D < _最小値)), append(L0,R2,R1),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/397 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):do-while文を使って、入力させた数値を3で割った余りを表示することを続ける。 # もし、3の倍数が入力されたときは"3の倍数"と表示して終了する。 # 'do-while文を使って、入力させた数値を3で割った余りを表示することを続ける。もし、3の倍数が入力されたときは"3の倍数"と表示して終了する。' :- do(_3で割った余り), while(\+(_3で割った余り = 0)). 'do-while文を使って、入力させた数値を3で割った余りを表示することを続ける。もし、3の倍数が入力されたときは"3の倍数"と表示して終了する。'. do(_3で割った余り) :- 入力させた数値を(_入力された数値), _3で割った余り is _入力された数値 mod 3, '3で割った余りを表示する。3の倍数が入力されたときは"3の倍数"と表示して終了する。'(_3で割った余り). while(P) :- call(P),!,fail. while(_). 入力させた数値を(_入力された数値) :- 整数を得る('1以上の自然数',_入力された数値 >= 1,_入力された数値). '3で割った余りを表示する。3の倍数が入力されたときは"3の倍数"と表示して終了する。'(_3で割った余り) :- \+(0 = _3で割った余り), writef('%t\n',[_3で割ったあまり]),!. '3で割った余りを表示する。3の倍数が入力されたときは"3の倍数"と表示して終了する。'(0) :- write('"3の倍数"'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/186 # # [1] 授業単元: プログラミングB # [2] 問題文(含コード&リンク):入力された文字列を2進数の文字列として #               解釈し、10進数に変換し画面出力しなさい。 #               入力にはライブラリ関数putcharを使用すること。 #               Enterキーのみが押された場合、エラーを表示し、再入力する。 #               0,1以外の文字が入力された場合、エラーを表示し、再入力する。   # # [3] 環境 #  [3.1] OS:Windows7 #  [3.2] コンパイラ名とバージョン: Borland C++ 5.5.1 #  [3.3] 言語:C言語 # [4] 期限: 2013/01/23 '入力された文字列を2進数の文字列として解釈し、10進数に変換し画面出力しなさい。 入力にはライブラリ関数putcharを使用すること。 Enterキーのみが押された場合、エラーを表示し、再入力する。 0,1以外の文字が入力された場合、エラーを表示し、再入力する。' :- '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)' (_入力された文字列), '2進数の文字列として解釈し、10進数に変換し'(_入力された文字列,_10進数), 画面に出力する(_入力された文字列,_10進数). '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列) :- write('2進数文字列を入力してください : '), get_line(_入力された文字列), '診断 :: 入力された文字列を'(_入力された文字列),!. '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列) :- '入力された文字列を(Enterキーのみが押された場合、エラーを表示し、再入力する。0,1以外の文字が入力された場合、エラーを表示し、再入力する。)'(_入力された文字列). '診断 :: 入力された文字列を'('') :- 'Enterキーのみが押された場合、エラーを表示し、再入力する。',!,fail. '診断 :: 入力された文字列を'(_入力された文字列) :- '0,1以外の文字が入力された場合、エラーを表示し、再入力する。'(_入力された文字列), !,fail. '診断 :: 入力された文字列を'(_). 'Enterキーのみが押された場合、エラーを表示し、再入力する。' :- write('エラー :: 文字列が入力されていません\n'). '0,1以外の文字が入力された場合、エラーを表示し、再入力する。'(_入力された文字列) :- sub_atom(_入力された文字列,_,1,_,_文字), \+(_文字 = '0'), \+(_文字 = '1'), write('エラー :: 0,1以外の文字が入力されました\n'), !,fail. '2進数の文字列として解釈し、10進数に変換し'(_入力された文字列,_10進数) :- atomic_list_concat(['0b',_入力された文字列],_2進数を表す文字列), atom_number(_2進数を表す文字列,_10進数). 画面に出力する(_入力された文字列,_10進数) :- writef('入力された文字列: %t 変換された10進数: %t\n',[_入力された文字列,_10進数]). % 以下のサイトは # # 教育漢字から任意の一文字を選択する # 教育漢字から任意の二文字を選択する # 教育漢字から任意の三文字を選択する # 教育漢字ならび([一,右,雨,円,王,音,下,火,花,貝,学,気,九,休,玉,金,空,月,犬,見,五,口,校,左,三,山,子,四,糸,字,耳,七,車,手,十,出,女,小,上,森,人,水,正,生,青,夕,石,赤,千,川,先,早,草,足,村,大,男,竹,中,虫,町,天,田,土,二,日,入,年,白,八,百,文,木,本,名,目,立,力,林,六,引,羽,雲,園,遠,何,科,夏,家,歌,画,回,会,海,絵,外,角,楽,活,間,丸,岩,顔,汽,記,帰,弓,牛,魚,京,強,教,近,兄,形,計,元,言,原,戸,古,午,後,語,工,公,広,交,光,考,行,高,黄,合,谷,国,黒,今,才,細,作,算,止,市,矢,姉,思,紙,寺,自,時,室,社,弱,首,秋,週,春,書,少,場,色,食,心,新,親,図,数,西,声,星,晴,切,雪,船,線,前,組,走,多,太,体,台,地,池,知,茶,昼,長,鳥,朝,直,通,弟,店,点,電,刀,冬,当,東,答,頭,同,道,読,内,南,肉,馬,売,買,麦,半,番,父,風,分,聞,米,歩,母,方,北,毎,妹,万,明,鳴,毛,門,夜,野,友,用,曜,来,里,理,話,悪,安,暗,医,委,意,育,員,院,飲,運,泳,駅,央,横,屋,温,化,荷,開,界,階,寒,感,漢,館,岸,起,期,客,究,急,級,宮,球,去,橋,業,曲,局,銀,区,苦,具,君,係,軽,血,決,研,県,庫,湖,向,幸,港,号,根,祭,皿,仕,死,使,始,指,歯,詩,次,事,持,式,実,写,者,主,守,取,酒,受,州,拾,終,習,集,住,重,宿,所,暑,助,昭,消,商,章,勝,乗,植,申,身,神,真,深,進,世,整,昔,全,相,送,想,息,速,族,他,打,対,待,代,第,題,炭,短,談,着,注,柱,丁,帳,調,追,定,庭,笛,鉄,転,都,度,投,豆,島,湯,登,等,動,童,農,波,配,倍,箱,畑,発,反,坂,板,皮,悲,美,鼻,筆,氷,表,秒,病,品,負,部,服,福,物,平,返,勉,放,味,命,面,問,役,薬,由,油,有,遊,予,羊,洋,葉,陽,様,落,流,旅,両,緑,礼,列,練,路,和,愛,案,以,衣,位,囲,胃,印,英,栄,塩,億,加,果,貨,課,芽,改,械,害,街,各,覚,完,官,管,関,観,願,希,季,紀,喜,旗,器,機,議,求,泣,救,給,挙,漁,共,協,鏡,競,極,訓,軍,郡,径,型,景,芸,欠,結,建,健,験,固,功,好,候,航,康,告,差,菜,最,材,昨,札,刷,殺,察,参,産,散,残,士,氏,史,司,試,児,治,辞,失,借,種,周,祝,順,初,松,笑,唱,焼,象,照,賞,臣,信,成,省,清,静,席,積,折,節,説,浅,戦,選,然,争,倉,巣,束,側,続,卒,孫,帯,隊,達,単,置,仲,貯,兆,腸,低,底,停,的,典,伝,徒,努,灯,堂,働,特,得,毒,熱,念,敗,梅,博,飯,飛,費,必,票,標,不,夫,付,府,副,粉,兵,別,辺,変,便,包,法,望,牧,末,満,未,脈,民,無,約,勇,要,養,浴,利,陸,良,料,量,輪,類,令,冷,例,歴,連,老,労,録,圧,移,因,永,営,衛,易,益,液,演,応,往,桜,恩,可,仮,価,河,過,賀,快,解,格,確,額,刊,幹,慣,眼,基,寄,規,技,義,逆,久,旧,居,許,境,均,禁,句,群,経,潔,件,券,険,検,限,現,減,故,個,護,効,厚,耕,鉱,構,興,講,混,査,再,災,妻,採,際,在,財,罪,雑,酸,賛,支,志,枝,師,資,飼,示,似,識,質,舎,謝,授,修,述,術,準,序,招,承,証,条,状,常,情,織,職,制,性,政,勢,精,製,税,責,績,接,設,舌,絶,銭,祖,素,総,造,像,増,則,測,属,率,損,退,貸,態,団,断,築,張,提,程,適,敵,統,銅,導,徳,独,任,燃,能,破,犯,判,版,比,肥,非,備,俵,評,貧,布,婦,富,武,復,複,仏,編,弁,保,墓,報,豊,防,貿,暴,務,夢,迷,綿,輸,余,預,容,略,留,領,異,遺,域,宇,映,延,沿,我,灰,拡,革,閣,割,株,干,巻,看,簡,危,机,貴,揮,疑,吸,供,胸,郷,勤,筋,系,敬,警,劇,激,穴,絹,権,憲,源,厳,己,呼,誤,后,孝,皇,紅,降,鋼,刻,穀,骨,困,砂,座,済,裁,策,冊,蚕,至,私,姿,視,詞,誌,磁,射,捨,尺,若,樹,収,宗,就,衆,従,縦,縮,熟,純,処,署,諸,除,将,傷,障,城,蒸,針,仁,垂,推,寸,盛,聖,誠,宣,専,泉,洗,染,善,奏,窓,創,装,層,操,蔵,臓,存,尊,宅,担,探,誕,段,暖,値,宙,忠,著,庁,頂,潮,賃,痛,展,討,党,糖,届,難,乳,認,納,脳,派,拝,背,肺,俳,班,晩,否,批,秘,腹,奮,並,陛,閉,片,補,暮,宝,訪,亡,忘,棒,枚,幕,密,盟,模,訳,郵,優,幼,欲,翌,乱,卵,覧,裏,律,臨,朗,論]). 教育漢字から一文字を選択する(_漢字) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から一文字を選択する(_教育漢字ならび,_漢字). 教育漢字から一文字を選択する(_教育漢字ならび,_漢字) :- _nth0 is random(1006), nth0(_nth0,_教育漢字ならび,_漢字). 教育漢字から重複なく二文字を選択する(_漢字_1,_漢字_2) :- 教育漢字から重複なくn文字を選択する(2,[_漢字_1,_漢字_2]). 教育漢字から重複なく三文字を選択する(_漢字_1,_漢字_2,_漢字_3) :- 教育漢字から重複なくn文字を選択する(3,[_漢字_1,_漢字_2,_漢字_3]). 教育漢字から重複なくn文字を選択する(_n,_漢字ならび) :- 教育漢字ならび(_教育漢字ならび), 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,[],_漢字ならび). 教育漢字から重複なくn文字を選択する(_n,_,L,L) :- length(L,_n),!. 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,L1,L) :- 重複なくn文字を選択して行く(_n,_教育漢字ならび,L1,L). 重複なくn文字を選択して行く(_n,_教育漢字ならび,L1,L) :- 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字), 教育漢字から重複なくn文字を選択する(_n,_教育漢字ならび,[_漢字|L1],L). 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字) :- 教育漢字から一文字を選択する(_教育漢字ならび,_漢字), 重複検査(_教育漢字ならび,L1,_漢字). 重複検査(_教育漢字ならび,L1,_漢字) :- 重複なく(_漢字,L1),!. 重複検査(_教育漢字ならび,L1,_漢字) :- 重複なく一文字を選択する(_教育漢字ならび,L1,_漢字). 重複なく(_漢字,L1) :- \+(member(_漢字,L1)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/94 # # [1] 授業単元: Cコーディング初級 # [2] 問題文(含コード&リンク): # # プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す # # [3] 環境 #  [3.1] OS: Windows #  [3.2] gcc 4.3.4 #  [3.3] 言語: C # [4] 期限: 1/17 # [5] その他の制限: (どこまで習っているか、標準ライブラリは使ってはいけない等々) time.h を使います # 週の頭は日曜から始まります # 1月1日を含む週に4日以上ある場合に第1週となります # つまり1月1日が日曜から始まっているときはその週が第1週ですが # 1月4日が日曜から始まっているときはその週が第1週になります 'プログラムを実行した日がその年の第何週目にあるかを終了コードとして整数で返す 週の頭は日曜から始まります 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_その年の第何週目) :- プログラムを実行した日が(_年,_月,_日), 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目). プログラムを実行した日が(_年,_月,_日) :- date(_年,_月,_日). 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :- 'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日), _曜日を表す値 >= 4, _今年に入ってからの第一週以前の日数 is 7 - _曜日を表す値, 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数), _その年の第何週目 is (_一月一日からの累積日数 - _今年に入ってからの第一週以前の日数) // 7 + 1. 'その年の第何週目にあるかを終了コードとして整数で返す 1月1日を含む週に4日以上ある場合に第1週となります つまり1月1日が日曜から始まっているときはその週が第1週ですが 1月4日が日曜から始まっているときはその週が第1週になります'(_年,_月,_日,_その年の第何週目) :- 'Zellerの公式を用いて曜日を得る'(_年,1,1,_曜日を表す値,_曜日), _曜日を表す値 < 4, 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数), _その年の第何週目 is _一月一日からの累積日数 // 7 + 1. 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :- うるう年(_年), findsum(_日数,( nth1(_nth1,[31,29,31,30,31,30,31,31,30,31,31],_日数), _nth1 < _月), 累積日数_1), _累積日数 is _累積日数 + _日. 一月一日からの累積日数(_年,_月,_日,_一月一日からの累積日数) :- \+(うるう年(_年)), findsum(_日数,( nth1(_nth1,[31,28,31,30,31,30,31,31,30,31,31],_日数), _nth1 < _月), 累積日数_1), _累積日数 is _累積日数 + _日. '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, 'Zellerの公式で使う曜日を表す値'(_曜日を表す値,_曜日),!. 'Zellerの公式で使う曜日を表す値'(0,'日曜'). 'Zellerの公式で使う曜日を表す値'(1,'月曜'). 'Zellerの公式で使う曜日を表す値'(2,'火曜'). 'Zellerの公式で使う曜日を表す値'(3,'水曜'). 'Zellerの公式で使う曜日を表す値'(4,'木曜'). 'Zellerの公式で使う曜日を表す値'(5,'金曜'). 'Zellerの公式で使う曜日を表す値'(6,'土曜'). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100, !,fail. うるう年(_年) :- 0 is _年 mod 4,!. うるう年(_年) :- \+(0 is _年 mod 4), fail. % 以下のサイトは # # 単位節から選択された引数リストの組合せ # # 単位節から選択された引数リストの順列 # 単位節組合せ(_単位節項,_射影項ならび,_条件,_組合せ数,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/33 # # [1] 授業単元: リスト処理 # [2] 問題文(含コード&) http://codepad.org/3DdhcBUM # # /* # # seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 # また、整列する際に要素どうしを比較した回数も表示しなさい。 # # 【実行例】 # # 番号 氏名      得点 # 1021 Machida Masato 100 # 1017 Nonaka Fujio 98 # 1011 Suzuki kenichi 93 # 1019 Fujimoto Kaoru 92 # 1006 kato Ichiro 91 # ・ ・     ・ # ・ ・     ・ # ・ ・     ・ # 1020 Hoshi Izumi 32 # 整列の為の比較回数=132回 # # ※長いので実行結果は途中省略しています。 # ※比較回数はコードによって異なる場合があります。 # # */ 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、リスト処理による挿入法で得点の降順に整列して表示しなさい。 また、整列する際に要素どうしを比較した回数も表示しなさい。' :- 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび), リスト処理による挿入法で得点の降順に整列して(_生徒ならび,[],_整列済み生徒ならび,0,_比較回数), 表示しなさい(_整列済み生徒ならび,_比較回数). 'seito.dat ( http://db.tt/RfFwIKXU )を構造体のリストのセルに(EOFになるまで)入力し、'(_生徒ならび) :- get_split_lines('seito.dat',[' '],_生徒ならび). リスト処理による挿入法で得点の降順に整列して([[_学籍番号,_姓,_名,_得点]|R1],L1,_整列済み生徒ならび,_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,L1,L2,_比較回数_1,_比較回数_2), リスト処理による挿入法で得点の降順に整列して(R1,L2,_整列済み生徒ならび,_比較回数_2,_比較回数),!. リスト処理による挿入法で得点の降順に整列して([],_整列済み生徒ならび,_整列済み生徒ならび,_比較回数,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],[[_学籍番号,_名,_名,_得点],[_学籍番号_1,_姓_1,_名_1,_得点_1]|R],_比較回数_1,_比較回数) :- 比較回数 is _比較回数_1 + 1, _得点 >= _得点_1,!. 降順に挿入(_学籍番号,_姓,_名,_得点,[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R1],[[_学籍番号_1,_姓_1,_名_1,_得点_1]|R2],_比較回数_1,_比較回数) :- 降順に挿入(_学籍番号,_姓,_名,_得点,R1,R2,_比較回数_1,_比較回数). 降順に挿入(_学籍番号,_姓,_名,_得点,[],[[_学籍番号,_名,_名,_得点]],_比較回数,_比較回数) :- !. 表示しなさい(_整列済み生徒ならび,_比較回数) :- 見出しの表示, append(_,[[_学籍番号,_姓,_名,_得点]|R],_整列済み生徒ならび), 整形して表示する(_学籍番号,_姓,_名,_得点), R = [], writef('整列の為の比較回数=%t回\n',[_比較回数]). 見出しの表示 :- write('番号 氏名      得点\n'). 整形して表示する(_学籍番号,_姓,_名,_得点) :- 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列), 得点を頭部空白3桁に(_得点,_得点文字列), atomic_list_concat([_学籍番号,_姓文字列,_名文字列,_得点文字列],' ',_表示文字列), writef('%t\n',[_表示文字列]). 姓名をそれぞれ8桁に(_姓,_名,_姓文字列,_名文字列) :- '8桁に'(_姓,_姓文字列), '8桁に'(_名,_名文字列). '8桁に'(_項,_8桁文字列) :- atom_chars(_項,Chars_1), length(L,8), append(L1,L2,L), all(L2,' '), atom_chars(_8桁文字列,L). 得点を頭部空白3桁に(_得点,_得点文字列) :- number_chars(_得点,Chars), length(L,3), append(L0,Chars,L), all(L0,' '), atom_chars(_得点文字列,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_split_lines(File,Sep,Lines) :- get_lines(File,Lines1), findall(Line,( member(A,Lines1), split(A,Sep,Line)), Lines). get_lines(Instream,end_of_file,_,_,[]) :-!. get_lines(Instream,S,[],_終了検索対象ならび,[S]) :- member(A,_終了検索対象ならび), 検索(S,A),!. get_lines(Instream,S,[],[],[S|R]) :- get_line(Instream,S2), get_lines(Instream,S2,[],[],R),!. get_lines(Instream,S,[],_終了検索対象ならび,[S|R]) :- member(A,_終了検索対象ならび), \+(検索(S,A)), get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), member(B,_終了検索対象ならび), 検索(S,B),!. get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,[S|R]) :- \+(_開始検索対象ならび = []), member(A,_開始検索対象ならび), 検索(S,A), !, get_line(Instream,S2), get_lines(Instream,S2,[],_終了検索対象ならび,R),!. get_lines(Instream,_,_開始検索対象ならび,_終了検索対象ならび,X) :- get_line(Instream,S2), get_lines(Instream,S2,_開始検索対象ならび,_終了検索対象ならび,X),!. get_lines(_ファイル,_スタート行,_最終行,X) :- integer(_スタート行), integer(_最終行), 行位置指定選択(_ファイル,_スタート行,_最終行,X). get_lines(_ファイル,_開始検索対象ならび,_終了検索対象ならび,X) :- \+(integer(_開始検索対象ならび)), \+(integer(_終了検索対象ならび)), open(_ファイル,read,Instream), get_line(Instream,S), get_lines(Instream,S,_開始検索対象ならび,_終了検索対象ならび,X), close(Instream),!. get_lines(File,Lines) :- get_chars(File,L), chars_lines(L,Lines),!. get_lines(Lines) :- findall(Line,( repeat, get_line(user_input,Line), (Line = end_of_file , (!) , fail ; true)), Lines). get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars),!. get_chars(Instream,end_of_file,[]) :- !. get_chars(Instream,_,[]) :- at_end_of_stream(Instream),!. get_chars(Instream,X,[X|R]) :- get_char(Instream,Y), get_chars(Instream,Y,R) . get_chars(File,L) :- \+(is_stream(_,File,_)), slush_op(File,File_1), exists_file(File_1), open(File_1,read,Instream), get_char(Instream,X), get_chars(Instream,X,L), close(Instream),!. get_chars(Instream,L) :- is_stream(_,Instream,_), get_char(Instream,X), get_chars(Instream,X,L),!. get_chars(L) :- findall(U,( repeat, get_char(U), (U = end_of_file , (!) , fail ; true)), L). get_line(X) :- get_line(user_input,X). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,_,[]) :- at_end_of_stream(Instream),!. get_line_3(Instream,end_of_file,[]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R), atomic_list_concat(U,A), chars_lines(R,R2). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y) , \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび) , atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), C number Nl,!. split_5(B,C) :- atomic_list_concat(B,C),!. all([],_). all([V|R],V) :- all(R,V). 検索(_文字列,_副文字列) :- atom_length(_文字列,_文字列の文字数), atom_length(_副文字列,_副文字列の文字数), Max is _文字列の文字数 - _副文字列の文字数, between(0,Max,N), sub_atom(_文字列,N,_副文字列の文字数,_副文字列),!. 行位置指定選択(_ファイル,_選択先頭行,_選択最終行,X) :- wc(_ファイル,[[_行,_,_,_]]), _行数_1 is _行 - _選択先頭行 + 1, _行数_2 is _選択最終行 - _選択先頭行, atomic_list_concat(['tail -',_行数_1,' ',_ファイル,' | head -',_行数_2],S), shs(S,X). wc(F,X) :- exists_file(F1), atomic_list_concat(['wc ',F1],S), sh(S,X),!. wc(F,X) :- atomic_list_concat([F,' | wc'],S), sh(S,X),!. sh(Command,X) :- shs(Command,Y), findall(U,(member(V,Y) , make_list(V,[' ',','],U)),X). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). system(Command,X) :- shell(Command,X). system(Command) :- shell(Command). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,_,[]) :- at_end_of_stream(Instream),!. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). % 以下のサイトは # 出典:: 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/841 # # お願いします。 # # [1] 授業単元: 課題 # [2] 問題文 # # 1. 10*10(=100)の領域に、ランダムに30個の点を配置する # 2. ランダムに2点 A, B を選ぶ # 3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ # # '1. 10*10(=100)の領域に、ランダムに30個の点を配置する 2. ランダムに2点 A, B を選ぶ 3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ' :- '1. 10*10(=100)の領域に、ランダムに30個の点を配置する'(L), '2. ランダムに2点 A, B を選ぶ'(L,_A,_B), '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(L,_A,_B). '1. 10*10(=100)の領域に、ランダムに30個の点を配置する'(L) :- fidnall((_x,_y),( between(1,30,_), _x is (random(10000) + 1) / 1000, _y is (random(10000) + 1) / 1000), L). '2. ランダムに2点 A, B を選ぶ'(L,_A,_B) :- ランダムに点を選ぶ(L,_A), ランダムに点を選ぶ(L,_B), \+(_A = _B),!. '2. ランダムに2点 A, B を選ぶ'(L,_A,_B) :- '2. ランダムに2点 A, B を選ぶ'(L,_A,_B). ランダムに点を選ぶ(L,_点) :- R is random(30), nth0(R,L,_点). '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(L,(_x1,_y1),(_x2,_y2)) :- 距離10以内にある点を経由し移動可能(L,(_x,_y),(_x1,_y1),(_x2,_y2)), writef('点(%t,%t)で可能です\n',[_x,_y]). '3. AからBまで、距離10以内にある点を経由し移動が可能か否か判定せよ'(_,_,_) :- write('可能な点はありません\n'). 距離10以内にある点を経由し移動可能(L,(_x,_y),(_x1,_y1),(_x2,_y2)) :- 経由する点候補を得る(L,(_x,_y),(_x1,_y1),(_x2,_y2)), 距離10以内にある((_x,_y),(_x1,_y1),(_x2,_y2)). 経由する点候補を得る(L,(_x,_y),(_x1,_y1),(_x2,_y2)) :- member((_x,_y),L), \+((_x,_y)=(_x1,_y1)), \+((_x,_y)=(_X2,_y2)). 距離10以内にある((_x,_y),(_x1,_y1),(_x2,_y2)) :- sqrt((_x - _x1) * (_x - _x1) + (_y - _y1) * (_y - _y1)) + sqrt((_x - _x2) * (_x - _x2) + (_y - _y2) * (_y - _y21)) =< 10.0. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/478 # # MySQL5.1 # ・テーブルデータ # table1 # name value # -------------------- # aaa a # aaa b # aaa c # bbb b # bbb c # ccc a # ccc c # # ・欲しい結果 # bbb # # table1から、valueにaが無いnameを抽出したいです。 # お願いします。 # # 'MySQL5.1 ・テーブルデータ table1 name value -------------------- aaa a aaa b aaa c bbb b bbb c ccc a ccc c ・欲しい結果 bbb table1から、valueにaが無いnameを抽出したいです。'(_name) :- table1(_name,_value), \+(_value=a). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/717 # # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/611 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク):となりどおしの数字の差がその下の数字となるように、 # 1から15までの数を1回だけ使って例に従ってマスにいれなさい。 # :- dynamic(重複が存在しない減算表/4). 重複が存在しない減算表の定義(_重複しない数ならび) :- 重複が存在しない減算表候補の選定(_重複しない数ならび,A,B,C), assertz((重複が存在しない減算表(L,A,B,C) :- 'A,B,Cは高々一個'(L,A,B,C))), fail. 重複が存在しない減算表の定義(_). 重複が存在しない減算表候補の選定(_重複しない数ならび,A,B,C) :- 最大値(_重複しない数ならび,_最大値), member(A,_重複しない数ならび), member(B,_重複しない数ならび), C is abs(A - B), 'A,B,Cは一意であり、Cは最大値より小さい'(_最大値,A,B,C). 最大値(L,_最大値) :- max_list(L,_最大値). 'A,B,Cは一意であり、Cは最大値より小さい'(_最大値,A,B,C) :- \+(A=B), C < _最大値, \+(C=B), \+(C=A). '定義::数を一回だけ使ってマスに入れる'(LL) :- flatten(LL,L), '条件生成::数を一回だけ使ってマスに入れる'(L,LL,Q), assertz(('数を一回だけ使ってマスに入れる'(L) :- Q)). '条件生成::数を一回だけ使ってマスに入れる'(L,[[_上左,_上右,_下]],重複が存在しない減算表(L,_上左,_上右,_下)) :- !. '条件生成::数を一回だけ使ってマスに入れる'(L,[[_上左,_上右,_下]|R],(重複が存在しない減算表(L,_上左,_上右,_下),P)) :- '条件生成::数を一回だけ使ってマスに入れる'(L,R,P). 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(A,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(B,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(C,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C). '2個以上存在する'(_,N,_) :- N > 1,!. '2個以上存在する'(_,_,[]) :- !,fail. '2個以上存在する'(C,N,[V|R]) :- var(V), '2個以上存在する'(C,N,R),!. '2個以上存在する'(C,N,[V|R]) :- \+(var(V)), C = V, N_2 is N + 1, '2個以上存在する'(C,N_2,R),!. '2個以上存在する'(C,N,[V|R]) :- \+(var(V)), \+(C=V), '2個以上存在する'(C,N,R). ?- 重複が存在しない減算表の定義([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]). ?- 数を一回だけ使ってマスに入れる'([[_1_1,_1_2,_2_1],[_1_2,_1_3,_2_2],[_1_3,1_4,_2_3],[_1_4,_1_5,_2_4],[_2_1,_2_2,_3_1],[_2_2,_2_3,_3_2],[_2_3,_2_4,_3_3],[_3_1,_3_2,_4_1],[_3_2,_3_3,_4_2],[_4_1,_4_2,_5_1]]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/611 # # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク):となりどおしの数字の差がその下の数字となるように、 # 1から15までの数を1回だけ使って例に従ってマスにいれなさい。 # :- dynamic(重複が存在しない減算表/4). 重複が存在しない減算表の定義(_重複しない数ならび) :- 重複が存在しない減算表候補の選定(_重複しない数ならび,A,B,C), assertz((重複が存在しない減算表(L,A,B,C) :- 'A,B,Cは高々一個'(L,A,B,C))), fail. 重複が存在しない減算表の定義(_). 重複が存在しない減算表候補の選定(_重複しない数ならび,A,B,C) :- 最大値(_重複しない数ならび,_最大値), member(A,_重複しない数ならび), member(B,_重複しない数ならび), C is abs(A - B), 'A,B,Cは一意であり、Cは最大値より小さい'(_最大値,A,B,C). 最大値(L,_最大値) :- max(L,_最大値). 'A,B,Cは一意であり、Cは最大値より小さい'(_最大値,A,B,C) :- \+(A=B), C < _最大値, \+(C=B), \+(C=A). '1から15までの数を1回だけ使って例に従ってマスにいれなさい。 '([_1_1,_1_2,_1_3,_1_4,_1_5,_2_1,_2_2,_2_3,_2_4,_3_1,_3_2,_3_3,_4_1,_4_2,_5_1]) :- L = [_1_1,_1_2,_1_3,_1_4,_1_5,_2_1,_2_2,_2_3,_2_4,_3_1,_3_2,_3_3,_4_1,_4_2,_5_1], 重複が存在しない減算表(L,_4_1,_4_2,_5_1), 重複が存在しない減算表(L,_3_1,_3_2,_4_1), 重複が存在しない減算表(L,_3_2,_3_3,_4_2), 重複が存在しない減算表(L,_2_1,_2_2,_3_1), 重複が存在しない減算表(L,_2_2,_2_3,_3_2), 重複が存在しない減算表(L,_2_3,_2_4,_3_3), 重複が存在しない減算表(L,_1_1,_1_2,_2_1), 重複が存在しない減算表(L,_1_2,_1_3,_2_2), 重複が存在しない減算表(L,_1_3,_1_4,_2_3), 重複が存在しない減算表(L,_1_4,_1_5,_2_4). '2個以上存在する'(_,N,_) :- N > 1,!. '2個以上存在する'(_,_,[]) :- !,fail. '2個以上存在する'(C,N,[V|R]) :- var(V), '2個以上存在する'(C,N,R),!. '2個以上存在する'(C,N,[V|R]) :- \+(var(V)), C = V, N_2 is N + 1, '2個以上存在する'(C,N_2,R),!. '2個以上存在する'(C,N,[V|R]) :- \+(var(V)), \+(C=V), '2個以上存在する'(C,N,R). 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(A,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(B,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C) :- '2個以上存在する'(C,0,L),!,fail. 'A,B,Cは高々一個'(L,A,B,C). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/587 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 演習目的 # 々渋ぢ里筌櫂ぅ鵐燭鰺用して、データ構造を設計することができる。 # 構造体をreturn文で返却する関数を作ることができる。 # ポインタを扱うことができる。 # 課題: # 直交座標系の座標(x,y)を極座標系の座標(r,θ)に変換する関数と、 # その逆変換をする関数を作成しなさい。 # ただし、直交座標系(orthogonal coordinate system)の座標と、 # 極座標系(polar coordinates system)の座標はそれぞれ構造体を # 用いて定義すること。 # {x=rcosθ,y=rsinθ # {r=√(x^2+y^2),tanθ=y/x # 例えば、次のように定義することができる。 # typedef struct{ # double x;  /** x座標 **/ # double y;  /** y座標 **/ # } orth_coord_t; # '直交座標系の座標(x,y)を極座標系の座標(r,θ)に変換する関数と その逆変換をする関数を作成しなさい。'(_x,_y,_r,_θ) :- \+(var(_x)), \+(var(_y)), '直交座標(x,y)から極座標(r,θ)へ変換'(_x,_y,_r,_θ) ,!. '直交座標系の座標(x,y)を極座標系の座標(r,θ)に変換する関数と その逆変換をする関数を作成しなさい。'(_x,_y,_r,_θ) :- \+(var(_r)), \+(var(_θ)), '極座標(r,θ)から直交座標(x,y)へ変換'(_r,_θ,_x,_y). '極座標(r,θ)から直交座標(x,y)へ変換'(_r,_θ,_x,_y) :- _x is _r * cos(_θ), _y is _r * sin(_θ),!. '直交座標(x,y)から極座標(r,θ)へ変換'(_x,_y,_r,_θ) :- _r is sqrt(_x ^ 2 + _y ^ 2), _θ is atan(_y / _x), '直交座標(x,y)から極座標(r,θ)へ変換'(_x,_y,_θ),!. '直交座標(x,y)から極座標(r,θ)へ変換'(_x,_y,_θ) :- \+(_x = 0.0), _θ is atan(0.0),!. '直交座標(x,y)から極座標(r,θ)へ変換'(0.0,_y,_θ) :- \+(_y = 0.0), _z is _x / _y, arccotan(_z,_θ),!. '直交座標(x,y)から極座標(r,θ)へ変換'(0.0,0.0,0.0). arccotan(X,Y) :- Z is X, Y is atan(Z) + 2 * atan(1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1355011916/198 # # phpですがwebじゃないので、こちらで質問させて下さい # 趣味でプログラムをはじめて半年程度です # # 競馬のデータ処理をやっています # 数字と記号の混ざった文字列の数字部分を置き換えたいのですが # どうすればいいでしょうか? # # 具体的には、各馬の各コーナーの通過順位を以下のように馬番から着順に置き換えたいのです # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) *各馬の各コーナー通過順位 馬番表示 ←コレを # (10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12) *各馬の各コーナー通過順位 着順表示 こうしたい # # # 現在データは、以下のようになっています # # 各馬の各コーナー通過順位 馬番表示は $corner *先週の朝日杯の3コーナー # (2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1) # # 馬番は $umban # Array ( [0] => 14 [1] => 15 [2] => 2 [3] => 5 [4] => 9 [5] => 12 [6] => 16 [7] => 3 [8] => 8 [9] => 6 [10] => 10 [11] => 13 [12] => 4 [13] => 11 [14] => 7 [15] => 1 ) # # 着順は $tyaku # Array ( [0] => 1 [1] => 16 [2] => 10 [3] => 2 [4] => 8 [5] => 4 [6] => 6 [7] => 3 [8] => 9 [9] => 7 [10] => 15 [11] => 14 [12] => 13 [13] => 11 [14] => 5 [15] => 12 ) # # $umbanと$tyakuの相関性は、[0]は14番で1着、[1]は15番で16着、[2]は2番で10着、、etcとなっています # # phpです、宜しくお願いします *分割で見にくくなってしまいすいません # # # 11R 第64回 朝日杯フューチュリティステークス(GI)成績 # # サラ系2歳,1600m,芝・右 外 # (国際)牡・牝(指定)オープン,馬齢 # 本,賞,金,:,7000,、,2800,、,1800,、,1100,、,700,万円 # 付加賞金,:,121.8,、,34.8,、,17.4,万円 # 発走 15:25 # 天候:晴   芝:良 # :- op(400,xfx,':'). コーナー通過時の先頭からの各馬の最終到達順位(_レース,_通過時文字列,_到達順位に置換した通過時文字列) :- sPLIT(_通過時文字列,['(','-','=','*',')'],L1), 馬番を最終到達順位に変換(_レース,L1,L2), atomic_list_concat(L2,_到達順に置換した通過時順位). 馬番を最終到達順位に変換(_レース,[],[]). 馬番を最終到達順位に変換(_レース,[_馬番|R1],[_着順|R2]) :- integer(_馬番), レース成績(_レース,_着順,_馬番,_馬名,_性齢,_負担重量,_騎手,_タイム,_着差,_推定上り,_馬体重,_調教師,_単勝人気), 馬番を最終到達順位に変換(_レース,R1,R2). 馬番を最終到達順位に変換(_レース,[A|R1],[A|R2]) :- \+(integer(A)), 馬番を最終到達順位に変換(_レース,R1,R2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',1,14, ロゴタイプ,牡2,55.0, M.デムーロ,1:33.4,'',36.1,482,-4, 田中剛,7). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',2,5, コディーノ,牡2,55.0, 横山典弘,1:33.4,クビ,36.0,476,+2, 藤沢和雄,1). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',3,3, ゴットフリート,牡2,55.0, C.スミヨン,1:33.8,2+1/2,36.0,470,+2, 斎藤誠,3). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',4,12, フラムドグロワール,牡2,55.0, C.ウィリアムズ,1:33.9,3/4,36.3,490, 0, 藤沢和雄,5). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',5,7, ティーハーフ,牡2,55.0, 武豊,1:33.9,クビ,35.5,436,-2, 西浦勝一,6). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',6,16, ノウレッジ,牡2,55.0, 蛯名正義,1:34.0,クビ,36.4,490,+2, 二ノ宮敬宇,10). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',7,6, ラブリーデイ,牡2,55.0, C.ルメール,1:34.0,クビ,36.2,472,-2, 池江泰寿,4). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',8,9,エーシントップ,牡2,55.0, 浜中俊,1:34.1,クビ,36.6,532,-2, 西園正都,2). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',9,8, クラウンレガーロ,牡2,55.0, 幸英明,1:34.1,ハナ,36.3,456,+12, 日吉正和,8). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',10, 2, ネオウィズダム,牡2,55.0, 柴田善臣,1:34.2,1/2,36.8,484,+2, 矢作芳人,12). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',11, 11, アットウィル,牡2,55.0, 岩田康誠,1:34.2,クビ,36.0,482,-2, 領家政蔵,13). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',12, 1, ザラストロ,牡2,55.0, 松岡正海,1:34.3,クビ,35.8,492,+4, 武藤善則,11). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',13, 4, テイエムイナズマ,牡2,55.0, 池添謙一,1:34.5,1+1/2,36.3,510,+10, 福島信晴,9). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',14, 13, ディアセルヴィス,牡2,55.0, 勝浦正樹,1:34.6,3/4,36.5,454,+4, 高橋裕,16). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',15, 10, ワキノブレイブ,牡2,55.0, 福永祐一,1:34.7,クビ,36.6,468,+6, 清水久詞,15). レース成績('11R 第64回 朝日杯フューチュリティステークス(GI)',16, 15,マイネルエテルネル,牡2,55.0, 柴田大知,1:34.9,1+1/4,37.6,470,-2, 西園正都,14). %%%%% 実行例 %%%% ?- コーナー通過時の先頭からの各馬の最終到達順位('11R 第64回 朝日杯フューチュリティステークス(GI)','(2,*15,14,5)(9,12,16)(8,3,6)-(10,13)(11,4)(7,1)',_到達順位に置換した通過時文字列). _到達順位に置換した通過時文字列 = '(10,*16,1,2)(8,4,6)(9,3,7)-(15,14)(11,13)(5,12)' % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/434 # # [1] C言語 # [2] 1) codepad.org/u1WNoZPtの関数と反対の動作をする関数、 #     及び二つの関数の動作確認が出来るmain関数を作成せよ。 #   2) キーボードから入力されたアルファベット及び数字の数を数えて、 #     少ないほうを消去するプログラムを作成せよ。 #     ただし、同数の場合は両方とも消去する。 # [3.1] Windows7 # [3.3] C言語 # [4] 12/19 19時まで # [5] 特になし # # 'キーボードから入力されたアルファベット及び数字の数を数えて、少ないほうを消去するプログラムを作成せよ。ただし、同数の場合は両方とも消去する。'(_残った文字列) :- 'キーボードから入力された'(_文字列), 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数), '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). 'キーボードから入力された'(_文字列) :- write('アルファベットと数字だけからなる文字列を入力してください : '), get_line(_文字列). 'アルファベット及び数字の数を数えて'(_文字列,_アルファベットの数,_数字の数) :- count((sub_atom(_文字列,_,1,_,_文字),アルファベット(_文字)),_アルファベットの数), count((sub_atom(_文字列,_,1,_,_文字),数字(_文字)),_アルファベットの数). アルファベット(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. アルファベット(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 数字(_文字) :- _文字 @>= '0', _文字 @=< '9'. '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 少ないほうを消去する。(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット < _数字の数, アルファベットを消去する(_文字列,_残った文字列). '少ないほうを消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット > _数字の数, 数字を消去する(_文字列,_残った文字列). 'ただし、同数の場合は両方とも消去する。'(_文字列,_アルファベットの数,_数字の数,_残った文字列) :- _アルファベット = _数字の数, 両方とも消去する(_文字列,_残った文字列). アルファベットを消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 数字を消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). 両方とも消去する(_文字列,_残った文字列) :- findall(_文字,( sub_atom(_文字列,_,1,_,_文字), \+(数字(_文字)), \+(アルファベット(_文字))), _残った文字ならび), atom_chars(_残った文字列,_残った文字ならび). count(P,Count) :- findall(1,P,L), length(L,Count). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/392 # # (1)C言語 # (2)問題:キーボードから正の整数を入力するとその桁数を表示するプログラムを作成せよ。 # (3)windows7 visual studio2010 # (4)期限:12月20日 # (5)よろしくお願いします。 # # 'キーボードから正の整数を入力するとその桁数を表示する' :- 'キーボードから正の整数を入力すると'(_正の整数), 'その桁数を表示する'(_正の整数). 'キーボードから正の整数を入力すると'(_正の整数) :- 整数を得る(正の整数,_正の整数 > 0,_正の整数). 'その桁数を表示する'(_正の整数) :- number_chars(_正の整数,Chars), length(Chars,_その桁数), writef('%t桁です\n',[_その桁数]). 整数を得る(_催促文,_整数を含む条件,_整数) :- 整数を得る(user_input,_催促文,_整数を含む条件,_整数). 整数を得る(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. get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/187 # # [1]C言語 # [2]最大20人分の番号、所属、名前を管理する構造体配列を利用し #   入力したデータを元に社員タグを出力するプログラムを作成せよ #   実行例 #   http://ime.nu/iup.2ch-library.com/i/i0804401-1355254105.jpg # [3.1]Windows # [4]2012/12/13まで # [5]いかにも初心者が作るようなものだと嬉しいです # お願いします # # # % syain # input name...yamada # input post...education # input syainID...1234 # # input name...okada # input post...sales # input syainID...9876 # # input name...\d # # *******[ IDnumber 1234 ]******* # post:education # name:yamada # ******************************* # # *******[ IDnumber 9876 ]******* # post:sales # name:okeda # ******************************* # :- dynamic(社員/3). '最大20人分の番号、所属、名前を管理する述語を定義し、 入力したデータを元に社員タグを出力する' :- '最大20人分の番号、所属、名前を管理する構造体配列を利用し入力したデータを元に', 入力したデータを元に社員タグを出力する. '最大20人分の番号、所属、名前を管理する述語を定義し' :- 最大20人分の(Ln), '番号、所属、名前を管理する述語を定義し'(Ln). 最大20人分の(Ln) :- length(Ln,20). '最大20人分の番号、所属、名前を管理する述語を定義し'([_|Ln]) :- '番号、所属、名前の入力'(_名前,_所属,_社員タグ), '番号、所属、名前を管理する述語を定義し'(_名前,_所属,_社員タグ), '最大20人分の番号、所属、名前を管理する述語を定義し'(Ln),!. '最大20人分の番号、所属、名前を管理する述語を定義し'(_). '番号、所属、名前の入力'(_名前,_所属,_社員タグ) :- 名前の入力(_名前), 所属の入力(_所属), 社員タグの入力(_社員タグ). 名前の入力(_名前) :- write('input name...'), get_line(_名前), \+(_名前 = end_of_file). 所属の入力(_所属) :- write('input post...'), get_line(_所属). 社員タグの入力(_社員タグ) :- write('input SyainID...'), get_line(_社員ID). '番号、所属、名前を管理する述語を定義し'(_名前,_所属,_社員タグ) :- assertz(社員(_社員タグ,_所属,_名前)). 入力したデータを元に社員タグを出力する :- 社員(_社員タグ,_所属,_名前), writef('*******[ IDnumber %t ]*******\n post:%t\n name:%t\n*******************************\n\n',[_社員タグ,_所属,_名前]), fail. 入力したデータを元に社員タグを出力する. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/144 # # [1] 授業単元:文字列処理・ポインタ # [2] 問題文(含コード&リンク): #  C言語でhtml文内のタグをとり、文字のみを端末内に出力するようなプログラムを完成させよ #  *サンプルのhtml文を以下のように表示できるすること # # TITLE # # text1 # text2 # text3 # text4 # text5 # # リンク1 # url # # リンク2 # url # # リンク3 # url # # # ※サンプルhtml文 # # TITLE # #

#

リンク1

#

url

#

リンク2

#

url

#

リンク3

#

url

# # 文字列から必ず閉じたタグの値だけ取得する(_文字列,_値ならび) :- atom_chars(_文字列,Chars), 文字ならびから必ず閉じたタグの値だけ取得する(_文字列,_値ならび). 文字ならびから必ず閉じたタグの値だけ取得する(Chars,_タグ値ならび) :- findall(_タグの値,( タグの値を切り取る(Chars,_タグの値)), _値ならび). タグの値を切り取る(_文字のならび,_タグの値) :- append(L1,[>|R2],[<|_],_文字のならび), '<,>を含まない文字ならび'(R2), atomic_list_concat(R2,_タグの値). '<,>を含まない文字ならび'(L) :- \+(L = []), \+(member(<,L)), \+(member(>,L)). append([],L1,L2,L) :- append(L1,L2,L). append([A|R1],L1,L2,[A|R]) :- append(R1,L1,L2,R). % 以下のサイトは # 出典:: http://test/read.cgi/tech/1354715494/33 # # 【お題】 # ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 # 10000以下の素数以外の数の和を求めよ # # ウィルソンの定理 # pが素数 <=> (p-1)!+1 (mod p) == 0 :- dynamic(f/2). a(A) :- b(B,(between(1,10000,B),\+(d(B))),A). b(A,B,C) :- findall(A,B,D),c(D,C). c([],0). c([A|B],C) :- c(B,D),C is A + D. d(A) :- e(A). e(A) :- A > 0,B is A - 1,f(B,C),0 is (C + 1) mod B,!. f(0,1) :- !. f(1,1) :- !. f(A,B) :- B is A - 1,f(B,C),B is A * C,asserta((f(A,B) :- !)). % 以下のサイトは # 出典:: http://test/read.cgi/tech/1354715494/33 # # 【お題】 # ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 # 10000以下の素数以外の数の和を求めよ # # ウィルソンの定理 # pが素数 <=> (p-1)!+1 (mod p) == 0 :- dynamic(階乗保存計算/2). :- retract((階乗保存計算(_,_) :- _)),fail;true. 'ウィルソンの定理を使って素数を判定する関数is_primeを実装し、 10000以下の素数以外の数の和を求めよ ウィルソンの定理 pが素数 <=> (p-1)!+1 (mod p) == 0'(_10000以下の素数以外の数の和) :- findsum(_p,( between(1,10000,_p), \+(is_prime(_p))), _10000以下の素数以外の数の和). is_prime(_p) :- 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p). 'ウィルソンの定理とは pが素数 <=> (p-1)!+1 (mod p) == 0'(_p) :- _p > 0, Y is _p - 1, 階乗保存計算(Y,Z), 0 is (Z + 1) mod _p,!. 階乗保存計算(0,1) :- !. 階乗保存計算(1,1) :- !. 階乗保存計算(N,X) :- N2 is N - 1, 階乗保存計算(N2,Y), X is N * Y, asserta((階乗保存計算(N,X) :- !)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/119 # # [1]C言語 # [2]http://ime.nu/www.dotup.org/uploda/www.dotup.org3700396.jpg # 探索木についての課題です # 問題1. データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。 # # 問題2. 前問をプログラムとして、表示しなさい。表示する関数は再帰的に書きなさい。 # 左の子(部分木) を print,node を print, 右の子 (部分木) を print のように表示することをDFS 中間順と言います。 # # 問題3. 標準入力から文字を入力させ、その文字によって2分探索木に対して以下の動作をするプログラムを作成せよ。 # s ---> 数を1つ標準入力から入力されてデータが存在するか表示 # i ---> 数を1つ標準入力から入力させて2分探索木に追加 # p ---> 今まで入力された数をすべて表示 (DFS中間順で) # q ---> quit # # 問題4. 0から9999の整数の乱数を10000個生成して、2分探索木を作り、データの # 総数、木の深さの最大値、データの最小値と最大値を求めるプログラムを作成し # て確認せよ。 # # [3]ubuntu # gcc # c言語 # [4]期限:木曜日6:00 # 宜しくお願いします。 # :- dynamic([木/3,根/1,二分探索木ラベル/2]). 二分探索木ラベルの生成(_値ならび,_ラベルならび) :- findall(_ラベル,( member(_値,_値ならび), 二分探索木ラベルの候補(_ラベル), assertz(二分探索木ラベル(_ラベル,_値))), _ラベルならび). 二分探索木ラベルの候補(_ラベル) :- N is random(900000) + 100000, atomic_list_concat(['L',N],_ラベル), \+(二分探索木ラベル(_ラベル,_)),!. 二分探索木ラベルの候補(_ラベル) :- 二分探索木ラベルの候補(_ラベル). 根を作る(_値,_ラベル) :- asserta((根(_ラベル) :- !)), 木を作る(_値,_ラベル). 木を作る(_値,_ラベル) :- 二分探索木ラベル(_ラベル,_値), asserta(木([],_ラベル,[])). 木に追加(_根のラベル,_値のラベル) :- 二分探索木ラベル(_根のラベル,_根の値), 二分探索木ラベル(_値のラベル,_値), 木に追加(_根のラベル,_値のラベル,_根の値,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, retract(木([],_根のラベル,_右枝)), 木を作る(_値のラベル), asserta(木(_値のラベル,_根のラベル,_右枝)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @< _根の値, 木(_左枝,_根,_右枝), 木に追加(_左枝,_値). 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, retract(木(_左枝,_根,[])), 木を作る(_値のラベル), asserta(木(_左枝,_根のラベル,_値のラベル)),!. 木に追加(_根のラベル,_値のラベル,_根の値,_値) :- _値 @>= _根の値, 木(_左枝,_根のラベル,_右枝), 木に追加(_右枝,_値のラベル). 'データ 6,4,3,8,5,9,7 がこの順に与えられたとき、これを2分探索木として表しなさい。' :- 二分探索木ラベルの生成([6,4,3,8,5,9,7],[_根のラベル|_ラベルならび]), 根を作る(_先頭のラベル), append(_,[N|R],_ラベルならび), 木に追加(_根のラベル,N), R = []. 二分探索木全体を表示する :- 根(_根のラベル), 木を表示する(_根のラベル). 木を表示する([]) :- !. 木を表示する(_木の根のラベル) :- 木(_左枝,_木の根のラベル,_右枝), 木を表示する(_左枝,_木の根のラベル,_右枝). 木を表示する(_左の枝,_木の根,_右の枝) :- 二分木探索ラベル(_木の根ラベル,_木の根の値), 木を表示する(_左枝), writef('%t ',[_木の根の値]), 木を表示する(_右枝). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/49 # # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/eMHdX9DL # 上記のプログラムを変更して,キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい. # 入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい. # # #include # int plot[8][8]; # char state[3][5] = {" ","○ ","● "}; # # # void print_board(){ # int x,y; # printf("\033[2J"); # printf("\033[%d;%dH",0,0); # for(y = 0;y < 8;y++){ # for (x = 0;x < 8;x++){ # printf("%s|",state[plot[x][y]]); # } # printf("\n"); # printf("--+--+--+--+--+--+--+--+\n"); # } # } # # int main(){ # int x,y; # # for(y = 0;y < 8;y++)for(x = 0;x < 8;x++)plot[x][y] = 0; # plot[3][3] = plot[4][4] = 1; # plot[3][4] = plot[4][3] = 2; # # print_board(); # } # # 1 2 3 4 5 6 7 8 # +--+--+--+--+--+--+--+--+ # 1 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 2 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 3 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 4 | | | |○|●| | | | # +--+--+--+--+--+--+--+--+ # 5 | | | |●|○| | | | # +--+--+--+--+--+--+--+--+ # 6 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 7 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 8 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # :- dynamic(ボード保存/1). 'キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい.入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい.' :- ボードの初期状態(_ボート), ボードゲーム(_ボード). ボードの初期状態(_ボート) :- findall(L,( between(1,8,_), length(L,8), all(L,' ')), _ボード). ボードゲーム(_現在のボード) :- ボード(_現在のボード,_一手進んだボード), ボードゲーム(_一手進んだボード),!. ボードゲーム(_現在のボード) :- ボード表示(_現在のボード), write('ゲーム終了です。\n'), 終了時点のボードを保存する(_現在のボード). ボード(_現在のボード) :- 着手するべきマスが残っている(_現在のボード), 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y), ボードを更新する(X,Y,_現在のボード,_一手進んだボード), ボードを表示する(_一手進んだボード),!. 着手するべきマスが残っている([L|R]) :- member(' ',L), 着手するべきマスが残っている(R),!. 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y,_マスの状態) :- 整数を得る('x(0は終了)',between(0,8,X),X), \+(X = 0), 整数を得る('y',between(1,8,Y),Y), マスの状態を得る(_マスの状態). マスの状態を得る(_マスの状態) :- write(' ..0か●..1か○..2を着手してください : '), get_Line(Line), '診断: マスの状態を得る'(Line,_マスの状態),!. マスの状態を得る(_マスの状態) :- マスの状態を得る(_マスの状態). '診断: マスの状態を得る'('0',' ') :- !. '診断: マスの状態を得る'('1','○') :- !. '診断: マスの状態を得る'('2','●') :- !. ボードを更新する(X,Y,_着手,_現在のボード,_一手進んだボード) :- '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび), 対象行を更新する(X,_着手,_対象行,_更新された対象行), append(_前の行ならび,[_更新された対象行|_後の行ならび],_一手進んだボード). '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび) :- append(_前の行ならび,[_対象行|_後の行ならび],_現在のボード), length([_|_前の行ならび],Y). 対象行を更新する(X,_着手,_対象行,_更新された対象行) :- append(L0,[_|R],_対象行), length([_|L0],X), append(L0,[_着手|R],_更新された対象行). ボード表示(_ボード) :- append(L0,[L|R],_ボード), ボードの一行を表示する(L0,L), R = [], writef(' +--+--+--+--+--+--+--+--+\n'),!. ボードの一行を表示する(L0,L) :- length([_|L0],N), writef(' +--+--+--+--+--+--+--+--+\n'), atomic_list_concat(L,'|',S), writef('%t %t|\n',[N,S]). 終了時点のボードを保存する(_現在のボード) :- asserta(ボード保存(終了時点のボードを保存する(_現在のボード)). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1351769173/599 # # 2進数3桁のパスワードロックのプログラムを作るのですが、パスワード変更の機能も追加しなければなりません。どのようにプログラムを組めば良いのかわかりません。なにかアドバイス頂けませんか? # # :- dynamic(パスワード/4). パスワードの変更([],_ID) :- !,fail. パスワードの変更(Ln,_ID) :- パスワードを変更の手続き(_ID),!. パスワードの変更([_|Ln],_ID) :- パスワードの変更(Ln,_ID). パスワードを変更の手続き(_ID) :- 現在のパスワードの確認(_ID,_入力1,_入力2,_入力3), 新しいパスワードの入力(_入力1_2,_入力2_2,_入力3_2), 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2), パスワードの書き換え(_ID,_入力1_2,_入力2_2,_入力3_2),!. 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2) :- write('念のためもう一度新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2). 現在のパスワードの確認(_ID,_入力1,_入力2,_入力3) :- write('現在のパスワードを入力してください : '), パスワードを入力する(_入力1,_入力2,_入力3), パスワード検査(_ID,_入力1,_入力2,_入力3,諾). 新しいパスワードの入力(_入力1_2,_入力2_2,_入力3_2) :- write('新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2),!. 新しいパスワードの再入力(_入力1_2,_入力2_2,_入力3_2) :- write('念のため、もう一度、新しいパスワードを入力してください : '), パスワードを入力する(_入力1_2,_入力2_2,_入力3_2),!. パスワードの書き換え(_ID,_入力1_2,_入力2_2,_入力3_2) :- retract(パスワード(_ID,_,_,_)), assertz(パスワード(_ID,_入力1_2,_入力2_2,_入力3_2)). パスワード検査(_ID) :- パスワードを入力する(_入力1,_入力2,_入力3), パスワード検査(_ID,_入力1,_入力2,_入力3,_診断), パスワード検査表示(_ID,_診断). パスワードを入力する(_入力1,_入力2,_入力3) :- 整数を得る('0か1',between(0,1,_入力1),_入力1), 整数を得る('0か1',between(0,1,_入力2),_入力2), 整数を得る('0か1',between(0,1,_入力3),_入力3). パスワード検査(_ID,_入力1,_入力2,_入力3,諾) :- パスワード(_ID,_入力1,_入力2,_入力3),!. パスワード検査(_ID,_入力1,_入力2,_入力3,拒) :- \+(パスワード(_ID,_入力1,_入力2,_入力3)). パスワード検査表示(_ID,拒) :- writef('パスワードが違います\n'),!. パスワード検査表示(_ID,諾) :- !. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # '1文字を引数としてそれが小文字であれば大文字にして返し そうでなければそのまま文字を返す関数を作成しキーボードから 文字入力としてこの関数の動作を確認せよ。' 'キーボードから文字入力としてこの関数の動作を確認せよ'. 'キーボードから文字入力としてこの関数の動作を確認せよ' :- get_char(_文字), '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返された文字_1), to_upper(_文字,_返された文字_2), writef('キーボードから入力した文字 "%t",返された文字 "%t"\n',[_返された文字_1,_返された文字_2]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- to_upper(_文字,_返す文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- それが小文字であれば(_文字), 大文字にして返し(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- そうでなければ(_文字), _返す文字 = _文字. それが小文字であれば(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 大文字にして返し(_文字,_返す文字) :- nth1(Nth,[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],_文字), nth1(Nth,['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'),!. そうでなければ(_文字) :- \+(_文字 @=< 'z'),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), between(97,122,_文字コード). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), _文字コード >= 97, _文字コード =< 122. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- 小文字大文字(_文字,_大文字). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- char_code(_文字,_文字コード), _大文字の文字コード is _文字コード - 32, char_code(_返す文字,_大文字の文字コード),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- 小文字大文字(_文字,_返す文字). 小文字大文字(a,'A') :- !. 小文字大文字(b,'B') :- !. 小文字大文字(c,'C') :- !. 小文字大文字(d,'D') :- !. 小文字大文字(e,'E') :- !. 小文字大文字(f,'F') :- !. 小文字大文字(g,'G') :- !. 小文字大文字(h,'H') :- !. 小文字大文字(i,'I') :- !. 小文字大文字(j,'J') :- !. 小文字大文字(k,'K') :- !. 小文字大文字(l,'L') :- !. 小文字大文字(m,'M') :- !. 小文字大文字(n,'N') :- !. 小文字大文字(o,'O') :- !. 小文字大文字(p,'P') :- !. 小文字大文字(q,'Q') :- !. 小文字大文字(r,'R') :- !. 小文字大文字(s,'S') :- !. 小文字大文字(t,'T') :- !. 小文字大文字(u,'U') :- !. 小文字大文字(v,'V') :- !. 小文字大文字(w,'W') :- !. 小文字大文字(x,'X') :- !. 小文字大文字(y,'Y') :- !. 小文字大文字(z,'Z') :- !. 小文字大文字(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/7 # # [1] 授業単元:問題1:二次元配列 問題2:関数 # [2] 問題文(含コード&リンク): # 問題1:ファイルから入力した英小文字a-zの頻度のヒストグラムを # 出力するプログラムを書いてください。入力ファイルはプログラムファイルを使えば良い。 # # 問題2:1文字を引数としてそれが小文字であれば大文字にして返し # そうでなければそのまま文字を返す関数を作成しキーボードから # 文字入力としてこの関数の動作を確認せよ。 # [3.1] OS: windows vista #  [3.2] コンパイラ名とバージョン:visual studio2010 #  [3.3] 言語: C言語 # [4] 期限: 11月30日 # [5]ポインタはやってません。宜しくお願いします 。 # # '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- to_upper(_文字,_返す文字). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- それが小文字であれば(_文字), 大文字にして返し(_文字,_返す文字). それが小文字であれば大文字にして返しそうでなければそのまま文字を返す(_文字,_返す文字) :- そうでなければ(_文字), _返す文字 = _文字. それが小文字であれば(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 大文字にして返し(_文字,_返す文字) :- nth1(Nth,[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],_文字), nth1(Nth,['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'),!. そうでなければ(_文字) :- \+(_文字 @=< 'z'),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), between(97,122,_文字コード). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% それが小文字であれば(_文字) :- char_code(_文字,_文字コード), _文字コード >= 97, _文字コード =< 122. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- 小文字大文字(_文字,_大文字). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 大文字にして返し(_文字,_返す文字) :- char_code(_文字,_文字コード), _大文字の文字コード is _文字コード - 32, char_code(_返す文字,_大文字の文字コード),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '1文字を引数としてそれが小文字であれば大文字にして返しそうでなければそのまま文字を返す'(_文字,_返す文字) :- 小文字大文字(_文字,_返す文字). 小文字大文字(a,'A') :- !. 小文字大文字(b,'B') :- !. 小文字大文字(c,'C') :- !. 小文字大文字(d,'D') :- !. 小文字大文字(e,'E') :- !. 小文字大文字(f,'F') :- !. 小文字大文字(g,'G') :- !. 小文字大文字(h,'H') :- !. 小文字大文字(i,'I') :- !. 小文字大文字(j,'J') :- !. 小文字大文字(k,'K') :- !. 小文字大文字(l,'L') :- !. 小文字大文字(m,'M') :- !. 小文字大文字(n,'N') :- !. 小文字大文字(o,'O') :- !. 小文字大文字(p,'P') :- !. 小文字大文字(q,'Q') :- !. 小文字大文字(r,'R') :- !. 小文字大文字(s,'S') :- !. 小文字大文字(t,'T') :- !. 小文字大文字(u,'U') :- !. 小文字大文字(v,'V') :- !. 小文字大文字(w,'W') :- !. 小文字大文字(x,'X') :- !. 小文字大文字(y,'Y') :- !. 小文字大文字(z,'Z') :- !. 小文字大文字(_文字,_文字). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [3]初日に1円、2日目に2円、3日目に4円というように #     前日の2倍の金額を貯金していったとき、貯金の合計金額が #     100万円を超えるのは何日目になるかを算出するプログラムを作成せよ。 # '初日に1円、2日目に2円、3日目に4円というように 前日の2倍の金額を貯金していったとき、貯金の合計金額が 100万円を超えるのは何日目になるかを算出する'(_何日目) :- 数列が1000000を超えるまで([1,2,4|R],_), length([1,2,4|R],_何日目). 数列が1000000を超えるまで([N],_) :- N > 1000000,!. 数列が1000000を超えるまで([A,B|R],_公差) :- 等差数列の連続した二項(A,B,_公差), 数列が1000000を超えるまで([B|R],_公差). 数列が1000000を超えるまで([A,B|R],_公比) :- 等比数列の連続した二項(A,B,_公比), 数列が1000000を超えるまで([B|R],_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [2] 次の数列の和を計算するプログラムを繰り返し処理を用いて作成せよ。 #      0.2, 0.4, 0.6, ・・・・・,10.0(ただし、10.0は何項目か分からない事とする。 #      プログラム内では何回繰り返しするか記述しない条件にする事とする) # '次の数列の和を計算するプログラムを繰り返し処理を用いて作成せよ。      0.2, 0.4, 0.6, ・・・・・,10.0(ただし、10.0は何項目か分からない事とする。'(_数列の和) :- 次の数列の([0.2,0.4,0.6|R],10.0,_), 和を計算する([0.2,0.4,0.6|R],_数列の和). 次の数列の([_終了値],_終了値,_) :- !. 次の数列の([A,B|R],_終了値,_公差) :- 等差数列の連続した二項(A,B,_公差), 次の数列の([B|R],_終了値,_公差). 次の数列の([A,B|R],_終了値,_公比) :- 等比数列の連続した二項(A,B,_公比), 次の数列の([B|R],_終了値,_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. 和を計算する([],0). 和を計算する([_数|R],_和) :- 和を計算する(R,_和_1), _和 is _和_1 + _数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/880 # # [1] 授業単元:C言語 # [2] 問題 http://codepad.org/I9NEBx3U # # #  [1] 次の数列の第20項までの和を計算するプログラムを繰り返し処理を用いて作成せよ。 #      5,10,15,20,・・・・ # '次の数列の第20項までの和を計算する      5,10,15,20,・・・・'(_数列の和) :- 次の数列の第20項までの([5,10,15,20|R]), 和を計算する([5,10,15,20|R],_数列の和). 次の数列の第20項までの(L) :- 第20項までの(L), 次の数列の(L,_). 第20項までの(L) :- length(L,20). 次の数列の([],_). 次の数列の([A,B|R],_公差) :- 等差数列の連続した二項(A,B,_公差), 次の数列の([B|R],_公差). 次の数列の([A,B|R],_公比) :- 等比数列の連続した二項(A,B,_公比), 次の数列の([B|R],_公比). 等差数列の連続した二項(A,B,_公差) :- var(B), B is A + _公差. 等差数列の連続した二項(A,B,_公差) :- \+(var(B)), _公差 is B - A. 等比数列の連続した二項(A,B,_公比) :- var(B), B is A * _公比. 等比数列の連続した二項(A,B,_公比) :- \+(var(B)), _公比 is B / A. 和を計算する([],0). 和を計算する([_数|R],_和) :- 和を計算する(R,_和_1), _和 is _和_1 + _数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/228 # # ご教示お願いいたします。 # # ・DBMS名とバージョン # SQL Server2008 # # ・テーブルデータ # テーブル名:住所_MST # ID 住所 # ------------ # 001 住所A # 002 住所B # 003 住所C # 004 住所D # 005 住所E # 006 住所F # 008 住所G # 010 住所H # # ・欲しい結果 # IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした # 仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします # なお、IDはキー設定されています # # 結果は下記のようになります # ID 住所 # ------------ # 001 住所A # 002 住所B # 003 住所C # 004 住所D # 005 住所E # 006 住所F # 007 新住所 # 008 住所G # 010 住所H # # '・DBMS名とバージョン SQL Server2008 ・テーブルデータ テーブル名:住所_MST ID 住所 ------------ 001 住所A 002 住所B 003 住所C 004 住所D 005 住所E 006 住所F 008 住所G 010 住所H ・欲しい結果 IDに007を設定してINSERTしたいのですが上手くSQL文が浮かびませんでした 仕様としましては一番若いIDから、設定されていないIDを取得してINSERTします なお、IDはキー設定されています 結果は下記のようになります ID 住所 ------------ 001 住所A 002 住所B 003 住所C 004 住所D 005 住所E 006 住所F 007 新住所 008 住所G 010 住所H '(_住所) :- '一番若いIDから、設定されていないIDを取得してINSERTします'(_住所). '一番若いIDから、設定されていないIDを取得してINSERTします'(_住所) :- between(1,999,N), 頭部零文字列(3,N,_ID), \+(住所_MST(_ID,_)), assertz(住所_MST(_ID,_住所)),!. 頭部零文字列(_長さ,_整数,_頭部零文字列) :- length(_頭部零文字ならび,_長さ), number_chars(_整数,Chars), append(L0,Chars,_頭部零文字ならび), all(L0,'0'), atom_chars(_頭部零文字列,_頭部零文字ならび),!. all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/693 # # [1]C/C++プログラミング実習 まとめ  # [2]問題 http://ime.nu/codepad.org/CfJninhf #   問題文中に出てくる histograms.txt # [3]visual studio 2010 # [4]11月19日 10時 # [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 #   この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 #   前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて #   お手上げ状態です。どなたか助けていただけると幸いに思います。 # # /* # histograms.txtという文章ファイルがある。 # このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が # 並んでいて、それらの数字は水平TAB文字によって区切られている。 # このhistograms.txtを自動的に以下の条件のもとに改変して # train.datというファイルとして出力をするプログラムを作れ。 # # 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。 #     (例 image/0-21C5N550AVL.jpg → 0 #        image/1-19690369.jpg  → 1 #        image/2-24891960.jpg  → 2 #        image/3-12725422.jpg  → 3) # # 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 # # 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、 #     番号:数値?番号:数値?番号:数値?…という形に書き換える #     (例 0  0.0309051 0 0   0.00496689 #      → 2:0.0309051 5:0.00496689 …… ) # # 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き #              指定した方の名前で出力を行う。 # # */ 'histograms.txtという文章ファイルがある。 このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が 並んでいて、それらの数字は水平TAB文字によって区切られている。 このhistograms.txtを自動的に以下の条件のもとに改変して train.datというファイルとして出力をするプログラムを作れ。 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。     (例 image/0-21C5N550AVL.jpg → 0        image/1-19690369.jpg  → 1        image/2-24891960.jpg  → 2        image/3-12725422.jpg  → 3) 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、     番号:数値?番号:数値?番号:数値?…という形に書き換える     (例 0  0.0309051 0 0   0.00496689      → 2:0.0309051 5:0.00496689 …… ) 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き              指定した方の名前で出力を行う。' :- get_lines('histograms.txt',Lines), sPLIT(Lines,['\t'],LL0), findall(L1,( 自動的に以下の条件のもとに改変して(LL0,L1)), LL), 'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL). 自動的に以下の条件のもとに改変して(LL0,L1) :- member([File|R],LL0), '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N), 左から順に番号を振った上で要素が0のものを削除し(0,R,L), 水平TAB文字をすべて空白文字に変える([N|L],L1). '行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える'(File,N) :- split(File,['/','-'],[_,N|_]). 左から順に番号を振った上で要素が0のものを削除し(_,[],[]). 左から順に番号を振った上で要素が0のものを削除し(N_0,[A|R1],[N:A|R2]) :- \+(A = '\t'), \+(A = 0), N is N_0 + 1, 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],[A|R2]) :- A = '\t', 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 左から順に番号を振った上で要素が0のものを削除し(N,[A|R1],R2) :- A = 0, 左から順に番号を振った上で要素が0のものを削除し(N,R1,R2). 水平TAB文字をすべて空白文字に変える(L,S) :- findall(B,( member(A,L), 水平TAB文字を空白文字に(A,B)), L2), atomic_list_concat(L2,S). 水平TAB文字を空白文字に('\t',' ') :- !. 水平TAB文字を空白文字に(A,A). 'train.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL) :- 'train.datかtest.datのどちらのファイル名で出力するかを聞き', 指定した方の名前で出力を行う(LL). 'train.datかtest.datのどちらのファイル名で出力するかを聞き' :- write('ファイル名を選択します。\n1.. train.dat 2.. test.dat \n'). 指定した方の名前で出力を行う(LL) :- 指定した方の名前で(_指定した方の名前), 出力を行う(_指定して方の名前,LL). 指定した方の名前で(_指定した方の名前) :- 整数を得る('1または2',(N == 1;N == 2),N), 指定した方の名前で(N,_指定した方の名前). 指定した方の名前(1,'train.dat'). 指定した方の名前(2,'test.dat'). 出力を行う(_指定した方の名前,LL) :- open(_指定した方の名前,write,Outstream), ストリーム出力を行う(Outstream,LL), close(Outstream). ストリーム出力を出力を行う(Outstream,LL) :- append(_,[L|R],LL), atomic_list_concat(L,S), writef(Outstream,'%t\n',[S]), R = [], % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/693 # # [1]C/C++プログラミング実習 まとめ  # [2]問題 http://ime.nu/codepad.org/CfJninhf #   問題文中に出てくる histograms.txt # [3]visual studio 2010 # [4]11月19日 10時 # [5]前にここのスレでお世話になりました../test/read.cgi/tech/1349527750/603です。 #   この前の課題を提出した所、今度はまとめとして前の問題の発展問題がだされました。 #   前に頂いたプログラムを改変してみようと思ったのですが、今回の問題が複雑になりすぎてて #   お手上げ状態です。どなたか助けていただけると幸いに思います。 # # /* # histograms.txtという文章ファイルがある。 # このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が # 並んでいて、それらの数字は水平TAB文字によって区切られている。 # このhistograms.txtを自動的に以下の条件のもとに改変して # train.datというファイルとして出力をするプログラムを作れ。 # # 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。 #     (例 image/0-21C5N550AVL.jpg → 0 #        image/1-19690369.jpg  → 1 #        image/2-24891960.jpg  → 2 #        image/3-12725422.jpg  → 3) # # 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 # # 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、 #     番号:数値?番号:数値?番号:数値?…という形に書き換える #     (例 0  0.0309051 0 0   0.00496689 #      → 2:0.0309051 5:0.00496689 …… ) # # 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き #              指定した方の名前で出力を行う。 # # */ 'histograms.txtという文章ファイルがある。 このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が 並んでいて、それらの数字は水平TAB文字によって区切られている。 このhistograms.txtを自動的に以下の条件のもとに改変して train.datというファイルとして出力をするプログラムを作れ。 条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。     (例 image/0-21C5N550AVL.jpg → 0        image/1-19690369.jpg  → 1        image/2-24891960.jpg  → 2        image/3-12725422.jpg  → 3) 条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。 条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、     番号:数値?番号:数値?番号:数値?…という形に書き換える     (例 0  0.0309051 0 0   0.00496689      → 2:0.0309051 5:0.00496689 …… ) 条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き              指定した方の名前で出力を行う。' :- 'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'. 'histograms.txtという文章ファイルがある。このファイルは一行ごとに画像ファイルの名前とその画像の特徴を表す500の数字が並んでいて、それらの数字は水平TAB文字によって区切られている。このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :- 'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする'. 'このhistograms.txtを自動的に以下の条件のもとに改変してtrain.datというファイルとして出力をする' :- 'histograms.txtを項区切りの情報に変換する'(LL0), '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1), '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL1,LL3), '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL3,_行ならび), '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(LL3). 'histograms.txtを項区切りの情報に変換する'(LL0) :- get_split_lines('histograms.txt',['\t'],LL0). '条件1 行のはじめに書かれている画像ファイルの名前を、/と-に挟まれた数字一文字に書き換える。'(LL0,LL1) :- findall([N|R],( member([File|R],LL0), split(File,['/','-'],[_,N|_])), LL1). '条件3 ファイル名の後に続く数値を、左から順に番号を振った上で要素が0のものを削除し、'(LL2,LL3) :- findall([N|L],( member([N|R],LL2), 左から順に番号を振った上で要素が0のものを削除し(R,L)), LL3). 左から順に番号を振った上で要素が0のものを削除し(L1,L) :- findall(Nth:A,( append(L0,[A|_],L1), \+(A = 0), length([_|L0],Nth)), L). '条件2 このtxtファイル中にある水平TAB文字をすべて空白文字に変える。'(LL1,L) :- findall(S,( member(L,LL1), atomic_list_concat(LL1,' ',S)), L). '条件4(余力がある人向け) 最後にtrain.datかtest.datのどちらのファイル名で出力するかを聞き指定した方の名前で出力を行う。'(_行ならび) :- 'train.datかtest.datのどちらのファイル名で出力するかを聞き', 整数を得る('1または2のどちらかの数字',(N>=1,N=<2),N), 指定した方の名前で出力を行う(N,_指定した方の名前). 'train.datかtest.datのどちらのファイル名で出力するかを聞き' :- write('ファイル名を選択します。\n1.. train.dat 2.. test.dat \n'). 指定した方の名前で出力を行う :- 指定した方の名前で(_指定した方の名前), 出力を行う(_指定して方の名前,_行ならび). 指定した方の名前で(_指定した方の名前) :- 整数を得る('1または2',(N == 1;N == 2),N), 指定した方の名前で(N,_指定した方の名前). 指定した方の名前(1,'train.dat'). 指定した方の名前(2,'test.dat'). 出力を行う(_指定した方の名前,_行ならび) :- put_lines(_指定した方の名前,_行ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/628 # # [1] c言語 # [2] 問題文:C言語でのポインタを使った行列の操作です。 # 1 2 3 0 # 0 0 0 1 # 2 0 0 2 # 0 0 0 1 # をファイルから読み込み,以下の操作を実行せよ。 # 1,非零の要素を左から右へ、上から下へ書きならべた配列を作り、 # [1 2 3 1 2 2 1]とする。 # 2,各要素が何行目・何列目にあるかを別の配列に格納し、 # A = [1 2 3 1 2 2 1] 非零要素リスト # IA = [1 1 1 2 3 3 4] i行 # JA = [1 2 3 4 1 4 4] j列 # の配列が出力されるようにせよ。 # 3,何番目の要素からiが始まるかを書きならべる。 # IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、 # IA' = [1 4 5 7] の配列が出力されるようにせよ # # '非零の要素を左から右へ、上から下へ書きならべた配列を作り'(_行列,_非零要素ならび) :- flatten(_行列,_要素ならび), findall(_非零要素,( member(_非零要素,_行列), \+(_非零要素 = 0)), _非零要素ならび). '各要素が何行目・何列目にあるかを別の配列に格納し'(_行列,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび) :- findall([_非零要素,_非零要素の元々の行位置,_非零要素の元々の列位置],( nth1(_非零要素の元々の行位置,_行列,_行), nth1(_非零要素の元々の列位置,_行,_非零要素), \+(_非零要素 = 0)), LL), 三つのならびに分解(LL,_非零要素ならび,_非零要素の元々の行位置ならび,_非零要素の元々の列位置ならび). 三つのならびに分解([],[],[],[]). 三つのならびに分解([[A,B,C]|R1],[A|R2],[B|R3],[C|R4]) :- 三つのならびに分解(R1,R2,R3,R4). '何番目の要素からiが始まるかを書きならべる。IAの中で、1が初めに出現するのは1番目、2が初めに出現するのは4番目、3が初めに出現するのは5番目、4が初めに出現するのは7番目なので、IA = [1 4 5 7] の配列が出力されるようにせよ'(_非零要素の元々の行位置ならび,_何番目の非零要素から元々の行列での行が変わったかを示すならび) :- findall(_何番目,( append(L0,[I|R],_非零要素の元々の行位置ならび), \+(member(I,L0), length([_|L0],_何番目)), _何番目の非零要素から元々の行列での行が変わったかを示すならび). % 以下のサイトは # # @kamizen1 @sym_num 最初の述語は多分こんな感じ。 http://nojiriko.asia/prolog/twitter_by_kamizen1_20121109.html … 実行して確かめてはいないけれど。 # % ?- hir_zen( 'う゛おう゛う゛お---;;;;,,,,...', P ). の様に使う。ひらがな -> 全角カタカナ (ひらがな ではない文字は、素通りします。) hir_zen( _文字列, _変換後 ) :- /* ここが質問のはじめ : main() */ atom(_文字列), atom_chars( _文字列, _処理前リスト ), hir_zen_henkan( _処理前リスト, _処理後リスト ), atom_chars( _変換後, _処理後リスト ). hir_zen( _変換後, _文字列 ) :- /* ここが質問のはじめ : main() */ atom(_文字列), var(_変換後), atom_chars( _文字列, _処理前リスト ), hir_zen_henkan( _処理後リスト,_処理前リスト ), atom_chars( _変換後, _処理後リスト ). hir_zen_henkan( [], [] ). /* 停止判定 */ hir_zen_henkan( [A,B|L], ['ヴ'|Z] ) :- /* _処理前リストの最初の2文字が 'う', '゛' の場合 */ atom_chars('う゛', V), V=[A,B], !, hir_zen_henkan( L, Z ). hir_zen_henkan(L1, [ZZ|Z]) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にある場合 */ \+(var(L1)), L1 = [A|L], hir( Hira ), nth1( N, Hira, A ), zen( Zen ), nth1( N, Zen, ZZ ), !, hir_zen_henkan( L, Z ). hir_zen_henkan(L1, L2) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にある場合 */ var(L1), \+(var(L2)), L2 = [ZZ|Z], L1 = [A|L], zen( Zen ), nth1( N, Zen, ZZ ), hir( Hira ), nth1( N, Hira, A ), !, hir_zen_henkan( L, Z ). hir_zen_henkan( [A|L], [A|Z] ) :- /* _処理前リストの最初の1文字が、hir( **リスト** ). にない場合 */ !, hir_zen_henkan( L, Z ). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/603 # # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 lこのtxtファイルを読み取って ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), ファイル名を削除し(LL,LL1), 右から順に番号を振った上で(LL1,LL2), 要素が0のものを削除し書き換え(LL2,LL3), 書き換えtxtファイルに出力する(LL3). ファイル名を削除し([],[]). ファイル名を削除し([[_|L1]|R1],[L1|R2]) :- ファイル名を削除し(R1,R2). 右から順に番号を振った上で([],[]). 右から順に番号を振った上で([L1|R1],[L2|R2]) :- findall(N-A,( append(_,[A|R],L1), length([_|R],N)), L2), 右から順に番号を振った上で(R1,R2). 要素が0のものを削除し書き換え([],[]). 要素が0のものを削除し書き換え([N-0|R1],R2) :- 要素が0のものを削除し書き換え(R1,R2). 要素が0のものを削除し書き換え([N:A|R1],[N-A|R2]) :- \+(A = 0), 要素が0のものを削除し書き換え(R1,R2). 書き換えtxtファイルに出力する(LL3) :- open('書き換え.txt',write,Outstream), append(_,[L|R],LL3), 行要素を出力する(Ountstream,L), R = [], close(Outstream). 行要素を出力する(Outstream,[]) :- writef(Outstream,'\n'). 行要素を出力する(Outstream,[N:A|R]) :- writef(Outstream,'%t:%t ',[N,A]), 行要素を出力する(Outstream,R). % 以下のサイトは # [1] 授業単元: プログラム言語基礎 # [2] 問題文(含コード&リンク):n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ # [3] 環境 #  [3.1] OS: Windows #  [3.2] コンパイラ名とバージョン: borland 2,31 #  [3.3] 言語: C # [4] 期限: 今日の17時まで # [5] その他の制限: まだ習い始めて間もないです。 # # #include # # void main(void) # { # int x; # # printf("x = "); # scanf("%d",&x); # if(x%2 !=0) # { # printf("\n xは奇数"); # } # else{ # printf("\n xは偶数"); # } # } # これを応用して作れだそうです。 # # どうかよろしくお願いします 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(_n個) :- rawmode, 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(_n個,0,0), norawmode. 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(0,_,_) :- !. 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(N,_奇数の個数_1,_偶数の個数_1) :- '整数を入力し、入力した値の中で奇数と偶数の個数を表示'(_奇数の個数_1,_偶数の個数_1,_奇数の個数_2,_偶数の個数_2), N_1 is N - 1, 'n個の整数を入力し、入力した値の中で奇数と偶数の個数を表示せよ'(N_1,_奇数の個数_2,_偶数の個数_2). '整数を入力し、入力した値の中で奇数と偶数の個数を表示'(_奇数の個数_1,_偶数の個数_1,_奇数の個数_2,_偶数の個数_2) :- 整数を得る(整数,_整数), 奇数または偶数の頻度を更新(_整数,_奇数の個数_1,_偶数の個数_1,_奇数の個数_2,_偶数の個数_2), writef('現在までの 奇数の個数=%t, 偶数の個数=%t \n',[_奇数の個数_2,_偶数の個数_2]). 奇数または偶数の頻度を更新(_整数,_奇数の個数_1,_偶数の個数_1,_奇数の個数_1,_偶数の個数_2) :- 0 is _整数 mod 2, _偶数の個数_2 is _偶数の個数_1 + 1,!. 奇数または偶数の頻度を更新(_整数,_奇数の個数_1,_偶数の個数_1,_奇数の個数_2,_偶数の個数_1) :- \+(0 is _整数 mod 2), _奇数の個数_2 is _奇数の個数_1 + 1. % 以下のサイトは # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク):キーボードから,「A」,「B」,「C」,「D」,「K」の5 種類のアルファベットを入力し,それぞれの入 # 力個数を数えて画面出力するプログラムを作成しなさい.なお,「Z」が入力されるまでキーボ # ード入力を繰り返すこととし,これら6 文字以外の入力はカウントしないようにしておくこと. # [3] 環境 #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語:C # [4] 期限: 明後日まで # [5] その他の制限: なし # よろしくお願いします。 # 'キーボードから,「A」,「B」,「C」,「D」,「K」の5 種類のアルファベットを 入力し,それぞれの入力個数を数えて画面出力する. なお,「Z」が入力されるまでキーボード入力を繰り返すこととし, これら6 文字以外の入力はカウントしないようにしておくこと.' :- rawmode, 'キーボードから,「A」,「B」,「C」,「D」,「K」の5 種類のアルファベットを入力し、「Z」が入力されるまで繰り返す'(_アルファベットならび), norawmode, 'それぞれの入力個数を数えて画面出力する.これら6 文字以外の入力はカウントしない'(_アルファベットならび). 'キーボードから,「A」,「B」,「C」,「D」,「K」の5 種類のアルファベットを入力し、「Z」が入力されるまで繰り返す'([_アルファベット|R]) :- get_char(_アルファベット), \+(_アルファベット = 'Z'), 'キーボードから,「A」,「B」,「C」,「D」,「K」の5 種類のアルファベットを入力し、「Z」が入力されるまで繰り返す'(R),!. 'キーボードから,「A」,「B」,「C」,「D」,「K」の5 種類のアルファベットを入力し、「Z」が入力されるまで繰り返す'([]). 'それぞれの入力個数を数えて画面出力する.これら6 文字以外の入力はカウントしない'(_アルファベットならび) :- 'それぞれの入力個数を数える.これら6 文字以外の入力はカウントしない'(_アルファベットならび,0,0,0,0,0,A,B,C,D,E), writef('A = %t, B = %t, C = %t, D = %t, E = %t\n',[A,B,C,D,E]). 'それぞれの入力個数を数える.これら6 文字以外の入力はカウントしない'([],A,B,C,D,E,A,B,C,D,E). 'それぞれの入力個数を数える.これら6 文字以外の入力はカウントしない'([_アルファベット|R],A1,B1,C1,D1,E1,A,B,C,D,E) :- カウント(_アルファベット,A1,B1,C1,D1,E1,A2,B2,C2,D2,E2), 'それぞれの入力個数を数える.これら6 文字以外の入力はカウントしない'(R,A2,B2,C2,D2,E2,A,B,C,D,E),!. 'それぞれの入力個数を数える.これら6 文字以外の入力はカウントしない'([_アルファベット|R],A1,B1,C1,D1,E1,A,B,C,D,E) :- 'これら6 文字以外の入力はカウントしない', 'それぞれの入力個数を数える.これら6 文字以外の入力はカウントしない'(R,A1,B1,C1,D1,E1,A,B,C,D,E),!. カウント('A',A1,B,C,D,E,A2,B,C,D,E) :- A2 is A1 + 1. カウント('B',A,B1,C,D,E,A,B2,C,D,E) :- B2 is B1 + 1. カウント('C',A,B,C1,D,E,A,B,C2,D,E) :- C2 is C1 + 1. カウント('D',A,B,C,D1,E,A,B,C,D2,E) :- D2 is D1 + 1. カウント('E',A,B,C,D,E1,A,B,C,D,E2) :- E2 is E1 + 1. 'これら6 文字以外の入力はカウントしない'. % 以下のサイトは # [1] 授業単元:情報処理概論 # [2] 問題文(含コード&リンク):0から99の乱数を使って6×6ビンゴの表を作成しなさい。 # [3] 環境 #  [3.1] OS: WindowsXP #  [3.2] コンパイラ名とバージョン:BorlandC++ #  [3.3] 言語:C++ # [4] 期限: 10月30日まで # [5] その他の制限: # よろしくお願いします '0から99の乱数を使って6×6ビンゴの表を作成しなさい。'(_ビンゴの表) :- findall(L,( between(1,6,_), length(L,6)), _ビンゴの表), flatten(_ビンゴの表,_重複のないリスト), '0から99の乱数を使って値を埋める'([],_重複のないリスト). '0から99の乱数を使って値を埋める'(_重複のないリスト,_重複のないリスト) :- !. '0から99の乱数を使って値を埋める'(L,_重複のないリスト) :- _乱数 is random(100), \+(member(_乱数,L)), '0から99の乱数を使って値を埋める'([_乱数|L],_重複のないリスト). '0から99の乱数を使って値を埋める'(L,_重複のないリスト) :- '0から99の乱数を使って値を埋める'(L,_重複のないリスト). % 以下のサイトは # [1] 授業単元:情報処理概論 # [2] 問題文(含コード&リンク):0から99の乱数を使って6×6ビンゴの表を作成しなさい。 # [3] 環境 #  [3.1] OS: WindowsXP #  [3.2] コンパイラ名とバージョン:BorlandC++ #  [3.3] 言語:C++ # [4] 期限: 10月30日まで # [5] その他の制限: # よろしくお願いします '0から99の乱数を使って6×6ビンゴの表を作成しなさい。'(_ビンゴの表) :- findall(L,( between(1,6,_), length(L,6)), _ビンゴの表), flatten(_ビンゴの表,_重複のないならび), '0から99の乱数を使って重複のないならびを作る'([],_重複のないならび). '0から99の乱数を使って重複のないならびを作る'(_重複のないならび,_重複のないならび) :- !. '0から99の乱数を使って重複のないならびを作る'(L,_重複のないならび) :- _乱数 is random(100), \+(member(_乱数,L)), '0から99の乱数を使って重複のないならびを作る'([_乱数|L],_重複のないならび). '0から99の乱数を使って重複のないならびを作る'(L,_重複のないならび) :- '0から99の乱数を使って重複のないならびを作る'(L,_重複のないならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/207 # # DBMS名「MySQL 5.0.95」 # # TABLE `items` # `itemID`,itemNAME` # '1','AAA' # '2','BBB' # '3','CCC' # '4','DDD' # '5','EEE' # '6','FFF' # # TABLE `purchase` # `userID`,`itemID` # '1001','1' # '1001','2' # '1002','1' # '1002','2' # '1002','5' # '1003','1' # '1004','5' # '1004','6' # # TABLE `recommend` # `itemID`,`rank` # '2','10' # '4','9' # '5','8' # '1','7' # # 上記のように、商品マスター `items` 購入履歴 `purchase` オススメリスト `recommend` # の3つのテーブルがあります。 # # ここで、特定の`userID`にオススメリストを表示したいのですが、 # その際には、購入済みの商品は省いて表示したいと思います。 # # 上記の例で`userID`='1001'には # itemID = '4' と itemID = '5' # だけを表示させていたと思います。 # # `item`テーブルの情報も含め # items.`itemID`,items.itemNAME`,recommend.`rank` # '4','DDD','9' # '5','EEE','8' # という結果を求めるためのSQLはどう書けばよいでしょうか? # # '上記のように、商品マスター `items` 購入履歴 `purchase` オススメリスト `recommend` の3つのテーブルがあります。 ここで、特定の`userID`にオススメリストを表示したいのですが、 その際には、購入済みの商品は省いて表示したいと思います。'(_顧客ID,_商品ID,_商品名,_ランク) :- オススメリスト(_商品ID,_ランク), \+(購入履歴(_顧客ID,_商品ID)), 商品マスター(_商品ID,_商品名). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/345 # # [1]計算機基礎実習 # [2]問題文:http://ime.nu/codepad.org/dCFDDyhz #  上記の「各桁の値の合計」を求めるプログラミングを #  用いて、3の倍数を判定する再帰プログラムを作りなさい。 # [3.1]Linux # [3.2]gcc # [3.3]C言語 # [4]10月25日 木曜日まで # よろしくお願いします。 # # # #include # # int keta(int a); //与えられた桁数を全て足して返す関数 # # int main(){ # int a; # # printf("数を入力して下さい:"); # scanf("%d",&a); # # printf("\n%dの桁数を足すと%dです.\n",a,keta(a)); # return(0); # } # # int keta(int a){ # if(a < 10)return(a); # return a % 10 + keta(a / 10); # } '「各桁の値の合計」を用いて、3の倍数を判定する' :- 整数を得る('正の整数(負数入力で終了)',_正の整数), '「各桁の値の合計」を用いて、3の倍数を判定する'(_正の整数,_3の倍数であるかどうかの判定). '「各桁の値の合計」を用いて、3の倍数を判定する' :- '「各桁の値の合計」を用いて、3の倍数を判定する'. '「各桁の値の合計」を用いて、3の倍数を判定する'(_負の整数,_3の倍数であるかどうかの判定) :- _負の整数 < 0,!. '「各桁の値の合計」を用いて、3の倍数を判定する'(_正の整数,_3の倍数であるかどうかの判定) :- 各桁の値の合計(_正の整数,_各桁の値の合計), '3の倍数を判定する'(_正の整数,_各桁の値の合計,_3の倍数であるかどうかの判定), writef('%t は %t\n',[_正の整数,_3の倍数であるかどうかの判定]), fail. 各桁の値の合計(0,0) :- !. 各桁の値の合計(N_1,S) :- M is N_1 mod 10, N_2 is N_1 // 10, 各桁の値の合計(N_2,S_2), S is S_2 + M. '3の倍数を判定する'(_整数,_各桁の値の合計,3の倍数です) :- 0 is _各桁の値の合計 mod 3. '3の倍数を判定する'(_整数,_各桁の値の合計,3の倍数ではありません) :- \+(0 is _各桁の値の合計 mod 3). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/387 # # 【 課題  「西暦から元号への変換など」 # #  日本では現在、年を表すために西暦と元号を両方使用している。 #  そこで、ある西暦の年が、明治、大正、昭和、平成の元年(1年)から数えると何年目に当たるのかを表示するプログラムを作成して提出しなさい。 #  さらに、その年が夏期オリンピックの年であるかどうかをしらべて表示する部分も追加しなさい。 # # # 【 形態 】Javaアプリケーション(main()で開始 # 【 GUI  】無制限 # 【 期限 】2012/10/18 23:59までに提出 # 【 Ver  】v1.4系 # 【 補足 】今日中の課題ということで、非常にせっぱつまっております。 #       Verについてですが、授業で取り扱っている教科書がv1.4系を #       中心に解説するということで、とりあえずという感じです。 #       また、教授のお言葉で、完璧にこなせる人も、洒落たマネはせず、 #       初心に戻って基礎を大切にしてやってくださいとのご指示がありました。 #       どうか助けてください。 # # '日本では現在、年を表すために西暦と元号を両方使用している。 そこで、ある西暦の年が、明治、大正、昭和、平成の元年(1年)から数えると何年目に当たるのかを表示するプログラムを作成して提出しなさい。 さらに、その年が夏期オリンピックの年であるかどうかをしらべて表示する部分も追加しなさい。'(_西暦の年) :- 'ある西暦の年が、明治、大正、昭和、平成の元年(1年)から数えると何年目に当たるのかを表示する。さらに、その年が夏期オリンピックの年であるかどうかをしらべて表示する'(_西暦の年). 'ある西暦の年が、明治、大正、昭和、平成の元年(1年)から数えると何年目に当たるのかを表示する。さらに、その年が夏期オリンピックの年であるかどうかをしらべて表示する'(_西暦の年) :- '明治、大正、昭和、平成の元年(1年)から数えると何年目に当たるのかを'(_西暦の年,_元号,_何年目), 表示する(_元号,_何年目), さらに. 'ある西暦の年が、明治、大正、昭和、平成の元年(1年)から数えると何年目に当たるのかを表示する。さらに、その年が夏期オリンピックの年であるかどうかをしらべて表示する'(_西暦の年) :- write('\n'), その年が夏期オリンピックの年であるかどうかをしらべて表示する(_西暦の年). '明治、大正、昭和、平成の元年(1年)から数えると何年目に当たるのかを'(_西暦の年,_元号,_何年目) :- 元号の始まる年(_元号,_元号の始まる年), _何年目 is _西暦の年 - _元号の始まる年. 表示する(_元号,_何年目) :- '_何年目が正の整数の時はそのまま表示する'(_元号,_何年目). 表示する(_元号,_何年目) :- '_何年目が負の整数の場合は絶対値を取って表示する'(_元号,_何年目). '_何年目が正の整数の時はそのまま表示する'(_元号,_何年目) :- _何年目 >= 0, writef('%t元年から%t年目,',[_元号,_何年目]). '_何年目が負の整数の場合は絶対値を取って表示する'(_元号,_何年目) :- _何年目 < 0, _何年前 is abs(_何年目), writef('%t元年から%t年前,',[_元号,_何年前]). さらに :- fail. その年が夏期オリンピックの年であるかどうかをしらべて表示する(_西暦の年) :- その年は夏期オリンピックの年である(_西暦の年,_開催都市), writef('その年には%tオリンピックが開催されました。\n',[_開催都市]),!. その年が夏期オリンピックの年であるかどうかをしらべて表示する(_西暦の年) :- その年は夏期オリンピックの年ではない(_西暦の年), writef('その年には夏期オリンピックは開催されていません\n'). その年は夏期オリンピックの年である(_西暦の年,_開催都市) :- 夏期オリンピック(_西暦の年,_開催都市). その年は夏期オリンピックの年ではない(_西暦の年) :- \+(夏期オリンピック(_西暦の年,_)). 元号の始まる年(明治,1868). 元号の始まる年(大正,1902). 元号の始まる年(昭和,1916). 元号の始まる年(平成,1989). 夏期オリンピック(1896,アテネ). 夏期オリンピック(1900,パリ). 夏期オリンピック(1904,セントルイス). 夏期オリンピック(1906,アテネ). 夏期オリンピック(1908,ロンドン). 夏期オリンピック(1912,ストックホルム). 夏期オリンピック(1920,アントワープ). 夏期オリンピック(1924,パリ). 夏期オリンピック(1928,アムステルダム). 夏期オリンピック(1932,ロサンジェルス). 夏期オリンピック(1936,ベルリン). 夏期オリンピック(1948,ロンドン). 夏期オリンピック(1952,ヘルシンキ). 夏期オリンピック(1956,メルボルン). 夏期オリンピック(1960,ローマ). 夏期オリンピック(1964,東京). 夏期オリンピック(1968,メキシコシチー). 夏期オリンピック(1972,ミュンヘン). 夏期オリンピック(1976,モントリオール). 夏期オリンピック(1980,モスクワ). 夏期オリンピック(1984,ロサンジェルス). 夏期オリンピック(1988,ソウル). 夏期オリンピック(1992,バルセロナ). 夏期オリンピック(1996,アトランタ). 夏期オリンピック(2000,シドニー). 夏期オリンピック(2004,アテネ). 夏期オリンピック(2008,北京). 夏期オリンピック(2012,ロンドン). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/267 # # [1] 授業単元:C言語(配列) # [2] 問題文(含コード&リンク):http://ime.nu/codepad.org/KOT3NBPz # # キーボードから3×3の行列の数値を入力し行列のランク(階