このディレクトリの索引

% 以下のサイトは # 出典 :: あたらしいこくご 一 東京書籍38-39頁 'ぶん を つくろう'(_ぶん) :- 'どうぶつ の あと に 「が」を つけて そのあと に どうさ を つければ よい。'(_ぶん). 'どうぶつ の あと に 「が」を つけて そのあと に どうさ を つければ よい。'(_ぶん) :- 'どうぶつ の あと に 「が」を つけて'(_どうぶつのあとにがをつけて), 'そのあと に どうさ を つければ よい。'(_どうぶつのあとにがをつけて,_ぶん). 'どうぶつ の あと に 「が」を つけて'(_どうぶつのあとにがをつけて) :- どうぶつ(_どうぶつ), atom_concat(_どうぶつ,が,_どうぶつのあとにがをつけて). 'そのあと に どうさ を つければ よい。'(_どうぶつのあとにがをつけて,_ぶん) :- どうさ(_どうさ), atomic_list_concat([_どうぶつのあとにがをつけて,_どうさ,'。'],_ぶん). どうさ(はしる). どうさ(にげる). どうさ(とぶ). どうさ(さす). どうさ(なく). どうさ(わらう). どうさ(ける). どうさ(さえずる). どうさ(ねる). どうぶつ(うま). どうぶつ(いぬ). どうぶつ(はち). どうぶつ(くま). どうぶつ(りす). どうぶつ(かえる). どうぶつ(とり). どうぶつ(うさぎ). % 以下のサイトは # 出典 :: あたらしいこくご 一 東京書籍38-39頁 ぶんをつくろう(_ぶん) :- 'どうぶつのあとに「が」をつけてそのあとにどうさをつければよい。'(_ぶん). 'どうぶつのあとに「が」をつけてそのあとにどうさをつければよい。'(_ぶん) :- 'どうぶつのあとに「が」をつけて'(_どうぶつのあとにがをつけて), 'そのあとにどうさをつければよい。'(_どうぶつのあとにがをつけて,_ぶん). 'どうぶつのあとに「が」をつけて'(_どうぶつのあとにがをつけて) :- どうぶつ(_どうぶつ), atom_concat(_どうぶつ,が,_どうぶつのあとにがをつけて). 'そのあとにどうさをつければよい。'(_どうぶつのあとにがをつけて,_ぶん) :- どうさ(_どうさ), atomic_list_concat([_どうぶつのあとにがをつけて,_どうさ,'。'],_ぶん). どうさ(はしる). どうさ(にげる). どうさ(とぶ). どうさ(さす). どうさ(なく). どうさ(わらう). どうさ(ける). どうさ(さえずる). どうさ(ねる). どうぶつ(うま). どうぶつ(いぬ). どうぶつ(はち). どうぶつ(くま). どうぶつ(りす). どうぶつ(かえる). どうぶつ(とり). どうぶつ(うさぎ). % 以下のサイトは ことば溜まり(かまきり). ことば溜まり(くり). ことば溜まり(りす). ことば溜まり(すいか). しりとり(_最初の言葉,_しりとりならび) :- しりとり(_最初の言葉,[_最初の言葉],_しりとりならび). しりとり(_前の言葉,_しりとりならび_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. % 以下のサイトは # 出典 :: 質問にやさしく親切に答えてくれるスレ 4 #610 # # 鶴と亀の頭の数の合計と足の数の合計を入力して, 鶴が何羽,亀が何匹いるか # を表示する。(ヒント:頭の数と足の数を変数として,鶴の数と亀の数について # 連立方程式を作り,解を与える式の値を表示させればよい) # 一羽の鶴の足の数(2). 一匹の亀の足の数(4). 小学生が考えた鶴亀算(_鶴と亀の頭の数の合計,_鶴と亀の足の数の合計,_鶴が何羽,_亀が何匹) :- 仮に全部鶴だったらどうなるか考えよう(_鶴と亀の頭の数の合計,_仮の鶴と亀の足の数の合計), 実際の鶴と亀の足の数の合計は仮の鶴と亀の足の数の合計より多いことを確認しよう(_仮の鶴と亀の足の数の合計,_鶴と亀の足の数の合計), 実際の鶴と亀の足の数の合計との差は(_仮の鶴と亀の足の数の合計,_鶴と亀の足の数の合計,_実際の鶴と亀の足の合計との差), 'この差が生じたのは亀が鶴に混じるとその分足の数も多くなるからであり, 亀の数の分だけ一匹の亀の足が一羽の鶴よりも多い分だけの差が生じている考えられる, ということは, 亀の数は'(_実際の鶴と亀の足の合計との差,_亀が何匹), 鶴の数は頭の合計から亀の数を引けばよい(_鶴と亀の頭の数の合計,_亀が何匹,_鶴が何羽). 仮に全部鶴だったらどうなるか考えよう(_鶴と亀の頭の数の合計,_仮に全部鶴だとした場合の足の数の合計) :- 一羽の鶴の足の数(_一羽の鶴の足の数), _仮に全部鶴だとした場合の足の数の合計 is _一羽の鶴の足の数 * _鶴と亀の頭の数の合計. 実際の鶴と亀の足の数の合計は仮の鶴と亀の足の数の合計より多いことを確認しよう(_仮の鶴と亀の足の数の合計,_鶴と亀の足の数の合計) :- _鶴と亀の足の数の合計 > _仮の鶴と亀の足の数の合計. 実際の鶴と亀の足の数の合計との差は(_仮に全部鶴だとした場合の足の数の合計,_鶴と亀の足の数の合計,_実際の鶴と亀の足の合計との差) :- _実際の鶴と亀の足の合計との差 is _鶴と亀の足の数の合計 - _仮に全部鶴だとした場合の足の数の合計. 'この差が生じたのは亀が鶴に混じるとその分足の数も多くなるからであり, 亀の数の分だけ一匹の亀の足が一羽の鶴よりも多い分だけの差が生じている考えられる, ということは, 亀の数は'(_実際の鶴と亀の足の合計との差,_亀が何匹) :- 一羽の鶴の足の数(_一羽の鶴の足の数), 一匹の亀の足の数(_一匹の亀の足の数), _亀が何匹 is _実際の鶴と亀の足の合計との差 // (_一匹の亀の足の数 - _一羽の鶴の足の数). 鶴の数は頭の合計から亀の数を引けばよい(_鶴と亀の頭の数の合計,_亀が何匹,_鶴が何羽) :- _鶴が何羽 is _鶴と亀の頭の数の合計 - _亀が何匹. % 以下のサイトは # 出典 :: 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,_後文字列). % 以下のサイトは # 出典 :: アダマール積(Wikipedia) アダマール積(_行列1,_行列2,_アダマール積) :- '数学におけるアダマール積(英: Hadamard product)は、同じサイズの行列に対して成分ごとに積を取ることによって定まる行列の積である。'(_行列1,_行列2,_アダマール積). '数学におけるアダマール積(英: Hadamard product)は、同じサイズの行列に対して成分ごとに積を取ることによって定まる行列の積である。'(_行列1,_行列2,_アダマール積) :- '同じサイズの行列に対して成分ごとに積を取る'(_行列1,_行列2,_アダマール積). '同じサイズの行列に対して成分ごとに積を取る'([],[],[]). '同じサイズの行列に対して成分ごとに積を取る'(_行列1,_行列2,_アダマール積行列) :- '各行ごとに要素位置が対応する列同士の積をとり、行列を構成する'(_行列1,_行列2,_アダマール積行列). '各行ごとに要素位置が対応する列同士の積をとり、行列を構成する'([_行1|R1],[_行2|R2],[_行3|R3]) :- 要素位置が対応する列同士の積をとる(_行1,_行2,_行3), '同じサイズの行列に対して成分ごとに積を取る'(R1,R2,R3). 要素位置が対応する列同士の積をとる([],[],[]). 要素位置が対応する列同士の積をとる(_行1,_行2,_行3) :- '要素位置が対応する列同士の積をとり、行を構成する'(_行1,_行2,_行3). '要素位置が対応する列同士の積をとり、行を構成する'([_行列1の列要素|R1],[_行列2の列要素|R2],[_アダマール積の列要素|R3]) :- _アダマール積の列要素 is _行列1の列要素 * _行列2の列要素, 要素位置が対応する列同士の積をとる(R1,R2,R3). % 以下のサイトは # 出典 :: アダマール積(Wikipedia) アダマール積(_行列1,_行列2,_アダマール積) :- '数学におけるアダマール積(英: Hadamard product)は、同じサイズの行列に対して成分ごとに積を取ることによって定まる行列の積である。'(_行列1,_行列2,_アダマール積). '数学におけるアダマール積(英: Hadamard product)は、同じサイズの行列に対して成分ごとに積を取ることによって定まる行列の積である。'(_行列1,_行列2,_アダマール積) :- '同じサイズの行列に対して成分ごとに積を取る'(_行列1,_行列2,_アダマール積). '同じサイズの行列に対して成分ごとに積を取る'([],[],[]). '同じサイズの行列に対して成分ごとに積を取る'([_行1|R1],[_行2|R2],[_行3|R3]) :- 要素位置が対応する列同士の積をとる(_行1,_行2,_行3), '同じサイズの行列に対して成分ごとに積を取る'(R1,R2,R3). 要素位置が対応する列同士の積をとる([],[],[]). 要素位置が対応する列同士の積をとる([_行列1の列要素|R1],[_行列2の列要素|R2],[_アダマール積の列要素|R3]) :- _アダマール積の列要素 is _行列1の列要素 * _行列2の列要素, 要素位置が対応する列同士の積をとる(R1,R2,R3). % 以下のサイトは ヘッドゼロサプレス数値文字列(_桁数,_数,_ヘッドゼロサプレス数値文字列) :- length(_ヘッドゼロサプレス文字ならび,_桁数), ヘッドゼロサプレス文字ならび(_数,_ヘッドゼロサプレス文字ならび), atom_chars(_ヘッドゼロサプレス数値文字列,_ヘッドゼロサプレス文字ならび). ヘッドゼロサプレス文字ならび(_数,_ヘッドゼロサプレス文字ならび) :- number_chars(_数,_数字ならび), append(L1,_数字ならび,_ヘッドゼロサプレス文字ならび), すべて同一文字(L1,' '). すべて同一文字([],_). すべて同一文字([_同一文字|R],_同一文字) :- すべて同一文字(R,_同一文字). ?- ヘッドゼロサプレス数値文字列(8,-25.42,_ヘッドゼロサプレス数値文字列). _ヘッドゼロサプレス数値文字列 = ' -25.42' % 以下のサイトは # # プログラム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). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #943 # 入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること. # 【実行例】 # # % ./a.out # 1gattatgtga # 11tgccgatatc # 21gatatgattc # (ここで ^D を押す) # #ATG is 3 # % # # よろしくお願いします。 # # '入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_いくつ) :- '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび), '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ). '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ) :- いくつあるか(atgという並びが(_DNA塩基ならび),_いくつ). atgという並びが(_DNA塩基ならび) :- append(_,[a,t,g|_],_DNA塩基ならび). いくつあるか(_副目標,_いくつ) :- findall(1,_副目標,L), length(L,_いくつ). '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび) :- findall(_DNA塩基,( '連続して一文字入力する。但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基)),_DNA塩基ならび). '連続して一文字入力する。但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基) :- 連続して一文字入力する(_文字), '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基). 連続して一文字入力する(_文字) :- repeat, get_char(_文字), (入力した文字がend_of_fileの時(_文字),!,入力を終了する;true). 入力した文字がend_of_fileの時(end_of_file). 入力を終了する :- fail. '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_DNA塩基,_DNA塩基) :- member(_DNA塩基,[t,c,a,g]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #943 # 入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること. # 【実行例】 # # % ./a.out # 1gattatgtga # 11tgccgatatc # 21gatatgattc # (ここで ^D を押す) # #ATG is 3 # % # # よろしくお願いします。 # # '入力したDNA塩基配列中に,atgという並びがいくつあるか調べるプログラムを作成せよ.但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_いくつ) :- '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび), '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ). '入力したDNA塩基配列中に,atgという並びがいくつあるか調べる'(_DNA塩基ならび,_いくつ) :- いくつあるか(atgという並びが(_DNA塩基ならび),_いくつ). atgという並びが(_DNA塩基ならび) :- append(_,[a,t,g|_],_DNA塩基ならび). いくつあるか(_副目標,_いくつ) :- findall(1,_副目標,L), length(L,_いくつ). '入力したDNA塩基配列中に,(但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること)'(_DNA塩基ならび) :- findall(_DNA塩基,( 連続して一文字入力する(_文字), (入力した文字がend_of_fileの時(_文字),!,入力を終了する; '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_文字,_DNA塩基))),_DNA塩基ならび). '但し,入力には t, c, a, g以外の文字も入っている.塩基以外の文字は無視すること'(_DNA塩基,_DNA塩基) :- member(_DNA塩基,[t,c,a,g]). 連続して一文字入力する(_文字) :- repeat, get_char(_文字). 入力した文字がend_of_fileの時(end_of_file). 入力を終了する :- fail. % 以下のサイトは % Prolog 象山の際の木ぬれ --> 象山の際, の, 木ぬれ. 象山の際 --> 象山, の, 際. 象山 --> [象山]. の --> [の]. 際 --> 際. 際 --> [際]. 木ぬれ --> [木ぬれ]. % これでどんな引数を付加できるか。 % 以下のサイトは # # プログラム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). % 以下のサイトは doremi('WBWBWWBWBWBWWBWBWWBW','Do'). doremi('WBWWBWBWBWWBWBWWBWBW','Re'). doremi('WWBWBWBWWBWBWWBWBWBW','Mi'). doremi('WBWBWBWWBWBWWBWBWBWW','Fa'). doremi('WBWBWWBWBWWBWBWBWWBW','So'). doremi('WBWWBWBWWBWBWBWWBWBW','Ra'). doremi('WWBWBWWBWBWBWWBWBWWB','Si'). ?- read(_s), doremi(_s,_doremi), writef('%w\n',[_doremi]). % 以下のサイトは # 出題: 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,_,_同一文字)). % 以下のサイトは ヒストグラムを出力する(_標本ならび) :- ヒストグラムの用意(_標本ならび,LL1), 転置して出力する(LL1). ヒストグラムの用意(_標本ならび,LL1) :- '標本の最大値要素数のリストを作る'(_標本ならび,L1), findall(L1,( 星のリストに変換(_標本ならび,L1)),LL1). '標本の最大値要素数のリストを作る'(_標本ならび,L1) :- 最大値(_標本ならび,_最大値), length(L1,_最大値). 星のリストに変換(_標本ならび,L1) :- member(_標本値,_標本ならび), length(_星のリスト,_標本値), 空白リストと星のリスト(_星のリスト,L1). 空白リストと星のリスト(_星のリスト,L1) :- append(_空白リスト,_星のリスト,L1), all(_空白リスト,' '), all(_星のリスト,*). 転置して出力する(LL1) :- 転置(LL1,LL2), 出力する(LL2). 出力する(LL) :- forall( ならび要素を文字列に変換して(LL,_出力行文字列), writef('%w\n',[_出力行文字列])). ならび要素を文字列に変換して(LL,_出力行文字列) :- member(L,LL), atomic_list_concat(L,_出力行文字列). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). all([],_). all([V|R],V) :- all(R,V). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素の値によって_最大値_1を置き換えて行く'(_ならび,_最大値_1,_最大値) :- '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'(_ならび,_最大値_1,_最大値). '_ならびの先頭要素が_最大値_1より大きい場合、_最大値_1を置き換える'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @> _最大値_1, 最大値(R,_先頭要素,_最大値). '_ならびの先頭要素が_最大値_1と等しいか小さい場合、_最大値_1を置き換えない'([_先頭要素|R],_最大値_1,_最大値) :- _先頭要素 @=< _最大値_1, 最大値(R,_最大値_1,_最大値). % 以下のサイトは # p=1231, q=4567を選びます。 # eに65537 # e^-1=d mod φ(n) のdを計算して求めます。 #     d=3988493 # となります。 # # 暗号化と複合化の手順 # 公開鍵:N = 1231 * 4567 # E = 65537 # d = 3988493 # 文字コード:「a〜z」=01〜26、「A〜Z」=27〜52、空白=53 # 文書:This Anser p(1231). % 素数1 q(4567). % 素数2 法とする数(5621977). % 法とする数 公開鍵(65537). % 公開鍵 秘密鍵(3988493). % 秘密鍵 'RSA暗号化'(_文書,_暗号文字コードならび) :- 文書を文字コードで数値化します(_文書,_文字コードならび), 'RSA方式によるコード暗号化'(_文字コードならび,_暗号文字コードならび). 'RSA復号化'(_暗号文字コードならび,_文書) :- 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび), 文字コードならびから文書を復元します(_文字コードならび,_文書). 'RSA方式によるコード暗号化'(_文字コードならび,_暗号コードならび) :- 公開鍵(_公開鍵), 法とする数(_法とする数), findall(_暗号コード,( '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード)),_暗号コードならび). '_文字コードを_暗号コードに変換'(_文字コードならび,_公開鍵,_法とする数,_暗号コード) :- member(_文字コード,_文字コードならび), _暗号コード is _文字コード ^ _公開鍵 mod _法とする数. 'RSA方式によるコード復号化'(_暗号文字コードならび,_文字コードならび) :- 秘密鍵(_秘密鍵), 法とする数(_法とする数), findall(_文字コード,( '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード)),_文字コードならび). '_暗号文字コードを_文字コードに復号する'(_暗号文字コードならび,_秘密鍵,_法とする数,_文字コード) :- member(_暗号文字コード,_暗号文字コードならび), _文字コード is _暗号文字コード ^ _秘密鍵 mod _法とする数. 文書を文字コードで数値化します(_文書,_文字コードならび) :- findall(_文字コード,( sub_atom(_文書,_,1,_,_文字), 文字コード(_文字,_文字コード)), _文字コードならび). 暗号コードを暗号文に変換(_暗号コードならび,_暗号文) :- findall(_暗号文字,( member(_暗号コード,_暗号コードならび), 文字コード(_暗号文字,_暗号コード)),_暗号文字ならび), atom_chars(_暗号文,_暗号文字ならび). 文字コードならびから文書を復元します(_文字コードならび,_文書) :- findall(_文字,( member(_文字コード,_文字コードならび), 文字コード(_文字,_文字コード)),_文字ならび), atom_chars(_文書,_文字ならび). 文字コード(_文字,_コード) :- char_code(_文字,_コード). '秘密鍵の候補'(_素数p,_素数q,_公開鍵,_秘密鍵) :- '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数), '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p_1と_素数q_1の最小公倍数,_公開鍵,_秘密鍵). '((_素数p_1と_素数q_1の最小公倍数 * N + 1) / _公開鍵) が整数となる秘密鍵候補を得る'(_素数p_1と_素数q_1の最小公倍数,_公開鍵,_秘密鍵) :- between(1,9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999,N), 0 is (_素数p_1と_素数q_1の最小公倍数 * N + 1) mod _公開鍵, _秘密鍵 is (_素数p_1と_素数q_1の最小公倍数 * N + 1) // _公開鍵. '_素数p_1と_素数q_1の最小公倍数'(_素数p,_素数q,_素数p_1と_素数q_1の最小公倍数) :- succ(_素数p_1,_素数p), succ(_素数q_1,_素数q), 最小公倍数(_素数p_1,_素数q_1,_素数p_1と_素数q_1の最小公倍数). 最小公倍数(_m,_n,_最小公倍数) :- Y is _m * _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_最大公約数), _最小公倍数 is ( _m * _n ) // _最大公約数. 'ユークリッドの互除法により最大公約数を得る'(_m,_m,_m). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m > _n, _剰余 is _m mod _n, ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数). 'ユークリッドの互除法により最大公約数を得る'(_m,_n,_最大公約数) :- _m < _n, ユークリッドの互除法により最大公約数を得る(_n,_m,_最大公約数). ユークリッドの互除法により最大公約数を得る(_,_最大公約数,0,_最大公約数) :- !. ユークリッドの互除法により最大公約数を得る(_m,_n,_剰余,_最大公約数) :- 'ユークリッドの互除法により最大公約数を得る'(_n,_剰余,_最大公約数). % 以下のサイトは # 出典 :: おウチで!簡単焼き方レシピ 焼きそばの作り方([_1,_2,_3,_4,_5,_6,_7]) --> '1'(_1), '2'(_2), '3'(_3), '4'(_4), '5'(_5), '6'(_6), '7'(_7). '1'('http://www.otafuku.co.jp/recipe/cook/noodle/images/p01.jpg') --> ['麺は袋をもんで軽くほぐしておきます。 フライパンを中火で温め、麺をほぐしながら、約5分炒めます。時々麺を持ち上げながら炒めます。 麺はしっかりと炒めよう!']. '2'('http://www.otafuku.co.jp/recipe/cook/noodle/images/p02.jpg') --> ['約5分炒めたら、麺をお皿に入れます。 ホットプレートで焼く場合は、空いているスペースに麺をおき温めて調理します。温度は220℃の高温。']. '3'('http://www.otafuku.co.jp/recipe/cook/noodle/images/p03.jpg') --> ['一口サイズに切った豚バラ肉を入れ、炒めます。 (目安1分)']. '4'('http://www.otafuku.co.jp/recipe/cook/noodle/images/p04.jpg') --> ['キャベツ、天かす、(2)の麺の順にのせて、約2分半蒸らします。 たまに箸をいれ、ゆすって蒸気を逃がしながらカラッと炒めます。 麺をかぶせてキャベツを蒸らす!']. '5'('http://www.otafuku.co.jp/recipe/cook/noodle/images/p05.jpg') --> ['蒸れたら、全体を混ぜ合わせ約30秒炒めます。']. '6'('http://www.otafuku.co.jp/recipe/cook/noodle/images/p06.jpg') --> ['ソースを加えて、全体にソースがなじむように20秒程度で手早く炒めます。 ソースは全体になじむようにサッと炒めるのがポイント!']. '7'('http://www.otafuku.co.jp/recipe/cook/noodle/images/p07.jpg') --> ['お皿に盛りつけて、青のりを振りかけて完成です。']. '材料(1人分)'('キャベツ(千切り',100,g). '材料(1人分)'('豚バラ肉',40,g). '材料(1人分)'(焼きそば麺,1,玉). '材料(1人分)'(オタフクいか天入り天かす天華,10,g). '材料(1人分)'(オタフク焼そばソース,50,g). '材料(1人分)'(オタフク青のり,0.25,g). '※麺の量、野菜の量により、ソースの分量は加減してください。'. ?- 焼きそばの作り方(_画像ならび,_手順ならび,R). % さて、何が起こるか % 以下のサイトは 先頭から同一要素の最長ならび(_対象ならび,_先頭から同一要素の最長ならび,_残りならび) :- 先頭から同一要素の最長ならび(_対象ならび,_同一要素,_先頭から同一要素の最長ならび,_残りならび), 残りならびの先頭要素は同一要素と異なる(_残りならび,_同一要素). 先頭から同一要素の(_対象ならび,_同一要素,_先頭から同一要素の最長ならび,_残りならび) :- append(_先頭から同一要素の最長ならび,_残りならび,_対象ならび), 全て同一要素(_先頭から同一要素の最長ならび,_同一要素). 全て同一要素([V],V). 全て同一要素([V|R],V) :- 全て同一要素(R,V). 残りならびの先頭要素は同一要素と異なる(_残りならび,_同一要素). \+(_残りならび = [_同一要素|_]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 先頭から同一要素の最長ならび([_先頭要素|R],_先頭から同一要素の最長ならび,_残りならび) :- append(_先頭から同一要素の最長ならび,_残りならび,[_先頭要素|R]), forall(member(A,_先頭から同一要素の最長ならび),A = _先頭要素), \+(_残りならび = [_先頭要素|_]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 先頭から同一要素の最長ならび([_先頭要素|R],_先頭から同一要素の最長ならび,_残りならび) :- 先頭から同一要素の最長ならび(R,_先頭要素,L2,_残りならび), _先頭から同一要素の最長ならび = [_先頭要素|L2]. 先頭から同一要素の最長ならび([_先頭要素|R],_先頭要素,[_先頭要素|R2],_残りならび) :- 先頭から同一要素の最長ならび(R,_先頭要素,R2,_残りならび),!. 先頭から同一要素の最長ならび(_残りならび,_先頭要素,[],_残りならび). % 以下のサイトは 最長反復文字列(_文字列,_最長反復文字列) :- setof([Len,_最長反復文字列], [Len,_最長反復文字列] ^ ( 最長反復文字列(_文字列,Len,_最長反復文字列)),LL), 最長反復文字列を取り出す(LL,_最長反復文字列). 最長反復文字列(_文字列,Len,_最長反復文字列) :- sub_atom(_文字列,_前文字列,_最長反復文字列,_後文字列), atom_length(_最長反復文字列,Len), sub_atom(_後文字列,0,Len,_,_最長反復文字列). 最長反復文字列を取り出す(LL,_最長反復文字列) :- findmax(N,member([N,_],LL),_最長文字数), member([_最長文字数,_最長反復文字列],LL). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典 :: 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(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは 'Prolog' --> 今年もまた桜が咲いたよ, '貴女に出逢い。貴女と別れた春の季節', こんなに時が過ぎているのに, 貴女ばかりを思い出している俺を見たら, '“ 散ってしまったものを嘆くのは美しくない ”', って言って貴女は笑うのかな, でもこの先どんなに時が過ぎても, 貴女を忘れることなんてない. 今年もまた桜が咲いたよ --> [今年もまた桜が咲いたよ]. '貴女に出逢い。貴女と別れた春の季節' --> ['貴女に出逢い。貴女と別れた春の季節']. こんなに時が過ぎているのに --> [こんなに時が過ぎているのに]. 貴女ばかりを思い出している俺を見たら --> [貴女ばかりを思い出している俺を見たら]. '“ 散ってしまったものを嘆くのは美しくない ”' --> ['“ 散ってしまったものを嘆くのは美しくない ”']. って言って貴女は笑うのかな --> [って言って貴女は笑うのかな]. でもこの先どんなに時が過ぎても --> [でもこの先どんなに時が過ぎても]. 貴女を忘れることなんてない --> [貴女を忘れることなんてない]. ?- 'Prolog'(L,[]). L = [今年もまた桜が咲いたよ, '貴女に出逢い。貴女と別れた春の季節', こんなに時が過ぎているのに, 貴女ばかりを思い出している俺を見たら, '“ 散ってしまったものを嘆くのは美しくない ”', って言って貴女は笑うのかな, でもこの先どんなに時が過ぎても, 貴女を忘れることなんてない]. ?- % 以下のサイトは # お題:1から16までの連続した自然数をA,Bの二つのグループに分ける。 # Aの要素の総和とBの要素の総和が等しく、Aの要素の2乗の総和と # Bの要素の2乗の総和も等しく、さらにAの要素の3乗の総和と # Bの要素の3乗の総和も等しくする。 お題(_グループA,_グループB) :- '1から16までの連続した自然数をA,Bの二つのグループに分ける。 Aの要素の総和とBの要素の総和が等しく、Aの要素の2乗の総和と Bの要素の2乗の総和も等しく、さらにAの要素の3乗の総和と Bの要素の3乗の総和も等しくする。'(_グループA,_グループB). '1から16までの連続した自然数をA,Bの二つのグループに分ける。 Aの要素の総和とBの要素の総和が等しく、Aの要素の2乗の総和と Bの要素の2乗の総和も等しく、さらにAの要素の3乗の総和と Bの要素の3乗の総和も等しくする。'(_グループA,_グループB) :- '1から16までの連続した自然数をA,Bの二つのグループに分ける。'(_グループA,_グループB), 'Aの要素の総和とBの要素の総和が等しく、Aの要素の2乗の総和と Bの要素の2乗の総和も等しく、さらにAの要素の3乗の総和と Bの要素の3乗の総和も等しくする。'(_グループA,_グループB). '1から16までの連続した自然数をA,Bの二つのグループに分ける。'(_グループA,_グループB) :- 'AとBが反転するすることがないように二つのグループならびを得る'(_二つのグループならび), member([_グループA,_グループB],_二つのグループならび). 'AとBが反転するすることがないように二つのグループならびを得る'(_二つのグループならび) :- N is 2 ^ 16 // 2, findnsols(N,[_グループA,_グループB],グループ分け([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16],_グループA,_グループB),_二つのグループならび),!. グループ分け([],[],[]). グループ分け([A|R1],[A|R2],R3) :- グループ分け(R1,R2,R3). グループ分け([A|R1],R2,[A|R3]) :- グループ分け(R1,R2,R3). 'Aの要素の総和とBの要素の総和が等しく、Aの要素の2乗の総和と Bの要素の2乗の総和も等しく、さらにAの要素の3乗の総和と Bの要素の3乗の総和も等しくする。'(_グループA,_グループB) :- 'Aの要素の総和とBの要素の総和が等しく'(_グループA,_グループB), 'Aの要素の2乗の総和とBの要素の2乗の総和も等しく'(_グループA,_グループB), 'Aの要素の3乗の総和とBの要素の3乗の総和も等しく'(_グループA,_グループB). 'Aの要素の総和とBの要素の総和が等しく'(_グループA,_グループB) :- sum_list(_グループA,_総和), sum_list(_グループB,_総和). 'Aの要素の2乗の総和とBの要素の2乗の総和も等しく'(_グループA,_グループB) :- findsum(N,(member(M,_グループA),N is M ^ 2),_総和), findsum(N,(member(M,_グループB),N is M ^ 2),_総和). 'Aの要素の3乗の総和とBの要素の3乗の総和も等しく'(_グループA,_グループB) :- findsum(N,(member(M,_グループA),N is M ^ 3),_総和), findsum(N,(member(M,_グループB),N is M ^ 3),_総和). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 1.. 全ての人から尊敬されている # 2.. 自分自身を尊敬している 'Aは全ての人から尊敬されている'(A) :- forall(自分以外の人(B),'AはBから尊敬されている'(A,B)). 自分以外の人(A,B) :- 人(B), B \== A. 自分自身を尊敬している(A) :- 'AはBを尊敬している'(A,B), A = B. % 以下のサイトは ことば溜まり(かまきり). ことば溜まり(くり). ことば溜まり(りす). ことば溜まり(すいか). しりとり(_最初の言葉,_しりとりならび) :- しりとり(_最初の言葉,[_最初の言葉],_しりとりならび). しりとり(_前の言葉,_しりとりならび_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,_,_最初の文字). % 以下のサイトは # # 例えば、会員番号、氏名のようなテーブルがあるとします。 # # 1. 田中太郎 # 2. 山田次郎 # 3. 鈴木花子 # 4. 田中太郎 # # このように重複会員がいた場合、1と4を同じものとして、4の会員番号を1にする操作を # 一行で書くにはどのように書いたら良いでしょうか? # 同姓同名の場合、最も若い番号を会員番号とするとします # :- dynamic(テーブル/2). テーブル(1,田中太郎). テーブル(2,山田次郎). テーブル(3,鈴木花子). テーブル(4,田中太郎). '同姓同名の場合、最も若い番号を会員番号とする、最も若い会員番号以外の節を削除する。同姓同名が居ない場合は対象としない。' :- forall(テーブル(_会員番号,_氏名), '同姓同名の場合、最も若い番号を会員番号とする、最も若い会員番号以外の節を削除する。同姓同名が居ない場合は対象としない。'(_会員番号,_氏名)). '同姓同名の場合、最も若い番号を会員番号とする、最も若い会員番号以外の節を削除する。同姓同名が居ない場合は対象としない。'(_会員番号,_氏名) :- '同姓同名が居て、より若い会員番号が存在する時は節を削除する。'(_会員番号,_氏名),!. '同姓同名の場合、最も若い番号を会員番号とする、最も若い会員番号以外の節を削除する。同姓同名が居ない場合は対象としない。'(_,_). '同姓同名が居て、より若い会員番号が存在する時は節を削除する。'(_会員番号,_氏名) :- '同姓同名が居て、より若い会員番号が存在する時は'(_会員番号,_氏名), '節を削除する。'(_会員番号,_氏名). '同姓同名が居て、より若い会員番号が存在する時は'(_会員番号,_氏名) :- テーブル(_会員番号_1,_氏名), _会員番号_1 @< _会員番号. '節を削除する。'(_会員番号,_氏名) :- retract(テーブル(_会員番号,_氏名)). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #48 # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/5oepZpDW # #include # double heikin(int a[]); # # int main(void) # { # int data[5],i; # double ave; # for (i=0;i<=4;i++) # { # printf("data[%d]= ",i); # scanf("%d",&data[i]); # } # ave=heikin(data); # printf("heikin=%f \n",ave); # return 0; # } # # double heikin(int a[]) # { # int i,k=0; # for(i=0;i<=4;i++) # { # k=k+a[i]; # } # return((double)k/5); # } # 上記のプログラムに5人の得点(10点満点)を受け取ると、合格者数を戻すgoukaku関数を追加せよ、但し6点以上で合格とする。 # そして5人のテストの得点を整数型配列data[5]の要素にそれぞれ入力すると # 5人の平均点に加えて合格者数も出力するプログラムをheikin関数およびgoukaku関数を利用して作成しなさい。 # '5人の得点(10点満点)を受け取ると、合格者数を戻す述語を定義する。但し6点以上で合格とする。そして5人のテストの得点を入力すると5人の平均点に加えて合格者数も出力する。' :- '5人の得点(10点満点)を受け取ると'(_5人の得点ならび), 平均点を出力する(_5人の得点ならび), '6点以上を取った合格者数を出力する'(_5人の得点ならび). 平均点を出力する(_5人の得点ならび) :- 平均点を戻す(_5人の得点ならび,_平均点), writef('平均点 = %w 点\n',[_平均点]). 平均点を戻す(_5人の得点ならび,_平均点) :- sum_list(_5人の得点ならび,_合計点), _平均点 is _合計点 / 5. '6点以上を取った合格者数を出力する'(_5人の得点ならび) :- '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数), writef('合格者数 = %w 人\n',[_合格者数]). '5人の得点(10点満点)を受け取ると'(_5人の得点ならび) :- findall(_得点,( '5人の', '得点(10点満点)を受け取る'(_得点)),_5人の得点ならび). '5人の' :- between(1,5,_). '得点(10点満点)を受け取る'(_得点) :- 行入力(_行文字列), '診断: 得点(10点満点)を受け取る'(_行文字列,_得点),!. '得点(10点満点)を受け取る'(_得点) :- '得点(10点満点)を受け取る'(_得点). '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点),!. '診断: 得点(10点満点)を受け取る'(_行文字列,_得点) :- writef('入力された %w からは適切な得点が得られません。再入力をお願いします。\n',[_行文字列]), fail. 行文字列を解析して0から10の範囲の得点を得る(_行文字列,_得点) :- 行文字列を解析して(_行文字列,_得点), '0から10の範囲の得点を得る'(_得点). 行文字列を解析して(_行文字列,_得点) :- read_term_from_atom(_行文字列,_得点,[]). '0から10の範囲の得点を得る'(_得点) :- integer(_得点), member(_得点,[0,1,2,3,4,5,6,7,8,9,10]). 行入力(_行文字列) :- read_line_to_codes(current_input,Codes), atom_codes(_行文字列,Codes). '6点以上を取った合格者数を戻す'(_5人の得点ならび,_合格者数) :- findall(_,( '6点以上で合格とする'(_5人の得点ならび)),L), length(L,_合格者数). '6点以上で合格とする'(_5人の得点ならび) :- member(_得点,_5人の得点ならび), _得点 >= 6. % 以下のサイトは # 出題場所 :: 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,_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数,[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_1からnの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個をとりのぞいたのこりの数) :- _シャッフルした1からnのn個の連続した整数=[_,_|_2個をとりのぞいたのこりの数]. 'のこりの数からとりのぞいた2個の数を求める。'(_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数,X) :- sort(_2個をとりのぞいたのこりの数,_整列した2個をとりのぞいたのこりの数), 欠番を2個求める(_1からnのn個の連続した整数,_整列した2個をとりのぞいたのこりの数,[],X). 欠番を2個求める(_,_,[X1,X2],[X1,X2]) :- !. 欠番を2個求める(L1,L2,Y,X) :- 欠番を2個見つけるまで探索する(L1,L2,Y,X). 欠番を2個見つけるまで探索する([A|R1],[A|R2],Y,X) :- 欠番を2個求める(R1,R2,Y,X). 欠番を2個見つけるまで探索する([A|R1],[B|R2],Y,X) :- A\==B, 欠番を2個求める(R1,[B|R2],[A|Y],X). % 以下のサイトは 各桁の数値ならび(_数値,_数ならび) :- 一旦数値を数字ならびに変換してその各桁を数に戻し数ならびを得る(_数値,_数ならび). 一旦数値を数字ならびに変換してその各桁を数に戻し数ならびを得る(_数値,_数ならび) :- 一旦数値を数字ならびに変換して(_数値,Chars), その各桁を数に戻し数ならびを得る(Chars,_数ならび). 一旦数値を数字ならびに変換して(_数値,Chars) :- number_chars(_数値,Chars). その各桁を数に戻し数ならびを得る(Chars,_数ならび) :- findall(_数,各桁の数字を数に変換(Chars,_数),_数ならび). 各桁の数字を数に変換(Chars,_数) :- member(A,Chars), atom_number(A,_数). % 以下のサイトは # 出典 :: Regular Expression(正規表現) Part13 # 「1回以上の abcdefg いずれかの文字の繰り返し、ただし ccd+cc を含まない」 # 例えば abcd 、 ffgabc 、 bbbbbbbbbbbbbdddddbbbbbbb にはヒットし # abcdffgabcbbbbbbbbbbbbbdddddbccdddddddddccbbbbbb をかけると abcdffgabcbbbbbbbbbbbbbdddddb (と bbbbbb )を得られる正規表現 # どうやって作ったら良いんでしょうか '「1回以上の abcdefg いずれかの文字の繰り返し、ただし ccd+cc を含まない」 例えば abcd 、 ffgabc 、 bbbbbbbbbbbbbdddddbbbbbbb にはヒットし abcdffgabcbbbbbbbbbbbbbdddddbccdddddddddccbbbbbb をかけると abcdffgabcbbbbbbbbbbbbbdddddb (と bbbbbb )を得られる'(_文字列,_部分適合文字列ならび) :- '文字列は1回以上の abcdefg いずれかの文字の繰り返し、ただし ccd+cc を含まない'(_文字列,_部分適合文字列ならび). '文字列は1回以上の abcdefg いずれかの文字の繰り返し、ただし ccd+cc を含まない'(_文字列,_部分適合文字列ならび) :- '文字列は1回以上の abcdefg いずれかの文字の繰り返し'(_文字列), 'ただし ccd+cc を含まない'(_文字列,_部分適合文字列ならび). '文字列は1回以上の abcdefg いずれかの文字の繰り返し'(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),sub_atom(abcdefg,_,1,_,_文字)). 'ただし ccd+cc を含まない'(_文字列,[_前文字列|R]) :- sub_atom(_文字列,_前文字列,_除外文字列,_後文字列), sub_atom(_除外文字列,0,3,_,ccd), sub_atom(_除外文字列,_,2,0,cc), 'ただし ccd+cc を含まない'(_後文字列,R),!. 'ただし ccd+cc を含まない'(_文字列,[_文字列]). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは 各桁の数値ならび(_数値,_数ならび) :- 各桁の数値ならび(_数値,[],_数ならび). 各桁の数値ならび(0,_数ならび,_数ならび) :- !. 各桁の数値ならび(N,L1,_数ならび) :- 下一桁をならびに取って行く(N,L1,_数ならび). 下一桁をならびに取って行く(N,L1,_数ならび) :- _下一桁 is N mod 10, N_1 is N // 10, 各桁の数値ならび(N_1,[_下一桁|L1],_数ならび). % 以下のサイトは # 中学生になるホンガツオ君はいつも学校の成績が悪く、父・海平に怒られます。 # 今回も中間テストでどれもひどい点数をとってしまい、海平の雷が落ちるのは間違いありません。 # # 全教科のテスト結果を同時にみせると、海平の怒りは最大級となり、1週間のおやつ抜きとなってしまいます。 # # おやつを毎日食べたいホンガツオ君は、海平の怒りを分散させるために、1日1教科ずつテスト結果をみせていくことを思いつきました。 # # ただ、テスト結果の報告が遅れることで、海平の怒りは日に日に上がっていきます。 # もしテスト結果を隠したりして報告しなかったことが後でバレたら最大級の怒りとなるため、すべての教科のテスト結果をみせた方がよさそうです。 # # 海平の怒りの度合いは教科といつみせるかによっても異ります。 # # たとえば、国語、数学、英語の3教科の点数が40点だった場合、1日1教科ずつみせるならば、3日必要です。 # 海平の怒りについては、ホンガツオ君は長年の経験から、スコア化できています。 # # 教科 点数 海平怒りのスコア初期値 1日目 2日目 3日目 # 国語(Ja) 40 10 1 2 3 # 数学(Ma) 40 10 1 4 6 # 英語(En) 40 10 1 6 9 # # # この例では、国語、数学、英語に対する海平怒りのスコアがすべて10です。 # あとは、何日目にみせるかによって、怒りが初期値に乗算されます。 # # 単純に怒りのスコアが小さい教科順にみせると、トータルの海平から被る怒りの量は以下のようになります。 # (10 * 1) + (10 * 4) + (10 * 9) = 140 # # しかし、3日目に被る怒りの量が大きい教科を先にみせることで、怒りの量は減ります。 # (10 * 1) + (10 * 4) + (10 * 3) = 80 # # # つまり、この場合は、1日目に英語→2日目に数学→3日目に国語(En->Ma->Ja)の順にみせることで、ホンガツオ君が海平から被る怒りの量は最も少ない80ですみます。 # # では、以下の7教科の場合、海平怒りのスコアが最も少なくてすむにはどの教科の順でテスト結果をみせればよいでしょうか? # # プログラミング言語はJavaScriptを使用してください。 # # 教科 点数 海平怒りのスコア初期値 1日目 2日目 3日目 4日目 5日目 6日目 7日目 # 国語(Ja) 15 35 1 1 2 3 5 8 13 # 数学(Ma) 35 15 1 5 9 13 17 21 25 # 英語(En) 30 20 1 5 8 12 15 19 22 # 社会(So) 20 30 1 3 5 7 9 11 13 # 理科(Sc) 25 25 1 2 4 6 8 10 12 # 音楽(Mu) 35 15 1 4 6 9 11 14 16 # 美術(Ar) 25 25 1 2 2 3 5 8 11 # # # 以下、問題のデータを用意しています。コピペして使ってください。 # また必ずしもこのデータを使う必要はありません。 # // 教科データ # var category=['Ja','Ma','En','So','Sc','Mu','Ar']; # // 海平怒りのスコア初期値 # var score=[35,15,20,30,25,15,25]; # // 海平怒りの倍数(7日分 # var multiplier=[ # [1,1,2,3,5,8,13], # [1,5,9,13,17,21,25], # [1,5,8,12,15,19,22], # [1,3,5,7,9,11,13], # [1,2,4,6,8,10,12], # [1,4,6,9,11,14,16], # [1,2,2,3,5,8,11], # ]; # # # ■資料 # answer_ikariscore_JavaScript.txt: # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer_ikariscore_JavaScript.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # 毎日一教科ずつ示して怒りを最小にする表示順序(_表示順序) :- 毎日一教科ずつ示して怒りを(_表示順候補ならび), 最小にする表示順序(_表示順候補ならび,_表示順序). 毎日一教科ずつ示して怒りを(_表示順候補ならび) :- 教科と怒りの相関表から教科ならびを得て表示順候補ならびを得る(_表示順候補ならび). 教科と怒りの相関表から教科ならびを得て表示順候補ならびを得る(_表示順候補ならび) :- 教科と怒りの相関表から教科ならびを得て(_教科ならび), 表示順候補ならびを得る(_教科ならび,_表示順候補ならび). 教科と怒りの相関表から教科ならびを得て(_教科ならび) :- findall(_教科,教科と怒りの相関表(_教科,_,_,_),_教科ならび). 表示順候補ならびを得る(_教科ならび,_表示順候補ならび) :- findall([_怒り指数,_表示順序候補],( 表示順による怒り指数(_教科ならび,_表示順序候補,_怒り指数)), _表示順候補ならび). 表示順による怒り指数(_教科ならび,_表示順序候補,_怒り指数) :- 順列(_教科ならび,7,_表示順序候補), 怒り評価(_表示順序候補,_怒り指数). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). 怒り評価(_順序候補,_怒り指数) :- findsum(_怒りの点数,( 順序候補から教科を取り出し怒りの点数を計算する(_順序候補,_怒りの点数)),_怒り指数). 順序候補から教科を取り出し怒りの点数を計算する(_順序候補,_怒りの点数) :- 順序候補から教科を取り出し(_順序候補,_nth1,_教科), 怒りの点数を計算する(_nth1,_教科,_怒りの点数). 順序候補から教科を取り出し(_順序候補,_nth1,_教科) :- nth1(_nth1,_順序候補,_教科). 怒りの点数を計算する(_nth1,_教科,_怒りの点数) :- 教科と怒りの相関表(_教科,_,_初期値,L), nth1(_nth1,L,_怒りの倍数), _怒りの点数 is _初期値 * _怒りの倍数), findsum(A,P,Sum) :- findall(A,P,L), sumlist(L,Sum). 教科と怒りの相関表('国語(Ja)',15,35,[1,1,2,3,5,8,13]). 教科と怒りの相関表('数学(Ma)',35,15,[1,5,9,13,17,21,25]). 教科と怒りの相関表('英語(En)',30,20,[1,5,8,12,15,19,22]). 教科と怒りの相関表('社会(So)',20,30,[1,3,5,7,9,11,13]). 教科と怒りの相関表('理科(Sc)',25,25,[1,2,4,6,8,10,12]). 教科と怒りの相関表('音楽(Mu)',35,15,[1,4,6,9,11,14,16]). 教科と怒りの相関表('美術(Ar)',25,25,[1,2,2,3,5,8,11]). 最小にする表示順序(LL,_表示順序) :- once(最小の怒り指数(LL,_最小の怒り指数)), member([_最小の怒り指数,_表示順序],LL). 最小の怒り指数(LL,_最小の怒り指数) :- select([_最小の怒り指数|_],LL,R), 'Rの中に_最小の怒り指数より小さいものはない'(R,_最小の怒り指数). 'Rの中に_最小の怒り指数より小さいものはない'(R,_最小の怒り指数) :- forall(member([_怒り指数|_],R),_怒り指数 >= _最小の怒り指数). % 以下のサイトは # テーブルPersonが参照している複数のPersonを取得したいのですが助言ください。 # # 「テーブル」 # Person { id, name } # Friend { from, to } // from, to ともにPerson.id # # 「データ表」 # id | name | # --+-----+-- # 1, "A" # 2, "B" # 3, "C" # 4, "D" # 5, "E" # # from | to | # ----+---+-- # 1, 3 # 1, 4 # 1, 5 # 2, 4 # 3, 1 # 4, 1 # 4, 2 # 5, 1 # # [クエリ結果] # 1, 3, "C" # 1, 4, "D" # 1, 5, "E" # 2, 4, "D" # 3, 1, "A" # 4, 1, "A" # 4, 2, "B" # 5, 1, "A" # # SQL SELECT p1.id, p2.* FROM Person p1, Friend , Person p2 WHERE p1.id = Friend.from and Friend.to = p2.id; # テーブルPersonが参照している複数のPersonを取得したい(_id,_to,_name) :- テーブルPersonが(_id), 参照している複数のPersonを取得したい(_id,_to,_name). テーブルPersonが(_id) :- 'Person'(_id,_). 参照している複数のPersonを取得したい(_from,_to,_name) :- 'Friend'(_from,_to), 'Person'(_to,_name). 'Person'(1,'A'). 'Person'(2,'B'). 'Person'(3,'C'). 'Person'(4,'D'). 'Person'(5,'E'). 'Friend'(1,3). 'Friend'(1,4). 'Friend'(1,5). 'Friend'(2,4). 'Friend'(3,1). 'Friend'(4,1). 'Friend'(4,2). 'Friend'(5,1). % 以下のサイトは # テーブルPersonが参照している複数のPersonを取得したいのですが助言ください。 # # 「テーブル」 # Person { id, name } # Friend { from, to } // from, to ともにPerson.id # # 「データ表」 # id | name | # --+-----+-- # 1, "A" # 2, "B" # 3, "C" # 4, "D" # 5, "E" # # from | to | # ----+---+-- # 1, 3 # 1, 4 # 1, 5 # 2, 4 # 3, 1 # 4, 1 # 4, 2 # 5, 1 # # [クエリ結果] # 1, 3, "C" # 1, 4, "D" # 1, 5, "E" # 2, 4, "D" # 3, 1, "A" # 4, 1, "A" # 4, 2, "B" # 5, 1, "A" # # SQL SELECT p1.id, p2.* FROM Person p1, Friend , Person p2 WHERE p1.id = Friend.from and Friend.to = p2.id; # テーブルPersonが参照している複数のPersonを取得したい(_id,_to,_name) :- person(_id,_), 'Friend'(_id,_to), person(_to,_name). person(1,'A'). person(2,'B'). person(3,'C'). person(4,'D'). person(5,'E'). 'Friend'(1,3). 'Friend'(1,4). 'Friend'(1,5). 'Friend'(2,4). 'Friend'(3,1). 'Friend'(4,1). 'Friend'(4,2). 'Friend'(5,1). % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた部分がある # 或る文字がn回以上続いた部分がある(_n,_或る文字,_文字列) :- 或る文字がn回以上続いた(_n,_或る文字,_文字列長,_或る文字がn回以上続いた文字列), 部分がある(_文字列,_文字列長,_或る文字がn回以上続いた文字列). 或る文字がn回以上続いた(_n,_或る文字,_文字列長,_或る文字がn回以上続いた文字列) :- freeze(_文字列長,_文字列長 >= _n), freeze(_或る文字がn回以上続いた文字列,forall(sub_atom(_或る文字がn回以上続いた文字列,_,1,_,_文字),_或る文字 = _文字)). 部分がある(_文字列,_文字列長,_或る文字がn回以上続いた文字列) :- sub_atom(_文字列,_,_文字列長,_,_或る文字がn回以上続いた文字列). % 以下のサイトは # 出典 :: プログラミングのお題スレ 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. % 以下のサイトは 二重再帰のお題(X,Y,Z) :- 'XとY共に0の場合、Zは1である。これが停止節である。'(X,Y,Z). 二重再帰のお題(X,Y,Z) :- 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z). 'XとY共に0の場合、Zは1である。これが停止節である。'(0,0,1). 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z) :- 'Xが0より大きい場合は、Xを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1から1を減じたのがZである'(X,Y,Z),!. 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z) :- 'Yが0より大きい場合は、Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1に3を加えたのがZである'(X,Y,Z). 'Xが0より大きい場合は、Xを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1から1を減じたのがZである'(X,Y,Z) :- 'Xが0より大きい場合は、'(X), 'Xを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1), 'その第三引数で得られた値Z_1から1を減じたのがZである'(Z_1,Z). 'Xが0より大きい場合は、'(X) :- X > 0. 'Xを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1) :- 'Xを1減じて'(X,X_1), 二重再帰のお題(X_1,Y,Z_1). 'Xを1減じて'(X,X_1) :- X_1 is X - 1. 'その第三引数で得られた値Z_1から1を減じたのがZである'(Z_1,Z) :- succ(Z,Z_1). 'Yが0より大きい場合は、Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1に3を加えたのがZである'(X,Y,Z) :- 'Yが0より大きい場合は、'(Y), 'Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1), 'その第三引数で得られた値Z_1に3を加えたのがZである'(Z_1,Z). 'Yが0より大きい場合は、'(Y) :- Y > 0. 'Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1) :- 'Xに1を加えYを1減じて'(X,Y,X_1,Y_1), 二重再帰のお題(X_1,Y_1,Z_1). 'Xに1を加えYを1減じて'(X,Y,X_1,Y_1) :- 'Xに1を加え'(X,X_1), 'Yを1減じて'(Y,Y_1). 'Xに1を加え'(X,X_1) :- succ(X,X_1). 'Yを1減じて'(Y,Y_1) :- Y_1 is Y - 1. 'その第三引数で得られた値Z_1に3を加えたのがZである'(Z_1,Z) :- Z is Z_1 + 3. % 以下のサイトは # 出典 :: ★★ 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. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 137代目 #936 # お手上げです。頑張ったのですが、できませんでした。 # 申し訳ないですけどお願いします。 # # 問題 # # 複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力するプログラムを作成せよ. # # 【実行例】 # # 何個の文字列を入力しますか?:4 # 入力文字列[1]:Computer # 入力文字列[2]:Science # 入力文字列[3]:Tarou # 入力文字列[4]:Tanaka # # 繋ぎ合わせる順番: # 2 # 4 # 3 # 1 # # 結果:ScienceTanakaTarouComputer # '複数の文字列を読み込み,さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する' :- '複数の文字列を読み込み,'(_複数の,_入力文字列ならび), 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび). '複数の文字列を読み込み,'(_複数の,_入力文字列ならび) :- 複数の(_複数の), findall(_行,( 文字列を読み込み(_複数の,_行)),_入力文字列ならび). 複数の(_複数の) :- 整数を得る('何個の文字列を入力しますか?: ',true,_複数の), writef('文字列を%w行連続して入力してください\n',[_複数の]). 文字列を読み込み(_複数の,_行) :- between(1,_複数の,_), 行入力(_行). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し結果を出力する'(_複数の,_入力文字列ならび) :- 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび), 結果を出力する(_入力文字列ならび,_取り出し順ならび). 'さらに,それらの文字列を繋ぎ合わせる順番を入力し'(_複数の,_取り出し順ならび) :- write('入力した文字列を繋ぎ合わせる順番を入力してください\n'), それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび). それらの文字列を繋ぎ合わせる順番を入力し(_複数の,_取り出し順ならび) :- findall(_番目,( 順番を入力し(_複数の,_番目)),_取り出し順ならび). 順番を入力し(_複数の,_番目) :- between(1,_複数の,_), 整数を得る(_番目). 整数を得る(_番目) :- 整数を得る('',true,_番目). 結果を出力する(_入力文字列ならび,_取り出し順ならび) :- 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび), 出力する(_指定した順番の文字列ならび). 結果を(_入力文字列ならび,_取り出し順ならび,_指定した順番の文字列ならび) :- findall(_文字列,( 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列)),_指定した順番の文字列ならび). 指定順に取り出す(_入力文字列ならび,_取り出し順ならび,_文字列) :- member(_番目,_取り出し順ならび), nth1(_番目,_入力文字列ならび,_文字列). 出力する(_指定した順番の文字列ならび) :- 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列), writef('繋ぎ合わせた文字列は: %w\n',[_表示文字列]). 文字列を指定した順番に繋ぎ合わせて(_指定した順番の文字列ならび,_表示文字列) :- atomic_list_concat(_指定した順番の文字列ならび,_表示文字列). 整数を得る(_催促文,_条件,_整数) :- 以下の入力に失敗した場合は再入力する, '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数),!. 以下の入力に失敗した場合は再入力する :- repeat. '催促文の表示後、入力された行を整数に変換し、条件を実行する'(_催促文,_条件,_整数) :- '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数), 条件を実行する(_行,_整数,_条件). '催促文の表示後、入力された行を整数に変換し、'(_催促文,_行,_整数) :- 催促文の表示(_催促文), 行入力(_行), 整数入力検査(_行,_整数). 催促文の表示(_催促文) :- writef('%w',[_催促文]). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 整数入力検査(_行,_整数) :- 行を解析して整数を得る(_行,_整数). 整数入力検査(_行,_) :- 整数を得られなかったらそのことを表示してfail(_行). 行を解析して整数を得る(_行,_整数) :- 行を解析して(_行,_整数), それが整数であることを確認する(_整数). 行を解析して(_行,_整数) :- catch(read_term_from_atom(_行,_整数,[]),E,fail). それが整数であることを確認する(_整数) :- integer(_整数). 整数を得られなかったらそのことを表示してfail(_行) :- writef('入力された行 %w からは整数が得られませんでした。再入力をお願いします。\n',[_行]), fail. 条件を実行する(_行,_整数,_条件) :- call(_条件). 条件を実行する(_行,_整数,_条件) :- writef('%w から得た整数 %w は、条件 %w を満たしません。再入力をお願いします。\n',[_行,_整数,_条件]), fail. % 以下のサイトは ハーシャッド数(_ハーシャッド数) :- ハーシャッド数(1,_ハーシャッド数). ハーシャッド数(_ハーシャッド数,_ハーシャッド数) :- ハーシャッド数は整数の各桁の合計が元の数の約数であるような整数(_ハーシャッド数). ハーシャッド数(_整数,_ハーシャッド数) :- ハーシャッド数を生成して行く(_整数,_ハーシャッド数). ハーシャッド数は整数の各桁の合計が元の数の約数であるような整数(_ハーシャッド数) :- 整数の各桁の合計が(_ハーシャッド数,_各桁の合計), 元の数の約数であるような整数(_ハーシャッド数,_各桁の合計). 整数の各桁の合計が(_整数,_各桁の合計) :- 整数の各桁の(_整数,[],_整数の各桁), sum_list(_整数の各桁,_各桁の合計). 整数の各桁の(0,_整数の各桁,_整数の各桁) :- !. 整数の各桁の(_整数,_整数の各桁_1,_整数の各桁) :- 整数の各桁をリストに取って行く(_整数,_整数の各桁_1,_整数の各桁). 整数の各桁をリストに取って行く(_整数,_整数の各桁_1,_整数の各桁) :- '10を法として商と剰余を得る'(_整数,_商,_剰余), 整数の各桁の(_商,[_剰余|_整数の各桁_1],_整数の各桁). '10を法として商と剰余を得る'(_整数,_商,_剰余) :- _商 is _整数 // 10, _剰余 is _整数 mod 10. 元の数の約数であるような整数(_ハーシャッド数,_各桁の合計) :- 0 is _ハーシャッド数 mod _各桁の合計. ハーシャッド数を生成して行く(_整数,_ハーシャッド数) :- succ(_整数,_整数_2), ハーシャッド数(_整数_2,_ハーシャッド数). n番目のハーシャッド数(_n番目,_n番目のハーシャッド数) :- findnsols(_n番目,_ハーシャッド数,ハーシャッド数(_ハーシャッド数),_ハーシャッド数ならび), last(_ハーシャッド数ならび,_n番目のハーシャッド数). % 以下のサイトは # # SWI-Prolog用 sub_atom/5 の遅延評価版述語 副文字列/5 # # 第一引数の_文字列が変数であってもすぐにはエラーとならない # 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列),!. 副文字列(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- freeze(_文字列,sub_atom(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列)). '選択開始位置0起源、残り長さが共に0で、かつ、文字列が変数'(_文字列,_選択開始位置0起源,_選択長さ,_残り長さ,_副文字列) :- '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ), 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ). '選択開始位置0起源、残り長さが共に0で、'(_選択開始位置0起源,_残り長さ) :- '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ), 共に0である(_選択開始位置0起源,_残り長さ). '選択開始位置0起源、残り長さは整数で'(_選択開始位置0起源,_残り長さ) :- integer(_選択開始位置0起源), integer(_残り長さ). 共に0である(0,0). 'かつ、文字列が変数'(_文字列,_副文字列,_選択長さ) :- var(_文字列), _文字列 = _副文字列, freeze(_文字列,atom_length(_文字列,_選択長さ)). % 以下のサイトは 前文字列の副文字列として適合文字列は現れない(_前文字列,_適合文字列) :- \+(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,_,_適合文字列の最後の文字)). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 128代目 #946 # 【質問テンプレ】 # [1] 授業単元 C言語 # [2] 問題文(含コード&リンク): # 二つのバイナリファイルの中身を比較して等しいか、等しくないかを # 比較して結果を返す関数を作る '二つのバイナリファイルの中身を比較して等しいか、等しくないかを返す'(_ファイル1,_ファイル2,_診断) :- 二つのバイナリファイルの(_ファイル1,_ファイル2,_ストリーム1,_ストリーム2,A,B), 中身を比較して等しいか等しくないか返す(_ストリーム1,_ストリーム2,A,B,_診断), 二つのバイナリファイルを閉じる(_ストリーム1,_ストリーム2). 二つのバイナリファイルの(_ファイル1,_ファイル2,_ストリーム1,_ストリーム2,A,B) :- 二つのバイナリファイルを開き二つのストリームを得る(_ファイル1,_ファイル2,_ストリーム1,_ストリーム2), それぞれのストリームから1バイトを得る(_ストリーム1,_ストリーム2,A,B). 二つのバイナリファイルを開き二つのストリームを得る(_ファイル1,_ファイル2,_ストリーム1,_ストリーム2) :- open(ファイル1,read,_ストリーム1,[type(binary)]), open(ファイル2,read,_ストリーム2,[type(binary)]). それぞれのストリームから1バイトを得る(_ストリーム1,_ストリーム2,A,B) :- get_byte(_ストリーム1,A), get_byte(_ストリーム2,B). 中身を比較して等しいか等しくないか返す(_,_,A,B,_診断) :- '両方同時にat_end_of_file状態になるか、二つの値が異なった時、停止する'(_ストリーム1,_ストリーム2,A,B,_診断),!. 中身を比較して等しいか等しくないか返す(_ストリーム1,_ストリーム2,_,_,_診断) :- 二つのバイトが等しい限り1バイトずつ読み続ける(_ストリーム1,_ストリーム2,_診断). '両方同時にat_end_of_file状態になるか、二つの値が異なった時、停止する'(_ストリーム1,_ストリーム2,-1,-1,等しい) :- !. '両方同時にat_end_of_file状態になるか、二つの値が異なった時、停止する'(_ストリーム1,_ストリーム2,A,B,等しくない) :- A =\= B. 二つのバイトが等しい限り1バイトずつ読み続ける(_ストリーム1,_ストリーム2,_診断) :- それぞれのストリームから1バイトを得る(_ストリーム1,_ストリーム2,C,D), 中身を比較して等しいか等しくないか返す(_ストリーム1,_ストリーム2,C,D,_診断). 二つのバイナリファイルを閉じる(_ストリーム1,_ストリーム2) :- close(_ストリーム1), close(_ストリーム2). % 以下のサイトは 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). % 以下のサイトは 'a-zを50回繰り返し、その文字列のn番目のnが素数かつその数値文字列の中に3を含まないものは、大文字に変換する'(_目標文字列) :- '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(_小文字ならび,_大文字ならび), 'エラトステネスの篩の変形'(_大文字ならび,Lx), 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列). 第二引数のならびの変数を第一引数の同一位置要素で埋めて文字列に変換する(_小文字ならび,Lx,_目標文字列) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(_小文字ならび,Lx), atom_chars(_目標文字列,Lx). 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). '小文字のa-zを50回繰り返したならびと大文字のA-Zを50回繰り返したならび'(L1,L2) :- '小文字のa-zを50回繰り返したならびと'(L1), '大文字のA-Zを50回繰り返したならび'(L2). '小文字のa-zを50回繰り返したならびと'(L1) :- findall(A,( between(1,50,_), sub_atom(abcdefghijklmnopqrstuvwxyz,_,1,_,A)),L1). '大文字のA-Zを50回繰り返したならび'(L2) :- findall(A,( between(1,50,_), sub_atom('ABCDEFGHIJKLMNOPQRSTRVWXYZ',_,1,_,A)),L2). 素数でその数値文字列に3を含まない時大文字で挿入する(_大文字ならび,L) :- findall(N,between(2,1300,N),_篩候補), length(L,1300), '素数でその数値文字列に3を含まない時大文字で挿入する'(_篩候補,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'([],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'([A|R1],_大文字ならび,L) :- '数字列に3を含まない時は大文字を素数の位置に挿入'(A,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(A,R1,R2,_大文字ならび,L), '素数でその数値文字列に3を含まない時大文字で挿入する'(R2,_大文字ならび,L). '素数でその数値文字列に3を含まない時大文字で挿入する'(_,[],[],_大文字ならび,L) :- !. '素数でその数値文字列に3を含まない時大文字で挿入する'(N,[A|R1],R,_大文字ならび,L) :- 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 要素がなくなるまで篩を掛けて行く(N,[A|R1],R,_大文字ならび,L) :- 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L). 'AがNで割り切れたらそのまま篩を掛け続ける'(N,[A|R1],R,_大文字ならび,L) :- 0 is A mod N, '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R,_大文字ならび,L),!. 'AがNで割り切れなかったら篩を掛け続ける'(N,[A|R1],[A|R2],_大文字ならび,L) :- '素数でその数値文字列に3を含まない時大文字で挿入する'(N,R1,R2,_大文字ならび,L). '数字列に3を含まない時は大文字を素数の位置に挿入'(N,_大文字ならび,L) :- 数字列に3を含まない時は(N,_大文字ならび), 大文字を素数の位置に挿入(N,_大文字ならび,L),!. '数字列に3を含まない時は大文字を素数の位置に挿入'(_,_,L). 数字列に3を含まない時は(N,_大文字ならび) :- number_chars(N,Chars), \+(member('3',Chars)). 大文字を素数の位置に挿入(N,_大文字ならび,L) :- nth1(N,_大文字ならび,A), nth1(N,L,A). % 以下のサイトは 頭寒足熱腹八分(_頭寒足熱腹八分) :- 頭寒足熱腹八分(_頭寒,_足熱,_腹八分), atomic_list_concat([_頭寒,_足熱,_腹八分],_頭寒足熱腹八分). 頭寒足熱腹八分(_頭寒,_足熱,_腹八分) :- 頭寒(_頭寒), 足熱(_足熱), 腹八分(_腹八分). 頭寒(気取らず). 足熱(怠けず). 腹八分(欲張らず). ?- 頭寒足熱腹八分(_頭寒足熱腹八分). _頭寒足熱腹八分 = 気取らず怠けず欲張らず. ?- % 以下のサイトは 第二引数のならびの変数を第一引数の同一位置要素で埋める([],[]). 第二引数のならびの変数を第一引数の同一位置要素で埋める(L1,L2) :- 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く(L1,L2). 第二引数のならびの変数を第一引数の同一位置要素で埋めて行く([A|R1],[B|R2]) :- 第二引数が変数の時は第一引数と単一化(A,B), 第二引数のならびの変数を第一引数の同一位置要素で埋める(R1,R2). 第二引数が変数の時は第一引数と単一化(A,A) :- !. 第二引数が変数の時は第一引数と単一化(A,B). % 以下のサイトは '乱数によってズンかドコを表示して、その表示した文字列にズンズンズンズンドコという副文字列が現れたらキ・ヨ・シ!を表示して終了します。' :- 'ズンズンズンズンドコキ・ヨ・シ!'. 'ズンズンズンズンドコキ・ヨ・シ!' :- 'ズンズンズンズンドコキ・ヨ・シ!'(''),!. 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- 'ズンズンズンズンドコが現れたらキ・ヨ・シ!を表示して終了する'(_文字列). 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- ズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列). 'ズンズンズンズンドコが現れたらキ・ヨ・シ!を表示して終了する'(_文字列) :- ズンズンズンズンドコが現れたら(_文字列), 'キ・ヨ・シ!を表示して終了する'. ズンズンズンズンドコが現れたら(_文字列) :- sub_atom(_文字列,_,_,0,ズンズンズンズンドコ). 'キ・ヨ・シ!を表示して終了する' :- format('~w\n',['キ・ヨ・シ!']). ズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列) :- 乱数によってズンかドコを選択して表示し文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列), 'ズンズンズンズンドコキ・ヨ・シ!'(_ズンかドコを付加された文字列). 乱数によってズンかドコを選択して表示し文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列) :- 乱数によってズンかドコを選択して表示し(_ズンかドコ), 文字列の末尾に付加する(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). 乱数によってズンかドコを選択して表示し(_ズンかドコ) :- 乱数によってズンかドコを選択して(_ズンかドコ), 表示し(_ズンかドコ). 乱数によってズンかドコを選択して(_ズンかドコ) :- random_select(_ズンかドコ,[ズン,ドコ],_). 表示し(_ズンかドコ) :- format('~w',[_ズンかドコ]). 文字列の末尾に付加する(_文字列,_ズンかドコ,_ズンかドコを付加された文字列) :- atom_concat(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). % 以下のサイトは 'ズンズンズンズンドコキ・ヨ・シ!' :- 'ズンズンズンズンドコキ・ヨ・シ!'(''). 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- 末尾がズンズンズンズンドコになったらキヨシを付加して終了する(_文字列),!. 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- 末尾にズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列). '末尾がズンズンズンズンドコになったらキ・ヨ・シ!を表示して終了する'(_文字列) :- 末尾がズンズンズンズンドコになったら(_文字列), 'キ・ヨ・シ!を表示して'(_文字列). 末尾がズンズンズンズンドコになったら(_文字列) :- sub_atom(_文字列,_,_,0,ズンズンズンズンドコ). 'キ・ヨ・シ!を表示して'(_文字列) :- write('キ・ヨ・シ!\n'). 末尾にズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列) :- 乱数によってズンかドコを選択して文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列), 'ズンズンズンズンドコキ・ヨ・シ!'(_ズンかドコを付加された文字列). 乱数によってズンかドコを選択してそれを表示し文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列) :- 乱数によってズンかドコを選択してそれを表示し(_ズンかドコ), 文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列). 乱数によってズンかドコを選択してそれを表示し(_ズンかドコ) :- 乱数によってズンかドコを選択して(_ズンかドコ), それを表示し(_ズンかドコ). 乱数によってズンかドコを選択して(_ズンかドコ) :- random_select(_ズンかドコ,[ズン,ドコ],_). それを表示し(_ズンかドコ) :- wrtitef('%w\n',[_ズンかドコ]). 文字列の末尾に付加する(_文字列,_ズンかドコ,_ズンかドコを付加された文字列) :- atom_concat(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). % 以下のサイトは 'ズンズンズンズンドコキ・ヨ・シ!'(_ズンズンズンズンドコキヨシ) :- 'ズンズンズンズンドコキ・ヨ・シ!'('',_ズンズンズンズンドコキヨシ),!. 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列,_ズンズンズンズンドコキヨシ) :- '末尾がズンズンズンズンドコになったらキ・ヨ・シ!を付加して終了する'(_文字列,_ズンズンズンズンドコキヨシ). 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列,_ズンズンズンズンドコキヨシ) :- 末尾にズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列,_ズンズンズンズンドコキヨシ). '末尾がズンズンズンズンドコになったらキ・ヨ・シ!を付加して終了する'(_文字列,_ズンズンズンズンドコキヨシ) :- sub_atom(_文字列,_,_,0,ズンズンズンズンドコ), atom_concat(_文字列,'キ・ヨ・シ!',_ズンズンズンズンドコキヨシ). 末尾にズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列,_ズンズンズンズンドコキヨシ) :- 乱数によってズンかドコを選択して文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列), 'ズンズンズンズンドコキ・ヨ・シ!'(_ズンかドコを付加された文字列,_ズンズンズンズンドコキヨシ). 乱数によってズンかドコを選択して文字列の末尾に付加する(_文字列,_ズンかドコを付加された文字列) :- random_select(_ズンかドコ,[ズン,ドコ],_), atom_concat(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). % 以下のサイトは :- dynamic(フィボナッチ数/2). フィボナッチ数(_n番目,_n番目のフィボナッチ数) :- '0番目のフィボナッチ数は0、1番目は1、2番目も1である。これらが停止節となる。'(_n番目,_n番目のフィボナッチ数),!. フィボナッチ数(_n番目,_n番目のフィボナッチ数) :- '_n番目のフィボナッチ数は_n-2番目のフィボナッチ数と_n-1番目のフィボナッチ数を加えたものである'(_n番目,_n番目のフィボナッチ数). '0番目のフィボナッチ数は0、1番目は1、2番目も1である。これらが停止節となる。'(0,0). '0番目のフィボナッチ数は0、1番目は1、2番目も1である。これらが停止節となる。'(1,1). '0番目のフィボナッチ数は0、1番目は1、2番目も1である。これらが停止節となる。'(2,1). '_n番目のフィボナッチ数は_n-2番目のフィボナッチ数と_n-1番目のフィボナッチ数を加えたものである'(_n番目,_n番目のフィボナッチ数) :- '_n番目のフィボナッチ数は_n-2番目のフィボナッチ数と_n-1番目のフィボナッチ数を'(_n番目,_n_2番目のフィボナッチ数,_n_1番目のフィボナッチ数), 加えたものである(_n_2番目のフィボナッチ数,_n_1番目のフィボナッチ数,_n番目のフィボナッチ数), '_n番目のフィボナッチ数を記憶する'(_n番目,_n番目のフィボナッチ数). '_n番目のフィボナッチ数は_n-2番目のフィボナッチ数と_n-1番目のフィボナッチ数を'(_n番目,_n_2番目のフィボナッチ数,_n_1番目のフィボナッチ数) :- '_n-2番目のフィボナッチ数と'(_n番目,_n_2番目のフィボナッチ数), '_n-1番目のフィボナッチ数を'(_n番目,_n_1番目のフィボナッチ数). '_n-2番目のフィボナッチ数と'(_n番目,_n_2番目のフィボナッチ数) :- _n_2番目 is _n番目 - 2, フィボナッチ数(_n_2番目,_n_2番目のフィボナッチ数). '_n-1番目のフィボナッチ数を'(_n番目,_n_1番目のフィボナッチ数) :- _n_1番目 is _n番目 - 1, フィボナッチ数(_n_1番目,_n_1番目のフィボナッチ数). 加えたものである(_n_2番目のフィボナッチ数,_n_1番目のフィボナッチ数,_n番目のフィボナッチ数) :- _n番目のフィボナッチ数 is _n_2番目のフィボナッチ数 + _n_1番目のフィボナッチ数. '_n番目のフィボナッチ数を記憶する'(_n番目,_n番目のフィボナッチ数) :- asserta((フィボナッチ数(_n番目,_n番目のフィボナッチ数) :- ! )). % 以下のサイトは '父方先祖、母方先祖の集合を作り、クロスがある共通先祖の血量合計が最大である先祖を得る。'(_本人,_血量が最大である先祖) :- '父方と母方のふたつの集合を作り、'(_本人,_父方集合,_母方集合,_共通先祖ならび), 'クロスがある共通先祖の血量合計が最大である先祖を得る。'(_父方集合,_母方集合,_共通先祖ならび,_血量が最大である先祖). '父方と母方のふたつの集合を作り、'(_本人,_父方集合,_母方集合,_共通先祖ならび) :- 父方集合を得る(_本人,_父方集合), 母方集合を得る(_本人,_母方集合), 父方集合と母方集合を先祖で集約して共通先祖ならびを得る(_父方集合,_母方集合,_共通先祖ならび). 父方集合を得る(_本人,_父方_世代_先祖集合) :- 父(_本人,_父), findall([_世代,_先祖],世代を数えながら先祖を得る(_父,0,_世代,_先祖),_父方_世代_先祖集合). 母方集合を得る(_本人,_母方_世代_先祖集合) :- 母(_本人,_母), findall([_世代,_先祖],世代を数えながら先祖を得る(_母,0,_世代,_先祖),_母方_世代_先祖集合). 世代を数えながら先祖を得る(_子,_世代_1,_世代,_先祖) :- 父または母(_子,_父または母), succ(_世代_1,_世代_2), 先祖を得る(_父または母,_世代_2,_世代,_先祖). 父または母(_子,_父または母) :- 父(_子,_父). 父または母(_子,_父または母) :- 母(_子,_母). 先祖を得る(_父または母,_世代,_世代,_父または母). 先祖を得る(_父または母,_世代_2,_世代,_先祖) :- 世代を数えながら先祖を得る(_父または母,_世代_2,_世代,_先祖). 父方集合と母方集合を先祖で集約して共通先祖ならびを得る(_父方集合,_母方集合,_共通先祖ならび) :- 父方集合を先祖で集約(_父方集合,_父方先祖ならび), 母方集合を先祖で集約(_母方集合,_母方先祖ならび), intersection(_父方先祖ならび,_母方先祖ならび,_共通先祖ならび). 父方集合を先祖で集約(_父方集合,_父方先祖ならび) :- setof(_先祖,[_世代,_先祖] ^ member([_世代,_先祖],_父方集合),_父方先祖ならび). 母方集合を先祖で集約(_母方集合,_母方先祖ならび) :- setof(_先祖,[_世代,_先祖] ^ member([_世代,_先祖],_母方集合),_母方先祖ならび). 'クロスがある共通先祖の血量合計が最大である先祖を得る。'(_父方集合,_母方集合,_共通先祖ならび,_血量が最大である先祖) :- 先祖_血量ならびを得る(_共通先祖ならび,_父方集合,_母方集合,_先祖_血量ならび), 血量が最大である先祖を取り出す(_先祖_血量ならび,_血量が最大である先祖). 先祖_血量ならびを得る(_共通先祖ならび,_父方集合,_母方集合,_先祖_血量ならび) :- append(_父親集合,_母親集合,_親集合), findall([_先祖,_血量],共通先祖ならびから先祖の血量を得る(_共通先祖ならび,_親集合,_先祖,_血量),_先祖_血量ならび). 共通先祖ならびから先祖の血量を得る(_共通先祖ならび,_親集合,_先祖,_血量) :- member(_先祖,_共通先祖ならび), 血量を得る(_先祖,_親集合,_血量). 血量を得る(_先祖,_親集合,_血量) :- findsum(_血量,( 先祖が現れるごとにその部分血量を計算する(_先祖,_親集合,_血量)),_血量合計). 先祖が現れるごとにその部分血量を計算する(_先祖,_親集合,_血量) :- member([_世代,_先祖],_親集合), 血量計算(_世代,_血量). 血量計算(_世代,_血量) :- _血量 is 1 rdiv (2 ^ _世代). 血量が最大である先祖を取り出す(_先祖_血量ならび,_血量が最大である先祖) :- findmax(_血量,member([_,_血量],_先祖_血量ならび),_最大血量), member([_血量が最大である先祖,_最大血量],_先祖_血量ならび). findmax(A,P,Max) :- findall(A,P,L), max_list(L,Max). findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは 'クロスがある先祖の最大血量'(_本人,_世代限界値,_血量の最大の先祖) :- 'n代まで遡りそこに全ての現れる父方個人、母方個人の集合を作る。その積集合を取り、その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。要素の中の、血量の最大のものを得る。'(_本人,_世代限界値,_血量の最大の先祖). 'n代まで遡りそこに全ての現れる父方個人、母方個人の集合を作る。その積集合を取り、その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。要素の中の、血量の最大のものを得る。'(_本人,_世代限界値,_血量の最大の先祖) :- findall([_先祖,_血量],( 'n代まで遡りそこに現れる全ての父方個人、母方個人の集合を作る。その積集合を取り、その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。'(_本人,_世代限界値,_先祖,_血量)),_先祖_血量ならび), 血量最大の先祖を得る(_先祖_血量ならび,_血量最大の先祖). 血量最大の先祖を得る(_先祖_血量ならび,_血量の最大の先祖) :- 最大血量値を得る(_先祖_血量ならび,_最大血量値), member([_血量の最大の先祖,_最大血量値],_先祖_血量ならび). 最大血量値を得る(_先祖_血量ならび,_最大血量値) :- findmax(_血量,member([_,_血量],_先祖_血量ならび),_最大血量値). 'n代まで遡りそこに現れる全ての父方個人、母方個人の集合を作る。その積集合を取り、その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。'(_本人,_世代限界値,_先祖,_先祖血量) :- 'n代まで遡りそこに現れる全ての父方個人、母方個人の集合を作る。'(_本人,_世代限界値,_父方集合,_母方集合), 'その積集合を取り、'(_父方集合,_母方集合,_積集合), 'その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。'(_本人,_世代限界値,_積集合,_先祖,_先祖血量). 'n代まで遡りそこに現れる全ての父方個人、母方個人の集合を作る。'(_本人,_世代限界値,_父方集合,_母方集合) :- 父方集合を得る(_本人,_世代限界値,_父方集合), 母方集合を得る(_本人,_世代限界値,_母方集合). 父方集合を得る(_本人,_世代限界値,_父方集合) :- 父(_本人,_父), findall(_先祖,世代を数えながら先祖を得る(_父,_世代限界値,_世代_1,_世代,_先祖),_父方集合). 母方集合を得る(_本人,_世代限界値,_母方集合) :- 母(_本人,_母), findall(_先祖,世代を数えながら先祖を得る(_母,_世代限界値,_世代_1,_世代,_先祖),_母方集合). 'その積集合を取り、'(_父方集合,_母方集合,_積集合) :- intersection(_父方集合,_母方集合,_積集合). 世代を数えながら先祖を得る(_本人,_世代限界値,_世代_1,_世代,_先祖) :- _世代限界値 > _世代_1, 父または母(_本人,_父または母), succ(_世代_1,_世代_2), 先祖を得る(_父または母,_世代限界値,_世代_2,_世代,_先祖). 父または母(_本人,_父または母) :- 父(_本人,_父). 父または母(_本人,_父または母) :- 母(_本人,_母). 先祖を得る(_父または母,_,_世代,_世代,_父または母). 先祖を得る(_父または母,_世代限界値,_世代_1,_世代,_先祖) :- 世代を数えながら先祖を得る(_父または母,_世代限界値,_世代_1,_世代,_先祖). 'その集合要素が父方に何親等が何人、母方何親等が何人と数えて血量を得る。'(_本人,_世代限界値,_積集合,_先祖,_先祖血量) :- member(_先祖,_積集合), findall([_世代,_先祖],世代を数えながら先祖を得る(_本人,_世代限界値,0,_世代,_先祖),_世代_先祖ならび), 血量計算(_世代先祖ならび,[],_先祖血量). 血量計算([],L,_先祖血量) :- sum_list(L,_先祖血量). 血量計算([[_世代,_]|R1],L,_先祖血量) :- _血量 is 1 rdiv (2 ^ _世代), 血量計算(R1,[_血量|L],_先祖血量). findmax(A,P,Max) :- findall(A,P,L), max_list(L,Max). % 以下のサイトは # 出典: # お題:引数に1を足した値を返すカメ関数と引数に2を掛けた値を返すウサギ関数を # 使って自然数mを自然数nにする(m < n)。この時、ふたつの関数の使用回数の合計の # 最小値を求める。 # 例 # m=3, n=10 -> 3 # m=3, n=95 -> 10 # m=666, n=2014 -> 342 '引数に1を足した値を返すカメ関数と引数に2を掛けた値を返すウサギ関数を使って自然数mを自然数nにする(m < n)。この時、ふたつの関数の使用回数の合計の最小値を求める。'(_m,_n,_ふたつの関数の使用回数の合計の最小値) :- findall(_ふたつの関数の使用回数,( '引数に1を足した値を返すカメ関数と引数に2を掛けた値を返すウサギ関数を使って自然数mを自然数nにする(m < n)までのふたつの関数の使用回数の合計'(_n,_m,0,0,_,_,_ふたつの関数の使用回数)),L), min_list(L,_ふたつの関数の使用回数の合計の最小値). '引数に1を足した値を返すカメ関数と引数に2を掛けた値を返すウサギ関数を使って自然数mを自然数nにする(m < n)までのふたつの関数の使用回数の合計'(_n,_n,X,Y,X,Y,_使用回数の合計) :- _使用回数の合計 is X + Y. '引数に1を足した値を返すカメ関数と引数に2を掛けた値を返すウサギ関数を使って自然数mを自然数nにする(m < n)までのふたつの関数の使用回数の合計'(_n,N,X_1,Y_1,X,Y,_使用回数の合計) :- _n > N, 'ウサギ関数とカメ関数を組合せて適用してNが_nになるまでの関数を使用回数を得る'(_n,N,X_1,Y_1,X,Y,_使用回数の合計). 'ウサギ関数とカメ関数を組合せて適用してNが_nになるまでの関数を使用回数を得る'(_n,N,X_1,Y_1,X,Y,_使用回数の合計) :- ウサギ関数を適用してみる(_n,N,X_1,Y_1,X,Y,_使用回数の合計). 'ウサギ関数とカメ関数を組合せて適用してNが_nになるまでの関数を使用回数を得る'(_n,N,X_1,Y_1,X,Y,_使用回数の合計) :- カメ関数を適用してみる(_n,N,X_1,Y_1,X,Y,_使用回数の合計). ウサギ関数を適用してみる(_n,N,X_1,Y_1,X,Y,_使用回数の合計) :- ウサギ関数を適用し回数をカウントする(_n,N,X_1,N_2,X_2), '引数に1を足した値を返すカメ関数と引数に2を掛けた値を返すウサギ関数を使って自然数mを自然数nにする(m < n)までのふたつの関数の使用回数の合計'(_n,N_2,X_2,Y_1,X,Y,_使用回数の合計). ウサギ関数を適用し回数をカウントする(_n,N,X_1,N_2,X_2) :- ウサギ関数(N,N_2), succ(X_1,X_2). カメ関数を適用してみる(_n,N,X_1,Y_1,X,Y,_使用回数の合計) :- カメ関数を適用し回数をカウントする(_n,N,Y_1,N_2,Y_2), '引数に1を足した値を返すカメ関数と引数に2を掛けた値を返すウサギ関数を使って自然数mを自然数nにする(m < n)までのふたつの関数の使用回数の合計'(_n,N_2,X_1,Y_2,X,Y,_使用回数の合計). カメ関数を適用し回数をカウントする(_n,N,Y_1,N_2,Y_2) :- カメ関数(N,N_2), succ(Y_1,Y_2). ウサギ関数(_ある値,_ウサギ関数を適用された値) :- _ウサギ関数を適用された値 is _ある値 * 2. カメ関数(_ある値,_カメ関数を適用された値) :- succ(_ある値,_カメ関数を適用された値). % 以下のサイトは # [1] 授業単元:プログラミング # [2] 問題文 # 三つの整数値の平均値を求めるプログラム。 # ただし、平均値を求める二項平均述語以外は使うことができない。 # 三項平均を二項平均だけから求める(_平均値_1,_平均値_2,_平均値_3,_平均値) :- 三つの二項差がすべて閾値より小さい時小数点以下5桁で丸め解とする(_平均値_1,_平均値_2,_平均値_3,_平均値),!. 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値) :- 三項を二項の三つの組合せで平均して行く(_整数の一,_整数の二,_整数の三,_平均値). 三項を二項の三つの組合せで平均して行く(_整数の一,_整数の二,_整数の三,_平均値) :- 三項を二項の三つの組合せで平均して(_整数の一,_整数の二,_整数の三,_二項平均の一,_二項平均の二,_二項平均の三), 三項平均を二項平均だけから求める(_二項平均の一,_二項平均の二,_二項平均の三,_平均値). 三項を二項の三つの組合せで平均して(_整数の一,_整数の二,_整数の三,_二項平均の一,_二項平均の二,_二項平均の三) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. 三つの二項差がすべて閾値より小さい時小数点以下5桁で丸め解とする(_平均値_1,_平均値_2,_平均値_3,_平均値) :- 三つの二項差がすべて閾値より小さい時の(_平均値_1,_平均値_2,_平均値_3), 小数点以下5桁で丸め解とする(_平均値_1,_平均値). 三つの二項差がすべて閾値より小さい時の(_平均値_1,_平均値_2,_平均値_3) :- abs(_平均値_1 - _平均値_2) < 0.0001, abs(_平均値_1 - _平均値_3) < 0.0001, abs(_平均値_2 - _平均値_3) < 0.0001. 小数点以下5桁で丸め解とする(_平均値_1,_平均値) :- _平均値 is round(_平均値_1 * 100000) / 100000. % 以下のサイトは # [1] 授業単元:プログラミング # [2] 問題文 # 三つの整数値の平均値を求めるプログラム。 # ただし、平均値を求める二項平均述語以外は使うことができない。 # 三項平均を二項平均だけから求める(_平均値_1,_平均値_2,_平均値_3,_平均値) :- 三つの二項差がすべて閾値より小さい時小数点以下5桁で丸め解とする(_平均値_1,_平均値_2,_平均値_3,_平均値),!. 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三), 三項平均を二項平均だけから求める(_二項平均の一,_二項平均の二,_二項平均の三,_平均値). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. 三つの二項差がすべて閾値より小さい時小数点以下5桁で丸め解とする(_平均値_1,_平均値_2,_平均値_3,_平均値) :- 三つの二項差がすべて閾値より小さい時の(_平均値_1,_平均値_2,_平均値_3), 小数点以下5桁で丸め解とする(_平均値_1,_平均値). 三つの二項差がすべて閾値より小さい時の(_平均値_1,_平均値_2,_平均値_3) :- abs(_平均値_1 - _平均値_2)<0.000001, abs(_平均値_1 - _平均値_3)<0.000001, abs(_平均値_2 - _平均値_3)<0.000001. 小数点以下5桁で丸め解とする(_平均値_1,_平均値) :- _平均値 is round(_平均値_1 * 100000) / 100000. % 以下のサイトは # [1] 授業単元:プログラミング # [2] 問題文 # 三つの整数値の平均値を求めるプログラム。 # ただし、平均値を求める二項平均述語以外は使うことができない。 # 三項平均を二項平均だけから求める(_平均値,_平均値,_平均値,_平均値) :- !. 三項平均を二項平均だけから求める(_整数の一,_整数の二,_整数の三,_平均値) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三), 三項平均を二項平均だけから求める(_二項平均の一,_二項平均の二,_二項平均の三,_平均値). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P38 (59) より % % 太郎が本を読んだ。 % 太郎が本を読んだ(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [太郎]. 助詞 --> [が]. 名詞節 --> 名詞句,助詞. 名詞句 --> [本]. 助詞 --> [を]. 述語節 --> 動詞. 動詞 --> [読んだ]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P38 (58) より % % たくさんのリンゴとミカンが売れた。 % 僕は太郎に本を読ませた(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,名詞節,名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [僕]. 助詞 --> [は]. 名詞節 --> 名詞句,助詞. 名詞句 --> [太郎]. 助詞 --> [に]. 名詞節 --> 名詞句,助詞. 名詞句 --> [本]. 助詞 --> [を]. 述語節 --> 動詞. 動詞 --> [読ませた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P35 (50) より % % たくさんのリンゴとミカンが売れた。 % 山田先生は借金が沢山ある(_解析,_残り文) :- 文(_解析,_残り文). 山田先生はシラミが沢山いる(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,名詞節,副詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [山田先生]. 助詞 --> [は]. 名詞節 --> 名詞句,助詞. 名詞句 --> [借金]. 名詞句 --> [シラミ]. 助詞 --> [が]. 副詞節 --> 数量詞. 数量詞 --> [沢山]. 述語節 --> 動詞. 動詞 --> [ある]. 動詞 --> [いる]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P34 (46) より % % 僕は水が飲みたい。 % 僕は英語ができる。 % 僕は水が飲みたい(_解析,_残り文) :- 文(_解析,_残り文). 僕は英語ができる(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [僕]. 助詞 --> [は]. 名詞節 --> 名詞,助詞. 名詞 --> [水]. 名詞 --> [英語]. 助詞 --> [が]. 述語節 --> [飲みたい]. 述語節 --> [できる]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P34 (44 イ) より % % '四、五人の生徒たちがよってきた'。 % '四、五人の生徒たちがよってきた'(_解析,_残りの文) :- 文(_解析,_残りの文). 文 --> 名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> 数量詞節,名詞句. 数量詞節 --> 数量詞,助詞. 数量詞 --> ['四、五人']. 助詞 --> [の]. 名詞句 --> [生徒たち]. 助詞 --> [が]. 述語節 --> 動詞. 動詞 --> [よってきた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P33 (44 ア) より % % 生徒たちが四、五人よってきた。 % '生徒たちが四、五人よってきた'(_解析,_残りの文) :- 文(_解析,_残りの文). % 文 --> 名詞節,副詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [生徒たち]. 助詞 --> [が]. 副詞節 --> 数量詞. 数量詞 --> ['四、五人']. 述語節 --> 動詞. 動詞 --> [よってきた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P33 (42.イ) より % % 子供は母親にしかられた。 % 子供は母親にしかられた(_解析,_残りの文) :- 文(_解析,_残りの文). 文 --> 名詞節,名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [子供]. 助詞 --> [は]. 名詞節 --> 名詞句,助詞. 名詞句 --> [母親]. 助詞 --> [に]. 述語節 --> 動詞. 動詞 --> [しかられた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P32 (42) より % % 母親は子供をしかった。 % 母親は子供をしかった(_解析,_残りの文) :- 文(_解析,_残りの文). % 文 --> 名詞節,名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [母親]. 助詞 --> [は]. 名詞節 --> 名詞句,助詞. 名詞句 --> [子供]. 助詞 --> [を]. 述語節 --> 動詞. 動詞 --> [しかった]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P32 (40) より % % 彼女はある夜ぼくにこっそりボートをこがせた。 % 彼女はある夜ぼくにこっそりボートをこがせた(_解析,_残りの文) :- 文(_解析,_残りの文). % 文 --> 名詞節,副詞節,名詞節,副詞節,名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [彼女]. 助詞 --> [は]. 副詞節 --> 副詞. 副詞 --> [ある夜]. 名詞節 --> 名詞句,助詞. 名詞句 --> [ぼく]. 助詞 --> [に]. 副詞節 --> 副詞. 副詞 --> [こっそり]. 名詞節 --> 名詞句,助詞. 名詞句 --> [ボート]. 助詞 --> [を]. 述語節 --> 動詞. 動詞 --> [こがせた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P30 (36) より % % 太郎は花子に自分の部屋で待たせた。 % 太郎は花子に自分の部屋で待たせた(_解析,_残りの文) :- 文(_解析,_残りの文). 文 --> 名詞節_1,名詞節_2,名詞節_3,述語節. 名詞節_1 --> 名詞句_1,助詞. 名詞句_1 --> [太郎]. 助詞 --> [は]. 名詞節_2 --> 名詞句_2,助詞. 名詞句_2 --> [花子]. 助詞 --> [に]. 名詞節_3 --> 名詞句_3,助詞. 名詞句_3 --> 名詞節_4,名詞句_4. 名詞節_4 --> 名詞句_5,助詞. 名詞句_5 --> [自分]. 助詞 --> [の]. 名詞句_4 --> [部屋]. 助詞 --> [で]. 述語節 --> 動詞. 動詞 --> [待たせた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P30 (38) より % % 太郎は花子に自分の部屋で待たせた。 % 太郎は花子に自分の部屋で待たせた(_解析,_残りの文) :- 文(_解析,_残りの文). % 文 --> 名詞節,名詞節,名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> [太郎]. 助詞 --> [は]. 名詞節 --> 名詞句,助詞. 名詞句 --> [花子]. 助詞 --> [に]. 名詞節 --> 名詞句,助詞. 名詞句 --> 名詞節,名詞句. 名詞節 --> 名詞句,助詞. 名詞句 --> [自分]. 助詞 --> [の]. 名詞句 --> [部屋]. 助詞 --> [で]. 述語節 --> 動詞. 動詞 --> [待たせた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P30 (36 ウ) より % % たくさんのリンゴとミカンが売れた。 % たくさんのリンゴとミカンが売れた(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節_1,述語節. 名詞節_1 --> 名詞句_1,助詞. 名詞句_1 --> 数量詞節,名詞句_2. 数量詞節 --> 数量詞. 数量詞 --> [たくさん]. 助詞 --> [の]. 名詞句_2 --> 名詞節_2,名詞句_3. 名詞節_2 --> 名詞句_4,助詞. 名詞句_4 --> [リンゴ]. 助詞 --> [と]. 名詞句_3 --> [ミカン]. 助詞 --> [が]. 述語節 --> 動詞. 動詞 --> [売れた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P30 (36 ウ) より % % たくさんのリンゴとミカンが売れた。 % たくさんのリンゴとミカンが売れた(_解析,_残り文) :- 文(_解析,_残り文). % 文 --> 名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> 数量詞節,名詞句. 数量詞節 --> 数量詞. 数量詞 --> [たくさん]. 助詞 --> [の]. 名詞句 --> 名詞節,名詞句. 名詞節 --> 名詞句,助詞. 名詞句 --> [リンゴ]. 助詞 --> [と]. 名詞句 --> [ミカン]. 助詞 --> [が]. 述語節 --> 動詞. 動詞 --> [売れた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P30 (34 イ) より % % たくさんのリンゴとミカンが売れた。 % たくさんのリンゴとミカンが売れた(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,述語節. 名詞節 --> 名詞句_1,助詞. 名詞句_1 --> 名詞節_1,名詞句_2. 名詞節_1 --> 名詞句_3,助詞. 名詞句_3 --> 数量詞節,名詞句_4. 数量詞節 --> 数量詞,助詞. 数量詞 --> [たくさん]. 助詞 --> [の]. 名詞句_4 --> [リンゴ]. 助詞 --> [と]. 名詞句_2 --> [ミカン]. 助詞 --> [が]. 述語節 --> 動詞. 動詞 --> [売れた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P30 (34 イ) より % % たくさんのリンゴとミカンが売れた。 % たくさんのリンゴとミカンが売れた(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> 名詞節,名詞句. 名詞節 --> 名詞句,助詞. 名詞句 --> 数量詞節,名詞句. 数量詞節 --> 数量詞,助詞. 数量詞 --> [たくさん]. 助詞 --> [の]. 名詞句 --> [リンゴ]. 助詞 --> [と]. 名詞句 --> [ミカン]. 助詞 --> [が]. 述語節 --> 動詞. 動詞 --> [売れた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P28 (33) より % % 太郎は学生だ。 % 太郎は学生だ(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> 名詞. 名詞 --> [太郎]. 助詞 --> [は]. 述語節 --> 名詞句,繋辞. 名詞 --> [学生]. 繋辞 --> [だ]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P28 (32) より % % 花子はきれいだ。 % 花子はきれいだ(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> 名詞. 名詞 --> [花子]. 助詞 --> [は]. 述語節 --> 形容動詞,繋辞. 形容動詞 --> [きれい]. 繋辞 --> [だ]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P28 (31) より % % 太郎は若い。 % 太郎は若い(_解析,_残り文) :- 文(_解析,_残り文). % 文 --> 名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> 名詞. 名詞 --> [太郎]. 助詞 --> [は]. 述語節 --> 形容詞. 形容詞 --> [若い]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P27 (30) より % % 犬がほえた。 % 犬がほえた(_解析,_残り文) :- 文(_解析,_残り文). 文 --> 名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> 名詞. 名詞 --> [犬]. 助詞 --> [が]. 述語節 --> 動詞. 動詞 --> [ほえた]. % 以下のサイトは % 『日本語の分析』柴谷方良著 大修館書店 1978年 P27 (29) より % % 突然大きな犬がネコをおいかけた。 % 突然大きな犬がネコをおいかけた(_解析,_残り文) :- 文(_解析,_残り文). % 文 --> 副詞節,文_1. 副詞節 --> 副詞. 副詞 --> [突然]. 文_1 --> 名詞節,名詞節,述語節. 名詞節 --> 名詞句,助詞. 名詞句 --> 形容詞,名詞. 形容詞 --> [大きな]. 名詞 --> [犬]. 助詞 --> [が]. 名詞句 --> 名詞. 名詞 --> [ネコ]. 助詞 --> [を]. 述語節 --> 動詞. 動詞 --> [おいかけた]. % 以下のサイトは 文(文(_主部,_述部)) --> 主部(_主部), 述部(_述部). 主部(主部(_名詞句)) --> 名詞句(_名詞句). 名詞句(名詞句(_名詞,_後置詞)) --> 名詞(_名詞),後置詞(_後置詞). 名詞(名詞(佐智子)) --> [佐智子]. 名詞(名詞(隆大)) --> [隆大]. 名詞(名詞(私)) --> [私]. 後置詞(後置詞(が)) --> [が]. 後置詞(後置詞(は)) --> [は]. 述部(述部(_動詞)) --> 動詞(_動詞). 述部(述部(_形容詞)) --> 形容詞(_形容詞), {形容詞は終止形(_形容詞)}. 述部(述部(_名詞,_助動詞)) --> 名詞(_名詞),助動詞(_助動詞). 述部(述部(_形容詞,_動詞)) --> 形容詞(_形容詞), {形容詞は連用形(_形容詞)}, 動詞(_動詞). 動詞(動詞(泳ぐ)) --> [泳ぐ]. 形容詞(形容詞([美しい,終止形])) --> [美しい]. 形容詞(形容詞([美しく,連用形])) --> [美しく]. 形容詞(形容詞([速い,終止形])) --> [速い]. 形容詞(形容詞([速く,連用形])) --> [速く]. 助動詞(助動詞(です)) --> [です]. '形容詞は連用形'(形容詞([_,連用形])). '形容詞は終止形'(形容詞([_,終止形])). % 以下のサイトは 文(文(_主部,_述部)) --> 主部(_主部), 述部(_述部). 主部(主部(_名詞句)) --> 名詞句(_名詞句). 名詞句(名詞句(_名詞,_後置詞)) --> 名詞(_名詞),後置詞(_後置詞). 名詞(名詞(佐智子)) --> [佐智子]. 名詞(名詞(隆大)) --> [隆大]. 名詞(名詞(私)) --> [私]. 後置詞(後置詞(が)) --> [が]. 後置詞(後置詞(は)) --> [は]. 述部(述部(_動詞)) --> 動詞(_動詞). 述部(述部(_形容詞)) --> 形容詞(_形容詞), {終止形(_形容詞)}. 述部(述部(_名詞,_助動詞)) --> 名詞(_名詞),助動詞(_助動詞). 述部(述部(_形容詞,_動詞)) --> 形容詞(_形容詞), {連用形(_形容詞)}, 動詞(_動詞). 動詞(動詞(泳ぐ)) --> [泳ぐ]. 形容詞(形容詞([美しい,終止形])) --> [美しい]. 形容詞(形容詞([美しく,連用形])) --> [美しく]. 形容詞(形容詞([速い,終止形])) --> [速い]. 形容詞(形容詞([速く,連用形])) --> [速く]. 助動詞(助動詞(です)) --> [です]. 連用形(形容詞([_,連用形])). 終止形(形容詞([_,終止形])). ?- 文(X,[佐智子,が,泳ぐ],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), R = [] ; false. ?- 文(X,[佐智子,が,A],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), A = 泳ぐ, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞([美しい, 終止形]))), A = 美しい, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞([速い, 終止形]))), A = 速い, R = [] ; false. ?- 文(X,[A,は,B,泳ぐ],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), A = 佐智子, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 佐智子, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 佐智子, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 佐智子, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 佐智子, B = 速く, R = [] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(動詞(泳ぐ))), A = 隆大, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 隆大, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 隆大, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 隆大, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 隆大, B = 速く, R = [] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(動詞(泳ぐ))), A = 私, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 私, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 私, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 私, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 私, B = 速く, R = []. ?- % 以下のサイトは 文(文(_主部,_述部)) --> 主部(_主部), 述部(_述部). 主部(主部(_名詞句)) --> 名詞句(_名詞句). 名詞句(名詞句(_名詞,_後置詞)) --> 名詞(_名詞),後置詞(_後置詞). 名詞(名詞(佐智子)) --> [佐智子]. 名詞(名詞(隆大)) --> [隆大]. 名詞(名詞(私)) --> [私]. 後置詞(後置詞(が)) --> [が]. 後置詞(後置詞(は)) --> [は]. 述部(述部(_動詞)) --> 動詞(_動詞). 述部(述部(_形容詞)) --> 形容詞(_形容詞), {終止形(_形容詞)}. 述部(述部(_名詞,_助動詞)) --> 名詞(_名詞),助動詞(_助動詞). 述部(述部(_形容詞,_動詞)) --> 形容詞(_形容詞), {連用形(_形容詞)}, 動詞(_動詞). 動詞(動詞(泳ぐ)) --> [泳ぐ]. 形容詞(形容詞(美しい)) --> [美しい]. 形容詞(形容詞(美しく)) --> [美しく]. 形容詞(形容詞(速い)) --> [速い]. 形容詞(形容詞(速く)) --> [速く]. 助動詞(助動詞(です)) --> [です]. 連用形(形容詞(美しく)). 終止形(形容詞(美しい)). ?- 文(X,[佐智子,が,泳ぐ],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), R = [] ; false. ?- 文(X,[佐智子,が,A],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), A = 泳ぐ, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞([美しい, 終止形]))), A = 美しい, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞([速い, 終止形]))), A = 速い, R = [] ; false. ?- 文(X,[A,は,B,泳ぐ],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), A = 佐智子, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 佐智子, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 佐智子, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 佐智子, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 佐智子, B = 速く, R = [] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(動詞(泳ぐ))), A = 隆大, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 隆大, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 隆大, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 隆大, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 隆大, B = 速く, R = [] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(動詞(泳ぐ))), A = 私, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 私, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 私, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 私, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 私, B = 速く, R = []. ?- % 以下のサイトは 文(文(_主部,_述部)) --> 主部(_主部), 述部(_述部). 主部(主部(_名詞句)) --> 名詞句(_名詞句). 名詞句(名詞句(_名詞,_後置詞)) --> 名詞(_名詞),後置詞(_後置詞). 名詞(名詞(佐智子)) --> [佐智子]. 名詞(名詞(隆大)) --> [隆大]. 名詞(名詞(私)) --> [私]. 後置詞(後置詞(が)) --> [が]. 後置詞(後置詞(は)) --> [は]. 述部(述部(_動詞)) --> 動詞(_動詞). 述部(述部(_形容詞)) --> 形容詞(_形容詞). 述部(述部(_名詞,_助動詞)) --> 名詞(_名詞),助動詞(_助動詞). 動詞(動詞(泳ぐ)) --> [泳ぐ]. 形容詞(形容詞(美しい)) --> [美しい]. 形容詞(形容詞(速い)) --> [速い]. 助動詞(助動詞(です)) --> [です]. ?- 文(_解析木,[佐智子,は,泳ぐ],_残り語ならび). _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), _残り語ならび = [] ; false. ?- 文(_解析木,[佐智子,は,_語彙_1],_残り語ならび). _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), _語彙_1 = 泳ぐ, _残り語ならび = [] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞(美しい))), _語彙_1 = 美しい, _残り語ならび = [] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞(速い))), _語彙_1 = 速い, _残り語ならび = [] ; false. ?- 文(_解析木,_文候補の語ならび,_残り語ならび). _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), _文候補の語ならび = [佐智子, が, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞(美しい))), _文候補の語ならび = [佐智子, が, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞(速い))), _文候補の語ならび = [佐智子, が, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [佐智子, が, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [佐智子, が, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [佐智子, が, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), _文候補の語ならび = [佐智子, は, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞(美しい))), _文候補の語ならび = [佐智子, は, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞(速い))), _文候補の語ならび = [佐智子, は, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [佐智子, は, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [佐智子, は, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [佐智子, は, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(動詞(泳ぐ))), _文候補の語ならび = [隆大, が, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(形容詞(美しい))), _文候補の語ならび = [隆大, が, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(形容詞(速い))), _文候補の語ならび = [隆大, が, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [隆大, が, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [隆大, が, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [隆大, が, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(動詞(泳ぐ))), _文候補の語ならび = [隆大, は, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞(美しい))), _文候補の語ならび = [隆大, は, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞(速い))), _文候補の語ならび = [隆大, は, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [隆大, は, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [隆大, は, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [隆大, は, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(動詞(泳ぐ))), _文候補の語ならび = [私, が, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(形容詞(美しい))), _文候補の語ならび = [私, が, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(形容詞(速い))), _文候補の語ならび = [私, が, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [私, が, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [私, が, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [私, が, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(動詞(泳ぐ))), _文候補の語ならび = [私, は, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞(美しい))), _文候補の語ならび = [私, は, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞(速い))), _文候補の語ならび = [私, は, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [私, は, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [私, は, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [私, は, 私, です|_残り語ならび]. ?- % 以下のサイトは 文 --> 主部, 述部. 主部 --> 名詞句. 名詞句 --> 名詞,後置詞. 名詞 --> [佐智子]. 名詞 --> [隆大]. 後置詞 --> [が]. 後置詞 --> [は]. 述部 --> 動詞. 述部 --> 形容詞. 動詞 --> [泳ぐ]. 形容詞 --> [美しい]. 形容詞 --> [速い]. ?- 文([佐智子,が,泳ぐ],R). R = []. ?- 文(X,R). X = [佐智子,が,泳ぐ|$VAR(R)] ; X = [佐智子,が,美しい|$VAR(R)] ; X = [佐智子,が,速い|$VAR(R)] ; X = [佐智子,は,泳ぐ|$VAR(R)] ; X = [佐智子,は,美しい|$VAR(R)] ; X = [佐智子,は,速い|$VAR(R)] ; X = [隆大,が,泳ぐ|$VAR(R)] ; X = [隆大,が,美しい|$VAR(R)] ; X = [隆大,が,速い|$VAR(R)] ; X = [隆大,は,泳ぐ|$VAR(R)] ; X = [隆大,は,美しい|$VAR(R)] ; X = [隆大,は,速い|$VAR(R)]. ?- 文([佐智子,は,X],R). X = 泳ぐ, R = [] ; X = 美しい, R = [] ; X = 速い, R = [] ; false. ?- % 以下のサイトは 行の部分二乗和(_行列,_何行目,_列起点,_列終点,_部分列の二乗和) :- nth1(_何行目,_行列,_行), findsum(_値の二乗,( 値を取り出し二乗する(_行,_列起点,_列終点,_値の二乗)),_部分列の二乗和). 値を取り出し二乗する(_行,_列起点,_列終点,_値の二乗) :- between(_列起点,_列終点,_何列目), 何列目の値の二乗(_行,_何列目,_値の二乗). 何列目の値の二乗(_行,_何列目,_値の二乗) :- nth1(_何列目,_行,_値), _値の二乗 is _値 ^ 2. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 列の部分二乗和(_行列,_行起点,_行終点,_何列目,_部分列の二乗和) :- findsum(_値の二乗,( 列の部分から値を取り出し二乗する(_行列,_行起点,_行終点,_何列目,_値の二乗)),_部分列の二乗和). 列の部分から値を取り出し二乗する(_行列,_行起点,_行終点,_何列目,_値の二乗) :- between(_行起点,_行終点,_何行目), 何行目の値の二乗(_行列,_何行目,_何列目,_値の二乗),_値の二乗). 何行目の値の二乗(_行列,_何行目,_何列目,_値の二乗) :- nth1(_何行目,_行列,_行), nth1(_何列目,_行,_値), _値の二乗 is _値 ^ 2. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 連続日(_前の日の年/_前の日の月/_前の日の日,_後の日の年/_後の日の月/_後の日の日) :- 月日生成(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 翌日(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日), 日付成立検査(_前の日の年,_前の日の月,_前の日の日,_後の日の年,_後の日の月,_後の日の日). 翌日(_年,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. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 153代目 #344 # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): 3問 http://ime.nu/ideone.com/kXOZ8 # # 1)帰納を使い、フィボナッチ数を表示するプログラミングを作れ。 # 例 0,1,1,2,3,5,8,13... # # 2)帰納を使い、インプットした数字nが偶数の場合は、 # 1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。 # ただし、nが奇数の場合は、-1と表示させる。 # # 3)帰納を使い、最大公約数を求めよ。 '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 'ただし、nが偶数の場合は、-1と表示させる。'(_n). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n). 'ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 偶数(_n). '-1と表示させる'. 偶数(_偶数) :- 0 is _偶数 mod 2. '-1と表示させる' :- writef('%w\n',[-1]). 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n) :- 奇数(_n), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(1,_n,1). 奇数(_奇数) :- 1 is _奇数 mod 2. '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n,_n,_答え) :- 'その答えを表示する'(_答え),!. '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N,_n,S1) :- 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を先頭から順に計算して行く'(N,_n,S1). 'その答えを表示する'(_答え) :- writef('%w\n',[_答え]). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を先頭から順に計算して行く'(N,_n,S1) :- 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N_2,_n,S2). 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2) :- N_2 is N_1 + 2, M_2 is M_1 * N_2. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 153代目 #344 # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): 3問 http://ime.nu/ideone.com/kXOZ8 # # 1)帰納を使い、フィボナッチ数を表示するプログラミングを作れ。 # 例 0,1,1,2,3,5,8,13... # # 2)帰納を使い、インプットした数字nが偶数の場合は、 # 1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。 # ただし、nが奇数の場合は、-1と表示させる。 # # 3)帰納を使い、最大公約数を求めよ。 '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 'ただし、nが偶数の場合は、-1と表示させる。'(_n). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示するプログラミングを作れ。ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n). 'ただし、nが偶数の場合は、-1と表示させる。'(_n) :- 偶数(_n). '-1と表示させる'. 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n) :- 奇数(_n), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(1,_n,1). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(_n,_n,_答え) :- 'その答えを表示する'(_答え),!. '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N,_n,S1) :- 'インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行って計算して行く'(N,_n,S1). '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を計算して行く'(N,_n,S1) :- 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2), '帰納を使い、インプットした数字nが奇数の場合は、1*3*5*7...n の計算式を行いその答えを表示する'(N_2,_n,S2). 'N_1に2を加えてN_2とした上で、N_2とM_1を掛けてM_2とする'(N_1,M_1,N_2,M_2) :- N_2 is N_1 + 2, M_2 is M_1 * N_2. 偶数(_偶数) :- 0 is _偶数 mod 2. 奇数(_奇数) :- 1 is _奇数 mod 2. '-1と表示させる' :- writef('%w\n',[-1]). 'その答えを表示する'(_答え) :- writef('%w\n',[_答え]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #823 # [1] 授業単元:c言語 # [2] 問題文 # 課題文1 # とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。 # また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。 # このとき、1ヶ月の合計通話時間を入力すると請求される料金を表示するプログラムを作成せよ。 # 課題文2 # 明治元年以降の西暦年を4桁の数で入力すると、和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # (2つの元号を持つ年の扱いについては余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示するプログラムとしてもよい。) % 課題文1 'とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。'(_通話の合計時間の時,_通話の合計時間の分,_通話料金) :- 'とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。'(_通話の合計時間の時,_通話の合計時間の分,_基本料金込み料金), 'また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。'(_基本料金込み料金,_通話料金). 'とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。'(_通話の合計時間の時,_通話の合計時間の分,_基本料金込み料金) :- '基本料金の1,000円に、'(_基本料金), '一ヶ月の 通話の合計時間によって通話料が(1分あたり10円)。'(_通話の合計時間の時,_通話の合計時間の分,_通話料), 加算される(_基本料金,_通話料,_基本料金込み料金). '基本料金の1,000円に、'(1000). '一ヶ月の 通話の合計時間によって通話料が(1分あたり10円)。'(_通話の合計時間の時,_通話の合計時間の分,_通話料) :- 通話の合計時間の分換算(_通話の合計時間の時,_通話の合計時間の分,_通話の合計時間の分換算), _通話料 is 10 * _通話の合計時間の分換算. 通話の合計時間の分換算(_通話の合計時間の時,_通話の合計時間の分,_通話の合計時間の分換算) :- _通話の合計時間の分換算 is _通話の合計時間の時 * 60 + _通話の合計時間の分. 加算される(_基本料金,_通話料,_基本料金込み料金) :- _基本料金込み料金 is _基本料金 + _通話料. 'また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。'(_基本料金込み料金,10000) :- _基本料金込料金 >= 10000,!. 'また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。'(_通話料金,_通話料金). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #823 # [1] 授業単元:c言語 # [2] 問題文 # 課題文1 # とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。 # また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。 # このとき、1ヶ月の合計通話時間を入力すると請求される料金を表示するプログラムを作成せよ。 # 課題文2 # 明治元年以降の西暦年を4桁の数で入力すると、和暦で年を表示するプログラムを作成せよ。 # ただし、2つの元号を持つ年は両方の年を表示すること。 # (例: 1989年 → 昭和64年、平成元年) # (2つの元号を持つ年の扱いについては余裕がある人は、月、日も入れて、その日の正しい # 元号を表示することによって元号を一つ表示するプログラムとしてもよい。) % 課題文1 'とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。'(_通話時間_時,_通話時間_分,_通話料金) :- 'とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。'(_通話時間_時,_通話時間_分,_基本料金込料金), 'また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。'(_基本料金込料金,_通話料金). 'とある架空の携帯電話会社では、基本料金の1,000円に、一ヶ月の 通話の合計時間によって通話料が加算される(1分あたり10円)。'(_通話時間_時,_通話時間_分,_基本料金込料金) :- _基本料金 = 1000, '一ヶ月の 通話の合計時間によって通話料が(1分あたり10円)。'(_通話時間_時,_通話時間_分,_通話料), 加算される(_基本料金,_通話料,_基本料金込料金). '一ヶ月の 通話の合計時間によって通話料が(1分あたり10円)。'(_通話時間_時,_通話時間_分,_通話料) :- _通話料 is 10 * (_通話時間_時 * 60 + _通話時間_分). 加算される(_基本料金,_通話料,_基本料金込料金) :- _基本料金込料金 is _基本料金 + _通話料. 'また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。'(_基本料金込料金,10000) :- _基本料金込料金 >= 10000,!. 'また、1ヶ月の料金は基本料金込みで10,000円以上は通話料が無料になるものとする。'(_通話料金,_通話料金). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 157代目 #602 # [1] 授業単元:配列 # [2] 問題文(含コード&リンク): 文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。 # '文字列を入力し、その文字列に含まれる英字、数字、その他の文字の数を出力せよ。' :- '文字列を入力し、'(_文字列), 'その文字列に含まれる英字、数字、その他の文字の数を出力せよ。'(_文字列). '文字列を入力し、'(_文字列) :- read_line_to_codes(user_input,Codes), atom_chars(_文字列,Codes). 'その文字列に含まれる英字、数字、その他の文字の数を出力せよ。'(_文字列) :- 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数), 出力せよ(_英字の数,_数字の数,_その他の文字の数). 'その文字列に含まれる英字、数字、その他の文字の数を'(_文字列,_英字の数,_数字の数,_その他の文字の数) :- 文字ごとの種別判定行列を作る(_文字列,_文字ごとの種別判定行列), 列を合計したならび(_文字ごとの種別判定行列,[_英字の数,_数字の数,_その他の文字の数]). 文字ごとの種別判定行列を作る(_文字列,_文字ごとの種別判定行列) :- findall([A,B,C],( sub_atom(_文字列,_,1,_,_文字), 文字種判定(_文字,A,B,C)),_文字ごとの種別判定行列). 列を合計したならび(_行列,[_英字の数,_数字の数,_その他の文字の数]) :- 転置(_行列,_転置された行列), 転置された行の合計をならびに取る(_転置された行列,[_英字の数,_数字の数,_その他の文字の数]). 転置された行の合計をならびに取る(_転置された行列,_行の合計ならび) :- findall(S,( member(L,_転置された行列), sum_list(L,S)),_行の合計ならび). 出力せよ(_英字の数,_数字の数,_その他の文字の数) :- writef('英字の数は %w,数字の数は %w,その他の文字の数は %w\n',[_英字の数,_数字の数,_その他の文字の数]). 文字種判定(_文字,1,0,0) :- 英字(_文字),!. 文字種判定(_文字,0,1,0) :- 数字(_文字),!. 文字種判定(_文字,0,0,1). 英字(A) :- A @>='A',A @=< 'Z'; A @>='a',A @=< 'z'. 数字(A) :- A @>= '0', A @=< '9'. 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #531 # [1] 授業単元: C言語プログラミング # [2] 問題文(含コード&リンク): # 平成○年の値を入力し、西暦に変換するプログラムを作成 # '平成○年の値を入力し、西暦に変換する' :- '平成○年の値を入力し漢数字を数字に変換する'(_数字), '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦), format('西暦は ~w です。\n',[_西暦]). '平成○年の値を入力し漢数字を数字に変換する'(_数字) :- '平成○年の値を入力し'(_漢数字年), 漢数字を数字に変換する(_漢数字年,_数字). '平成○年の値を入力し'(_漢数字年) :- write('平成○年を入力してください : '), 漢数字年を得る(_漢数字年). 漢数字年を得る(_漢数字年) :- 行入力されたものが漢数字であるか検査する(_漢数字年),!. 漢数字年を得る(_漢数字年) :- 漢数字年を得る(_漢数字年). 行入力されたものが漢数字であるか検査する(_漢数字年) :- 行入力(_行), 年は切り取って検査する(_行,_年が切り取られた行), 漢数字年入力検査(_年が切り取られた行,_漢数字年). 年は切り取って検査する(_行,_年が切り取られた行) :- 末尾文字が年だったら切り取る(_行,_年が切り取られた行),!. 年は切り取って検査する(_行,_行). 末尾文字が年だったら切り取る(_行,_年が切り取られた行) :- sub_atom(_行,_,1,0,年), sub_atom(_行,0,_,1,_年が切り取られた行). 漢数字年入力検査(元,元) :- !. 漢数字年入力検査(_漢数字年,_漢数字年) :- forall(sub_atom(_漢数字年,_,1,_,A),'漢数字・数字'(A,_)),!. 漢数字年入力検査(_行,_) :- writef('入力された %t からは漢数字が得られませんでした。再入力をお願いします。\n',[_行]), fail. 漢数字を数字に変換する(元,1) :- !. 漢数字を数字に変換する(_年,_数字) :- '二桁年の数字を得る'(_年,_数字). 漢数字を数字に変換する(_年,_数字) :- '一桁年の数字を得る'(_年,_数字). '二桁年の数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字). '十の桁、一の桁の漢数字を切り取り数字を得る'(_年,_数字) :- '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字), '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字), _数字 is _十の桁の数字 * 10 + _一の桁の数字. '十の桁、一の桁の漢数字を得る'(_年,_十の桁の漢数字,_一の桁の漢数字) :- sub_atom(_年,0,1,R,_十の桁の漢数字), sub_atom(_年,R,1,0,_一の桁の漢数字), R > 0. '十の桁、一の桁の数字を得る'(_十の桁の漢数字,_一の桁の漢数字,_十の桁の数字,_一の桁の数字) :- '漢数字・数字'(_十の桁の漢数字,_十の桁の数字), '漢数字・数字'(_一の桁の漢数字,_一の桁の数字). '一桁年の数字を得る'(_年,_数字) :- sub_atom(_年,0,1,0,_一の桁の漢数字), '漢数字・数字'(_一の桁の漢数字,_数字). '平成元年は西暦1989年であることから西暦を得る'(_数字,_西暦) :- _西暦 is _数字 + 1989 - 1. '漢数字・数字'(一,1). '漢数字・数字'(二,2). '漢数字・数字'(三,3). '漢数字・数字'(四,4). '漢数字・数字'(五,5). '漢数字・数字'(六,6). '漢数字・数字'(七,7). '漢数字・数字'(八,8). '漢数字・数字'(九,9). '漢数字・数字'(十,1). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは :- use_module(library(socket)). :- op(800,xfx,(::)). :- op(850,fx,(!)). (! _目標) :- (keizo97:6013 :: _目標). _ホスト:_ポート :: _目標 :- クライアント(_ホスト,_ポート,findall(_目標,_目標,_目標ならび)), 全解を取り出す(_目標,_目標ならび). クライアント(_ホスト,_ポート, _項) :- 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out), ホストから情報受信(In,_行2), 受信情報の評価(_項,_行2,_項2,In,Out). 受信情報の評価(_項,_行2,_項2,In,Out) :- catch(read_term_from_atom(_行2,_項2,[]),E,(ストリームを閉じる(In,Out),fail)), ストリームを閉じる(In,Out), 送信項と受信項の単一化(_項,_項2). ホストから情報受信(In,_行2) :- '% end_of_file行までの表示'(In), 行入力(In,_行2). '% end_of_file行までの表示'(In) :- 行入力(In,_行), '% end_of_file行までの表示'(In,_行). '% end_of_file行までの表示'(In,'% end_of_file') :- !. '% end_of_file行までの表示'(In,_行) :- '% end_of_file行が来るまで表示して行く'(In,_行). '% end_of_file行が来るまで表示して行く'(In,_行) :- format('~w\n',[_行]), 行入力(in,_行2), '% end_of_file行までの表示'(In,_行2). 項にfindallを被せて目標として送信する(_ホスト,_ポート,_項,_ソケット,In,Out) :- サーバと接続する(_ホスト, _ポート,_ソケット), tcp_open_socket(_ソケット, In, Out), 情報を送信する(Out,_項). サーバと接続する(_ホスト, _ポート,_ソケット) :- tcp_socket(_ソケット), tcp_connect(_ソケット, _ホスト:_ポート). 全解を取り出す(P,L) :- member(P,L). 行入力(In,_行) :- read_line_to_codes(In,Codes), atom_codes(_行,Codes). エラー情報の送信(Out,_エラー情報) :- writef('%w\n',[_エラー情報]), format(Out,'~%w\n',[_エラー情報]). 情報を送信する(Out,_項) :- format(Out,'%w\n',[_項]), flush_output(Out). ストリームを閉じる(In,Out) :- close(In), close(Out). 送信項と受信項の単一化(_項,_項). % 以下のサイトは :- 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. % 以下のサイトは ファイルに全行書き込む(_ファイル,_全行) :- open(_ファイル,write,_ストリーム), ストリームに全行書き込む(_ストリーム,_全行), close(_ストリーム). ストリームに全行書き込む(_ストリーム,[]) :- !. ストリームに全行書き込む(_ストリーム,_全行) :- ストリームに全行書き込んで行く(_ストリーム,_全行). ストリームに全行書き込んで行く(_ストリーム,[_行|R]) :- format(_ストリーム,'%w\n',[_行]), ストリームに全行書き込む(_ストリーム,R). % 以下のサイトは :- 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). 送信項と受信項の単一化(_項,_項). % 以下のサイトは スレッドとメッセージキューを使って全解を収集する(_選択項,_副目標,_回収値ならび) :- message_queue_create(_キュー番号), thread_create(スレッドで副目標を実行する(_キュー番号,_選択項,_副目標),_,[]), メッセージを回収する(_キュー番号,_回収値ならび), message_queue_destroy(_キュー番号). スレッドで副目標を実行する(_キュー番号,_選択項,_副目標) :- call(_副目標), thread_send_message(_キュー番号,_選択項), fail. スレッドで副目標を実行する(_キュー番号,_,_) :- thread_send_message(_キュー番号,end_of_file). メッセージを回収する(_キュー番号,_メッセージならび) :- メッセージを確実に得る(_キュー番号,_回収値), メッセージを回収する(_キュー番号,_回収値,_メッセージならび). メッセージを回収する(_キュー番号,end_of_file,[]) :- !. メッセージを回収する(_キュー番号,_回収値,[_回収値|R]) :- メッセージを確実に得る(_キュー番号,_回収値_2), メッセージを回収する(_キュー番号,_回収値_2,R). メッセージを確実に得る(_キュー番号,_メッセージ) :- repeat, thread_peek_message(_キュー番号,_), thread_get_message(_キュー番号,_メッセージ),!. % 以下のサイトは % % 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++の宿題片付けます 161代目 #983 # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントするプログラムを作成せよ.' :- '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, gそれぞれの個数をカウントする' :- 入力したDNA塩基配列中にある(_DNA塩基ならび), '塩基 t, c, a, gそれぞれの個数をカウントする'(_DNA塩基ならび,0,0,0,0,_t,_c,_a,_g), writef('Thymine (t) : %w\nCytoshine (c) : %w\nAdenine (a) : %w\nGuanime (g) : %w\n',[_t,_c,_a,_g]). 入力したDNA塩基配列中にある(_DNA塩基ならび) :- 行入力(_行), atom_chars(_行,_DNA塩基ならび). '塩基 t, c, a, gそれぞれの個数をカウントする'([],_t,_c,_a,_g,_t,_c,_a,_g). '塩基 t, c, a, gそれぞれの個数をカウントする'([_塩基|R],_t_1,_c_1,_a_1,_g_1,_t,_c,_a,_g) :- 塩基の集計欄に加算(_塩基,_t_1,_c_1,_a_1,_g_1,_t_2,_c_2,_a_2,_g_2), '塩基 t, c, a, gそれぞれの個数をカウントする'(R,_t_2,_c_2,_a_2,_g_2,_t,_c,_a,_g). 塩基の集計欄に加算(t,_t_1,_c,_a,_g,_t,_c,_a,_g) :- succ(_t_1,_t). 塩基の集計欄に加算(c,_t,_c_1,_a,_g,_t,_c,_a,_g) :- succ(_c_1,_c). 塩基の集計欄に加算(a,_t,_c,_a_1,_g,_t,_c,_a,_g) :- succ(_a_1,_a). 塩基の集計欄に加算(g,_t,_c,_a,_g_1,_t,_c,_a,_g) :- succ(_g_1,_g). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 133代目 #606 # プログラミングの問題なんですが、if文と繰り返し(for,whileのいずれか)を利用して次の問題を作成します。 # # 米ドル紙幣としては次のような紙幣とコインがある。 # 100ドル、50ドル、20ドル、10ドル、5ドル、2ドル、1ドル # 50セント、25セント、10セント、5セント、1セント # # 問題は、キーボードから日本円を入力し、まずドルに変換した後ドルを最適な紙幣とコインに振り分けるプログラムを作成しなさい。但し1ドルを92.69円として換算しなさい。そして、日本円が0円の時にプログラムを終了する。 # # 例 # ¥195,865 # 2,112,89$ # # 100$…21枚 # 50$ # 20$ # 10$…1枚 # 5$ # 2$…1枚 # 1$ # 50¢…1枚 # 25¢…1枚 # 10¢…1枚 # 5¢ # 1¢…4枚 # # このような問題なんですがプログラムとして最適なものが分かる方は是非教えてください。 # # % 現在の為替レート(92.384). 現在の対ドル為替レート(92.69). 日本円をドルに変換する(_日本円,_ドル,_セント) :- 現在の対ドル為替レート(_現在の為替レート), 日本円をドルとセントに変換する(_日本円,_現在の為替レート,_ドル,_セント). 日本円をドルとセントに変換する(_日本円,_現在の為替レート,_ドル,_セント) :- _ドル is truncate(float_integer_part(_日本円 / _現在の為替レート)), _セント is truncate(float_fractional_part(_日本円 / _現在の為替レート) * 100). 日本円をドルとセントに変換して金種を計算する(_日本円,_ドルの金種,_セントの金種) :- 日本円をドルに変換する(_日本円,_ドル,_セント), ドルの金種計算(_ドル,[100,50,20,10,5,2,1],_ドルの金種), セントの金種計算(_セント,[50,25,10,5,1],_セントの金種). ドルの金種計算(_,[],[]) :- !. ドルの金種計算(D,_金種ならび,LL) :- 'ドルの金種計算を続ける'(D,_金種ならび,LL). 'ドルの金種計算を続ける'(D,[_金種|R1],[[_金種,_枚数]|R2]) :- 金種の枚数と残りドルを計算する(D,_金種,D2,_枚数,D2), ドルの金種計算(D2,R1,R2). 金種の枚数と残りドルを計算する(D,_金種,D2,_枚数,D2) :- _枚数 is truncate(D // _金種), D2 is truncate(D mod _金種). セントの金種計算(_,[],[]) :- !. セントの金種計算(C,_金種ならび,LL) :- 'セントの金種計算を続ける'(C,_金種ならび,LL). 'セントの金種計算を続ける'(C,[_金種|R1],[[_金種,_枚数]|R2]) :- 金種の枚数と残りセントを計算する(C,_金種,_枚数,C2), セントの金種計算(C2,R1,R2). 金種の枚数と残りセントを計算する(C,_金種,_枚数,C2) :- _枚数 is truncate(C // _金種), C2 is truncate(C mod _金種). ?- 日本円をドルに変換する(123840,_ドル,_セント). _ドル = 1340, _セント = 49. ?- 日本円をドルとセントに変換して金種を計算する(35211,_ドル,_セント). _ドル = [[100, 3], [50, 1], [20, 1], [10, 0], [5, 1], [2, 2], [1, 0]], _セント = [[50, 1], [25, 1], [10, 1], [5, 0], [1, 2]]. ?- % 以下のサイトは # 出典 :: #132 # 親テーブル # Id, 資産 # 1, 100 # 2, 200 # 3, 400 # # 子テーブル # Id, 親Id, 資産 # 1, 1, 10 # 2, 1, 20 # 3, 2, 10 # 4, 2, 20 # 5, 2, 30 # 6, 3, 10 # # から # Id, 資産 # 1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。 # 2, 70 # 3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。 # 4, 86 # 5, 96 # 6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。 # # という結果を得たい。 # 要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。 # SQL で出来ます? # # 親テーブル(1, 100). 親テーブル(2, 200). 親テーブル(3, 400). 子テーブル(1, 1, 10). 子テーブル(2, 1, 20). 子テーブル(3, 2, 10). 子テーブル(4, 2, 20). 子テーブル(5, 2, 30). 子テーブル(6, 3, 10). 親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい(_一覧) :- findall([_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額],子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額),_一覧). 子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- 子テーブル(_Id,_親Id,_資産), 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数), _親の資産を子供に分配して各々の子供の資産と合わせた額 is _資産 + _親資産 // _自分を含めた兄弟人数. 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数) :- 親テーブル(_親Id,_親資産), 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数). 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数) :- 度数(子テーブル(_,_親Id,_),_自分を含めた兄弟人数). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典 :: #132 # 親テーブル # Id, 資産 # 1, 100 # 2, 200 # 3, 400 # # 子テーブル # Id, 親Id, 資産 # 1, 1, 10 # 2, 1, 20 # 3, 2, 10 # 4, 2, 20 # 5, 2, 30 # 6, 3, 10 # # から # Id, 資産 # 1, 60 -- 親1の子供は二人だから、各々の子に 100/2 = 50 を加算する。 # 2, 70 # 3, 76 -- 親2の子供は三人だから、各々の子に 200/3 = 66 を加算する。 # 4, 86 # 5, 96 # 6, 410 -- 親3の子供は一人だから、400 をそのまま加算する。 # # という結果を得たい。 # 要するに、親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい。 # SQL で出来ます? # # 親テーブル(1, 100). 親テーブル(2, 200). 親テーブル(3, 400). 子テーブル(1, 1, 10). 子テーブル(2, 1, 20). 子テーブル(3, 2, 10). 子テーブル(4, 2, 20). 子テーブル(5, 2, 30). 子テーブル(6, 3, 10). 親の資産を子供に分配して各々の子供の資産と合わせた額の一覧を出したい(_一覧) :- findall([_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額],子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額),_一覧). 子供の親資産と自分を含めた兄弟人数を調べて親資産を自分を含めた兄弟人数で割ったものに自分の資産を加える(_Id,_親の資産を子供に分配して各々の子供の資産と合わせた額) :- 子テーブル(_Id,_親Id,_資産), 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数), _親の資産を子供に分配して各々の子供の資産と合わせた額 is _資産 + _親資産 // _自分を含めた兄弟人数. 親資産と自分を含めた兄弟人数を調べて(_Id,_親Id,_親資産,_自分を含めた兄弟人数) :- 親テーブル(_親Id,_親資産), 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数). 自分を含めた兄弟人数(_親Id,_自分を含めた兄弟人数) :- 度数(子テーブル(_,_親Id,_),_自分を含めた兄弟人数). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 167代目 #309 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&amp;リンク):入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返すプログラム。 # [3] 環境 #  [3.1] OS:Windows #  [3.2] コンパイラ名とバージョン:Visual C++ 2010 #  [3.3] 言語:C++ # [4] 期限:4月18日 '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す' :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(0). '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和) :- 入力した奇数の和が20を超えるまで(_入力した奇数の和),!. '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1). 入力した奇数の和が20を超えるまで(_入力した奇数の和) :- _入力した奇数の和 > 20. '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '入力した数が奇数の場合表示する。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。奇数でない場合はなにもしない。'(_入力した奇数の和_1) :- '奇数でない場合はなにもしない。'(_入力した奇数の和_1). '入力した数が奇数の場合表示する。'(_入力した奇数の和_1) :- '入力した数が奇数の場合'(_入力した数), 表示する(_入力した数), _入力した奇数の和_2 is _入力した数 + _入力した奇数の和_1, '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和_2). '入力した数が奇数の場合'(_入力した数) :- 入力した数が(_入力した数), 奇数の場合(_入力した数). '奇数でない場合はなにもしない。'(_入力した奇数の和) :- '入力した数が奇数の場合表示する。入力した奇数の和が20を超えるまで繰り返す'(_入力した奇数の和). 入力した数が(_入力した数) :- 整数を得る('整数を入力して下さい: ',true,_入力した数),!. 奇数の場合(_入力した数) :- 1 is _入力した数 mod 2. 表示する(_入力した数) :- writef('%w\n',[_入力した数]). 整数を得る(_催促文,_条件,_整数) :- write(_催促文), 行を得る(_行), 整数入力検査(_行,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 行を得る(_行) :- read_line_to_codes(user_input,_codes), atom_codes(_行,_codes). 整数入力検査(_行,_条件,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査と条件検査(_行,_整数,_条件). 整数検査と条件検査(_行,_整数,_条件) :- 整数検査(_行,_整数), 条件検査(_行,_条件). 整数検査(_行,_整数) :- integer(_整数),!. 整数検査(_整数) :- writef('入力された行 %w から整数は得られません。\n',[_行]), fail. 条件検査(_行,_条件) :- call(_条件),!. 条件検査(_行,_条件) :- writef('入力された行 %w からは、条件 %w が真になりません。\n',[_行,_条件]), fail. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/887 # # (1)c言語(2)問題:ベースを基にビットを左に回転させるleft_rottate関数を追加しプログラムを完成させよ。 # 実行結果: # 数値f0f0のビット状態 # 1111000011110000 # 3ビット回転させました # 数値8787のビット状態 # 1000011110000111 # ベース # #include <stdio.h> # void print_bit(unsigned short int x); //プロトタイプ宣言 # int main(){ # unsigned short int usi; # usi = 0xf0f0 ; # print_bit(usi); # return 0; //システムに値0を返す # } # void print_bit(unsigned short int x){ # int length , i , mask ; # mask = 1; # length = sizeof(x) *8; # mask =mask << (length -1); # printf("数値%xのビット状態\n",x); # for(i = 1;i<= length ; i++){ # if(x & mask){ # printf("1"); # }else{ # printf("0"); # } # mask =mask >> 1; # } # printf("\n"); # } # # '2進ならびの左回転'(_ベース桁数,_数,_Nビット回転) :- 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_2進数ならび), '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび),!. 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_ベース桁数で規定された2進数ならび) :- 数2進数変換(_数,_2進数ならび), ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび). '数2進数変換'(_数,_2進数ならび) :- '数2進数変換'(_数,[],_2進数ならび). '数2進数変換'(0,_2進数ならび,_2進数ならび). '数2進数変換'(N,L,_2進数ならび) :- '数2進数変換して行く'(N,L,_2進数ならび). '数2進数変換して行く'(N,L,_2進数ならび) :- M is N mod 2, N_1 is N // 2, '数2進数変換'(N_1,[M|L],_2進数ならび). '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび) :- '2進数を_Nビット左回転して、'(_Nビット回転,_2進数ならび,L,_2進表示), それを16進数と2進数で表示する(_Nビット回転,L,_2進表示). '2進数を_Nビット左回転して、'(_Nビット回転,_ベース桁数2進数ならび,L,_2進表示) :- ならびの左回転(1,_Nビット回転,_ベース桁数2進数ならび,L), atomic_list_concat(L,_2進表示). ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび) :- length(_2進数ならび,_桁), _0を付加するべき数 is _ベース桁数 - _桁, 頭部に0を付加する(_0を付加するべき数,_2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(0,_ベース桁数で規定された2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(N,_2進数ならび,_ベース桁数で規定された2進数ならび) :- N \== 0, 'N桁の0ならび'(N,_N桁の0ならび), append(_N桁の0ならび,_2進数ならび,_ベース桁数で規定された2進数ならび). 'N桁の0ならび'(N,_N桁の0ならび) :- length(_N桁の0ならび,N), all(_N桁の0ならび,0). all([],_). all([N|R],N) :- all(R,N). ならびの左回転(N,N,[A|R],L) :- append(R,[A],L),!. ならびの左回転(M,N,[A|R],L) :- append(R,[A],L1), M2 is M + 1, ならびの左回転(M2,N,L1,L). それを16進数と2進数で表示する(_Nビット回転,L,_2進表示) :- writef('%wビット回転しました\n数値 ',[_Nビット回転]), '16進数で表示する'(L), '2進数で表示する'(_2進表示). '16進数で表示する'(_2進ならび) :- '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび), '2進数16進数表示'(_整形された2進ならび). '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび) :- length(_2進ならび,_桁), _余り is _桁 mod 4, '頭部に0を付加する'(_余り,_2進ならび,_整形された2進ならび). '頭部に0を付加する'(0,L,L). '頭部に0を付加する'(1,L,[0,0,0|L]). '頭部に0を付加する'(2,L,[0,0|L]). '頭部に0を付加する'(3,L,[0|L]). '2進数で表示する'(_2進表示) :- write('のビット状態\n'), writef('%w\n',[_2進表示]). '2進数16進数表示'([]) :- write('\n'),!. '2進数16進数表示'([_b1,_b2,_b3,_b4|R]) :- '4ビット数ならび16進表記'([_b1,_b2,_b3,_b4],_16進表記), writef('%w',[_16進表記]), '2進数16進数表示'(R). '4ビット数ならび16進表記'([0,0,0,0],'0'). '4ビット数ならび16進表記'([0,0,0,1],'1'). '4ビット数ならび16進表記'([0,0,1,0],'2'). '4ビット数ならび16進表記'([0,0,1,1],'3'). '4ビット数ならび16進表記'([0,1,0,0],'4'). '4ビット数ならび16進表記'([0,1,0,1],'5'). '4ビット数ならび16進表記'([0,1,1,0],'6'). '4ビット数ならび16進表記'([0,1,1,1],'7'). '4ビット数ならび16進表記'([1,0,0,0],'8'). '4ビット数ならび16進表記'([1,0,0,1],'9'). '4ビット数ならび16進表記'([1,0,1,0],'a'). '4ビット数ならび16進表記'([1,0,1,1],'b'). '4ビット数ならび16進表記'([1,1,0,0],'c'). '4ビット数ならび16進表記'([1,1,0,1],'d'). '4ビット数ならび16進表記'([1,1,1,0],'e'). '4ビット数ならび16進表記'([1,1,1,1],'f'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/887 # # (1)c言語(2)問題:ベースを基にビットを左に回転させるleft_rottate関数を追加しプログラムを完成させよ。 # 実行結果: # 数値f0f0のビット状態 # 1111000011110000 # 3ビット回転させました # 数値8787のビット状態 # 1000011110000111 # ベース # #include <stdio.h> # void print_bit(unsigned short int x); //プロトタイプ宣言 # int main(){ # unsigned short int usi; # usi = 0xf0f0 ; # print_bit(usi); # return 0; //システムに値0を返す # } # void print_bit(unsigned short int x){ # int length , i , mask ; # mask = 1; # length = sizeof(x) *8; # mask =mask << (length -1); # printf("数値%xのビット状態\n",x); # for(i = 1;i<= length ; i++){ # if(x & mask){ # printf("1"); # }else{ # printf("0"); # } # mask =mask >> 1; # } # printf("\n"); # } # # '2進ならびの左回転'(_ベース桁数,_数,_Nビット回転) :- 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_2進数ならび), '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび),!. 'ベース桁数を確保して数2進数変換'(_ベース桁数,_数,_ベース桁数で規定された2進数ならび) :- 数2進数変換(_数,_2進数ならび), ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび). '数2進数変換'(_数,_2進数ならび) :- '数2進数変換'(_数,[],_2進数ならび). '数2進数変換'(0,_2進数ならび,_2進数ならび). '数2進数変換'(N,L,_2進数ならび) :- '数2進数変換して行く'(N,L,_2進数ならび). '数2進数変換して行く'(N,L,_2進数ならび) :- M is N mod 2, N_1 is N // 2, '数2進数変換'(N_1,[M|L],_2進数ならび). '2進数を_Nビット左回転して、それを16進数と2進数で表示する'(_ベース桁数,_Nビット回転,_2進数ならび) :- '2進数を_Nビット左回転して、'(_Nビット回転,_2進数ならび,L,_2進表示), それを16進数と2進数で表示する(_Nビット回転,L,_2進表示). '2進数を_Nビット左回転して、'(_Nビット回転,_ベース桁数2進数ならび,L,_2進表示) :- ならびの左回転(1,_Nビット回転,_ベース桁数2進数ならび,L), atomic_list_concat(L,_2進表示). ベース桁数付き二進数(_ベース桁数,_2進数ならび,_ベース桁数で規定された2進数ならび) :- length(_2進数ならび,_桁), _0を付加するべき数 is _ベース桁数 - _桁, 頭部に0を付加する(_0を付加するべき数,_2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(0,_ベース桁数で規定された2進数ならび,_ベース桁数で規定された2進数ならび). 頭部に0を付加する(N,_2進数ならび,_ベース桁数で規定された2進数ならび) :- N \== 0, 'N桁の0ならび'(N,_N桁の0ならび), append(_N桁の0ならび,_2進数ならび,_ベース桁数で規定された2進数ならび). 'N桁の0ならび'(N,_N桁の0ならび) :- length(_N桁の0ならび,N), all(_N桁の0ならび,0). all([],_). all([N|R],N) :- all(R,N). ならびの左回転(N,N,[A|R],L) :- append(R,[A],L),!. ならびの左回転(M,N,[A|R],L) :- append(R,[A],L1), M2 is M + 1, ならびの左回転(M2,N,L1,L). それを16進数と2進数で表示する(_Nビット回転,L,_2進表示) :- writef('%wビット回転しました\n数値 ',[_Nビット回転]), '16進数で表示する'(L), '2進数で表示する'(_2進表示). '16進数で表示する'(_2進ならび) :- '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび), '2進数16進数表示'(_整形された2進ならび). '桁数が4の倍数になるように頭部を整形'(_2進ならび,_整形された2進ならび) :- length(_2進ならび,_桁), _余り is _桁 mod 4, '頭部に0を付加する'(_余り,_2進ならび,_整形された2進ならび). '頭部に0を付加する'(0,L,L). '頭部に0を付加する'(1,L,[0,0,0|L]). '頭部に0を付加する'(2,L,[0,0|L]). '頭部に0を付加する'(3,L,[0|L]). '2進数で表示する'(_2進表示) :- write('のビット状態\n'), writef('%w\n',[_2進表示]). '2進数16進数表示'([]) :- write('\n'),!. '2進数16進数表示'([_b1,_b2,_b3,_b4|R]) :- '4ビット数ならび16進表記'([_b1,_b2,_b3,_b4],_16進表記), writef('%w',[_16進表記]), '2進数16進数表示'(R). '4ビット数ならび16進表記'([0,0,0,0],'0'). '4ビット数ならび16進表記'([0,0,0,1],'1'). '4ビット数ならび16進表記'([0,0,1,0],'2'). '4ビット数ならび16進表記'([0,0,1,1],'3'). '4ビット数ならび16進表記'([0,1,0,0],'4'). '4ビット数ならび16進表記'([0,1,0,1],'5'). '4ビット数ならび16進表記'([0,1,1,0],'6'). '4ビット数ならび16進表記'([0,1,1,1],'7'). '4ビット数ならび16進表記'([1,0,0,0],'8'). '4ビット数ならび16進表記'([1,0,0,1],'9'). '4ビット数ならび16進表記'([1,0,1,0],'a'). '4ビット数ならび16進表記'([1,0,1,1],'b'). '4ビット数ならび16進表記'([1,1,0,0],'c'). '4ビット数ならび16進表記'([1,1,0,1],'d'). '4ビット数ならび16進表記'([1,1,1,0],'e'). '4ビット数ならび16進表記'([1,1,1,1],'f'). % 以下のサイトは # 出典::SQL質疑応答スレ 11問目 #754 # 以下のようなテーブルがあるとします。 # [テーブル名:ユーザー] # ユーザーID , NAME # -------- # 1 , hoge # 2 , fuga # 3 , piyo # # [テーブル名:所持品] # ユーザーID , 備品ID # -------- # 1 , 1 # 2 , 1 # 3 , 2 # 2 , 2 # 3 , 3 # 1 , 2 # # [テーブル名:備品] # 備品ID , NAME # -------- # 1 , PC # 2 , 電話 # 3 , プリンタ # # ここから指定した備品、例えばPCと電話を両方持っているユーザーを # 取得したいです。 # DBはmysqlです。よろしくお願いします。 # ユーザー(1,hoge). ユーザー(2,fuga). ユーザー(3,piyo). 所持品(1,1). 所持品(2,1). 所持品(3,2). 所持品(2,2). 所持品(3,3). 所持品(1,2). 備品(1,'PC'). 備品(2,電話). 備品(3,プリンタ). 指定した備品('PC'). 指定した備品('電話'). :- dynamic(指定した備品を全部持っているユーザー名/1). '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する' :- findall(_備品,指定した備品(_備品),_備品名ならび), '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'(_備品名ならび). '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'(_備品名ならび) :- forall('所持品/2,備品/2から指定した備品を全部持っているユーザー名を取得する'(_備品名ならび,_ユーザー名), assertz(指定した備品を全部持っているユーザー名(_ユーザー名))). '所持品/2,備品/2から指定した備品を全部持っているユーザー名を取得する'(_備品名ならび,_ユーザー名) :- ユーザー(_ユーザーID,_ユーザー名), 指定した備品を全部持っている(_備品名ならび,_ユーザーID). 指定した備品を全部持っている(_備品名ならび,_ユーザーID) :- forall(指定した備品を(_備品名ならび,_備品ID),持っている(_ユーザーID,_備品ID)). 指定した備品を(_備品名ならび,_備品ID) :- member(_備品名,_備品名ならび), 備品(_備品ID,_備品名). 持っている(_ユーザーID,_備品ID) :- 所持品(_ユーザーID,_備品ID). ?- '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'. ?- listing(指定した備品を全部持っているユーザー名). 指定した備品を全部持っているユーザー名(hoge). 指定した備品を全部持っているユーザー名(fuga). ?- % 以下のサイトは # 出典 :: C/C++の宿題片付けます 145代目 #749 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):ー由に文字列を定義して、その文字列のn番目の文字を表示するプログラムを作れ。 #                ⊆由に文字列を定義して、n番目以降の文字をすべて表示するプログラムを作れ。 #                自由に文字列を定義して、n番目からo番目(n<=o)の文字を表示するプログラムを作れ。 # '自由に文字列を定義して、その文字列のn番目の文字を表示する'(_文字列,_n番目) :- succ(_変位,_n番目), sub_atom(_文字列,_変位,1,_,_文字), writef('%w',[_文字]). '自由に文字列を定義して、n番目以降の文字をすべて表示する'(_文字列,_n番目) :- succ(_変位,_n番目), sub_atom(_文字列,_変位,_,0,_副文字列), writef('%w',[_副文字列]). '自由に文字列を定義して、n番目からo番目(n<=o)の文字を表示する'(_文字列,_n番目,_o番目) :- 'n番目からo番目(n<=o)の文字を'(_文字列,_n番目,_o番目,_文字ならび), 表示する(_文字ならび). 'n番目からo番目(n<=o)の文字を'(_文字列,_n番目,_o番目,_文字ならび) :- findall(_文字,( '変位Mの文字を取り出す'(_文字列,_n番目,_o番目,_変位M,_文字)),_文字ならび). '変位Mの文字を取り出す'(_文字列,_n番目,_o番目,_変位_M,_文字) :- 変位に変換(_n番目,_o番目,_変位_n番目,_変位_o番目), between(_変位_n番目,_変位_o番目,_変位_M), sub_atom(_文字列,_変位_M,1,_,_文字). 変位に変換(_n番目,_o番目,_変位_n番目,_変位_o番目) :- succ(_変位_n番目,_n番目), succ(_変位_o番目,_o番目). 表示する(_文字ならび) :- atomic_list_concat(_文字ならび,_副文字列), writef('%w',[_副文字列]). /* for(S,S,S) :- !. for(S,S,E). for(S,N,E) :- succ(S,E,S1), for(S1,N,E). succ(S,E,S1) :- S =< E, succ(S,S1),!. succ(S,E,S1) :- S > E, succ(S1,S). */ % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_段) :- 九九表(_九九表), 表の中から21を捜す(_九九表,_段,_列,_答え). 表の中から21を捜す(_九九表,_段,_列,_答え) :- 段と列の候補を挙げる(_段,_列), '21を得る'(_九九表,_段,_列), 答えは(_段,_列,_答え). 段と列の候補を挙げる(_段,_列) :- between(1,9,_段), between(1,9,_列). '21を得る'(_九九表,_段,_列) :- nth1(_段,_九九表,_九九表の行), nth1(_列,_九九表の行,21). 答えは(7,_列,_列) :- !. 答えは(_段,7,_段). % 以下のサイトは 九九表([ [1,2,3,3,4,6,7,8,9], [2,4,6,8,10,12,14,16,18], [3,6,9,12,15,18,21,24,27], [4,8,12,16,20,24,28,32,36], [5,10,15,20,25,30,35,40,45], [6,12,18,24,30,36,42,48,54], [7,14,21,28,35,42,49,56,63], [8,16,24,32,40,48,56,64,72], [9,18,27,36,45,54,63,72,81]]). '「21÷7 の計算は、九九表をどのように辿れば答えがえられますか?」ならば全然問題がないように思いますが。'(_答え,_段) :- 九九表(_九九表), 表の中から21を捜す(_九九表,_段,_列,_答え). 表の中から21を捜す(_九九表,_段,_列,_答え) :- 段と列の候補を挙げる(_段,_列), '21を得る'(_九九表,_段,_列), 答えは(_段,_列,_答え). 段と列の候補を挙げる(_段,_列) :- between(1,9,_段), between(1,9,_列). '21を得る'(_九九表,_段,_列) :- nth1(_段,_九九表,_九九表の行), nth1(_列,_九九表の行,21). 答えは(7,_列,_列) :- !. 答えは(_段,7,_段). % 以下のサイトは # 出典 :: 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. % 以下のサイトは #出典: Regular Expression(正規表現) Part12 #507 #●Regular Expressionの使用環境 #秀丸 # #●検索か置換か? #置換 # #●説明 #行の一番最後の全角文字から後を削除したい。 # #●対象データ # #東京 abc 大阪静岡 123 名古屋 apple orange # # #●希望する結果 # #東京 abc 大阪静岡 123 名古屋 # # #宜しくお願いします。 '行の一番最後の全角文字から後を削除したい。'(_行文字列,_行の一番最後の全角文字から後を削除した文字列) :- 行の一番最後の全角文字から(_行文字列,_全角文字から後の長さ), '後を削除したい。'(_行文字列,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列),!. 行の一番最後の全角文字から(_行文字列,_全角文字から後の長さ) :- 行の一番最後の(_行文字列,_全角文字から後の長さ,_文字), 全角文字から(_文字). 行の一番最後の(_行文字列,_全角文字から後の長さ,_文字) :- sub_atom(_行文字列,_全角文字から後の長さ,1,_最後の全角文字の開始位置,_), sub_atom(_行文字列,_最後の全角文字の開始位置,1,_全角文字から後の長さ,_文字). 全角文字から(_全角文字) :- char_code(_全角文字,_文字コード), _文字コード > 255. '後を削除したい。'(_行文字列,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列) :- sub_atom(_行文字列,0,_,_全角文字から後の長さ,_行の一番最後の全角文字から後を削除した文字列). % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙), 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字). 文字ならびに変換して二種の文字を得る(_二種類の文字からなる長さが奇数の文字列,_文字ならび,_甲,_乙) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,_文字ならび), ふたつの文字は異なる(_文字ならび,_甲,_乙),!. ふたつの文字は異なる(_文字ならび,_甲,_乙) :- append([_甲|_],[_乙|_],_文字ならび), _甲 \== _乙. 多数派の文字を求める(_文字ならび,_甲,_乙,_多数派の文字) :- 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数), 多数派の文字を得る(_甲,_乙,_甲の度数,_乙の度数,_多数派の文字). 度数を得る(_文字ならび,_甲,_甲の度数,_乙の度数) :- length(_文字ならび,_文字数), 度数(member(_甲,_文字ならび),_甲の度数), _乙の度数 is _文字数 - _甲の度数. 多数派の文字を得る(_甲,_,_甲の度数,_乙の度数,_甲) :- _甲の度数 > _乙の度数. 多数派(_,_乙,_,_,_乙). 度数(P,_度数) :- findall(1,P,L), length(L,_度数). % 以下のサイトは '二つの2行3列の行列A、Bに対して 和A+B を求める'( [[A_1_1,A_1_2,A_1_3], [A_2_1,A_2_2,A_2_3]], [[B_1_1,B_1_2,B_1_3], [B_2_1,B_2_2,B_2_3]], [[_和_1_1,_和_1_2,_和_1_3], [_和_2_1,_和_2_2,_和_2_3]]) :- _和_1_1 is A_1_1 + B_1_1, _和_1_2 is A_1_2 + B_1_2, _和_1_3 is A_1_3 + B_1_3, _和_2_1 is A_2_1 + B_2_1, _和_2_2 is A_2_2 + B_2_2, _和_2_3 is A_2_3 + B_2_3. % 以下のサイトは 整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数),!. 整数を得る(_催促文,_条件,_整数) :- 整数を得る(_催促文,_条件,_整数). 催促文付き行入力から条件付きで整数を得る(_催促文,_条件,_整数) :- 催促文付き行入力から(_催促文,_行), 行を条件付きで整数に変換する(_行,_条件,_整数). 催促文付き行入力から(_催促文,_行) :- writef('%w',[_催促文]), 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_chars(_行,Codes). 行を条件付きで整数に変換する(_行,_条件,_整数) :- 行を整数に変換する(_行,_整数), 整数入力条件検査(_条件). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), 整数検査(_整数). 整数検査(_整数) :- integer(_整数),!. 整数検査(_項) :- 整数検査再入力要請(_項). 整数検査再入力要請(_項) :- writef('入力された項 %w は整数になりません。再入力をお願いします。\n',[_項]), fail. 整数入力条件検査(_条件) :- _条件,!. 整数入力条件検査(_条件) :- 整数入力条件検査再入力要請(_条件). 整数入力条件検査再入力要請(_条件) :- writef('入力された %w は成立しません。再入力をお願いします。\n',[_条件]), fail. % 以下のサイトは # 出典::SQL質疑応答スレ 11問目 #754 # 以下のようなテーブルがあるとします。 # [テーブル名:ユーザー] # ユーザーID , NAME # -------- # 1 , hoge # 2 , fuga # 3 , piyo # # [テーブル名:所持品] # ユーザーID , 備品ID # -------- # 1 , 1 # 2 , 1 # 3 , 2 # 2 , 2 # 3 , 3 # 1 , 2 # # [テーブル名:備品] # 備品ID , NAME # -------- # 1 , PC # 2 , 電話 # 3 , プリンタ # # ここから指定した備品、例えばPCと電話を両方持っているユーザーを # 取得したいです。 # DBはmysqlです。よろしくお願いします。 # ユーザー(1,hoge). ユーザー(2,fuga). ユーザー(3,piyo). 所持品(1,1). 所持品(2,1). 所持品(3,2). 所持品(2,2). 所持品(3,3). 所持品(1,2). 備品(1,'PC'). 備品(2,電話). 備品(3,プリンタ). 指定した備品('PC'). 指定した備品('電話'). :- dynamic(指定した備品を全部持っているユーザー名/1). '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する' :- findall(_備品,指定した備品(_備品),_備品名ならび), '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'(_備品名ならび). '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'(_備品名ならび) :- forall('所持品/2,備品/2から指定した備品を全部持っているユーザー名を取得する'(_備品名ならび,_ユーザー名), assertz(指定した備品を全部持っているユーザー名(_ユーザー名))). '所持品/2,備品/2から指定した備品を全部持っているユーザー名を取得する'(_備品名ならび,_ユーザー名) :- ユーザー(_ユーザーID,_ユーザー名), 指定した備品を全部持っている(_備品名ならび,_ユーザーID). 指定した備品を全部持っている(_備品名ならび,_ユーザーID) :- forall(指定した備品を(_備品名ならび,_備品ID),持っている(_ユーザーID,_備品ID)). 指定した備品を(_備品名ならび,_備品ID) :- member(_備品名,_備品名ならび), 備品(_備品ID,_備品名). 持っている(_ユーザーID,_備品ID) :- 所持品(_ユーザーID,_備品ID). ?- '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'. ?- listing(指定した備品を全部持っているユーザー名). 指定した備品を全部持っているユーザー名(hoge). 指定した備品を全部持っているユーザー名(fuga). ?- % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #984 # ・SQL Server2008R2Express # テーブルデータ # ・2012-08-01 11:35:00, りんご, 1 # ・2012-08-01 16:22:00, みかん, 2 # ・2012-08-02 13:54:00, りんご, 2 # ・2012-08-02 14:32:00, りんご, 1 # ・2012-08-04 16:22:00, みかん, 3 # # ・欲しい結果 # 2012-08-01 # 2012-08-02 # 2012-08-04 # # ・説明 # 件数に関係なく売り上げがあった日だけのリストが欲しいのですが # うまい方法あるでしょうか # # 売上('2012-08-01 11:35:00', りんご, 1 ). 売上('2012-08-01 16:22:00', みかん, 2 ). 売上('2012-08-02 13:54:00', りんご, 2 ). 売上('2012-08-02 14:32:00', りんご, 1 ). 売上('2012-08-04 16:22:00', みかん, 3 ). 件数に関係なく売り上げがあった日(_売上のあった日) :- 売上のあった日を選ぶ(_売上のあった日候補日リスト), 実際に売上のあった日(_売上のあった日候補日リスト,_売上のあった日). 売上のあった候補日を選ぶ(_売上のあった候補日リスト) :- setof(_年月日,[_年月日] ^ 売上のあった日(_年月日),_売上のあった候補日リスト). 売上のあった日(_年月日) :- 売上(_日付時刻,_,_件数), 日付時刻から年月日を切り取る(_日付時刻,_年月日). 日付時刻から年月日を切り取る(_日付時刻,_年月日) :- sub_atom(_日付時刻,0,10,_,_年月日). 実際に売上のあった日(_売上のあった日候補日リスト,_年月日) :- member(_年月日,_売上のあった日候補日リスト), 合計件数を得る(_年月日,_合計件数), _合計件数 > 0. 合計件数を得る(_年月日,_合計件数) :- findsum(_件数,売上の件数を得る(_年月日,_件数),_合計件数). 売上の件数を得る(_年月日,_件数) :- 売上(_日付時刻,_,_件数), 日付時刻から年月日を切り取る(_日付時刻,_年月日). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは 二文字以上の同一文字文字列(_文字列,_前文字列,_同一文字文字列,_後文字列) :- 二文字以上の同一文字文字列(_文字列,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,_,_文字),_文字 = _同一文字). % 以下のサイトは 我筝罌(' 紊筝絲莨違紊絖荀篏我筝罌 筝違篁ュ画牡≦燭峨篋榊藥篋絨篁ユ筝吟箙篋i銀筝茫ф取篋篋篏篋筝 篋違膀ゆ筝絲吟篏羈т箙腟罩吾箙胼絎篏筝篏篋冴莢贋羈篋咲絨ゆ<醇緇箙銀罩娯絲吟篏篁ョ贋 筝違粋綽茗鴻紊箙e遺紊荀h茵羂緇井峨ぉ荀恰潟篁ャ荐f帥筝茵筝<粋綽若筝茗壕 違臂ゅ睡上篁ョΞ我倶音羂箙荀胼箙筝筝胼筝藹筝∞Ξ篁ュ臀篁ャ臂よgΞ篏罨>篋上胼絎区羃祉 篋違腟狗罍罨蚊莨荐頑句上箙荐筝上篋筝ュ障羈箙膣罩潟羃肢緇峨幻荀莖綮活箴炊莢>荐絋勄羂眼箙箙荐眼篌惹梓潟篁ヨ翁羂筝ユ宴i篋主 違我≦後や吾篁ユ推査荀-綽<区荅画篋絎銀牙偽篋堺箙篋篏紵絨筝絅処筝≫茯壕筝紊宴九罩や査綽弱篁惹紊т箙箙 筝違篋阪篁祉絎-筝羶区晦俄算絎喝莎激紮ц絎胼篋膵筝絨ャ綽灸篋≦ぇ絨緇篋阪羃祉≧ョ粂莖∵絲罩ゅ絎倶宛箙腓丞水宴よ峨篁ユ篋冴俄査筝羆絎 違臂ゅ睡上篋∞c腟ラg<篁ャ我筝篋ャ綽篋筝< 箙違篆≧臂罸篋篆<九荀篋篆<臂よe延拭篏篋筝臂よf篆<篋 違腟九真罍筝篋咲篋榊綽激綵惹綵守綽綵弱掩≦か潟箙荅遵絎後沿晦絋倶腴篁ャ綵寂査紊宴緇緇茵с 筝違絲莖臀医吟ヨ莖筝臀遺臀隙臂ゅ帥絎莖臀違 篋違夔水上篋羂≦筝祉羂篁ョ俄源篁糸夒c篏∵莖上 筝違茫娯算絎ヨ傑篏帥寂九ヤャ絋乗銀札翠峨 違臂よg上≧絆絋√篋冴篋絆絆絋箙c筝ュ倶サ篁ャ阪弱訓筝弱訓絆絋篁ャ篋鞘箙篁莖≪莠篁ラe筝銀緇莖∵篏篁ユ音 篋違腱dc>査腱綽上篁ョ絋乗儀九恰腴篋筝筝茫с銀墾罩 違篏炊篁ユや吾篁ュ篏炊緇ヨ括莨我箙膀筝篏炊銀莨俄蕋筝罅篏 筝違紊篋筝激綽茵絎茫絨篋莠筝綽茵茫紊тョ紊宴茵梧小莨緇 '). % 以下のサイトは ファイルから全行読み取る(_ファイル,_全行) :- open(_ファイル,read,_ストリーム), ストリームから全行読み取る(_ストリーム,_全行), close(_ストリーム). ストリームから全行読み取る(_ストリーム,[]) :- at_end_of_stream(_ストリーム),!. ストリームから全行読み取る(_ストリーム,_全行) :- ストリームから全行読み取って行く(_ストリーム,_全行). ストリームから全行読み取って行く(_ストリーム,[_行|R]) :- 行入力(_ストリーム,_行), ストリームから全行読み取る(_ストリーム,R). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは バイバイマン(LL) :- findnsols(101,[N,_値],バイバイマン([],[0,1,1,1,1],N,_値),LL),!. バイバイマン(Ln,_値,N,_値) :- length(Ln,N). バイバイマン(Ln,[A,B,C,D,E],N,_値) :- バイバイマンが行く(Ln,[A,B,C,D,E],N,_値). バイバイマンが行く(Ln,[A,B,C,D,E],N,_値) :- バイバイ([A,B,C,D,E,F,G,H,I,J]), バイバイマン([_|Ln],[F,G,H,I,J],N,_値). バイバイ([_,_,_,_,_]). バイバイ([A,B,C,D,E,F|R]) :- '4(B),5(A)要素前を計算の種とする'([A,B,C,D,E,F|R]). '4(B),5(A)要素前を計算の種とする'([A,B,C,D,E,F|R]) :- F is A + 2 * B, バイバイ([B,C,D,E,F|R]). % 以下のサイトは バイバイマン(LL) :- findnsols(101,[N,_値],バイバイマン(0,[0,1,1,1,1],N,_値),LL),!. バイバイマン(N,_値,N,_値). バイバイマン(N_1,[A,B,C,D,E],N,_値) :- バイバイマンが行く(N_1,[A,B,C,D,E],N,_値). バイバイマンが行く(N_1,[A,B,C,D,E],N,_値) :- succ(N_1,N_2), バイバイ([A,B,C,D,E,F,G,H,I,J]), バイバイマン(N_2,[F,G,H,I,J],N,_値). バイバイ([_,_,_,_,_]). バイバイ([A,B,C,D,E,F|R]) :- '4(B),5(A)要素前を計算の種とする'([A,B,C,D,E,F|R]). '4(B),5(A)要素前を計算の種とする'([A,B,C,D,E,F|R]) :- F is A + 2 * B, バイバイ([B,C,D,E,F|R]). % 以下のサイトは バイバイマン(LL) :- findnsols(101,[N,_値],バイバイマン(0,[0,1,1,1,1],N,_値),LL),!. バイバイマン(N,_値,N,_値). バイバイマン(N_1,[A,B,C,D,E],N,_値) :- succ(N_1,N_2), バイバイ([A,B,C,D,E,F,G,H,I,J]), バイバイマン(N_2,[F,G,H,I,J],N,_値). バイバイ([_,_,_,_,_]). バイバイ([A,B,C,D,E,F|R]) :- F is A + 2 * B, バイバイ([B,C,D,E,F|R]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #358 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10471.txt # # ≪問題と条件≫ # 第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、 # ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込むプログラムを作成せよ。ただし、16バイトごとに改行を入れること。 '第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込む。 ただし、16バイトごとに改行を入れる'(_入力バイナリファイル,_出力16進表示テキストファイル) :- '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output), '1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],Input,Output), ストリームを閉じる(Input,Output). '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output) :- '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input), '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output). '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input) :- open(_入力バイナリファイル,read,Input,[type(binary)]). '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output) :- open(_出力16進表示テキストファイル,write,Output). ストリームを閉じる(Input,Output) :- close(Input), close(Output). '1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln,Input,Output) :- 'at_end_of_stream状態になったら停止する'(Ln,Input,Output),!. '1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln,Input,Output) :- 'at_end_of_streamになるまで、1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln,Input,Output). 'at_end_of_stream状態になったら停止する'(Ln,Input,Output) :- at_end_of_stream(Input), 改行を入れる(Output). 'at_end_of_streamになるまで、1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln,Input,Output) :- 既に16バイト目になっていたら改行を入れる(Ln,Output,Ln2), '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output), '1バイトずつファイルを読み込み、16進数で示したものを書き込む。ただし、16バイトごとに改行を入れる'(Ln2,Input,Output). '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- '1バイトファイルを読み込み、'(Input,_1バイト), '16進数で示したものを書き込む'(Output,_1バイト). '1バイトファイルを読み込み、'(Input,_1バイト) :- get_byte(Input,_1バイト). '16進数で示したものを書き込む'(Output,_1バイト) :- '16進数で示したものを'(_1バイト,_16進数文字列), 書き込む(Output,_16進数文字列). '16進数で示したものを'(_1バイト,_16進数文字列) :- 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列), 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列), atomic_list_concat([_16進数上位桁文字列,_16進数下位桁文字列,' '],_16進数文字列). 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列) :- X is _1バイト // 16, '16進数文字コード'(X,_16進数上位桁文字列). 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列) :- Y is _1バイト mod 16, '16進数文字コード'(Y,_16進数下位桁文字列). '16進数文字コード'(15,'F') :- !. '16進数文字コード'(14,'E') :- !. '16進数文字コード'(13,'D') :- !. '16進数文字コード'(12,'C') :- !. '16進数文字コード'(11,'B') :- !. '16進数文字コード'(10,'A') :- !. '16進数文字コード'(N,C) :- atom_number(C,N). 書き込む(Output,_16進数文字列) :- write(Output,_16進数文字列). 既に16バイト目になっていたら改行を入れる([],Output,[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]) :- 改行を入れる(Output). 既に16バイト目になっていたら改行を入れる([_|Ln],_,Ln). 改行を入れる(Output) :- write(Output,'\n'). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #358 # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10471.txt # # ≪問題と条件≫ # 第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、 # ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込むプログラムを作成せよ。ただし、16バイトごとに改行を入れること。 '第1引数に指定したファイルからバイナリーモードで1バイトずつファイルを読み込み、ファイルの内容を16進数で示したものを第2引数に指定したファイルに書き込む。 ただし、16バイトごとに改行を入れる'(_入力バイナリファイル,_出力16進表示テキストファイル) :- '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output), '1バイトずつファイルを読み込み、16進数で示したもの書き込む。ただし、16バイトごとに改行を入れる'(Input,Output), ストリームを閉じる(Input,Output). '入力ファイルはバイナリーモード、出力ファイルはテキストモード'(_入力バイナリファイル,_出力16進表示テキストファイル,Input,Output) :- '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input), '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output). '入力ファイルはバイナリーモード、'(_入力バイナリファイル,Input) :- open(_入力バイナリファイル,read,Input,[type(binary)]). '出力ファイルはテキストモード'(_出力16進表示テキストファイル,Output) :- open(_出力16進表示テキストファイル,write,Output). ストリームを閉じる(Input,Output) :- close(Input), close(Output). '1バイトずつファイルを読み込み、16進数で示したもの書き込む。ただし、16バイトごとに改行を入れる'(Input,Output) :- forall('16バイト分、1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output), 改行を入れる(Output)). '16バイト分、1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- findnsols(16,1,'1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output),_). '1バイトずつファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- repeat, ( at_end_of_stream(Input),!,fail; '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output)). '1バイトファイルを読み込み、16進数で示したものを書き込む'(Input,Output) :- '1バイトファイルを読み込み、'(Input,_1バイト), '16進数で示したものを書き込む'(Output,_1バイト). '1バイトファイルを読み込み、'(Input,_1バイト) :- get_byte(Input,_1バイト). '16進数で示したものを書き込む'(Output,_1バイト) :- '16進数で示したものを'(_1バイト,_16進数文字列), 書き込む(Output,_16進数文字列). '16進数で示したものを'(_1バイト,_16進数文字列) :- 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列), 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列), atomic_list_concat([_16進数上位桁文字列,_16進数下位桁文字列,' '],_16進数文字列). 上位桁の16進数文字列変換(_1バイト,_16進数上位桁文字列) :- X is _1バイト // 16, '16進数文字コード'(X,_16進数上位桁文字列). 下位桁の16進数文字列変換(_1バイト,_16進数下位桁文字列) :- Y is _1バイト mod 16, '16進数文字コード'(Y,_16進数下位桁文字列). '16進数文字コード'(15,'F') :- !. '16進数文字コード'(14,'E') :- !. '16進数文字コード'(13,'D') :- !. '16進数文字コード'(12,'C') :- !. '16進数文字コード'(11,'B') :- !. '16進数文字コード'(10,'A') :- !. '16進数文字コード'(N,C) :- atom_number(C,N). 書き込む(Output,_16進数文字列) :- write(Output,_16進数文字列). 改行を入れる(Output) :- write(Output,'\n'). % 以下のサイトは # 出典 :: 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. % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 :- op(500,xfx,すべて). P すべて Q :- forall(P,Q). '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) すべて 印字する(_現在の要素). '直前・直後のならび要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- '直前・直後のならび要素が存在する現在の要素は'(_ならび,_直前の要素,_現在の要素,_直後の要素), '直前・直後の値の平均よりも大きな値を持つ'(_直前の要素,_現在の要素,_直後の要素). '直前・直後のならび要素が存在する現在の要素は'(_ならび,_直前の要素,_現在の要素,_直後の要素) :- append([_,[_直前の要素,_現在の要素,_直後の要素],_],_ならび). '直前・直後の値の平均よりも大きな値を持つ'(_直前の要素,_現在の要素,_直後の要素) :- _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. 印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目,_j番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目,_j番目) :- _小さな方 is min(_i番目,_j番目), writef('%w\n',[_小さな方]). % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 :- op(500,xfx,すべて). P すべて Q :- forall(P,Q). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) すべて 印字する(_現在の要素). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- append([_,[_直前の要素,_現在の要素,_直後の要素],_],_ならび), _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. 印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目,_j番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目,_j番目) :- _小さな方 is min(_i番目,_j番目), writef('%w\n',[_小さな方]). % 以下のサイトは # [1] 授業単元: 基礎プログラミング # [2] 問題文(含コード&リンク): # いま、要素数Nのならび(リスト)に整数がセットされている。 # # 1) 直前・直後の要素が存在し、それら2つの値の平均よりも大きな値を # 持つ要素をすべて印字する。 # 2) ならびからi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が # 等しいとき、iをを印字する。 # ただし出力される要素位置は重複しないこと。 '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素をすべて印字する'(_ならび) :- forall('直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素), すべて印字する(_現在の要素)). '直前・直後の配列要素が存在し、それら2つの値の平均よりも大きな値を持つ要素を'(_ならび,_現在の要素) :- append(_,[_直前の要素,_現在の要素,_直後の要素|_],_ならび), _現在の要素 * 1.0 > (_直前の要素 + _直後の要素) / 2. すべて印字する(_現在の要素) :- writef('%t\n',[_現在の要素]). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、それらの要素の添え字のうち小さな方を印字する'(_ならび) :- forall('ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目), それらの要素の添字の小さな方を印字する(_i番目)). 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目) :- 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_要素の値), '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_要素の値), _i番目 =< _j番目. 'ならびの先頭からi番目(i=0,1,2,...,N-1)の要素と、'(_ならび,_i番目,_値) :- append(L1,[_値|_],_ならび), length(L1,_i番目). '末尾からi番目の要素の値が等しいとき、'(_ならび,_i番目,_j番目,_値) :- append(L3,[_値|L4],_ならび), length(L4,_i番目), length(L3,_j番目). それらの要素の添字の小さな方を印字する(_i番目) :- writef('%w\n',[_i番目]). % 以下のサイトは # # 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://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 日付を鍵とする(_日付ならび), 日々の売上の合計が一定額を越えた日(_一定額,_日付ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日). 日付を鍵とする(_日付ならび) :- setof(_日付,[_日付,_売上] ^ 売上(_日付,_売上),_日付ならび). 日々の売上の合計が一定額を越えた日(_一定額,_日付ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日) :- '日々の売上の合計'(_日付ならび,_日々の,_日々の売上の合計), 一定額を越えた日(_一定額,_日々の,_日々の売上の合計,_日々の売上の合計が一定額を越えた日),!. '日々の売上の合計'(_日付ならび,_日々の,_日々の売上の合計) :- 日々の(_日付ならび,_日々の), 売上の合計(_日々の,_日々の売上の合計). 日々の(_日付ならび,_日々の) :- append(_日々の,_,_日付ならび). 売上の合計(_日々の,_日々の売上の合計) :- findsum(_売上,( 日々の売上(_日々の,_売上)),_日々の売上の合計). 日々の売上(_日々の,_売上) :- member(_日付,_日々の), 売上(_日付,_売上). 一定額を越えた日(_一定額,_日々の,_日々の売上の合計,_日々の売上の合計が一定額を越えた日) :- 一定額を越えた(_一定額,_日々の売上の合計), 日(_日々の,_日々の売上の合計が一定額を越えた日). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 > _一定額. 日(_日々の,_日々の売上の合計が一定額を越えた日) :- last(_日々の,_日々の売上の合計が一定額を越えた日). findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # 出典 :: プログラミングのお題スレ Part3 #435 # # お題:10進数を2進数にしてビットごとに反転したものを10進数に戻す。 # 例 # 1 -> 0 # 12345 -> 4038 # 256 -> 255 '10進数を2進数にしてビットごとに反転したものを10進数に戻す。'(_10進数を,_2進数にしてビットごとに反転したものを10進数戻す) :- '10進数を2進数にして'(_10進数を,[],_2進数にして), ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを), '10進数に戻す'(_ビットごとに反転したものを,0,_2進数にしてビットごとに反転したものを10進数戻す). '10進数を2進数にして'(0,_2進数にして,_2進数にして) :- !. '10進数を2進数にして'(_10進数,_2進数ならび,_2進数にして) :- '2進数を下位桁から積み上げる'(_10進数,_2進数ならび,_2進数にして). '2進数を下位桁から積み上げる'(_10進数,_2進数ならび,_2進数にして) :- 最下位桁のビットを切り取る(_10進数,_ビット,_10進数_1), '10進数を2進数にして'(_10進数_1,[_ビット|_2進数ならび],_2進数にして). 最下位桁のビットを切り取る(_10進数,_ビット,_10進数_1) :- _ビット is _10進数 mod 2, _10進数_1 is _10進数 // 2. ビットごとに反転したものを(_2進数にして,_ビットごとに反転したものを) :- findall(_反転した,( ビットを反転した(_2進数にして,_反転した)),_ビットごとに反転したものを). ビットを反転した(_2進数にして,_反転した) :- ビットを(_2進数にして,_ビットを), 反転した(_ビットを,_反転した). ビットを(_2進数にして,_ビットを) :- nth1(_,_2進数にして,_ビットを). 反転した(0,1). 反転した(1,0). '10進数に戻す'([],_10進数に戻す,_10進数に戻す). '10進数に戻す'(_二進数ビットならび,_10進数の積み上げ_1,_10進数に戻す) :- '10進数を積み上げて行く'(_二進数ビットならび,_10進数の積み上げ_1,_10進数に戻す). '10進数を積み上げて行く'([_ビット|R],_10進数の積み上げ_1,_10進数に戻す) :- _10進数の積み上げ_2 is _10進数の積み上げ_1 * 2 + _ビット, '10進数に戻す'(R,_10進数の積み上げ_2,_10進数に戻す). % 以下のサイトは # 出典 :: 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個の素数文字列]). % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_ストリーム,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,_) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!,fail. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,end_of_file) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは ファイル行入力(_ファイル,_行) :- open(_ファイル,read,_ストリーム), ストリーム行入力(_ストリーム,_行). ストリーム行入力(_ストリーム,_) :- 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム),!,fail. ストリーム行入力(_ストリーム,_行) :- ストリーム行入力を続ける(_ストリーム,_行). 'at_end_of_stream状態になったらストリームをcloseする'(_ストリーム) :- at_end_of_stream(_ストリーム), close(_ストリーム). ストリーム行入力を続ける(_ストリーム,_行) :- 行入力(_ストリーム,_行). ストリーム行入力を続ける(_ストリーム,_行) :- ストリーム行入力(_ストリーム,_行). 行入力(_ストリーム,_行) :- read_line_to_codes(_ストリーム,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典::★★ Java の宿題ここで答えます Part 69 ★★ #806 # # 【 課題 】鶴亀算:頭の数と足の数を入力し,鶴と亀の数を出力しなさい.計算できない場合は,その旨メッセージを出力しなさい. # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI 】制限なし # 【 期限 】1/23 # 【 Ver 】1.6.0_21 # 【 補足 】プログラムに適切なコメントを入れてください. # # よろしくお願いします # # 鶴亀算(_頭の数,_足の数,_鶴何羽,_亀何匹) :- 頭の数と足の数のならび表現(_頭の数,_足の数,_頭の数ならび表現,_足の数ならび表現), 鶴亀算(_鶴の頭ならび表現,_亀の頭ならび表現,_,_,_頭の数ならび表現,_足の数ならび表現), 頭のならび表現を数表現に変換する(_鶴の頭ならび表現,_亀の頭ならび表現,_鶴何羽,_亀何匹). 鶴亀算([],[],[],[],[],[]). 鶴亀算([_|_鶴の頭],[],[_,_|_鶴の足],[],[_|_頭の数],[_,_|_足の数]) :- 鶴亀算(_鶴の頭,[],_鶴の足,[],_頭の数,_足の数). 鶴亀算([],[_|_亀の頭],[],[_,_,_,_|_亀の足],[_|_頭の数],[_,_,_,_|_足の数]) :- 鶴亀算([],_亀の頭,[],_亀の足,_頭の数,_足の数). 鶴亀算([_|_鶴の頭],[_|_亀の頭],[_,_|_鶴の足],[_,_,_,_|_亀の足],[_,_|_頭の数],[_,_,_,_,_,_|_足の数]) :- 鶴亀算(_鶴の頭,_亀の頭,_鶴の足,_亀の足,_頭の数,_足の数) . 頭の数と足の数のならび表現(_頭の数,_足の数,_頭の数ならび表現,_足の数ならび表現) :- length(_頭の数ならび表現,_頭の数), length(_足の数ならび表現,_足の数). 頭のならび表現を数表現に変換する(_鶴の頭ならび表現,_亀の頭ならび表現,_鶴何羽,_亀何匹) :- length(_鶴の頭ならび表現,_鶴何羽), length(_亀の頭ならび表現,_亀何匹). % 以下のサイトは # 出典 :: Prologの宿題片付けます # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 売上(稲葉,'20140228'). 売上(尾崎,'20140227'). 売上(稲葉,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140228'). 社員(尾崎). 社員(稲葉). 全社員が売上を記録した日を求めよ(_全社員が売上を記録した日) :- 社員ごとの売上日ならび(_社員ごとの売上日ならび), 全社員が売上を記録した日(_社員ごとの売上日ならび,_全社員が売上を記録した日). 社員ごとの売上日ならび(_社員ごとの売上日ならび) :- findall(_社員の重複のない売上日ならび,( 社員の重複のない売上日ならび(_社員の重複のない売上日ならび)),_社員ごとの売上日ならび). 社員の重複のない売上日ならび(_社員の重複のない売上日ならび) :- 社員(_社員), setof(_日,[_社員,_日] ^ 売上(_社員,_日),_社員の重複のない売上日ならび). 全社員が売上を記録した日([L],_全社員が売上を記録した日) :- ひとつに纏まったら日付を順に取り出す(L,_全社員が売上を記録した日). 全社員が売上を記録した日([L1,L2|R],_全社員が売上を記録した日) :- 売上を共通して記録した日を纏めて行く([L1,L2|R],_全社員が売上を記録した日). ひとつに纏まったら日付を順に取り出す(L,_全社員が売上を記録した日) :- member(_全社員が売上を記録した日,L). 売上を共通して記録した日を纏めて行く([L1,L2|R],_全社員が売上を記録した日) :- ふたりの共通に売上を記録した日を取り出してひとつに纏める(L1,L2,_共通に売上を記録した日ならび), 全社員が売上を記録した日([_共通に売上を記録した日ならび|R],_全社員が売上を記録した日). ふたりの共通に売上を記録した日を取り出してひとつに纏める(L1,L2,_共通に売上を記録した日ならび) :- intersection(L1,L2,_共通に売上を記録した日ならび). % 以下のサイトは # 出典 :: Prologの宿題片付けます # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 売上(稲葉,'20140228'). 売上(尾崎,'20140227'). 売上(稲葉,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140228'). 社員(尾崎). 社員(稲葉). 全社員が売上を記録した日を求めよ(_全社員が売上を記録した日) :- 社員ごとの売上日ならび(_社員ごとの売上日ならび), ならびに共通して存在する要素(_社員ごとの売上日ならび,_全社員が売上を記録した日). 社員ごとの売上日ならび(_社員ごとの売上日ならび) :- findall(_社員の重複のない売上日ならび,( 社員の重複のない売上日ならび(_社員の重複のない売上日ならび)),_社員ごとの売上日ならび). 社員の重複のない売上日ならび(_社員の重複のない売上日ならび) :- 社員(_社員), setof(_日,[_社員,_日] ^ 売上(_社員,_日),_社員の重複のない売上日ならび). ならびに共通して存在する要素([L],_要素) :- ひとつの集合に纏まったら要素を順に取り出す(L,_要素). ならびに共通して存在する要素([L1,L2|R],_要素) :- 共通要素に纏めて行く([L1,L2|R],_要素). ひとつの集合に纏まったら要素を順に取り出す(L,_要素) :- member(_要素,L). 共通要素に纏めて行く([L1,L2|R],_要素) :- intersection(L1,L2,L3), ならびに共通して存在する要素([L3|R],_要素). % 以下のサイトは # # 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. ?- '前に指定したデータを冠としない検索文字列'(お気に入りのスケート,スケート,[アイス,ローラー],_前データ,_検索文字列,_後データ). _前データ = お気に入りの, _検索文字列 = スケート, _後データ = ''. ?- % 以下のサイトは # 出題 :: プログラミングのお題スレ Part3 #482 # # お題:二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。 # 例 # aabaabbab -> a '二種類の文字からなる長さが奇数の文字列があるとき多数派の文字を求める。'(_二種類の文字からなる長さが奇数の文字列,_多数派の文字) :- 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2), 多数派の文字を求める(_文字種_1,_文字種_2,Ln1,Ln2,_多数派の文字). 二種類の文字からなる長さが奇数の文字列があるとき(_二種類の文字からなる長さが奇数の文字列,_文字種_1,_文字種_2,Ln1,Ln2) :- atom_chars(_二種類の文字からなる長さが奇数の文字列,Chars), 二種類の文字に分類して度数を示すならびを得る(Chars,_文字種_1,_文字種_2,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを得る([],_,_,[],[]) :- !. 二種類の文字に分類して度数を示すならびを得る(L,A,B,Ln1,Ln2) :- 二種類の文字に分類して度数を示すならびを作って行く(L,A,B,Ln1,Ln2). 二種類の文字に分類して度数を示すならびを作って行く(L,A,B,Ln1,Ln2) :- 文字の度数を進める(L,A,B,Ln1_2,Ln2_2,R,Ln1,Ln2), 二種類の文字に分類して度数を示すならびを得る(R,A,B,Ln1_2,Ln2_2). 文字の度数を進める([A|R],A,_,Ln1,Ln2,R,[_|Ln1],Ln2) :- !. 文字の度数を進める([B|R],_,B,Ln1,Ln2,R,Ln1,[_|Ln2]). 多数派の文字を求める(_,B,Ln1,Ln2,B) :- append(Ln1,[_|_],Ln2),!. 多数派の文字を求める(A,_,_,_,A). % 以下のサイトは '起点年月日を示して、翌日以降の日付と曜日を生成する'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日) :- '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,土曜). % 以下のサイトは '起点年月日を示して、翌日以降の日付と曜日を生成する'(_起点年,_起点月,_起点日,_年,_月,_日,_曜日) :- 日付と曜日の生成(_起点年,_起点月,_起点日,_年,_月,_日,_曜日). 日付と曜日の生成(_年,_月,_日,_年,_月,_日,_曜日) :- 'Zellerの公式を用いて曜日を得る'(_年,_月,_日,_曜日を表す値,_曜日). 日付と曜日の生成(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_年,_月,_日,_曜日). 翌日の日付と曜日の生成をして行く(_年_1,_月_1,_日_1,_年,_月,_日,_曜日) :- 翌日(_年_1,_月_1,_日_1,_年_2,_月_2,_日_2), 日付と曜日の生成(_年_2,_月_2,_日_2,_年,_月,_日,_曜日). 翌日(_年_1,_月_1,_日_1,_年,_月,_日) :- '12月、2月の月末日には特別ルールを適用する'(_年_1,_月_1,_日_1,_年,_月,_日),!. 翌日(_年,_月_1,_日_1,_年,_月,1) :- '12月、2月を除く月末日では、翌日は翌月の一日である'(_月_1,_日_1,_月),!. 翌日(_年,_月,_日_1,_年,_月,_日) :- '月末日でない日は、年月は変わらず、日のみ一加算される'(_日_1,_日). '12月、2月の月末日には特別ルールを適用する'(_年_1,12,31,_年,1,1) :- succ(_年_1,_年). '12月、2月の月末日には特別ルールを適用する'(_年,2,_日_1,_年,3,1) :- 'うるう年の時は、29日、それ以外の月は28日が末日である'(_年,_日_1). 'うるう年の時は、29日、それ以外の月は28日が末日である'(_年,29) :- うるう年(_年),!. 'うるう年の時は、29日、それ以外の月は28日が末日である'(_年,28). '12月、2月を除く月末日では、翌日は翌月の一日である'(_月_1,_日_1,_月) :- '12月、2月を除く月末日は、月が大の月であるか小の月であるか判断して決まる'(_月_1,_日_1), succ(_月_1,_月). '12月、2月を除く月末日は、月が大の月であるか小の月であるか判断して決まる'(_月,30) :- 小の月(_月). '12月、2月を除く月末日は、月が大の月であるか小の月であるか判断して決まる'(_月,31) :- 大の月(_月). 小の月(_月) :- member(_月,[2,4,6,9,11]). 大の月(_月) :- member(_月,[1,3,5,7,8,10,12]). '月末日でない日は、年月は変わらず、日のみ一加算される'(_日_1,_日) :- succ(_日_1,_日). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!,fail. うるう年(_年) :- 0 is _年 mod 4. '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,土曜). % 以下のサイトは ある行に実数倍した他の行を加える(_行列,_ある行の位置,_実数,_他の行の位置,_ある行に実数倍した他の行を加えた行列) :- ある行に実数倍した他の行を加えた行で(_行列,_ある行の位置,_実数,_他の行の位置,L1,_ある行に実数倍した他の行を加えた行,R1), ある行を置き換える(L1,_ある行に実数倍した他の行を加えた行,R1,_ある行に実数倍した行を加えた行列). ある行に実数倍した他の行を加えた行で(_行列,_ある行の位置,_実数,_他の行の位置,L1,_ある行に実数倍した他の行を加えた行,R1) :- ある行に(_行列,_ある行の位置,L1,_ある行,R1), 実数倍した他の行(_行列,_他の行の位置,_実数倍した他の行), 行と行との加算(_ある行,_実数倍した他の行,_ある行に実数倍した他の行を加えた行). ある行に(_行列,_ある行の位置,L1,_ある行,R1) :- append(L1,[_ある行|R1],_行列), length([_|L1],_ある行の位置). 実数倍した他の行(_行列,_他の行の位置,_実数倍した他の行) :- 他の行に(_行列,_他の行の位置,_他の行), 行に実数を掛ける(_他の行,_実数,_実数倍した他の行). 他の行に(_行列,_他の行の位置,_他の行) :- append(L2,[_他の行|R2],_行列), length([_|L2],_他の行の位置). 行に実数を掛ける([],_,[]). 行に実数を掛ける(L1,_実数,L2) :- 行に実数を掛けて行く(L1,_実数,L2). 行に実数を掛けて行く([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数を掛ける(R1,_実数,R2). 行と行との加算([],[],[]). 行と行との加算(L1,L2,L3) :- 行と行を加算して行く(L1,L2,L3). 行と行を加算して行く([A|R1],[B|R2],[C|R3]) :- C is A + B, 行と行との加算(R1,R2,R3). ある行を置き換える(L1,_ある行に実数倍した他の行を加えた行,R1,_ある行に実数倍した行を加えた行列) :- append(L1,[_ある行に実数倍した他の行を加えた行|R1],_ある行に実数倍した他の行を加えた行列). % 以下のサイトは 差分整列(_ならび, _整列したならび) :- 差分整列(_ならび, _整列したならび, []). 差分整列([], _ならび, _ならび). 差分整列([_軸要素|_軸要素以外の要素], _整列したもの, _差分) :- '[_軸要素|_軸要素以外の要素]を整列したものは _整列したもの から _差分 の差分である'(_軸要素,_軸要素以外の要素,_整列したもの,_差分). '[_軸要素|_軸要素以外の要素]を整列したものは _整列したもの から _差分 の差分である'(_軸要素,_軸要素以外の要素,_全体の整列,_差分) :- 軸要素を軸に小と等しいか大に分類する(_軸要素以外の要素, _軸要素, _より小, _より大), '_より小 を整列したものは全体を整列したものから _軸要素 を先頭に加えた _より大 を整列したものの差分である'(_より小,_全体の整列,[_軸要素|_より大の整列]), '_より大 を整列したものは _より大 を整列したものから _差分 の差分である'(_より大, _より大の整列, _差分). '_より小 を整列したものは全体を整列したものから _軸要素 を先頭に加えた _より大 を整列したものの差分である'(_より小,_全体の整列,[_軸要素|_より大の整列]) :- 差分整列(_より小,_全体の整列,[_軸要素|_より大の整列]). '_より大 を整列したものは _より大 を整列したものから _差分 の差分である'(_より大, _より大の整列, _差分) :- 差分整列(_より大,_より大の整列, _差分). 軸要素を軸に小と等しいか大に分類する([],_,[],[]). 軸要素を軸に小と等しいか大に分類する([_要素|_残り分類対象],_軸要素,_より小,_より大) :- 軸要素を軸に小と等しいか大に分類して行く(_要素,_残り分類対象,_軸要素,_より小,_より大). 軸要素を軸に小と等しいか大に分類して行く(_要素,_残り分類対象,_軸要素,_より小,_より大) :- 小と等しいか大に分類する(_要素,_軸要素,_より小_2,_より大_2,_より小,_より大), 軸要素を軸に小と等しいか大に分類する(_残り分類対象,_軸要素,_より小_2,_より大_2). 小と等しいか大に分類する(_要素,_軸要素,_より小,_より大,[_要素|_より小],_より大) :- _要素 @< _軸要素. 小と等しいか大に分類する(_要素,_軸要素,_より小,_より大,_より小,[_要素|_より大]) :- _要素 @>= _軸要素. % 以下のサイトは 小さい順に取り出す(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). % 以下のサイトは # 最大の利益 # 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 とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび). 時刻tに於ける価格ならびを得る(_時系列数,_時刻tに於ける価格ならび) :- findall(_価格,( 時刻tに於ける価格(_時系列数,_価格)),_時刻tに於ける価格ならび). 時刻tに於ける価格(_時系列数,_価格) :- between(1,_時系列数,_t), 価格を得る(_価格). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差)),_最大の為替差の利益). 為替差の利益(_時刻tに於ける価格ならび,_時刻tの投資に対する最大価格差) :- append(_,[_時刻tの価格|_その後の価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差)),_時刻tの投資に対する最大価格差). 時刻tの投資に対する価格差(_時刻tの価格,_その後の価格ならび,_時刻tの価格との価格差) :- member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格. 時系列数を得る(_時系列数) :- 数を得る(_時系列数). 価格を得る(_価格) :- 数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). 数を得る(_数) :- 行入力(_行), 数入力検査(_行,_数). 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). 数入力検査(_行,_数) :- read_term_from_atom(_行,_数,[]), number(_数). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは % 非決定性 シャッフルして一枚取り出す/4 シャッフルして一枚取り出す(_札,_既に取り出した札,_取り出す札,_残り札) :- シャッフル(_札,_シャッフルした札), append(_既に取り出した札,[_取り出す札|_残り札],_シャッフルした札). % 決定性 シャッフル/2 シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い(L,_乱数), 一個ずつ取り出して行く(L,_乱数,A,R2). 位置を示す乱数を使い(L,_乱数) :- length(L,Len), _乱数 is random(Len). 一個ずつ取り出して行く(L,_乱数,A,R2) :- 取り出して行く(L,_乱数,A,R1), シャッフル(R1,R2). 取り出して行く(L,_乱数,A,R1) :- nth0(_乱数,L,A), select(A,L,R1). % 以下のサイトは # 出典::出されたお題をコーディングして罵られるスレ #361 # お題:自然数Nが与えられたとき、Nの各桁の和をとり結果が一桁でなければ各桁の和 # をとることを繰り返す。最後の一桁の数を求めよ。 # 例 # 412205725 -> 4+1+2+2+0+5+7+2+5=28 # 28 -> 2+8=10 # 10 -> 1+0=1 '自然数Nが与えられたとき、Nの各桁の和をとり結果が一桁でなければ各桁の和をとることを繰り返す。最後の一桁の数を求めよ。'(N,N) :- N < 10,!. '自然数Nが与えられたとき、Nの各桁の和をとり結果が一桁でなければ各桁の和をとることを繰り返す。最後の一桁の数を求めよ。'(N,X) :- '一桁になるまで各桁の和をとる'(N,X). '一桁になるまで各桁の和をとる'(N,X) :- 'Nの各桁の和をとり'(N,0,N_2), '自然数Nが与えられたとき、Nの各桁の和をとり結果が一桁でなければ各桁の和をとることを繰り返す。最後の一桁の数を求めよ。'(N_2,X). 'Nの各桁の和をとり'(0,S,S) :- !. 'Nの各桁の和をとり'(N,S1,S) :- '一桁ずつ取り出して桁の和をとる'(N,S1,S). '一桁ずつ取り出して桁の和をとる'(N,S1,S) :- ひと桁を取り出して加算する(N,S1,N_1,S2), 'Nの各桁の和をとり'(N_1,S2,S). ひと桁を取り出して加算する(N,S1,N_1,S2) :- 最下位桁を取り出し加算する(N,S1,S2), 加算した桁を除去する(N,N_1). 最下位桁を取り出し加算する(N,S1,S2) :- M is N mod 10, S2 is S1 + M. 加算した桁を除去する(N,N_1) :- N_1 is N // 10. % 以下のサイトは 冪乗法(_底,_指数,_法,_冪) :- _法 < 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,_冪). 冪乗法(_底,_指数,_法,_冪,_冪). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 134代目 #154 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク):http://ime.nu/www.acm-japan.org/past-icpc/domestic2008/problems/all_ja.html # 等しい合計点 # # 太郎と花子はそれぞれカードを何枚か持っている. # 各カードには点数が書かれている.太郎のカードと花子のカードを 1 枚ずつ交換して, # それぞれの持つカードの合計点数が等しくなるようにしたい. # どのカードとどのカードを交換したらよいか. # # ただし,カードを交換しなくても合計点数が等しい場合でも,必ずカードの交換を行うものとする. # Input # 入力は,いくつかのデータセットからなる.各データセットは次の形式で与えられ # # n m # s1 # s2 # ... # 各データセットの最初の行は空白ひとつで区切られたふたつの数 n と m を含み, # n は太郎のカードの枚数,m は花子のカードの枚数を表す.続く n+m 行には, # 各カードの点数が 1 行にひとつずつ並ぶ. # 最初の n 個の点数 (s1 から sn まで) は太郎のカードの点数, # 残りの m 個の点数 (sn+1 から sn+m まで) は花子のカードの点数を表す. # n および m は 100 以下の正の整数とし,カードの点数は 0 以上 100 以下の整数値とする. # # 入力の終わりは,空白ひとつで区切られたふたつの 0 を含む 1 行で示される. '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくなるようにしたい' :- 太郎と花子の手札を読み込む(_太郎の手札ならび,_花子の手札ならび), '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくする'(_太郎の手札ならび,_花子の手札ならび,_太郎の手札から抜いた手札,_花子の手札から抜いた手札). 太郎と花子の手札を読み込む(_太郎の手札ならび,_花子の手札ならび) :- '行を入力し、空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数), '点数を入力し、太郎と花子に分配する'(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札ならび,_花子の手札ならび). '行を入力し、空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数) :- 行を文字コードとして読み取る(_文字コードならび), '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数). '空白を区切りに太郎の手札の枚数と花子の手札の枚数を得る'(_太郎の手札の枚数,_花子の手札の枚数) :- 行を文字コードとして読み取る(_文字コードならび), '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数). 行を文字コードとして読み取る(_文字コード) :- get_line_to_codes(user_input,_文字コード). 整数を得る(_整数) :- 行を得る(_行), 行を整数に変換する(_行,_整数). 行を整数に変換する(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). 行を得る(_行) :- get_line_to_codes(user_input,_文字コードならび), atom_codes(_行,文字コードならび). '空白のコードを区切りに、文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(_文字コードならび,_太郎の手札の枚数,_花子の手札の枚数) :- '空白のコードを区切りに、'(_文字コードならび,L1,L2), '文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(L1,L2,_太郎の手札の枚数,_花子の手札の枚数). '空白のコードを区切りに、'(_文字コードならび,L1,L2) :- append(L1,[32|L2],_文字コードならび). '文字コードならびを太郎の手札の枚数と花子の手札の枚数に変換する'(L1,L2,_太郎の手札の枚数,_花子の手札の枚数) :- number_codes(_太郎の手札の枚数,L1), number_codes(_花子の手札の枚数,L2). '点数を入力し、太郎と花子に分配する'(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札) :- 太郎と花子の手札を読み込む(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札). 太郎と花子の手札を読み込む(_太郎の手札の枚数,_花子の手札の枚数,_太郎の手札,_花子の手札) :- 太郎の手札を読み込む(_太郎の手札の枚数,_太郎の手札), 花子の手札を読み込む(_花子の手札の枚数,_花子の手札),!. 太郎の手札を読み込む(_太郎の手札の枚数,_太郎の手札) :- findnsols(_整数,_太郎の手札の枚数,( 連続して整数を読み込む(_整数)),_太郎の手札). 花子の手札を読み込む(_花子の手札の枚数,_花子の手札) :- findnsols(_整数,_花子の手札の枚数,( 連続して整数を読み込む(_整数)),_花子の手札). 連続して整数を読み込む(_整数) :- repeat, 整数を得る(_整数). '太郎の手札と花子の手札を 1 枚ずつ交換して,それぞれの持つ手札の合計点数が等しくする'(_太郎の手札,_差し替える太郎の手札,_花子の手札,_差し替える花子の手札,_等しい合計) :- '太郎の手札と花子の手札を 1 枚ずつ交換して'(_太郎の手札,_花子の手札,_差し替える太郎の手札,_差し替える花子の手札,_差し替えた太郎の手札,_差し替えた花子の手札), 合計点数が等しい(_差し替えた太郎の手札,_差し替えた花子の手札,_等しい合計). '太郎の手札と花子の手札を 1 枚ずつ交換して'(_太郎の手札,_花子の手札,_太郎の手札から抜いた手札,_花子の手札から抜いた手札,_差し替えた太郎の手札,_差し替えた花子の手札) :- select(_太郎の手札から抜いた手札,_太郎の手札ならび,_花子の手札から抜いた手札,_差し替えた太郎の手札ならび), select(_花子の手札から抜いた手札,_花子の手札,_太郎の手札から抜いた手札,_差し替えた花子の手札). 合計点数が等しい(_差し替えた太郎の手札,_差し替えた花子の手札,_等しい合計) :- sum_list(_差し替えた太郎の手札,_等しい合計), sum_list(_差し替えた花子の手札,_等しい合計). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nがmになる直前の変数nの値を求めよ # '1+2+3+....+nが_mになる直前の変数_nの値を求めよ'(_m,_n) :- once((nth1(_n,_,_),((_n + 2) * (_n + 1)) / 2 >= _m)). % 以下のサイトは 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 行列の2つの行を交換する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列) :- length(_行列,_行列の行数), '2つの行を交換しながら別に行列を生成する'(_行列,_行列の行数,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列). '2つの行を交換しながら別に行列を生成する'(_行列,_行列の行数,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行を交換した行列) :- findnsols(_生成された行,_行列の行数,( 行を生成する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行)),_2つの行を交換した行列),!. 行を生成する(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行) :- nth1(_nth1,_,_生成された行), '交換する行は交換し、そうでないものは行列から取得'(_行列,_nth1,_第何行_1,_第何行_2,_行_1,_行_2,_生成された行). '交換する行は交換し、そうでないものは行列から取得'(_,_nth1,_nth1,_,_,_行_2,_行_2) :- !. '交換する行は交換し、そうでないものは行列から取得'(_,_nth1,_,_nth1,_行_1,_,_行_1) :- !. '交換する行は交換し、そうでないものは行列から取得'(_行列,_nth1,_,_,_,_,_行) :- nth1(_nth1,_行列,_行). % 以下のサイトは 大きい順に取り出す(_ならび,_取り出すもの) :- 一番大きいもの(_ならび,_一番大きいもの,_残りならび), 大きい順に取り出す(_一番大きいもの,_残りならび,_取り出すもの). 一番大きいもの(_ならび,_一番大きいもの,_残りならび) :- select(_一番大きいもの,_ならび,_残りならび), 全ての残りならびの中のものは一番大きいものと等しいか小さい(_一番大きいもの,_残りならび),!. 全ての残りならびの中のものは一番大きいものと等しいか小さい(_一番大きいもの,_残りならび) :- forall(全ての残りならびの中のものは(_残りならび,_残りならびの中のもの),一番大きいものと等しいか小さい(_残りならびの中のもの,_一番大きいもの)). 全ての残りならびの中のものは(_残りならび,_残りならびの中のもの) :- member(_残りならびの中のもの,_残りならび). 一番大きいものと等しいか小さい(_残りならびの中のもの,_一番大きいもの) :- _残りならびの中のもの @=< _一番大きいもの. 大きい順に取り出す(_取り出すもの,_,_取り出すもの). 大きい順に取り出す(_,_残りならび,_取り出すもの) :- 大きい順に取り出す(_残りならび,_取り出すもの). % 以下のサイトは body {line-height: 158%;} --> # 出典 :: twitter_by_@pytoninfo_20160130 # # 深さ優先探索で躓いているpython初心者です。 # 部分和問題を深さ優先探索で解くことを考えています。 # 質問したいことはソースコードの部分で、アルゴリズムに対しての理解が足りないのか、 # pythonにたいしての理解が足りないのか、ネットに乗っているpythonのソースコードを見てもなにをやっているのかさっぱりわかりません。 # # 解きたい問題→a=[1.2.4.7]の中からいくつかの和でk=13が作れるかどうか判定しろ。 '[1,2,4,7]の部分和が13になる組合せがあるかどうか深さ優先で解く'(_組合せ) :- 組合せ数を1から4までの範囲で試行する(_組合せ数), 深さ優先で部分和が13になる組合せを取り出す([1,2,4,7],_組合せ数,_組合せ). 組合せ数を1から4までの範囲で試行する(_組合せ数) :- between(1,4,_組合せ数). 深さ優先で部分和が13になる組合せを取り出す(_候補ならび,_組合せ数,_組合せ) :- 深さ優先で組合せを取り出す(_候補ならび,_組合せ数,_組合せ), 部分和が13になる(_組合せ). 深さ優先で組合せを取り出す(_候補ならび,1,[_種]) :- '組合せ数の指定が1の時、候補ならびから1要素ずつ取り出し組合せの種にする'(_候補ならび,_種). 深さ優先で組合せを取り出す(_候補ならび,_組合せ数,_組合せ) :- '組合せ数の指定が1より大きいならば、候補ならびの各要素にそれより後の要素の組合せを付加していく'(_候補ならび,_組合せ数,_組合せ). '組合せ数の指定が1の時、候補ならびから1要素ずつ取り出し組合せの種にする'(_候補ならび,_種) :- member(_種,_候補ならび). '組合せ数の指定が1より大きいならば、候補ならびの各要素にそれより後の要素の組合せを付加していく'(_候補ならび,_組合せ数,_組合せ) :- _組合せ数 > 1, '候補ならびの各要素にそれより後の要素の組合せを付加していく'(_候補ならび,_組合せ数,_組合せ). '候補ならびの各要素にそれより後の要素の組合せを付加していく'(_候補ならび,_組合せ数,_組合せ) :- '先頭要素をそれより後の数字列を組合せたものと結合する'(_候補ならび,_組合せ数,_組合せ). '候補ならびの各要素にそれより後の要素の組合せを付加していく'([_|_残り候補ならび],_組合せ数,_組合せ) :- 深さ優先で組合せを取り出す(_残り候補ならび,_組合せ数,_組合せ),!. '先頭要素をそれより後の数字列を組合せたものと結合する'([_先頭要素|_残り候補ならび],_組合せ数,[_先頭要素|_残り組合せ]) :- succ(_減らした組合せ数,_組合せ数), 深さ優先で組合せを取り出す(_残り候補ならび,_減らした組合せ数,_残り組合せ). 部分和が13になる(_組合せ) :- sum_list(_組合せ,13). % 以下のサイトは body {line-height: 158%;} --> # 出典 :: twitter_by_@pytoninfo_20160130 # # 深さ優先探索で躓いているpython初心者です。 # 部分和問題を深さ優先探索で解くことを考えています。 # 質問したいことはソースコードの部分で、アルゴリズムに対しての理解が足りないのか、 # pythonにたいしての理解が足りないのか、ネットに乗っているpythonのソースコードを見てもなにをやっているのかさっぱりわかりません。 # # 解きたい問題→a=[1.2.4.7]の中からいくつかの和でk=13が作れるかどうか判定しろ。 '[1,2,4,7]の部分和が13になる組合せがあるかどうか深さ優先で解く'(_組合せ) :- 組合せ数を1から4までの範囲で試行する(_組合せ数), 深さ優先で部分和が13になる組合せを取り出す([1,2,4,7],_組合せ数,_組合せ). 組合せ数を1から4までの範囲で試行する(_組合せ数) :- between(1,4,_組合せ数). 深さ優先で部分和が13になる組合せを取り出す(L,_組合せ数,_組合せ) :- 深さ優先で組合せを取り出す(L,_組合せ数,_組合せ), 部分和が13になる(_組合せ). 深さ優先で組合せを取り出す(L,1,[A]) :- '取り出し数の指定が1の時、Lから1要素ずつ取り出し組合せの種にする'(L,A). 深さ優先で組合せを取り出す(L1,N,L2) :- N > 1, 深さ優先で組合せる(L1,N,L2). '取り出し数の指定が1の時、Lから1要素ずつ取り出し組合せの種にする'(L,A) :- member(A,L). 深さ優先で組合せる([A|R1],N,[A|R2]) :- succ(N_1,N), 深さ優先で組合せを取り出す(R1,N_1,R2). 深さ優先で組合せる([_|R1],N,R2) :- 深さ優先で組合せを取り出す(R1,N,R2). 部分和が13になる(_組合せ) :- sum_list(_組合せ,13). % 以下のサイトは body {line-height: 158%;} --> # 出典 :: twitter_by_@pytoninfo_20160130 # # 深さ優先探索で躓いているpython初心者です。 # 部分和問題を深さ優先探索で解くことを考えています。 # 質問したいことはソースコードの部分で、アルゴリズムに対しての理解が足りないのか、 # pythonにたいしての理解が足りないのか、ネットに乗っているpythonのソースコードを見てもなにをやっているのかさっぱりわかりません。 # # 解きたい問題→a=[1.2.4.7]の中からいくつかの和でk=13が作れるかどうか判定しろ。 '[1,2,4,7]の部分和が13になる組合せがあるかどうか深さ優先で解く'(_組合せ) :- 組合せ数を1から4までの範囲で試行する(_組合せ数), 深さ優先で部分和が13になる組合せを取り出す([1,2,4,7],_組合せ数,_組合せ). 組合せ数を1から4までの範囲で試行する(_組合せ数) :- between(1,4,_組合せ数). 深さ優先で部分和が13になる組合せを取り出す(L,_組合せ数,_組合せ) :- 深さ優先で組合せを取り出す(L,_組合せ数,_組合せ), 部分和が13になる(_組合せ). 深さ優先で組合せを取り出す(L,1,[A]) :- '取り出し数の指定が1の時、Lから1要素ずつ取り出し組合せの種にする'(L,A). 深さ優先で組合せを取り出す(L1,N,L2) :- N > 1, 深さ優先で組合せる(L1,N,L2). '取り出し数の指定が1の時、Lから1要素ずつ取り出し組合せの種にする'(L,A) :- member(A,L). 深さ優先で組合せる([A|R1],N,[A|R2]) :- succ(N_1,N), 深さ優先で組合せを取り出す(R1,N_1,R2). 深さ優先で組合せる([_|R1],N,R2) :- 深さ優先で組合せを取り出す(R1,N,R2). 部分和が13になる(_組合せ) :- sum_list(_組合せ,13). % 以下のサイトは '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,_度数). % 以下のサイトは %% 4.16 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]), M=N,!. fizzbuzz(M_1,M,L,[]) :- fizzbuzz(M_1,M,L,L). fizzbuzz(M,M,L,[A|R]) :- writef('%w ',[A]). fizzbuzz(M_1,M,L,[_|R]) :- succ(M_1,M_2), fizzbuzz(M_2,M,L,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/505 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): #  キーボードから正負の整数をデタラメに入力し、整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ # 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数の和,_5つの正の整数の平均) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'([],_5つの正の整数ならび), 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび,_正の整数ならび) :- 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび),!. 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび). 'その個数が5個になったら入力を受け付けず、'(_正の整数ならび) :- length(_正の整数ならび,5). 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になるまで入力を続ける'(_正の整数ならび_1,_正の整数ならび) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数), '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2), 'キーボードから正負の整数をデタラメに入力し、正の整数のみをリストに格納し、その個数が5個になったら入力を受け付けず、'(_正の整数ならび_2,_正の整数ならび). 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 整数を入力する(_整数),!. 'キーボードから正負の整数をデタラメに入力し、'(_整数) :- 'キーボードから正負の整数をデタラメに入力し、'(_整数). 整数を入力する(_整数) :- 行入力(_行), '診断 :: 整数'(_行,_整数). '診断 :: 整数'(_行,_整数) :- read_term_from_atom(_行,_整数,[]), integer(_整数). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_2) :- _整数 >= 0, append(_正の整数ならび_1,[_整数],_正の整数ならび_2). '正の整数のみをリストに格納し、'(_整数,_正の整数ならび_1,_正の整数ならび_1) :- _整数 < 0. 'その5つの正の整数の和と平均を求めるプログラムを作れ、平均は小数点以下一位まで求めろ'(_5つの正の整数ならび,_5つの正の整数の和,_5つの正の整数の平均) :- sum_list(_5つの正の整数ならび,_5つの正の整数の和), _5つの正の整数の平均 is floor((_5つの正の整数の和 / 5) * 10 + 0.5) / 10. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: 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',[_文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 143代目 #7 # [1] 授業単元:プログラミング # [2] 問題文 # ・キーボードから入力した三つの整数値の平均値を求めるプログラムを作成しなさい。 # ただし、平均値を求める関数 float ave(int a,int b) # を利用すること。 % % ave()の代わりに述語 二項平均/3 を使うこととする。 % キーボードから入力した三つの整数値の平均値を求める :- 三つの整数値を得る(_整数の一,_整数の二,_整数の三), 三項平均を二項平均だけから求める(100,_整数の一,_整数の二,_整数の三,_平均値), 平均値表示(_平均値). 三つの整数値を得る(_整数の一,_整数の二,_整数の三) :- キーボードから入力した整数値(_整数の一), キーボードから入力した整数値(_整数の二), キーボードから入力した整数値(_整数の三). 三項平均を二項平均だけから求める(N,_平均値の一,_平均値の二,_平均値の三,_平均値) :- '終了条件::三つの平均値が一致した時か、Nが0に至った時'(N,_平均値の一,_平均値の二,_平均値の三,_平均値),!. 三項平均を二項平均だけから求める(N,_整数の一,_整数の二,_整数の三,_平均値) :- '終了条件に達するまで、三項平均を二項平均だけから求める'(N,_整数の一,_整数の二,_整数の三,_平均値). '終了条件::三つの平均値が一致した時か、Nが0に至った時'(_,_平均値,_平均値,_平均値,_平均値). '終了条件::三つの平均値が一致した時か、Nが0に至った時'(0,_平均値,_,_,_平均値). '終了条件に達するまで、三項平均を二項平均だけから求める'(N,_整数の一,_整数の二,_整数の三,_平均値) :- 三項の組合せに対して二項平均を取る(_整数の一,_整数の二,_整数の三,_二項平均の一,_二項平均の二,_二項平均の三), succ(N_1,N), 三項平均を二項平均だけから求める(N_1,_二項平均の二,_二項平均の三,_二項平均の一,_平均値). 三項の組合せに対して二項平均を取る(_整数の一,_整数の二,_整数の三,_二項平均の一,_二項平均の二,_二項平均の三) :- 二項平均(_整数の一,_整数の二,_二項平均の一), 二項平均(_整数の一,_整数の三,_二項平均の二), 二項平均(_整数の二,_整数の三,_二項平均の三). 二項平均(_第一項,_第二項,_二項平均) :- _二項平均 is (_第一項 + _第二項) / 2. 平均値表示(_平均値) :- writef('平均値は %t です。\n',[_平均値]). キーボードから入力した整数値(_整数) :- write('整数を入力してください : '), 行入力(Line), キーボードから入力した整数値診断(Line,_整数),!. キーボードから入力した整数値(_整数) :- キーボードから入力した整数値(_整数). キーボードから入力した整数値診断(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. キーボードから入力した整数値診断(Line,_整数) :- writef('入力された %t からは整数は得られません。再入力をお願いします。\n',[Line]), fail. 行入力(_行) :- read_line_to_codes(user_input,Codes), atom_codes(_行,Codes). % 以下のサイトは # 出典:: 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(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび). 次の手番(○,×). 次の手番(×,○). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 #644 # # お題:硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 # 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 # 内訳は各硬貨の枚数を並べたものとする。 # 複数の解がある場合はすべてを求める。 # 例 # 11枚で1082円のとき # 2 0 1 0 6 2 # # 12枚で777円のとき # 1 0 5 1 3 2 # 1 1 3 0 5 2 # # 25枚で4999円のとき # 9 2 5 4 1 4 # 9 3 3 3 3 4 # 9 4 1 2 5 4 '硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 内訳は各硬貨の枚数を並べたものとする。 複数の解がある場合はすべてを求める。'(_n,_k,_500,_100,_50,_10,_5,_1) :- '硬貨がn枚あり、'(_n,_硬貨ならび), 'その内訳を求める。'(_硬貨ならび,_500,_100,_50,_10,_5,_1), '合計金額がk円のとき、'(_k,_500,_100,_50,_10,_5,_1). '硬貨がn枚あり、'(_n,_硬貨ならび) :- findall(_,between(1,_n,_),_硬貨ならび). 'その内訳を求める。'(_硬貨ならび,_500,_100,_50,_10,_5,_1) :- '6種類に分割された'(_硬貨ならび,L1,L2,L3,L4,L5,L6), '6種類に分割された硬貨の内訳'([L1,L2,L3,L4,L5,L6],[_500,_100,_50,_10,_5,_1]). '6種類に分割された'(_硬貨ならび,L1,L2,L3,L4,L5,L6) :- append([L1,L2,L3,L4,L5,L6],_硬貨ならび). '6種類に分割された硬貨の内訳'([],[]). '6種類に分割された硬貨の内訳'([L|R1],[_枚数|R2]) :- length(L,_枚数), '6種類に分割された硬貨の内訳'(R1,R2). '合計金額がk円のとき、'(_k,_500,_100,_50,_10,_5,_1) :- _k is 500 * _500 + 100 * _100 + 50 * _50 + 10 * _10 + 5 * _5 + 1 * _1. % 以下のサイトは partition([],_,[],[]). partition(L,Pivot,Smalls,Bigs) :- 'Lの全ての要素をピボットと比較して振り分ける'(L,Pivot,Smalls,Bigs). 'Lの全ての要素をピボットと比較して振り分ける'([X|Xs],Pivot,Smalls,Bigs) :- 'Xをピボットと比較して振り分ける'(X,Pivot,XsのSmalls,XsのBigs,Smalls,Bigs), partition(Xs,Pivot,XsのSmalls,XsのBigs). 'Xをピボットと比較して振り分ける'(X,Pivot,Smalls,Bigs,[X|Smalls],Bigs) :- X @< Pivot,!. 'Xをピボットと比較して振り分ける'(X,Pivot,Smalls,Bigs,Smalls,[X|Bigs]) :- X @>= Pivot. % 以下のサイトは 紊紿紮茖ゅ頳(絲榊育檎,傑,茖ゅ,). 紊紿紮茖ゅ頳(罠私蘊絖,絅恰,茵水,). 紊紿紮茖ゅ頳(臂,傑,茖ゅ,). 紊紿紮茖ゅ頳(絏♂篁e,絅恰,絖,). 紊紿紮茖ゅ頳(紊ц扱綵,傑,綣茘桁,). 紊紿紮茖ゅ頳(紊ф罩f,傑,綣茘桁,). 紊紿紮茖ゅ頳(絮掩畿罔,傑,綣茘桁,). 紊紿紮茖ゅ頳(絨顙割拭,傑,罎絲絎,). 紊紿紮茖ゅ頳(薔寂幻,絅恰,綣茘桁,). 紊紿紮茖ゅ頳(腑,傑,綣茘桁,). 紊紿紮茖ゅ頳(絮掩綺後晃,傑,茵水,). 紊紿紮茖ゅ頳(絮怨,傑,茖ゅ,). 紊紿紮茖ゅ頳(羆筝水晃,傑,罎絲絎,). 紊紿紮茖ゅ頳(紊ц扱岩査,傑,茖ゅ,). 紊紿紮茖ゅ頳(絨閺茖,傑,茖ゅ,). '絅恰'. 紊紿紮茖ゅ頳('絲榊育檎 (茖ゅ)',''). 紊紿紮茖ゅ頳('罠私蘊絖 (茵水)','') :- '絅恰'. 紊紿紮茖ゅ頳('臂 (茖ゅ)',''). 紊紿紮茖ゅ頳('絏♂篁e (絖)','') :- '絅恰'. 紊紿紮茖ゅ頳('紊ц扱綵 (綣茘桁)',''). 紊紿紮茖ゅ頳('紊ф罩f (綣茘桁)',''). 紊紿紮茖ゅ頳('絮掩畿罔 (綣茘桁)',''). 紊紿紮茖ゅ頳('絨顙割拭 (罎絲絎)',''). 紊紿紮茖ゅ頳('薔寂幻 (綣茘桁)','') :- '絅恰'. 紊紿紮茖ゅ頳('腑 (綣茘桁)',''). 紊紿紮茖ゅ頳('絮掩綺後晃 (茵水)',''). 紊紿紮茖ゅ頳('絮怨 (茖ゅ)',''). 紊紿紮茖ゅ頳('羆筝水晃 (罎絲絎)',''). 紊紿紮茖ゅ頳('紊ц扱岩査 (茖ゅ)',''). 紊紿紮茖ゅ頳('絨閺茖 (茖ゅ)',''). 紊紿紮<ゆ筝眼у(_у) :- уャ冴(_у), <ゆ筝眼у(_у). уャ冴(_у) :- уャ(_уャ), 冴(_уャ,_у). уャ(_уャ) :- setof(_у,[_茖ゅ,_у,_肴昆,_ゆ] ^ 紊紿紮茖ゅ頳(_茖ゅ,_у,_肴昆,_ゆ),_уャ). 冴(_уャ,_у) :- member(_у,_уャ). <ゆ筝眼у(_у) :- <ゆ(_у,_<ゆ), 筝眼(_<ゆ,_). <ゆ(_у,_<ゆ) :- findall(_ゆ,( 紊紿紮茖ゅ頳(_,_у,_,_ゆ)),_<ゆ). 筝眼([_ゆ],_ゆ). 筝眼([_ゆ|R],_ゆ), 筝眼(R,_ゆ). ?- 紊紿紮茖ゅ頳(X,''). X = '罠私蘊絖 (茵水)'; X = '絮掩畿罔 (綣茘桁)'; X = '絏♂篁e (絖)'; X = '薔寂幻 (綣茘桁)'; false. ?- 紊紿ュ茖ゅ頳(_茖ゅ,絅恰,綣茘桁,_蚊蚊). _茖ゅ = 薔寂幻, _蚊蚊 = ; false. ?- findall(_茖ゅ,紊紿紮茖ゅ頳(_茖ゅ,_,_,),_我頳菴違鴻茖ゅ). _我頳菴違鴻茖ゅ = [絲榊育檎,臂,紊ц扱綵,紊ф罩f,絨顙割拭,絮掩綺後晃,絮怨,羆筝水晃,紊ц扱岩査,絨閺茖]. ?- 紊紿紮<ゆ筝眼у(_у) :- _у = 絅恰; false. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/905 # # [1]c++ # [2]2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。 # また、対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。 # ただし、対角要素は左上隅から右下隅への対角線上の要素とする。次の図は実行例であ る。 # --- (2)配列nの内容 --- # # 100000000 # 010000000 # 001000000 # 000100000 # 000010000 # 000001000 # 000000100 # 000000010 # 000000001 '2次元配列n[10][10]のすべての要素に1を代入してから、その内容を表示しなさい。' :- '2次元配列n[10][10]のすべての要素に1を代入してから'(LL), 'その内容を表示しなさい。'(LL). '2次元配列n[10][10]のすべての要素に1を代入してから'(LL) :- findall(_行,( '10行ある', '10要素の行のすべての要素に1を代入'(_行)),LL). '10行ある' :- between(1,10,_). '10要素の行のすべての要素に1を代入'(_行) :- '10要素の行の'(_行), すべての要素に1を代入(_行). '10要素の行の'(_行) :- length(_行,10). すべての要素に1を代入([]). すべての要素に1を代入([1|R]) :- すべての要素に1を代入(R). 'その内容を表示しなさい。'(LL) :- 表示しなさい(LL). 表示しなさい(LL) :- forall(行を表示文字列に変換する(LL,_表示文字列),writef('%w\n',[_表示文字列])). 行を表示文字列に変換する(LL,_表示文字列) :- member(_行,LL), atomic_list_concat(_行,' ',_表示文字列). '対角要素だけを1を代入し、ほかはすべて0を代入してから、表示しなさい。' :- 対角要素だけ1を代入しほかは全て0を代入してから(LL), 表示しなさい(LL). 対角要素だけ1を代入しほかは全て0を代入してから(LL) :- findall(L,( between(1,10,_n), 対角要素だけ1を代入しほかは全て0を代入(_n,L)),LL). 対角要素だけ1を代入しほかは全て0を代入(_n,L) :- 対角要素だけ1を代入し(_n,L), 他の全ての変数要素は0に(L). 対角要素だけ1を代入し(_n,L) :- length(L,10), reverse(L,RL), 対角要素だけ1を代入し(_n,RL,L). 対角要素だけ1を代入し(_n,RL,L) :- nth1(_n,L,1), nth1(_n,RL,1). 他の全ての変数要素は0に(L) :- findall(N,( member(N,L), 変数要素は0に(N)),L). 変数要素は0に(0) :- !. 変数要素は0に(N). % 以下のサイトは # # 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). % 以下のサイトは # # 篩に掛ける/5 再帰版 # # _副目標が真になったものは篩に掛かる # 篩に掛ける([],_,_,[],[]) :- !. 篩に掛ける(L1,_要素,_副目標,_篩に引っ掛った要素ならび,_篩に掛けられた要素ならび) :- 'L1の要素を順に篩に掛ける'(L1,_要素,_副目標,_篩に引っ掛った要素ならび,_篩に掛けられた要素ならび). 'L1の要素を順に篩に掛ける'(L1,_要素,_副目標,L2,L3) :- 篩に掛ける準備(L1,_要素,_副目標,_要素_2,_副目標_2,R1), 篩(R1,_要素,_副目標,R2,R3,L2,L3), 篩に掛ける(R1,_要素_2,_副目標_2,R2,R3). 篩に掛ける準備(L1,_要素,_副目標,_要素_2,_副目標_2,R1) :- copy_term((_要素,_副目標),(_要素_2,_副目標_2)), L1=[_要素|R1]. 篩(R1,_要素,_副目標,R2,R3,[_要素|R2],R3) :- call(_副目標),!. 篩(R1,_要素,P,R2,R3,R2,[_要素|R3]). ?- 篩に掛ける([1,2,3,4],_要素,0 is _要素 mod 2,L1,L2). _要素 = 1, L1 = [2, 4], L2 = [1, 3]. ?- % 以下のサイトは 非決定性の素数生成(_限界値,_素数) :- 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. % 以下のサイトは # 出典 :: # f(0,b)=b+1 # f(a,0)=f(a-1,1) # f(a,b)=f(a-1,f(a,b-1)) :- dynamic(f/3). f(0,_2,_x) :- succ(_2,_x). f(_1,0,_x) :- succ(_1_1,_1), f(_1_1,1,_x), asserta((f(_1_1,1,_x) :- !)),!. f(_1,_2,_x) :- succ(_2_1,_2), f(_1,_2_1,_y), asserta((f(_1,_2_1,_y) :- !)), succ(_1_1,_1), f(_1_1,_y,_x), assertz((f(_1_1,_y,_x) :- !)),!. % 以下のサイトは # 要素の和集合って結構手順面倒なんじゃね… 和集合(L1,L2,_和集合) :- 初出要素のみ収集(L1,[],L3), 初出要素のみ収集(L2,L3,_和集合). 初出要素のみ収集([],L,L). 初出要素のみ収集([A|R1],L2,L) :- member(A,L2), 初出要素のみ収集(R1,L2,L). 初出要素のみ収集([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,_,_文字)). % 以下のサイトは # 出典 :: # f(0,b)=b+1 # f(a,0)=f(a-1,1) # f(a,b)=f(a-1,f(a,b-1)) f(0,_2,_x) :- succ(_2,_x). f(_1,0,_x) :- succ(_1_1,_1), f(_1_1,1,_x). f(_1,_2,_x) :- succ(_2_1,_2), f(_1,_2_1,_y), succ(_1_1,_1), f(_1_1,_y,_x). % 以下のサイトは # 出典 :: # f(0,b)=b+1 # f(a,0)=f(a-1,1) # f(a,b)=f(a-1,f(a,b-1)) f(0,_2,_x) :- succ(_2,_x). f(_1,_2,_x) :- '_1が0でない時は、fの実行'(_1,_2,_x). '_1が0でない時は、fの実行'(_1,0,_x) :- '_1から1引き、_2を1で実行'(_1,_,_x). '_1が0でない時は、fの実行'(_1,_2,_x) :- '_1をそのままに_2から1引いたfを実行し_yを得て、これを第二引数,_1から1引いたものを第一引数でfを実行'(_1,_2,_x). '_1から1引き、_2を1で実行'(_1,_,_x) :- succ(_1_1,_1), f(_1_1,1,_x). '_1をそのままに_2から1引いたfを実行し_yを得て、これを第二引数,_1から1引いたものを第一引数でfを実行'(_1,_2,_x) :- '_1をそのままに_2から1引いたfを実行し_yを得て、'(_1,_2,_y), 'これを第二引数,_1から1引いたものを第一引数でfを実行'(_1,_y,_x). '_1をそのままに_2から1引いたfを実行し_yを得て、'(_1,_2,_y) :- succ(_2_1,_2), f(_1,_2_1,_y). 'これを第二引数,_1から1引いたものを第一引数でfを実行'(_1,_y,_x) :- succ(_1_1,_1), f(_1_1,_y,_x). ?- f(3,3,_x). _x = 61; false. % 以下のサイトは '2文字の抽出とその出現頻度を求める'(_文字列,_抽出された出現頻度付きの2文字ならび) :- '2文字の抽出と'(_文字列,_抽出された2文字ならび), その出現頻度を求める(_文字列,_抽出された2文字ならび,_抽出された出現頻度付きの2文字ならび). '2文字の抽出と'(_文字列,_抽出された2文字ならび) :- setof(_2文字,[_文字列,S,R,_2文字] ^ sub_atom(_文字列,S,2,R,_2文字),_抽出された2文字ならび). その出現頻度を求める(_文字列,_抽出された2文字ならび,_抽出された出現頻度付きの2文字ならび) :- findall([_2文字,_出現頻度],( member(_2文字,_抽出された2文字ならび), 出現頻度(sub_atom(_文字列,_,2,_,_2文字),_出現頻度)),_抽出された出現頻度付きの2文字ならび). 出現頻度(P,_出現頻度) :- findall(1,P,L), length(L,_出現頻度). % 以下のサイトは '2つの文字列の先頭から一致する文字数を返す'(_文字列_1,_文字列_2,_先頭から一致する文字数) :- findall(_先頭から一致する文字数, 先頭から一致する文字数(_文字列_1,_文字列_2,_先頭から一致する文字数),_先頭から一致する文字数ならび), 最大長(_先頭から一致する文字数ならび,_先頭から一致する文字数). 先頭から一致する文字数(_文字列_1,_文字列_2,先頭から一致する文字数) :- sub_atom(_文字列_1,0,先頭から一致する文字数,_,_先頭から一致する副文字列), sub_atom(_文字列_2,0,先頭から一致する文字数,_,_先頭から一致する副文字列). 最大長(L,_最大長) :- max_list(L,_最大長). % 以下のサイトは '2つの文字列の先頭から一致する文字数を返す'(_文字列_1,_文字列_2,_先頭から一致する文字数) :- findall(_長さ,先頭から一致する文字数(_文字列_1,_文字列_2,_長さ),_長さならび), max_list(_長さならび,_先頭から一致する文字数). 先頭から一致する文字数(_文字列_1,_文字列_2,_長さ) :- sub_atom(_文字列_1,0,_長さ,_,_副文字列), sub_atom(_文字列_2,0,_長さ,_,_副文字列). % 以下のサイトは ナップサック問題(N,_許容最大重量,_重さならび,_詰め方,_詰めることのできる最大重量) :- 許容最大重量内の全ての詰め方の組合せを得る(N,_許容最大重量,_重さならび,LL), 詰めることのできる最大重量を得る(LL,_詰めることのできる最大重量), 選択位置ならびから詰め方を得る(_重さならび,LL,_詰めることのできる最大重量,_詰め方). 許容最大重量内の全ての詰め方の組合せを得る(N,_許容最大重量,_重さならび,LL) :- findall([_詰め方,_選択位置ならび],詰め物の作成(N,_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ),LL). 詰め物の作成(N,_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の詰め方と詰めた重さ(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ). 許容最大重量内の詰め方と詰めた重さ(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ) :- 許容最大重量内の選択位置ならび(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,_詰めた重さ). 許容最大重量内の選択位置ならび(_許容最大重量,_重さならび,_冪集合,_選択位置ならび,詰めた重さ) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび,_詰めた重さ) :- '集合の重量合計は'(_選択位置ならび,_重さならび,_詰めた重さ), _詰めた重さ =< _許容最大重量. '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_選択位置ならび), nth1(_要素,_重さならび,Wi)),_合計重量). 詰めることのできる最大重量を得る(LL,_詰めることのできる最大重量) :- findmax(_詰めた重さ,member([_,_詰めた重さ],LL),_詰めることのできる最大重量). 選択位置ならびから詰め方を得る(_重さならび,LL,_詰めることのできる最大重量,_詰め方) :- member([_選択位置ならび,_詰めることのできる最大重量],LL), findall(_重さ,( member(_位置,_選択位置ならび), nth1(_位置,_重さならび,_重さ)),_詰め方). 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは ナップサック問題(N,_許容最大重量,_重さならび,_価格ならび,_詰めることのできる最高合計金額) :- findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_選択位置ならび,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_選択位置ならび,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_選択位置ならび,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_選択位置ならび), 集合の合計価格(_選択位置ならび,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_選択位置ならび) :- member(_選択位置ならび,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_選択位置ならび) :- '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_選択位置ならび,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_選択位置ならび), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは バイナリファイル (標準入力) に一致しました % 以下のサイトは # 出典 :: 現在はリンクが切れています (レス番号110) # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の学籍番号が小さいデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_降順に整列した成績鍵ならび,_学籍番号,_成績) :- '降順に整列した成績鍵から'(_降順整列した成績鍵ならび,_成績), '_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_成績,_学籍番号). '降順に整列した成績鍵から'(_降順整列した成績鍵ならび,_成績) :- member(_成績,_降順に整列した成績鍵ならび). '_学籍番号_成績を取り出す。ただし同点の場合は学籍番号の小さい順に取り出す。'(_成績,_学籍番号) :- setof(_学籍番号_1,[_学籍番号_1,_成績] ^ 成績表(_学籍番号_1,_成績),L), member(_学籍番号,L). 上位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] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の学籍番号が小さいデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 学籍番号を鍵に昇順に整列した成績ならび(_学籍番号を鍵に昇順に整列した成績ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび,_学籍番号を鍵に昇順に整列した成績ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 学籍番号を鍵に昇順に整列した成績ならび(_学籍番号を鍵に昇順に整列した成績ならび) :- setof([_学籍番号,_成績],[_学籍番号,_成績] ^ 成績(_学籍番号,_成績),_学籍番号を鍵に昇順に整列した成績ならび). 上位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] 問題文(含コード&リンク): # 述語 成績表は学籍番号と成績を引数として持つ。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,述語の定義位置が上位のデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 成績上位11名 :- 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび), 上位11名を選別して表示する(_降順に整列した成績鍵ならび). 降順に整列した成績鍵ならび(_降順に整列した成績鍵ならび) :- setof(_成績,[_学籍番号,_成績] ^ 成績表(_学籍番号,_成績),_整列した成績鍵ならび), reverse(_整列した成績鍵ならび,_降順に整列した成績鍵ならび). 上位11名を選別して表示する(_降順に整列した成績鍵ならび) :- once(上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名)), 上位11名を表示する(_上位11名). 上位11名を選別する(_降順に整列した成績鍵ならび,_上位11名ならび) :- findnsols(11,[_学籍番号,_成績], '降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号,_成績),_上位11名ならび). '降順に整列した成績鍵から_学籍番号_成績を取り出す'(_降順に整列した成績鍵ならび,_学籍番号,_成績) :- member(_成績,_降順に整列した成績鍵ならび), 成績表(_学籍番号,_成績). 上位11名を表示する(_上位11名ならび) :- forall(member([A,B],_上位11名ならび),writef('%w %w\n',[A,B])). % 以下のサイトは % Prolog 音高という話がでてきたところで、持続時間について書いてみる。 持続時間(しばし,_持続時間) :- しばし(_持続時間). しばし(道の辺に清水ながるる柳蔭しばしとてこそ立ちとまりつれ). しばし(春の夜の夢の浮橋とだえして峰にわかるる横雲の空). % 以下のサイトは # 出典:: 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. % 以下のサイトは # 10個の桃を6人で分ける時、分け方のパターンをすべて出力する :- op(750,xfx,すべて). :- op(600,xfx,を). :- op(500,xf,で). :- op(650,xf,分ける). '10個の桃を6人で分ける時、分け方のパターンをすべて出力する' :- '10個の桃を6人で分ける時、分け方のパターンを'(_6人) すべて 出力する(_6人). '10個の桃を6人で分ける時、分け方のパターンを'(_6人) :- '10個の桃'(_10個の桃), '6人'(_6人), _10個の桃 を _6人 で 分ける. '10個の桃'([桃,桃,桃,桃,桃,桃,桃,桃,桃,桃]). '6人'([_1,_2,_3,_4,_5,_6]). 出力する(_6人) :- writef('%w, %w, %w, %w, %w, %w\n',_6人). Q1 すべて Q2 :- forall(Q1,Q2). L を LL で 分ける :- append(LL,L). % 以下のサイトは # 10個の桃を6人で分ける時、分け方のパターンをすべて出力する :- op(750,xfx,すべて). '10個の桃を6人で分ける時、分け方のパターンをすべて出力する' :- '10個の桃を6人で分ける時、分け方のパターンを'(_1,_2,_3,_4,_5,_6) すべて 出力する(_1,_2,_3,_4,_5,_6). '10個の桃を6人で分ける時、分け方のパターンを'(_1,_2,_3,_4,_5,_6) :- append([_1,_2,_3,_4,_5,_6],[桃,桃,桃,桃,桃,桃,桃,桃,桃,桃]). 出力する(_1,_2,_3,_4,_5,_6) :- writef('%w, %w, %w, %w, %w, %w\n',[_1,_2,_3,_4,_5,_6]). Q1 すべて Q2 :- forall(Q1,Q2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/456 # # [1] 授業単元: C++ # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10195.txt # # 今回はナップサック問題について考えプログラムを作成する。N個の荷物があって、個々の荷物の重さをWi、値段をPiとする。但しiは1からNの整数を意味する。 # 袋には最大Wの重さまで入れられるとすると、最大でいくら分を入れることができるか?という問題。 # データファイルは、始めの一行に荷物の個数Nが書かれており、次に重さが整数でN行分書かれている。その次の行からN行分、それぞれの荷物の価値が書かれているとする。 # 下のデータファイルの場合は、3個の荷物があり、重みは10、20、13、で # それぞれの値段は23、23、10という状況を表す。 # ------------------- # 3 # 10 # 20 # 13 # 23 # 23 # 10 # ------------------- # 荷物の重みと値段はともに、1から100までの乱数で与えることとする。 # void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている # ファイル名のファイルを開き、そこにデータを記録する。void_read_data_file(char*file)という関数を呼ぶと、文字列変数fileによって名前が指定されたファイルを開き、大域変数の荷物の重み配列W[]と値段配列[]\\\\\にデータを入力する。 '荷物の重みと値段はともに、1から100までの乱数で与えることとする。 void_write_data_file(char*file,intN)という関数を呼ぶとN個分のデータを乱数で生成し、文字列変数fileに入っている ファイル名のファイルを開き、そこにデータを記録する。'(_ファイル名,N) :- ファイル名のファイルを開き(_ファイル名), 'そこにデータを記録する。'(N), ファイルを閉じる. ファイル名のファイルを開き(_ファイル名) :- tell(_ファイル名). 'そこにデータを記録する。'(N) :- writef('%w\n',[N]), forall((between(1,N,_),X is random(100) + 1),writef('%w\n',[X])), forall((between(1,N,_),Y is random(100) + 1),writef('%w\n',[Y])). ファイルを閉じる :- told. ナップサック問題(_ファイル名,N,_許容最大重量,_詰めることのできる最高合計金額) :- データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび), findmax(_合計価格,詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_,_合計価格),_詰めることのできる最高合計金額). データファイルから重さならびと価格ならびを得る(_ファイル名,N,_重さならび,_価格ならび) :- データファイルから読み出す(_ファイル名,N,_整数ならび), 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび). データファイルから読み出す(_ファイル名,N,L1) :- see(_ファイル名), get_integer(N), get_integers(L1), seen. 重さならびと価格ならびに分離(N,_整数ならび,_重さならび,_価格ならび) :- length(_重さならび,N), length(_価格ならび,N), append(_重さならび,_価格ならび,_整数ならび). 詰め物の作成(N,_許容最大重量,_重さならび,_価格ならび,_集合,_合計価格) :- findall(M,between(1,N,M),L), 冪集合(L,_冪集合), 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格). 許容最大重量内の集合の合計価格(_許容最大重量,_重さならび,_価格ならび,_冪集合,_集合,_合計価格) :- 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合), 集合の合計価格(_集合,_価格ならび,_合計価格). 許容最大重量内の集合(_許容最大重量,_重さならび,_冪集合,_集合) :- member(_集合,_冪集合), '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合). '集合の重量合計は許容最大重量内'(_許容最大重量,_重さならび,_集合) :- '集合の重量合計は'(_集合,_重さならび,_合計重量), _合計重量 =< _許容最大重量. '集合の重量合計は'(_集合,_重さならび,_合計重量) :- findsum(Wi,( member(_要素,_集合), nth1(_要素,_重さならび,Wi)),_合計重量). 集合の合計価格(_集合,_価格ならび,_合計価格) :- findsum(Pi,( member(_要素,_集合), nth1(_要素,_価格ならび,Pi)),_合計価格). get_integers(L) :- findall(I,(repeat,get_line(Line),(Line=end_of_file,!,fail;read_term_from_atom(Line,I,[]))),L),!. 冪集合(_対象集合,_冪集合) :- findall(_部分集合,( 部分集合(_対象集合,_部分集合)),_冪集合). 部分集合([], []). 部分集合([_|R1], LL) :- 部分集合(R1,LL). 部分集合([L|R1], [L|R2]) :- 部分集合(R1,R2). get_integer(N) :- get_line(Line), read_term_from_atom(Line,N,[]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findmax(A,B,C) :- findall(A,B,L), max_list(L,C). % 以下のサイトは # 出典 :: Prologの宿題片付けます # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 売上(稲葉,'20140228'). 売上(尾崎,'20140227'). 売上(稲葉,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140228'). 社員(尾崎). 社員(稲葉). 全社員が売上を記録した日を求めよ(_全社員が売上を記録した日) :- 社員ごとの売上日ならび(_社員ごとの売上日ならび), ならびに共通して存在する要素(_社員ごとの売上日ならび,_全社員が売上を記録した日). 社員ごとの売上日ならび(_社員ごとの売上日ならび) :- findall(_売上日ならび,( 社員(_社員), setof(_日,[_社員,_日] ^ 売上(_社員,_日),_売上日ならび)),_社員ごとの売上日ならび). ならびに共通して存在する要素([L],_要素) :- member(_要素,L). ならびに共通して存在する要素([L1,L2|R],_要素) :- intersection(L1,L2,L3), ならびに共通して存在する要素([L3|R],_要素). % 以下のサイトは # 出典::C/C++の宿題片付けます 127代目 #650 # [1] 授業単元: C # [2] 問題文(含コード&リンク):キーボードから入力された1以上の整数nについて、 # 次の例に示すように行番号と*を表示するプログラムを作成せよ。 # なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 # 表示結果の例 # 正の整数:7 # 1******* # 2****** # 3***** # 4**** # 5*** # 6** # 7* # のように作れとのことです。 # # [3] 環境 # [3.1]linux # [3.2] gcc # [3.3]C # [4]6月20日 # [5]繰り返しまでです、関数まではいっていません、お願いします 'キーボードから入力された1以上の整数nについて、 次の例に示すように行番号と*を表示するプログラムを作成せよ。 なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例 正の整数:7 1******* 2****** 3***** 4**** 5*** 6** 7* のように作れとのことです。' :- 'キーボードから入力された1以上の整数nについて、例に示すように行番号と星を表示する'. 'キーボードから入力された1以上の整数nについて、例に示すように行番号と星を表示する' :- 'キーボードから入力された1以上の整数nによって、n個の星ならびを用意する'(_n個の星ならび), '行番号と星文字列を表示する'(_n個の星ならび). 'キーボードから入力された1以上の整数nによって、n個の星ならびを用意する'(_n個の星ならび) :- 'キーボードから入力された1以上の整数nによって(_n), n個の星ならびを用意する(_n,_n個の星ならび). 'キーボードから入力された1以上の整数nによって(_n) :- 整数を得る('1以上の整数n',_n >= 1,_n). n個の星ならびを用意する(_n,_n個の星ならび) :- findall(*,between(1,_n,_),_n個の星ならび). '行番号と星文字列を表示する'(_n個の星ならび) :- forall('行番号と星文字列を'(_n個の星ならび,_行番号と星文字列),表示する(_行番号と星文字列)). '行番号と星文字列を'(_n個の星ならび,_行番号と星文字列) :- append(L1,[_星ならびの最初の要素|_星ならびの残りの要素],_n個の星ならび), length([_|L1],_行番号), 行番号と星ならびを文字列(_行番号,[_星ならびの最初の要素|_星ならびの残りの要素],_行番号と星文字列). 行番号と星ならびを文字列(_行番号,_星ならび,_行番号と星文字列) :- atomic_list_concat([_行番号|_星ならび],_行番号と星文字列). 表示する(_行番号と星文字列) :- writef('%w\n',[_行番号と星文字列]). % 整数を得る/3 % 以下のサイトは # 出典::スレ立てるまでもない質問はここで 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(_文字,_文字ならび), 文字置換ルール(_文字,_置換文字). 文字置換ルール(あ,お). 文字置換ルール(い,え). 文字置換ルール(う,う). 文字置換ルール(え,あ). 文字置換ルール(お,い). % 以下のサイトは # 出典 :: Python の宿題ここで答えます Part 2 #229 # project euler problem02 # 出典::project euler Problem 2 「偶数のフィボナッチ数」 † # # フィボナッチ数列の項は前の2つの項の和である。最初の2項を 1, 2 とすれば、最初の10項は以下の通りである。 # 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... # 数列の項が400万を超えない範囲で、偶数の項の総和を求めよ。 # # (´・ω・`)再帰で書いたら深度が深すぎて怒られました。だれか教えてください。 # # 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(_偶数の項の総和) :- 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(1,2,2,_偶数の項の総和). 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(N1,N2,_偶数の項の総和,_偶数の項の総和) :- N1 + N2 > 4000000,!. 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- 'フィボナッチ数を計算して偶数の場合に限り、総和に加算していく'(N1,N2,_偶数の項の総和_1,_偶数の項の総和). 'フィボナッチ数を計算して偶数の場合に限り、総和に加算していく'(N1,N2,_偶数の項の総和_1,_偶数の項の総和) :- '次のフィボナッチ数を計算して_偶数の項の総和_1に加算'(N1,N2,_偶数の項の総和_1,N3,_偶数の項の総和_2), 'フィボナッチ数列の項が400万を超えない範囲で、偶数の項の総和を求める'(N2,N3,_偶数の項の総和_2,_偶数の項の総和). '次のフィボナッチ数を計算して_偶数の項の総和_1に加算'(N1,N2,_偶数の項の総和_1,N3,_偶数の項の総和_2) :- 次のフィボナッチ数を計算して(N1,N2,N3), '_偶数の項の総和_1に加算'(N3,_偶数の項の総和_1,_偶数の項の総和_2). 次のフィボナッチ数を計算して(_ふたつ前のフィボナッチ数,_ひとつ前のフィボナッチ数,_フィボナッチ数) :- _フィボナッチ数 is _ふたつ前のフィボナッチ数 + _ひとつ前のフィボナッチ数. '_偶数の項の総和_1に加算'(N3,_偶数の項の総和_1,_偶数の項の総和_2) :- 足すべき値(N3,_足すべき値), _偶数の項の総和_2 is _偶数の項の総和_1 + _足すべき値. 足すべき値(N,N) :- 偶数(N). 足すべき値(N,0) :- 奇数(N). 偶数(_偶数) :- 0 is _偶数 mod 2. 奇数(_奇数) :- 1 is _奇数 mod 2. % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが'(_n,_合計), '1000になる直前の変数nの値'(_合計,_n),!. '1+2+3+....+nが'(_n,_合計) :- nth1(_n,_,_), '1+2+3+....+n'(_n,_合計). '1+2+3+....+n'(_n,_合計) :- findall(_整数,between(1,_n,_整数),_1からnまでの整数ならび), sum_list(_1からnまでの整数ならび,_合計). '1000になる直前の変数nの値'(_合計,_n) :- _合計 + _n + 1 >= 1000. % 以下のサイトは 足し算(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). % 以下のサイトは # 出典::SQL質疑応答スレ 11問目 #754 # 以下のようなテーブルがあるとします。 # [テーブル名:ユーザー] # ユーザーID , NAME # -------- # 1 , hoge # 2 , fuga # 3 , piyo # # [テーブル名:所持品] # ユーザーID , 備品ID # -------- # 1 , 1 # 2 , 1 # 3 , 2 # 2 , 2 # 3 , 3 # 1 , 2 # # [テーブル名:備品] # 備品ID , NAME # -------- # 1 , PC # 2 , 電話 # 3 , プリンタ # # ここから指定した備品、例えばPCと電話を両方持っているユーザーを # 取得したいです。 # DBはmysqlです。よろしくお願いします。 # ユーザー(1,hoge). ユーザー(2,fuga). ユーザー(3,piyo). 所持品(1,1). 所持品(2,1). 所持品(3,2). 所持品(2,2). 所持品(3,3). 所持品(1,2). 備品(1,'PC'). 備品(2,電話). 備品(3,プリンタ). 指定した備品('PC'). 指定した備品('電話'). :- dynamic(指定した備品を全部持っているユーザー名/1). '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する' :- findall(_備品,指定した備品(_備品),_備品名ならび), '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'(_備品名ならび). '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'(_備品名ならび) :- forall('所持品/2,備品/2から指定した備品を全部持っているユーザー名を取得する'(_備品名ならび,_ユーザー名), assertz(指定した備品を全部持っているユーザー名(_ユーザー名))). '所持品/2,備品/2から指定した備品を全部持っているユーザー名を取得する'(_備品名ならび,_ユーザー名) :- ユーザー(_ユーザーID,_ユーザー名), 指定した備品を全部持っている(_備品名ならび,_ユーザーID). 指定した備品を全部持っている(_備品名ならび,_ユーザーID) :- forall(指定した備品を(_備品名ならび,_備品ID),持っている(_ユーザーID,_備品ID)). 指定した備品を(_備品名ならび,_備品ID) :- member(_備品名,_備品名ならび), 備品(_備品ID,_備品名). 持っている(_ユーザーID,_備品ID) :- 所持品(_ユーザーID,_備品ID). ?- '所持品/2,備品/2から指定した備品、例えばPCと電話を両方持っているユーザーを取得して、指定した備品を全部持っているユーザー名/1として登録する'. ?- listing(指定した備品を全部持っているユーザー名). 指定した備品を全部持っているユーザー名(hoge). 指定した備品を全部持っているユーザー名(fuga). ?- % 以下のサイトは # 出典::SQL質疑応答スレ 11問目 #754 # 以下のようなテーブルがあるとします。 # [テーブル名:ユーザー] # ユーザーID , NAME # -------- # 1 , hoge # 2 , fuga # 3 , piyo # # [テーブル名:所持品] # ユーザーID , 備品ID # -------- # 1 , 1 # 2 , 1 # 3 , 2 # 2 , 2 # 3 , 3 # 1 , 2 # # [テーブル名:備品] # 備品ID , NAME # -------- # 1 , PC # 2 , 電話 # 3 , プリンタ # # ここから指定した備品、例えばPCと電話を両方持っているユーザーを # 取得したいです。 # DBはmysqlです。よろしくお願いします。 # ユーザー(1,hoge). ユーザー(2,fuga). ユーザー(3,piyo). 所持品(1,1). 所持品(2,1). 所持品(3,2). 所持品(2,2). 所持品(3,3). 所持品(1,2). 備品(1,'PC'). 備品(2,電話). 備品(3,プリンタ). '指定した備品、例えばPCと電話を両方持っているユーザーを取得したい'(_備品名ならび,_ユーザー名) :- ユーザー(_ユーザーID,_ユーザー名), 指定した備品を全部持っている(_備品名ならび,_ユーザーID). 指定した備品を全部持っている(_備品名ならび,_ユーザーID) :- forall(指定した備品を(_備品名ならび,_備品ID),持っている(_ユーザーID,_備品ID)). 指定した備品を(_備品名ならび,_備品ID) :- member(_備品名,_備品名ならび), 備品(_備品ID,_備品名). 持っている(_ユーザーID,_備品ID) :- 所持品(_ユーザーID,_備品ID). ?- '指定した備品、例えばPCと電話を両方持っているユーザーを取得したい'(['PC',電話],_ユーザー名). _ユーザー名 = hoge ; _ユーザー名 = fuga . ?- % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364009659/540 # # 540 :デフォルトの名無しさん :2013/06/09(日) 20:07:42.82 (p)ID:FF7F/XIY(6)! # 質問ばっかでゴメンナサイ。 # [1..4] > [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)] # みたいに出力したい。 # pairUp :: [a] -> [(a, a)] # pairUp list = case (list) of # [] -> [] # [x, y] -> [(x, y)] # (x:y:xs) -> (x, y) : pairUp (x:xs)だと # [(1,2),(1,3),(1,4)]までしか出ない。 # (x:y:xs) -> (x, y) : pairUp (x:xs) ++ pairUp (y:xs) # やると出力カオス # # 541 :デフォルトの名無しさん :sage :2013/06/09(日) 20:22:05.24 # pairUp :: [a] -> [(a, a)] # pairUp [] = [] # pairUp (x:xs) = map ((,) x) xs ++ pairUp xs # pairUp(_m,_n,L) :- findall(N,between(_m,_n,N),L1), pairUp(L1,L). pairUp([],[]). pairUp([X|R1],R2) :- pairUp(X,R1,R2,R3), pairUp(R1,R3). pairUp(X,[],R,R). pairUp(X,[Y|R1],[(X,Y)|R2],R) :- pairUp(X,R1,R2,R). % 以下のサイトは # 出典::SQL質疑応答スレ 11問目 #754 # 以下のようなテーブルがあるとします。 # [テーブル名:ユーザー] # ユーザーID , NAME # -------- # 1 , hoge # 2 , fuga # 3 , piyo # # [テーブル名:所持品] # ユーザーID , 備品ID # -------- # 1 , 1 # 2 , 1 # 3 , 2 # 2 , 2 # 3 , 3 # 1 , 2 # # [テーブル名:備品] # 備品ID , NAME # -------- # 1 , PC # 2 , 電話 # 3 , プリンタ # # ここから指定した備品、例えばPCと電話を両方持っているユーザーを # 取得したいです。 # DBはmysqlです。よろしくお願いします。 # ユーザー(1,hoge). ユーザー(2,fuga). ユーザー(3,piyo). 所持品(1,1). 所持品(2,1). 所持品(3,2). 所持品(2,2). 所持品(3,3). 所持品(1,2). 備品(1,'PC'). 備品(2,電話). 備品(3,プリンタ). '指定した備品、例えばPCと電話を両方持っているユーザーを取得したい'(_備品名ならび,_ユーザー名) :- ユーザー(_ユーザーID,_ユーザー名), 指定した備品を全部持っている(_備品名ならび,_ユーザーID). 指定した備品を全部持っている(_備品名ならび,_ユーザーID) :- forall(指定した備品を(_備品名ならび,_備品ID),持っている(_ユーザーID,_備品ID)). 指定した備品を(_備品名ならび,_備品ID) :- member(_備品名,_備品名ならび), 備品(_備品ID,_備品名). 持っている(_ユーザーID,_備品ID) :- 所持品(_ユーザーID,_備品ID). ?- '指定した備品、例えばPCと電話を両方持っているユーザーを取得したい'(['PC',電話],_ユーザー名). _ユーザー名 = hoge ; _ユーザー名 = fuga . ?- % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364009659/540 # # 540 :デフォルトの名無しさん :2013/06/09(日) 20:07:42.82 (p)ID:FF7F/XIY(6)! # 質問ばっかでゴメンナサイ。 # [1..4] > [(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)] # みたいに出力したい。 # pairUp :: [a] -> [(a, a)] # pairUp list = case (list) of # [] -> [] # [x, y] -> [(x, y)] # (x:y:xs) -> (x, y) : pairUp (x:xs)だと # [(1,2),(1,3),(1,4)]までしか出ない。 # (x:y:xs) -> (x, y) : pairUp (x:xs) ++ pairUp (y:xs) # やると出力カオス # # 541 :デフォルトの名無しさん :sage :2013/06/09(日) 20:22:05.24 # pairUp :: [a] -> [(a, a)] # pairUp [] = [] # pairUp (x:xs) = map ((,) x) xs ++ pairUp xs # pairUp(_m,_n,L) :- findall(N,between(_m,_n,N),L1), pairUp(L1,L). pairUp([],[]). pairUp([X|R1],R2) :- pairUp(X,R1,R2,R3), pairUp(R1,R3). pairUp(X,[],R,R). pairUp(X,[Y|R1],[(X,Y)|R2],R) :- pairUp(X,R1,R2,R). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- once((nth1(_n,_,_),((_n + 2) * (_n + 1)) / 2 >= 1000)). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- between(1,1000,_n), findall(M,between(1,_n,M),L), sum_list(L,Sum), Sum + _n + 1 >= 1000. % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([],[],_n),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L,Ls_1,_n) :- 加算するとならび要素が1000を超える(L,Ls_1,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L1,Ls_1,_n) :- append([_|L1],Ls_1,Ls_2), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([_|L1],Ls_2,_n). 加算するとならび要素が1000を超える(L,Ls_1,_n) :- append([_|L],Ls_1,Lx), length(Lx,X), X >= 1000, length(L,_n). % 以下のサイトは # 出典::C/C++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- length(Ln,1000), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([],Ln,[],L), length(L,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L,Ln,Ls_1,L) :- 加算するとならび要素が1000を超える(L,Ln,Ls_1),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(L1,Ln,Ls_1,L) :- append([_|L1],Ls_1,Ls_2), '1+2+3+....+nが1000になる直前の変数nの値を求めよ'([_|L1],Ln,Ls_2,L). 加算するとならび要素が1000を超える(L,Ln,Ls_1) :- append([_|L],Ls_1,Lx), append(Ln,_,Lx). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 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++の宿題片付けます 160代目 #754 # [1] プログラミング # [2] 1+2+3+....+nが1000になる直前の変数nの値を求めよ # '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n) :- '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(0,0,_n). '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(_n,S,_n) :- 'Sに_nを加えたら1000以上になる場合_nが解'(_n,S,_n),!. '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(N_1,S,_n) :- '1000になる直前までN_1を1ずつ増分しSに加算する'(N_1,S,_n). 'Sに_nを加えたら1000以上になる場合_nが解'(_n,S,_n) :- 1000 =< S + _n + 1. '1000になる直前までN_1を1ずつ増分しSに加算する'(N_1,S_1,_n) :- N_2 is N_1 + 1, S_2 is S_1 + N_2, '1+2+3+....+nが1000になる直前の変数nの値を求めよ'(N_2,S_2,_n). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/754 # # [1] プログラミング # [2] 1+2+3+....+nがzになる直前の変数nの値を求めよ # '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,_n) :- '1+2+3+....+nがzになる直前の変数nの値を求めよ'(0,0,_n),!. '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,_n,S,_n) :- _z =< S + _n + 1,!. '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,N_1,S_1,_n) :- N_2 is N_1 + 1, S_2 is S_1 + N_2, '1+2+3+....+nがzになる直前の変数nの値を求めよ'(_z,N_2,S_2,_n). % % S_2 is S_1 + N_2, % % の N_2 が( N_1 ではなく)大事なところであるが、 % それがまったく表れていない。 % 好ましいプログラムとはいえない。 % % 以下のサイトは # # 出典::パスワード向け文字列検査 # 半角英数字8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)). 半角英数字をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)), 半角英字が一文字はある(_文字列), 半角数字が一文字はある(_文字列). 半角英小文字大文字数字をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数(_文字)), 半角英大文字が一文字はある(_文字列), 半角英小文字が一文字はある(_文字列), 半角数字が一文字はある(_文字列). 半角英数字記号をそれぞれ1種類以上含む8文字以上100文字以下(_文字列) :- '8文字以上100文字以下'(_文字列), forall(sub_atom(_文字列,_,1,_,_文字),半角英数字記号(_文字)), 半角英大文字が一文字はある(_文字列), 半角英小文字が一文字はある(_文字列), 半角数字が一文字はある(_文字列), 半角英記号が一文字はある(_文字列). '8文字以上100文字以下'(_文字列) :- atom_length(_文字列,_文字列の長さ), between(8,100,_文字列の長さ),!. 半角英字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英字), 半角英字(_半角英字),!. 半角数字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角数字), 半角英字(_半角数字). 半角英大文字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英大文字), 半角英大文字(_半角英大文字),!. 半角英小文字が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英小文字), 半角英小文字(_半角英小文字),!. 半角英記号が一文字はある(_文字列) :- sub_atom(_文字列,_,1,_,_半角英記号), 半角英記号(_半角英記号),!. 半角英数(_文字) :- 半角英字(_半角英字). 半角英数(_数字) :- 半角数字(_半角数字). 半角英数字記号(_半角英数) :- 半角英数(_半角英数). 半角英数字記号(_半角英記号) :- 半角英記号(_半角英記号). 半角英字(_半角英小英字) :- 半角英小文字(_半角英小文字). 半角英字(_半角英大文字) :- 半角英大文字(_半角英大文字). 半角英小文字(_半角英小文字) :- _半角英小文字 @>= a, _半角英小文字 @=< z. 半角英大文字(_半角英大文字) :- _半角英大文字 @>= 'A', _半角英大文字 @=< 'Z'. 半角数字(_半角数字) :- _半角数字 @>= '0', _半角数字 @=< '9'. 半角英記号(_半角英記号) :- member(_半角英記号,['!','"','#','$','%','&','\'','(',')','=','-','~','^','|','\\','@','[','}',']','+','*',';',':','<',',','>','.','?','/','_','\']). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/935 # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク):レポート形式なのですが比較回数を数えるプログラムのソースコードを御教示ください。 #  問:以下の挿入ソートのプログラムを参考に(次番に記載)着目する各x[i]の大小比較の回数を求めよ。 #    参考として、各データの比較回数は最大(i-1)回、最小1回、平均(i/2)回となる。 #    また、それぞれのデータの並びを変えて比較回数とデータの並びの関係を考えよ。 # 挿入整列時の比較回数(L1,L2,_単一化回数,_比較回数) :- 挿入整列時の比較回数(L1,[],9,0,L2,_単一化回数,_比較回数). 挿入整列時の比較回数([],L2,_単一化回数_1,_比較回数,L2,_単一化回数,_比較回数) :- '挿入終了、単一化回数のみ1加算'(_単一化回数_1,_単一化回数). 挿入整列時の比較回数([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数):- '対象ならびから一要素ずつ取り出し挿入する'([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数). '挿入終了、単一化回数のみ1加算'(_単一化回数_1,_単一化回数) :- _単一化回数 is _単一化回数_1 + 1. '対象ならびから一要素ずつ取り出し挿入する'([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数) :- 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L3,_単一化回数_2,_比較回数_2), _単一化回数_3 is _単一化回数_2 + 1 * 8, 挿入整列時の比較回数(R,L3,_単一化回数_3,_比較回数_2,L2,_単一化回数,_比較回数). 比較回数を計測しながらの挿入(A,[],_単一化回数_1,_比較回数,[A],_単一化回数,_比較回数) :- _単一化回数 is _単一化回数_1 + 1 * 8. 比較回数を計測しながらの挿入(A,[B|R],_単一化回数_1,_比較回数_1,[A,B|R],_単一化回数_2,_比較回数_2) :- '挿入可能の場合は単一化回数は第一節を含めて2加算、比較回数は1加算'(A,B,_単一化回数_1,_比較回数_1,_単一化回数_2,_比較回数_2),!. 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 2 * 8, 'まだ挿入できない場合は、単一化回数は上二節を含めて3加算、比較回数は1加算して挿入位置を継続して捜す'(A,L1,_単一化回数_2,_比較回数_1,L2,_単一化回数,_比較回数). '挿入可能の場合は単一化回数は第一節を含めて2加算、比較回数は1加算'(A,B,_単一化回数_1,_比較回数_1,_単一化回数_2,_比較回数_2) :- A @=< B, _単一化回数_2 is _単一化回数_1 + 2 * 8, _比較回数_2 is _比較回数_1 + 1,!. 'まだ挿入できない場合は、単一化回数は上二節を含めて3加算、比較回数は1加算して挿入位置を継続して捜す'(A,[B|R1],_単一化回数_1,_比較回数_1,[B|R2],_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 3 * 8, _比較回数_2 is _比較回数_1 + 1, 比較回数を計測しながらの挿入(A,R1,_単一化回数_2,_比較回数_2,R2,_単一化回数,_比較回数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/935 # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク):レポート形式なのですが比較回数を数えるプログラムのソースコードを御教示ください。 #  問:以下の挿入ソートのプログラムを参考に(次番に記載)着目する各x[i]の大小比較の回数を求めよ。 #    参考として、各データの比較回数は最大(i-1)回、最小1回、平均(i/2)回となる。 #    また、それぞれのデータの並びを変えて比較回数とデータの並びの関係を考えよ。 # 挿入整列時の比較回数(L1,L2,_単一化回数,_比較回数) :- 挿入整列時の比較回数(L1,[],1,0,L2,_単一化回数,_比較回数). 挿入整列時の比較回数([],L2,_単一化回数_1,_比較回数,L2,_単一化回数,_比較回数) :- '挿入終了、単一化回数のみ1加算'(_単一化回数_1,_単一化回数). 挿入整列時の比較回数([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数):- '対象ならびから一要素ずつ取り出し挿入する'([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数). '挿入終了、単一化回数のみ1加算'(_単一化回数_1,_単一化回数) :- _単一化回数 is _単一化回数_1 + 1. '対象ならびから一要素ずつ取り出し挿入する'([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数) :- 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L3,_単一化回数_2,_比較回数_2), _単一化回数_3 is _単一化回数_2 + 1, 挿入整列時の比較回数(R,L3,_単一化回数_3,_比較回数_2,L2,_単一化回数,_比較回数). 比較回数を計測しながらの挿入(A,[],_単一化回数_1,_比較回数,[A],_単一化回数,_比較回数) :- _単一化回数 is _単一化回数_1 + 1. 比較回数を計測しながらの挿入(A,[B|R],_単一化回数_1,_比較回数_1,[A,B|R],_単一化回数_2,_比較回数_2) :- '挿入可能の場合は単一化回数は第一節を含めて2加算、比較回数は1加算'(A,B,_単一化回数_1,_比較回数_1,_単一化回数_2,_比較回数_2),!. 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 2, 'まだ挿入できない場合は、単一化回数は上二節を含めて3加算、比較回数は1加算して挿入位置を継続して捜す'(A,L1,_単一化回数_2,_比較回数_1,L2,_単一化回数,_比較回数). '挿入可能の場合は単一化回数は第一節を含めて2加算、比較回数は1加算'(A,B,_単一化回数_1,_比較回数_1,_単一化回数_2,_比較回数_2) :- A @=< B, _単一化回数_2 is _単一化回数_1 + 2, _比較回数_2 is _比較回数_1 + 1,!. 'まだ挿入できない場合は、単一化回数は上二節を含めて3加算、比較回数は1加算して挿入位置を継続して捜す'(A,[B|R1],_単一化回数_1,_比較回数_1,[B|R2],_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 3, _比較回数_2 is _比較回数_1 + 1, 比較回数を計測しながらの挿入(A,R1,_単一化回数_2,_比較回数_2,R2,_単一化回数,_比較回数). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/935 # [1] 授業単元: C言語 # [2] 問題文(含コード&amp;リンク):レポート形式なのですが比較回数を数えるプログラムのソースコードを御教示ください。 #  問:以下の挿入ソートのプログラムを参考に(次番に記載)着目する各x[i]の大小比較の回数を求めよ。 #    参考として、各データの比較回数は最大(i-1)回、最小1回、平均(i/2)回となる。 #    また、それぞれのデータの並びを変えて比較回数とデータの並びの関係を考えよ。 # 挿入整列時の比較回数(L1,L2,_単一化回数,_比較回数) :- 挿入整列時の比較回数(L1,[],1,0,L2,_単一化回数,_比較回数). 挿入整列時の比較回数([],L2,_単一化回数_1,_比較回数,L2,_単一化回数,_比較回数) :- _単一化回数 is _単一化回数_1 + 1. 挿入整列時の比較回数([A|R],L1,_単一化回数_1,_比較回数_1,L2,_単一化回数,_比較回数):- 比較回数を計測しながらの挿入(A,L1,_単一化回数_1,_比較回数_1,L3,_単一化回数_2,_比較回数_2), _単一化回数_3 is _単一化回数_2 + 2, 挿入整列時の比較回数(R,L3,_単一化回数_3,_比較回数_2,L2,_単一化回数,_比較回数). 比較回数を計測しながらの挿入(A,[],_単一化回数_1,_比較回数,[A],_単一化回数,_比較回数) :- _単一化回数 is _単一化回数_1 + 1. 比較回数を計測しながらの挿入(A,[B|R],_単一化回数_1,_比較回数_1,[A,B|R],_単一化回数_2,_比較回数_2) :- A @=< B, _単一化回数_2 is _単一化回数_1 + 2, _比較回数_2 is _比較回数_1 + 1,!. 比較回数を計測しながらの挿入(A,[B|R1],_単一化回数_1,_比較回数_1,[B|R2],_単一化回数,_比較回数) :- _単一化回数_2 is _単一化回数_1 + 3, _比較回数_2 is _比較回数_1 + 1, 比較回数を計測しながらの挿入(A,R1,_単一化回数_2,_比較回数_2,R2,_単一化回数,_比較回数). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #520 # お題: nをmで割って余りを切り上げる関数を作れ! # n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか? # nは0または自然数、mは自然数とする。 # 10 3 -> 4 'n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか?'(_n,_m,_幾つ) :- 'n個の埴輪をm個入りの蔵に全て入れるには蔵を'(_n,_m,_蔵ならび,_蔵の可能性), once('少なくとも幾つ用意すればよいか?'(_蔵ならび,_蔵ならびの可能性,_幾つ)). 'n個の埴輪をm個入りの蔵に全て入れるには蔵を'(_n,_m,_蔵ならび,_蔵ならびの可能性) :- findall(_蔵,findnsols(_m,_埴輪,between(1,_n,_),_蔵),_蔵ならび,_蔵ならびの可能性). '少なくとも幾つ用意すればよいか?'(_蔵ならび,_蔵ならびの可能性,_幾つ) :- _蔵ならびの可能性 = [], length(_蔵ならび,_幾つ). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #520 # お題: nをmで割って余りを切り上げる関数を作れ! # n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか? # nは0または自然数、mは自然数とする。 # 10 3 -> 4 'n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか?'(_n,_m,_幾つ) :- findall(_蔵,findnsols(_m,_埴輪,between(1,_n,_),_蔵),_蔵ならび), length(_蔵ならび,_幾つ). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #520 # お題: nをmで割って余りを切り上げる関数を作れ! # n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか? # nは0または自然数、mは自然数とする。 # 10 3 -> 4 'n個の埴輪をm個入りの蔵に全て入れるには蔵を少なくとも幾つ用意すればよいか?'(_n,_m,_幾つ) :- findall(_蔵,findnsols(_m,_埴輪,between(1,_n,_埴輪),_蔵),_蔵ならび), length(_蔵ならび,_幾つ). % 以下のサイトは # 出典: プログラミングのお題スレ 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'). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 日付を鍵とする(_日付ならび), 日々の売上の合計が一定額を越えた日(_一定額,_日付ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日). 日付を鍵とする(_日付ならび) :- setof(_日付,[_日付,_売上] ^ 売上(_日付,_売上),_日付ならび). 日々の売上の合計が一定額を越えた日(_一定額,_日付ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日) :- '日々の売上の合計'(_日付ならび,_日々の,_日々の売上の合計), 一定額を越えた日(_一定額,_日々の,_日々の売上の合計,_日々の売上の合計が一定額を越えた日),!. '日々の売上の合計'(_日付ならび,_日々の,_日々の売上の合計) :- 日々の(_日付ならび,_日々の), 売上の合計(_日々の,_日々の売上の合計). 日々の(_日付ならび,_日々の) :- append(_日々の,_,_日付ならび). 売上の合計(_日々の,_日々の売上の合計) :- findsum(_売上,( 日々の売上(_日々の,_売上)),_日々の売上の合計). 日々の売上(_日々の,_売上) :- member(_日付,_日々の), 売上(_日付,_売上). 一定額を越えた日(_一定額,_日々の,_日々の売上の合計,_日々の売上の合計が一定額を越えた日) :- 一定額を越えた(_一定額,_日々の売上の合計), 日(_日々の,_日々の売上の合計が一定額を越えた日). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 > _一定額. 日(_日々の,_日々の売上の合計が一定額を越えた日) :- last(_日々の,_日々の売上の合計が一定額を越えた日). findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # 出典::C/C++の宿題片付けます 128代目 #222 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9599.txt # “パスカルの三角形”を表示するプログラムを作ってください。 # ただし、表示する段数はキー入力するようにします。 # # 実行の様子はこのような感じです。 # # [b8000@localhost]$ ./main # 何段表示しますか?: 13 # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # 1 10 45 120 210 252 210 120 45 10 1 # 1 11 55 165 330 462 462 330 165 55 11 1 # 1 12 66 220 495 792 924 792 495 220 66 12 1 # # # この問題は、calloc() を使って領域確保をしてください。 # 段数を入力した後、calloc() を使って、必要分の領域確保をします。 # # 表示の体裁は大まかに二等辺三角形の形になっていればOKです。 # なお、上の実行例のプログラムでは、 # # printf("%3d ", 〜); # ↑ # ここは半角スペース3個 # # という記述で表示を行なっています。 パスカルの三角形(_段) :- パスカルの三角形(_段,LL), パスカルの三角形_表示(_段,LL). パスカルの三角形(_段,[[1]|LL]) :- length([_|Ln],_段), パスカルの三角形加算(Ln,[1,1],LL). パスカルの三角形加算([],_,[]). パスカルの三角形加算([_|Ln],L,[L|R2]) :- 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2). 指定された段に達するまでパスカルの三角形加算を続ける(Ln,L,R2) :- パスカルの三角形一行計算(L,L1), パスカルの三角形加算(Ln,L1,R2). パスカルの三角形一行計算(L,L1) :- 上の行の隣り合う二項の合計を取っていく(L,L0), 両端に1を付加する(L0,L1). 上の行の隣り合う二項の合計を取っていく(L,L0) :- findall(N,( append(_,[A,B|_],L),N is A + B),L0). 両端に1を付加する(L0,L1) :- append([1|L0],[1],L1). パスカルの三角形_表示(0,_) :- !. パスカルの三角形_表示(N,[L|R]) :- 'N>0の間、パスカルの三角形の表示'(N,L,R). 'N>0の間、パスカルの三角形の表示'(N,L,R) :- N > 0, succ(N_1,N), パスカルの三角形一行表示(N_1,L), パスカルの三角形_表示(N_1,R). パスカルの三角形一行表示(N_1,L) :- 左端からの空白表示(N_1), パスカルの三角形部分表示(L), write('\n'). 左端からの空白表示(N_1) :- 左端からの空白文字列の生成(N_1,_空白文字列), writef('%w',[_空白文字列]). 左端からの空白文字列の生成(N_1,_空白文字列) :- 左端からの空白文字ならびの生成(N_1,_空白ならび), atomic_list_concat(_空白ならび,_空白文字列). 左端からの空白文字ならびの生成(N_1,_空白ならび) :- Len is 3 * N_1, length(_空白ならび,Len), all(_空白ならび,' '). all([],_). all([V|R],V) :- all(R,V). パスカルの三角形部分表示(L) :- forall(member(A,L), writef('%5r ',[A])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/493 # SQLServer2008R2です. # テーブルデータはDATE(YYYYMMの6けたのint型),CODE(varchar型),VALUE(float型) # の3カラムからなります.各DATEの各CODEに対して過去3か月分の総和を算出したいと思います. # 元テーブル # DATE, CODE, VALUE # .... # 200101, AAA, 1 # 200102, AAA, 2 # 200103, AAA, 3 # 200104, AAA, 4 # 200101, BBB, 1 # .... # # 欲しい結果 # 200103, AAA, 6 # 200104, AAA, 9 # ....... # # 下記のようなSQLを書いたのですが,同じ結果の行が12か月分でてきます. # 何処を修正すればよろしいでしょうか?もしくは全然違うSQLでしょうか? # # SELECT A.DATE, A.CODE, SUM(B.VALUE) OVER (PARTITION BY B.DATE, B.CODE) # FROM TABLE A, TABLE B # WHERE A.CODE=B.CODE AND B.DATE>=A.DATE AND B.DATE>=(A.DATEの3か月前←計算式が長いので省略です) # ORDER BY A.DATE, A.CODE # # よろしくお願いいたします. # 'A'(200101,'AAA',1). 'A'(200102,'AAA',2). 'A'(200103,'AAA',3). 'A'(200104,'AAA',4). 'A'(200101,'BBB',1). 過去三ヶ月の集計(_過去三ヶ月の集計ならび) :- '_DATE,_CODEを鍵として、過去三ヶ月の_VALUEの集計'(_過去三ヶ月の集計ならび). '_DATE,_CODEを鍵として、過去三ヶ月の_VALUEの集計'(_過去三ヶ月の集計ならび) :- '_DATE,_CODEを鍵とする'(_DATE_CODEならび), findall([_DATE,_CODE,_集計],( '過去三ヶ月の全ての_DATE,_CODEに対して、_VALUEを集約する'(_DATE,_CODE,_DATE_CODEならび,_集計)),_過去三ヶ月の集計ならび). '_DATE,_CODEを鍵とする'(_DATE_CODEならび) :- setof([_DATE,_CODE],[_DATE,_CODE,_VALUE] ^ 'A'(_DATE,_CODE,_VALUE),_DATE_CODEならび). '過去三ヶ月の全ての_DATE,_CODEに対して、_VALUEを集約する'(_DATE,_CODE,_DATE_CODEならび,_集計) :- member([_DATE,_CODE],_DATE_CODEならび), '過去三ヶ月の_DATE,_CODEで_VAULEを集約'(_DATE,_CODE,_集計). '過去三ヶ月の_DATE,_CODEで_VAULEを集約'(_DATE,_CODE,_集計) :- '3ヶ月前の起点月'(_DATE,_3ヶ月前の起点月), findsum(_VALUE,( テーブルデータは過去三ヶ月の範囲内(_DATE,_CODE,_3ヶ月前の起点月,_VALUE)),_集計). テーブルデータは過去三ヶ月の範囲内(_DATE,_CODE,_3ヶ月前の起点月,_VALUE) :- 'A'(_DATE_1,_CODE,_VALUE), between(_3ヶ月前の起点月,_DATE,_DATE_1). '3ヶ月前の起点月'(_今月,_3ヶ月前の起点年月) :- 今月が1月から3月の範囲では前年となる(_今月,_3ヶ月前の起点年月),!. '3ヶ月前の起点月'(_今月,_3ヶ月前の起点年月) :- 今月が4月から12月の範囲では今年となる(_今月,_3ヶ月前の起点年月). 今月が1月から3月の範囲では前年となる(_今月,_3ヶ月前の起点月) :- M is _今月 mod 100, M =< 3, _3ヶ月前の起点月 is _今月 - 100 + 9. 今月が4月から12月の範囲では今年となる(_今月,_3ヶ月前の起点月) :- _3ヶ月前の起点月 is _今月 - 3. findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # # 出典::SQL質疑応答スレ 11問目 #535 # # 関連性がないけど取得したデータ型が同じ2つのSELECT文を結合させるにはどうしたらいいでしょうか? # # SELECT 1 # SELECT int_column AS A, timestamp_column AS B FROM table1 # # A     B # 10 2011-07-11 # # SELECT 2 # SELECT int_column AS A timestamp_column AS B FROM table2 # # A     B # 5  2011-07-10 # 10 2011-07-13 # # これをA-Bの順番にソートして # # A     B # 5  2011-07-10 # 10  2011-07-11 # 10  2011-07-13 # # こんな感じの1つのテーブルにしたいのですが、よろしくお願いします。 # # :- dynamic(table3/2). '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する これをA-Bの順番にソートして1つのテーブルにしたい'(_順番にソートして結合された表) :- '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する'(_結合された表), 'これをA-Bの順番にソートして1つのテーブルにしたい'(_順番にソートして結合された表). '関連性がないけど取得したデータ型が同じ2つのSELECT文を結合する'(LL3) :- 同じ形式の照会で得られた(LL1,LL2), '2つを結合する'(LL1,LL2,LL3). 同じ形式の照会で得られた(LL1,LL2) :- 'table1をならびに取得する'(LL1), 'table2をならびに取得する'(LL2). 'table1をならびに取得する'(LL1) :- findall([_table1_A,_table1_B],table1(_table1_A,_table1_B),LL1). 'table2をならびに取得する'(LL2) :- findall([_table2_A,_table2_B],table2(_table2_A,_table2_B),LL2). '2つを結合する'(LL1,LL2,LL3) :- append(LL1,LL2,LL3). 'これをA-Bの順番にソートして1つのテーブルにしたい'(_結合された表,_順番にソートして結合された表) :- sort(_結合された表,_順番にソートして結合された表), '1つのテーブルにしたい'(_順番にソートして結合された表). '1つのテーブルにしたい'(_順番にソートして結合された表) :- forall( member([_table3_A,_table3_B],_順番にソートして結合された表), assertz(table3(_table3_A,_table3_B))). % 以下のサイトは # 出典::Functional dependency From Wikipedia # 従業員('0001',従業員ID,'0001'). 従業員('0002',従業員ID,'0002'). 従業員('0003',従業員ID,'0003'). 従業員('0004',従業員ID,'0004'). 従業員('0001',従業員名,'ジョン・ドウ'). 従業員('0002',従業員名,'ジェーン・ドウ'). 従業員('0003',従業員名,'ジョン・スミス'). 従業員('0004',従業員名,'ジェーン・グドール'). 従業員('0001',部門別ID,'1'). 従業員('0002',部門別ID,'2'). 従業員('0003',部門別ID,'1'). 従業員('0004',部門別ID,'3'). 部門('1',部門別ID,'1'). 部門('2',部門別ID,'2'). 部門('3',部門別ID,'3'). 部門('1',部門名,人事). 部門('2',部門名,市販). 部門('3',部門名,販売). % 以下のサイトは # 出典::Functional dependency From Wikipedia # 従業員ID('0001'). 従業員ID('0002'). 従業員ID('0003'). 従業員ID('0004'). 従業員名('0001','ジョン・ドウ'). 従業員名('0002','ジェーン・ドウ'). 従業員名('0003','ジョン・スミス'). 従業員名('0004','ジェーン・グドール'). 部門('0001','1'). 部門('0002','2'). 部門('0003','1'). 部門('0004','3'). 部門別ID('1'). 部門別ID('2'). 部門別ID('3'). 部門名('1',人事). 部門名('2',市販). 部門名('3',販売). % 以下のサイトは # # (<- (parent ?x (mother-of ?x))) # (<- (parent ?x (father-of ?x))) # # これらの節は、「ある人がいて、その人の父親と母親が両親である」ことを述べている。ここで、 # 自分自身の両親が自分であるかどうか質問してみよう。 # # > (?- (parent ?y ?y)) # # ?Y = [Abort] # #  システムは発見する。ただし、?y = (mother-of ?y) である。deref(またはsubstbindings)が、 # ?yを計算しようとして無限ループに入るので、答えが出力できない。 # # 『実用Common Lisp AIプログラミングのケーススタディ』 p445 # 'ある人がいて、その人の父親と母親が両親である'(_ある人,_両親) :- 'ある人がいて、'(_ある人), _ある人 = _その人, 'その人の父親と'(_その人,_父親), '母親が'(_その人,_母親), '両親である'(_父親,_母親,_両親). 'ある人がいて、'(_ある人) :- ある人(_ある人). 'その人の父親と'(_その人,_父親) :- 父親(_その人,_父親). '母親が'(_その人,_母親) :- 母親(_その人,_母親). '両親である'(_父親,_母親,[_父親,_母親]). ある人(義経). 父親(義経,義朝). 母親(義経,常磐御前). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/751 # # [1] 授業単元:文字列 # [2] 問題文(含コード&リンク): # 1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示するプログラムを作成しなさい # このプログラムの入力は、英字以外の文字が入力される場合を考慮しなくてもよい # 英大文字ならび(['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z']). 英小文字ならび([a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z]). '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する' :- 英大文字ならび(_英大文字ならび), 英小文字ならび(_英小文字ならび), '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび). '1行最大80文字の空白を挟まない英字文字列を入力したとき、大文字の文字を小文字に、小文字の文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび) :- '1行最大80文字の空白を挟まない英字文字列を入力したとき、'(_英大文字ならび,_英小文字ならび,_英文字ならび), '一行を大文字を小文字に、小文字を大文字にしながら表示する'(_英大文字ならび,_英小文字ならび,_英文字ならび). '1行最大80文字の空白を挟まない英字文字列を入力したとき、'(_英大文字ならび,_英小文字ならび,_最大80字の英文字ならび) :- length(Ln,80), 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字), '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,_英文字,_最大80字の英文字ならび). '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_,_,_文字,[]) :- '停止条件::改行を読み込むか80字を超える'(Ln,_文字). '1行最大80文字の空白を挟まない英字文字ならび'([_|Ln],_英大文字ならび,_英小文字ならび,_文字,[_文字|R]) :- '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,R). '停止条件::改行を読み込むか80字を超える'([],_). '停止条件::改行を読み込むか80字を超える'([_|_],'\n'). '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,R) :- 英文字を読み込む(_英大文字ならび,_英小文字ならび,_次の英文字), '1行最大80文字の空白を挟まない英字文字ならび'(Ln,_英大文字ならび,_英小文字ならび,_次の英文字,R). 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字) :- get_char(_英文字), 英文字(_英文字,_英大文字ならび,_英小文字ならび),!. 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字) :- 英文字を読み込む(_英大文字ならび,_英小文字ならび,_英文字). 英文字(_文字,_英大文字ならび,_) :- member(_文字,_英大文字ならび). 英文字(_文字,_,_英小文字ならび) :- member(_文字,_英小文字ならび). '一行を大文字を小文字に、小文字を大文字にしながら表示する'(_英文字ならび,_英大文字ならび,_英小文字ならび) :- forall(member(_文字,_英文字ならび), '大文字を小文字に、小文字を大文字にして表示する'(_英大文字ならび,_英小文字ならび,_文字)). '大文字を小文字に、小文字を大文字にして表示する'(L1,L2,_文字) :- '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字), writef('%w',[_変換された文字]). '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字) :- 英文字変換(L1,L2,_文字,_変換された文字),!. '大文字を小文字に、小文字を大文字にして'(L1,L2,_文字,_変換された文字) :- '大文字を小文字に、小文字を大文字にして'(L2,L1,_文字,_変換された文字). 英文字変換(L1,L2,_文字,_変換された文字) :- nth1(_nth1,L1,_文字), nth1(_nth1,L2,_変換された文字). % 以下のサイトは '二つの2行3列の行列A、Bに対して 和A+B を求める'(_2行3列の行列A,_2行3列の行列B,_行列Aと行列Bの和行列) :- '二つの2行3列の行列A、Bの対応する成分の和を成分とする2行3列の行列を得る'(_2行3列の行列A,_2行3列の行列B,_行列Aと行列Bの和行列). '二つの2行3列の行列A、Bの対応する成分の和を成分とする2行3列の行列を得る'([],[],[]). '二つの2行3列の行列A、Bの対応する成分の和を成分とする2行3列の行列を得る'(_行列A,_行列B,_行列C) :- '二つの2行3列の行列A、Bの対応する行成分を加えて行く'(_行列A,_行列B,_行列C). '二つの2行3列の行列A、Bの対応する行成分を加えて行く'([_Aの行|R1],[_Bの行|R2],[_行C|R3]) :- '_Aの行と_Bの行の各成分を加えて_行Cを得る'(_Aの行,_Bの行,_行C), '二つの2行3列の行列A、Bの対応する成分の和を成分とする2行3列の行列を得る'(R1,R2,R3). '_Aの行と_Bの行の各成分を加えて_行Cを得る'([],[],[]). '_Aの行と_Bの行の各成分を加えて_行Cを得る'([_Aの行の成分|R1],[_Bの行の成分|R2],[_Cの行の成分|R3]) :- '_Aの行と_Bの行の各成分を加えて行く'([_Aの行の成分|R1],[_Bの行の成分|R2],[_Cの行の成分|R3]). '_Aの行と_Bの行の各成分を加えて行く'([_Aの行の成分|R1],[_Bの行の成分|R2],[_Cの行の成分|R3]) :- _Cの行の成分 is _Aの行の成分 + _Bの行の成分, '_Aの行と_Bの行の各成分を加えて_行Cを得る'(R1,R2,R3). % 以下のサイトは # # sudo ifdown _有線LANのデバイス; ネットワーク設定ファイルに追加する ; sudo ifup _有線LANのデバイス # ネットワーク設定ファイルに追加してデバイスを起動する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- デバイスを停止する(_有線LANのデバイス), ネットワーク設定ファイルに追加する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ), デバイスを起動する(_有線LANのデバイス). デバイスを停止する(_有線LANのデバイス) :- atomic_list_concat(['sudo,ifdown',_有線LANのデバイス],' ',_ifdown), shell(_ifdown,_). デバイスを起動する(_有線LANのデバイス) :- atomic_list_concat(['sudo,ifup',_有線LANのデバイス],' ',_ifup), shell(_ifup,_). ネットワーク設定ファイルに追加する(_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- open('/etc/network/interfaces',append,Outstream), ネットワーク設定ファイルに追加する(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ), close(Outstream). ネットワーク設定ファイルに追加する(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク,_ブロードキャスト,_ゲートウェイ) :- 固定IPアドレスとネットマスクの追加(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク), ブロードキャストとゲートウェイとDNSの追加(Outstream,_ブロードキャスト,_ゲートウェイ), システムの起動時にデバイスを有効にする(Outstream,_有線LANのデバイス). 固定IPアドレスとネットマスクの追加(Outstream,_有線LANのデバイス,_固定IPアドレス,_ネットマスク) :- 有線LANのデバイスの追加(Outstream,_有線LANのデバイス), 固定IPアドレスの追加(Outstream,_固定IPアドレス), ネットマスクの追加(Outstream,_ネットマスク). 有線LANのデバイスの追加(Outstream,_有線LANのデバイス) :- writef(Outstream,'iface %w inet static\n',[_有線LANのデバイス]). 固定IPアドレスの追加(Outstream,_固定IPアドレス) :- writef(Outstream,'address %w\n',[_固定IPアドレス,_ネットマスク]). ネットマスクの追加(Outstream,_ネットマスク) :- writef(Outstream,'netmask %w\n',[_ネットマスク]). ブロードキャストとゲートウェイとDNSの追加(Outstream,_ブロードキャスト,_ゲートウェイ) :- ブロードキャストの追加(Outstream,_ブロードキャスト), ゲートウェイの追加(Outstream,_ゲートウェイ), 'DNSの追加'(Outstream). ブロードキャストの追加(Outstream,_ブロードキャスト) :- writef(Outstream,,'broadcast %w\n',[_ブロードキャスト]). ゲートウェイの追加(Outstream,_ゲートウェイ) :- swritef(Outstream,'broadcast %w\n',[_ゲートウェイ]). 'DNSの追加'(Outstream) :- write(Outstream,'dns-nameservers 8.8.8.8\n'). システムの起動時にデバイスを有効にする(Outstream,_有線LANのデバイス) :- writef(Outstream,'auto %w\n',[_有線LANのデバイス]). writef(Stream,P,L) :- swritef(A,P,L), write(Stream,A). % 以下のサイトは # # ある専門学校の受験資格のデシジョンテーブル # # <条件> 1 2 3 4 5 6 7 8 # # 体重が軽い N N N N Y Y Y Y # 体が柔らかい N N Y Y N Y N Y # 敏捷である N Y Y N N N Y Y # # <行動> # # 受験資格がある X # 受験資格がない X X X X X X X 体重が軽い(偽,偽,偽,偽,真,真,真,真). 体が柔らかい(偽,偽,真,真,偽,真,偽,真). 敏捷である(偽,真,真,偽,偽,偽,真,真). 受験(諦める,諦める,ダイエットして来年受験する,諦める,諦める,諦める,ヨガに一年通ってから受験する,受験してみる). デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_行動述語名ならび,_選択列,_行動ならび) :- デシジョンテーブル(_アリティ,_条件述語名ならび,_真偽値ならび,_選択列), findall(_行動,( '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動)), _行動ならび). デシジョンテーブル(_,[],_,_選択列). デシジョンテーブル(_アリティ,[_述語名|R1],[_真偽値|R2],_選択列) :- 条件述語を実行する(_アリティ,_述語名,_真偽値ならび), nth1(_選択列,_真偽値ならび,_真偽値), デシジョンテーブル(_アリティ,R1,R2,_選択列). 条件述語を実行する(_アリティ,_述語名,_真偽値ならび) :- length(_真偽値ならび,_アリティ), P =.. [_述語名|_真偽値ならび], call(P). '行動述語の_選択列引数を得る'(_アリティ,_選択列,_行動述語名ならび,_行動) :- member(_行動述語名,_行動述語名ならび), 行動述語名の行動ならびを得る(_アリティ,_行動述語名,_行動選択ならび), nth1(_選択列,_行動選択ならび,_行動). 行動述語名の行動選択ならびを得る(_アリティ,_行動述語名,_行動選択ならび) :- length(_行動選択ならび,_アリティ), P =.. [_行動述語名|_行動選択ならび], call(P). % % ?- デシジョンテーブル(8,[体重が軽い,体が柔らかい,敏捷である],[真,偽,真],[受験],_選択列,_行動ならび). % % _選択列 = 7, % _行動ならび = [ヨガに一年通ってから受験する] % % 以下のサイトは 切ったトランプを用意する(_切ったトランプ) :- '52枚の整列したカード'(_52枚の整列したカード), シャッフル(_52枚の整列したカード,_切ったトランプ). '52枚の整列したカード'(_52枚の整列したカード) :- findall([_数,_スート], 'カードを数・スート順に生成する'(_数,_スート),_52枚の整列したカード). 'カードを数・スート順に生成する'(_数,_スート) :- between(1,13,_数), member(_スート,[スペード,ハート,ダイヤ,クラブ]). シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一枚ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一枚ずつ取り出して行く(L1,A,R2):- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- atom_chars(_文字列,_文字ならび), 'CGUUを確定する'(_文字ならび,L1,R1,R2,R3,R4), '_前文字列・_後文字列を取りだす'(L1,R4,_前文字列,_後文字列). 'CGUUを確定する'(_文字ならび,L1,R1,R2,R3,R4) :- append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|R4]],_文字ならび), 'R1,R2,R3は全てギャップで満されているか[]である'(R1,R2,R3), 'CGUU'(R1,R2,R3,_CGUU). 'R1,R2,R3は全てギャップで満されているか[]である'(R1,R2,R3) :- forall(member(_ギャップならび,[R1,R2,R3]),'全てギャップで満たされているか[]である'(_ギャップならび)). '全てギャップで満たされているか[]である'([]), '全てギャップで満たされているか[]である'(['-'|R]) :- '全てギャップで満たされているか[]である'(R). 'CGUU'(R1,R2,R3,_CGUU) :- append([['C'|R1],['G'|R2],['U|R3],['U']],L2), atom_chars(_CGUU,L2). '_前文字列・_後文字列を取りだす'(L1,R4,_前文字列,_後文字列) :- atom_chars(_前文字列,L1), atom_chars(_後文字列,R4). % 以下のサイトは 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る([],_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈,_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈). 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る([_|L],_霜まよふ_1,_そらにしをれし_1,_雁が音の_1,_かへるつばさに_1,_春雨ぞ降る_1,_歌釈_1,_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈) :- 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る(_霜まよふ_1,_そらにしをれし_1,_雁が音の_1,_かへるつばさに_1,_春雨ぞ降る_1,_歌釈_1,_霜まよふ_2,_そらにしをれし_2,_雁が音の_2,_かへるつばさに_2,_春雨ぞ降る_2,_歌釈_2), 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る(L,_霜まよふ_2,_そらにしをれし_2,_雁が音の_2,_かへるつばさに_2,_春雨ぞ降る_2,_歌釈_2,_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈). 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る(_霜まよふ_1,_そらにしをれし_1,_雁が音の_1,_かへるつばさに_1,_春雨ぞ降る_1,_歌釈_1,_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈) :- 霜まよふ(_霜まよふ_1,_そらにしをれし_1,_雁が音の_1,_かへるつばさに_1,_春雨ぞ降る_1,_歌釈_1,_霜まよふ_2,_そらにしをれし_2,_雁が音の_2,_かへるつばさに_2,_春雨ぞ降る_2,_歌釈_2), そらにしをれし(_霜まよふ_2,_そらにしをれし_2,_雁が音の_2,_かへるつばさに_2,_春雨ぞ降る_2,_歌釈_2,_霜まよふ_3,_そらにしをれし_3,_雁が音の_3,_かへるつばさに_3,_春雨ぞ降る_3,_歌釈_3), 雁が音の(_霜まよふ_3,_そらにしをれし_3,_雁が音の_3,_かへるつばさに_3,_春雨ぞ降る_3,_歌釈_3,_霜まよふ_4,_そらにしをれし_4,_雁が音の_4,_かへるつばさに_4,_春雨ぞ降る_4,_歌釈_4), かへるつばさに(_霜まよふ_4,_そらにしをれし_4,_雁が音の_4,_かへるつばさに_4,_春雨ぞ降る_4,_歌釈_4,_霜まよふ_5,_そらにしをれし_5,_雁が音の_5,_かへるつばさに_5,_春雨ぞ降る_5,_歌釈_5), 春雨ぞ降る(_霜まよふ_5,_そらにしをれし_5,_雁が音の_5,_かへるつばさに_5,_春雨ぞ降る_5,_歌釈_5,_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈). % 以下のサイトは 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る([],_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈,_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈). 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る([_|L],_霜まよふ_1,_そらにしをれし_1,_雁が音の_1,_かへるつばさに_1,_春雨ぞ降る_1,_歌釈_1,_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈) :- 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る(_霜まよふ_1,_そらにしをれし_1,_雁が音の_1,_かへるつばさに_1,_春雨ぞ降る_1,_歌釈_1,_霜まよふ_2,_そらにしをれし_2,_雁が音の_2,_かへるつばさに_2,_春雨ぞ降る_2,_歌釈_2), 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る(L,_霜まよふ_2,_そらにしをれし_2,_雁が音の_2,_かへるつばさに_2,_春雨ぞ降る_2,_歌釈_2,_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈). 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る(_霜まよふ_1,_そらにしをれし_1,_雁が音の_1,_かへるつばさに_1,_春雨ぞ降る_1,_歌釈_1,_霜まよふ_2,_そらにしをれし_2,_雁が音の_2,_かへるつばさに_2,_春雨ぞ降る_2,_歌釈) :- 霜まよふ(_霜まよふ_1,_霜まよふ_2,_歌釈_1,_歌釈_2), そらにしをれし(_そらにしをれし_1,_そらにしをれし_2,_歌釈_2,_歌釈_3), 雁が音の(_雁が音の_1,_雁が音の_2,_歌釈_3,_歌釈_4), かへるつばさに(_かへるつばさに_1,_かへるつばさに_2,_歌釈_4,_歌釈_5), 春雨ぞ降る(_春雨ぞ降る_1,_春雨ぞ降る_2,_歌釈_5,_歌釈). % 以下のサイトは '0から9までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- '0から9までの数字に一致する適合文字列'(_文字列,_適合文字列,S,R), 前後の文字列を切り取る(_文字列,S,R,_前文字列,_後文字列). '0から9までの数字に一致する適合文字列'(_文字列,_適合文字列,S,R) :- sub_atom(_文字列,S,1,R,_適合文字列), member(_適合文字列,['0','1','2','3','4','5','6','7','8','9']). 前後の文字列を切り取る(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/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回登場したら30回目より'(_文字列,_削除する文字数) :- n個収集した最後(30,_残り文字数,sub_atom(_文字列,_,1,_残り文字数,'\r'),_削除する文字数). n個収集した最後(_n個,_射影項,_目標,_n個収集した最後) :- n個収集した(_n個,_射影項,_目標,_n個収集した), 最後(_n個収集した,_n個収集した最後). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). 最後(_ならび,_ならびの最後) :- last(_ならび,_ならびの最後). '後ろの文字を削除したい'(_文字列,_削除する文字数,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_削除する文字数,_末尾を削除された文字列). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #689 # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_あかさたなはまやらわん,_件数) :- あかさたなはまやらわん(_あかさたなはまやらわん), '件数(但し0件は除く)'('名簿のひらがな読みの最初の文字は_あかさたなはまやらわんの行範囲'(_あかさたなはまやらわん),_件数). '名簿のひらがな読みの最初の文字は_あかさたなはまやらわんの行範囲'(_あかさたなはまやらわん) :- 名簿のひらがな読みの最初の文字は(_ひらがな読みの最初の文字), あかさたなはまやらわん(_あかさたなはまやらわん,_ひらがな読みの最初の文字). 名簿のひらがな読みの最初の文字は(_ひらがな読みの最初の文字) :- 名簿(_,_ひらがな読み), sub_atom(_ひらがな読み,0,1,_,_ひらがな読みの最初の文字). '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). あかさたなはまやらわん(あ). あかさたなはまやらわん(か). あかさたなはまやらわん(さ). あかさたなはまやらわん(た). あかさたなはまやらわん(な). あかさたなはまやらわん(は). あかさたなはまやらわん(ま). あかさたなはまやらわん(や). あかさたなはまやらわん(ら). あかさたなはまやらわん(わ). あかさたなはまやらわん(ん). あかさたなはまやらわん(あ,あ). あかさたなはまやらわん(あ,ぃ). あかさたなはまやらわん(あ,い). あかさたなはまやらわん(あ,ぅ). あかさたなはまやらわん(あ,う). あかさたなはまやらわん(あ,ぇ). あかさたなはまやらわん(あ,え). あかさたなはまやらわん(あ,ぉ). あかさたなはまやらわん(あ,お). あかさたなはまやらわん(か,か). あかさたなはまやらわん(か,が). あかさたなはまやらわん(か,き). あかさたなはまやらわん(か,ぎ). あかさたなはまやらわん(か,く). あかさたなはまやらわん(か,ぐ). あかさたなはまやらわん(か,け). あかさたなはまやらわん(か,げ). あかさたなはまやらわん(か,こ). あかさたなはまやらわん(か,ご). あかさたなはまやらわん(さ,さ). あかさたなはまやらわん(さ,ざ). あかさたなはまやらわん(さ,し). あかさたなはまやらわん(さ,じ). あかさたなはまやらわん(さ,す). あかさたなはまやらわん(さ,ず). あかさたなはまやらわん(さ,せ). あかさたなはまやらわん(さ,ぜ). あかさたなはまやらわん(さ,そ). あかさたなはまやらわん(さ,ぞ). あかさたなはまやらわん(た,た). あかさたなはまやらわん(た,だ). あかさたなはまやらわん(た,ち). あかさたなはまやらわん(た,ぢ). あかさたなはまやらわん(た,っ). あかさたなはまやらわん(た,つ). あかさたなはまやらわん(た,づ). あかさたなはまやらわん(た,て). あかさたなはまやらわん(た,で). あかさたなはまやらわん(た,と). あかさたなはまやらわん(た,ど). あかさたなはまやらわん(な,な). あかさたなはまやらわん(な,に). あかさたなはまやらわん(な,ぬ). あかさたなはまやらわん(な,ね). あかさたなはまやらわん(な,の). あかさたなはまやらわん(は,は). あかさたなはまやらわん(は,ば). あかさたなはまやらわん(は,ぱ). あかさたなはまやらわん(は,ひ). あかさたなはまやらわん(は,び). あかさたなはまやらわん(は,ぴ). あかさたなはまやらわん(は,ふ). あかさたなはまやらわん(は,ぶ). あかさたなはまやらわん(は,ぷ). あかさたなはまやらわん(は,へ). あかさたなはまやらわん(は,べ). あかさたなはまやらわん(は,ぺ). あかさたなはまやらわん(は,ほ). あかさたなはまやらわん(は,ぼ). あかさたなはまやらわん(は,ぽ). あかさたなはまやらわん(ま,ま). あかさたなはまやらわん(ま,み). あかさたなはまやらわん(ま,む). あかさたなはまやらわん(ま,め). あかさたなはまやらわん(ま,も). あかさたなはまやらわん(や,ゃ). あかさたなはまやらわん(や,や). あかさたなはまやらわん(や,ゅ). あかさたなはまやらわん(や,ゆ). あかさたなはまやらわん(や,ょ). あかさたなはまやらわん(や,よ). あかさたなはまやらわん(ら,ら). あかさたなはまやらわん(ら,り). あかさたなはまやらわん(ら,る). あかさたなはまやらわん(ら,れ). あかさたなはまやらわん(ら,ろ). あかさたなはまやらわん(わ,ゎ). あかさたなはまやらわん(わ,わ). あかさたなはまやらわん(わ,ゐ). あかさたなはまやらわん(わ,ゑ). あかさたなはまやらわん(わ,を). あかさたなはまやらわん(な,ん). % 以下のサイトは # 出典 :: Qiita_47443e0fb2988c1332b2 表(1,×,×,×,×,×). 表(2,×,×,×,○,×). 表(3,×,×,○,×,×). 表(4,×,○,×,×,×). 表(5,×,×,○,○,○). 表(6,×,○,○,×,×). 表(7,×,○,×,○,○). 表(8,×,○,○,○,○). 表(9,○,×,×,×,×). 表(10,○,×,×,○,×). 表(11,○,×,○,×,○). 表(12,○,○,×,×,○). 表(13,○,×,○,○,○). 表(14,○,○,○,×,○). 表(15,○,○,×,○,○). 表(16,○,○,○,○,○). 結婚できるか(_結婚できるか) :- findall(_項目の判定,聞き取り(_項目の判定),[_年収,_身長,_学歴,_親が資産家]), 結婚できるか(_年収,_身長,_学歴,_親が資産家,_結婚できるか). 聞き取り項目(年収,年収). 聞き取り項目(身長,身長). 聞き取り項目(学歴,学歴). 聞き取り項目(親の資産額,親が資産家). 聞き取り(_項目の判定) :- 聞き取り項目の値を得る(_項目,_値), 項目の判定(_項目,_値,_項目の判定). 聞き取り項目の値を得る(_項目,_値) :- 聞き取り項目(_質問,_項目), writef('%t : ',[_質問]), 行入力(_値). 項目の判定(_項目,_値,_項目の判定) :- P =.. [_項目,_値,_項目の判定], call(P). 年収(_年収文字列,○) :- 年収が10000000円以上(_年収文字列),!. 年収(_,×). 年収が10000000円以上(_年収文字列) :- atom_number(_年収文字列,_年収), _年収 >= 10000000. 親が資産家(_資産額文字列,○) :- 親の資産が10000000円以上(_資産額文字列),!. 親が資産家(_,×). 親の資産が10000000円以上(_資産額文字列) :- atom_number(_資産額文字列,_資産額), _資産額 >= 100000000. 身長(_身長文字列,○) :- 身長が180cm以上(_身長文字列),!. 身長(_,×). 身長が180cm以上(_身長文字列) :- atom_number(_身長文字列,_身長), _身長 >= 180. 学歴(_学歴,○) :- 最終学歴の偏差値が65以上(_学歴),!. 学歴(_学歴,×). 最終学歴の偏差値が65以上(_大学卒) :- 入試時点の偏差値(_大学卒,_偏差値), _偏差値 >= 65. 入試時点の偏差値(南河内大学,71). 入試時点の偏差値(私立東京未来大学,62). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できる) :- 表(_,_年収,_身長,_学歴,_親が資産家,○). 結婚できるか(_年収,_身長,_学歴,_親が資産家,結婚できない) :- 表(_,_年収,_身長,_学歴,_親が資産家,×). 行入力(_行文字列) :- 行入力文字ならびを得る(_行入力文字ならび), atom_chars(_行文字列,_行入力文字ならび). 行入力文字ならびを得る(_行入力文字ならび) :- findall(_文字,(文字入力(_文字),(行入力終了(_文字),!,fail;true)),_行入力文字ならび). 文字入力(end_of_file) :- at_end_of_stream(user_input). 文字入力(_文字) :- get_char(_文字). 文字入力(_文字) :- 文字入力(_文字). 行入力終了(end_of_file). 行入力終了('\n'). % 以下のサイトは % % カレンダーの形式(何曜日から始まるか)と % 月日数と1日の曜日が分かっている時 % カレンダーをならびに得る。 % 第一週と最終週を変数で補正した曜日起点月カレンダー補正(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー_1), 第一週と最終週を変数で補正した(_カレンダー_1,_カレンダー). 曜日起点月カレンダー(_起点曜日形式,_月日数,_1日の曜日,_カレンダー) :- findall(N,between(1,_月日数,N),_日ならび), 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号), 曜日番号からカレンダーを作成する(_起点曜日番号,_日ならび,_カレンダー). 起点曜日番号を得る(_起点曜日形式,_月日数,_1日の曜日,_起点曜日番号) :- 曜日番号(_曜日番号_1,_起点曜日形式), 曜日番号(_曜日番号,_1日の曜日), _起点曜日番号 is (7 - (_曜日番号 - _曜日番号_1)) mod 7. 曜日番号からカレンダーを作成する(0,_日ならび,_カレンダー) :- 'N個組'(7,_日ならび,_カレンダー),!. 曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー) :- 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,_カレンダー). 先頭に変数日を付加して曜日番号からカレンダーを作成する(_曜日番号,_日ならび,[L0|LL]) :- length(L0,_曜日番号), append(L0,L1,_日ならび), 'N個組'(7,L1,LL). 曜日番号(0,日曜) :- !. 曜日番号(1,月曜) :- !. 曜日番号(2,火曜) :- !. 曜日番号(3,水曜) :- !. 曜日番号(4,木曜) :- !. 曜日番号(5,金曜) :- !. 曜日番号(6,土曜) :- !. 'N個組'(_,[],[]) :- !. 'N個組'(N,L,[U|R]) :- 先頭からN個(N,L,U,R1), 'N個組'(N,R1,R). 先頭からN個(N,L1,L2,R) :- 'L1の要素数はN個以上'(N,L1,L2,R),!. 先頭からN個(_,L,L,[]). 'L1の要素数はN個以上'(N,L1,L2,R) :- length(L2,N), append(L2,R,L1). 第一週と最終週を変数で補正した([L|LL1],[[_1,_2,_3,_4,_5,_6,_7]|LL2]) :- 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]), 最終週を変数で補正(LL1,LL2). 第一週を変数で補正(L,[_1,_2,_3,_4,_5,_6,_7]) :- append(_,L,[_1,_2,_3,_4,_5,_6,_7]). 最終週を変数で補正(LL1,LL2) :- append(LL1_1,[L_2],LL1), append(L_2,_,[_11,_12,_13,_14,_15,_16,_17]), append(LL1_1,[[_11,_12,_13,_14,_15,_16,_17]],LL2). 変数だけ値を詰める([],_). 変数だけ値を詰める([A|R],V) :- 変数だけ値を詰める(A,R,V). 変数だけ値を詰める(A,R,V) :- '_1が変数の場合は_2になる'(A,V), 変数だけ値を詰める(R,V). '_1が変数の場合は_2になる'(V,V) :- !. '_1が変数の場合は_2になる'(_,_). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- n個収集した最後(30,_残り文字数,sub_atom(_文字列,_,1,_残り文字数,'\r'),_削除する文字数), '30回目より後ろの文字を削除したい'(_文字列,_削除する文字数,_末尾を削除された文字列). n個収集した最後(_n個,_射影項,_目標,_n個収集した最後) :- n個収集した(_n個,_射影項,_目標,_n個収集した), 最後(_n個収集した,_n個収集した最後). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). 最後(_ならび,_ならびの最後) :- last(_ならび,_ならびの最後). '30回目より後ろの文字を削除したい'(_文字列,_削除する文字数,_末尾を削除された文字列) :- sub_atom(_文字列,0,_,_削除する文字数,_末尾を削除された文字列). % 以下のサイトは # 出典 :: Prologの宿題片付けます # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 売上(稲葉,'20140228'). 売上(尾崎,'20140227'). 売上(稲葉,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140228'). 社員(尾崎). 社員(稲葉). 全社員が売上を記録した日を求めよ(_全社員が売上を記録した日) :- 売上を記録した日(_全社員が売上を記録した日), 全社員が(_全社員が売上を記録した日). 売上を記録した日(_日) :- 売上を記録した全ての日(_日ならび), 日を取り出す(_日ならび,_日). 売上を記録した全ての日(_日ならび) :- setof(_日,[_社員,_日] ^ 売上(_社員,_日),_日ならび). 日を取り出す(_日ならび,_日) :- member(_日,_日ならび). 全社員が(_全社員が売上を記録した日) :- forall(社員(_社員),売上(_社員,_全社員が売上を記録した日)). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124 # # <問題> # 全社員が売上を記録した日を求めよ。 これをPrologプログラムとして表現しなさい。 売上(稲葉,'20140228'). 売上(尾崎,'20140227'). 売上(稲葉,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140228'). 社員(尾崎). 社員(稲葉). 全社員が売上を記録した日を求めよ(_日) :- 日(_日), 全社員が売上を記録した(_日). 日(_日) :- 日ならび(_日ならび), member(_日,_日ならび). 日ならび(_日ならび) :- setof(_日,[_社員,_日] ^ 売上(_社員,_日),_日ならび). 全社員が売上を記録した(_日) :- forall(社員(_社員),売上(_社員,_日)). % 以下のサイトは # 出典 :: # すいませんおねがいします。日曜までです。 # # # 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(_最長のしりとり,_最大要素数). % 以下のサイトは # 出典 :: どんなプログラム言語でも覚える時にの共通習得仕様:15項目 prologでは(1,'Hello World表示', 'どんな方法でもいいので、その言語を書ける基盤が整っていて、print出来る証 そしてプログラムを実行できる環境構築が出来る証') :- true. prologでは(2,for文, 'プログラムの醍醐味は、繰り返しを端的に行える事にある。 人間が手作業でやると、タイムロスや失敗が生まれるが、バグの無いプログラムは無敵である。 上記、printと組み合われるとアウトプットも可能。') :- fail. prologでは(3,if文, '上記for文と組み合わせると、既に条件分岐による大量処理が可能となる。 先ずは簡単なif文から書いてみよう。 条件演算も、言語により特性が違うので、一通り出来る事。 同じ、異なる、型、文字比較') :- fail. prologでは(4,ファイル読み込み, 'テキストファイルのデータを取得してみよう。 csvデータから、簡単なレポート資料が作れるようになる。 読み込み時の形式は、行単位のレコード方式で行うと汎用性が増す。') :- true. prologでは(5,ファイル書き込み, '行区切りのレコード追記型で、ファイルアクセスして、データ追記を行う。 言語によっては、ファイルを壊してしまう恐れもあるので機能を習得しよう。') :- true. prologでは(6,'ファイル・ディレクトリ操作', 'ディレクトリの作成 ファイル名の変更 新規ファイル作成 これによりOSや他言語(ツール)などとの連携が柔軟にできるようになる。') :- true. prologでは(7,計算における演算, '+ , ? , × , ÷ , 余り、乗算 確率や、合計などが柔軟に出せるようにするのがポイント。') :- true. prologでは(8,文字列操作, 'split、join、文字検索、文字置換、連結、型変換、正規表現対応') :- fail. prologでは(9,配列, '多次元配列、連想配列、配列データの削除、jsonデータの扱い、xmlデータの扱い、csvデータの扱い') :- fail. prologでは(10,正規表現, '行マタギが可能か? どのレベルまでの判定が出来るか確認。 他の言語とコピペ出来るか?') :- fail. prologでは(11,関数, 'class、無名関数、返り値の制限 ライブラリの活用') :- fail. prologでは(12,プログラムのファイル読み込み, 'include,requireが出来るか?上記ライブラリと同じ オブジェクト志向の構成がどのレベルで行えるかを見極められるとベスト') :- true. prologでは(13,他言語連動, 'サーバで実行するのであれば、shellやawkを実行して、返り値を得られるか。 この環境を整えられるとほぼ無敵になる。') :- true. prologでは(14,プログラム負荷計算, '言語を実行する際の負荷を測定する(できれば多言語との比較などができるとベスト) サービスの安定運用など非常に上位の構築を行うことができるようになる。') :- fail. prologでは(15,複数環境における実行環境,'') :- true. % 以下のサイトは 副文字列の性質適用(_文字列,_前文字列の性質,_適合文字列の性質,_後文字列の性質,_前文字列,_適合文字列,_後文字列) :- 適合文字列の性質適用(_文字列,_適合文字列の性質,S,R,_適合文字列), 前文字列の性質適用(_文字列,S,_前文字列の性質,_前文字列), 後文字列の性質適用(_文字列,R,_後文字列の性質,_後文字列). 適合文字列の性質適用(_文字列,_適合文字列の性質,S,R,_適合文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), call(_適合文字列の性質). 前文字列の性質適用(_文字列,S,_前文字列の性質,_前文字列) :- sub_atom(_文字列,0,S,_,_前文字列), call(_前文字列の性質). 後文字列の性質適用(_文字列,R,_後文字列の性質,_後文字列) :- sub_atom(_文字列,_,R,0,_後文字列), call(_後文字列の性質). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ここでは以下の比較をしたい % ?- 副文字列の性質適用(abcdef,sub_atom(X,_,1,0,b),true,sub_atom(Z,0,1,_,e),X,Y,Z). X = ab, Y = cd, Z = ef; false. ?- sub_atom(abcdef,X,Y,Z), sub_atom(X,_,1,0,b), sub_atom(Z,0,1,_,e). X = ab, Y = cd, Z = ef; false. % 本当に引数に適用目標を持ち込んだ 副目標の性質適用/7 の表現が % 理解しやすい、使いやすいと言い得るであろうか? % 以下のサイトは 一文字の副文字列(_文字列,_前文字列,_一文字の副文字列,_後文字列) :- sub_atom(_文字列,S,1,R,_一文字の副文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 一文字の副文字列(_文字列,_一文字の副文字列の性質,_前文字列,_一文字の副文字列,_後文字列) :- sub_atom(_文字列,S,1,R,_一文字の副文字列), call(_一文字の副文字列の性質), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 目標である _一文字の副文字列の性質 の引数の中に、 _一文字の副文字列 を含ませる。 % 以下のサイトは '0から9までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,1,R,_適合文字列), member(_適合文字列,['0','1','2','3','4','5','6','7','8','9']), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは '0から9までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,1,R,_適合文字列), member(_適合文字列,['0','1','2','3','4','5','6','7','8','9']), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは # 出典:: 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(_日文字列,_整数日). % 以下のサイトは 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 非決定性の置換('',_文字列,_置換対象文字列,_置換文字列,_置換された文字列). 非決定性の置換(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 新たな置換された文字列を作りだす(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_新たな置換された文字列), 非決定性の置換_1(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). 新たな置換された文字列を作りだす(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_新たな置換された文字列) :- sub_atom(_文字列,_前文字列,_置換対象文字列,_後文字列),!, atomic_list_concat([_既に置換された文字列,_前文字列,_置換文字列],_新たな置換された文字列). 非決定性の置換_1(_新たな置換された文字列,_後文字列,_,_,_置換された文字列) :- atomic_list_concat([_新たな置換された文字列,_後文字列],_置換された文字列). 非決定性の置換_1(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 非決定性の置換(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). sub_atom(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_適合文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). % 以下のサイトは 性質の異なる文字に挟まれた適合文字列(_文字列,_性質,_文字,_前文字列,_適合文字列,_後文字列) :- 'ある性質を持つ適合文字列'(_文字列,_性質,_文字,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(_性質). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/689 # # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_行,_件数) :- append(_,[_行|R],[あ,か,さ,な,ま,や,ら,わ,ん]), '件数(但し0件は除く)'('_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,R),_件数). '_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_残りの行) :- '名簿の_ひらがな読みの一字目は行の範囲'(_行,_残りの行). '名簿の_ひらがな読みの一字目は行の範囲'(_行,[]) :- '名簿の_ひらがな読みの一字目は「ん」'. '名簿の_ひらがな読みの一字目は行の範囲'(_行,[_次の行|_]) :- '名簿の一字目は行の範囲'(_行,_次の行). '名簿の一字目は行の範囲'(_行,_次の行) :- 名簿(_,_ひらがな読み), _ひらがな読み @>= _行, _ひらがな読み @< _次の行. '名簿の_ひらがな読みの一字目は「ん」' :- 名簿(_,_ひらがな読み), sub_atom(_ひらがな読み,0,1,_,ん). '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/689 # # すみません。 # 高専機械科卒なんですがお願いいたします。 # # 以下のようなテーブルにて、あかさたなでGROUP BYしてそれぞれの件数を出力できないかどうか悩んでおります。 # # CREATE TABLE `name_list` ( # kanji varchar(64), # yomi varchar(64) # ) # # INSERT INTO name_list (kanji,yomi) VALUES # ('安部','あべ'), # ('井口','いぐち'), # ('臼井','うすい'), # ('江本','えもと'), # ('小川','おがわ'), # ('柿本','かきもと'), # ('木島','きじま'), # ('九条','くじょう'), # ('毛森','けもり'), # ('小島','こじま'), # ('佐藤','さとう'), # ('しみず','')・・・・・・ # # 勿論、各頭文字で一件ずつじゃないのですが # これを # # あ行 5件 # か行 5件 # さ行 8件 # # のように集計をかけたいと思っておりますが # よい方法が思いつかず… # # 出力結果は、例でして出力した左側のフィールドはなんでもOKです。 # 右側のあかさたな行のそれぞれのレコード数がチェックできればOKです。 # # なにとぞよろしくお願いいたします。 # 名簿(安部,あべ). 名簿(井口,いぐち). 名簿(臼井,うすい). 名簿(江本,えもと). 名簿(小川,おがわ). 名簿(柿本,かきもと). 名簿(木島,きじま). 名簿(九条,くじょう). 名簿(毛森,けもり). 名簿(小島,こじま). 名簿(佐藤,さとう). 名簿(しみず,''). '各頭文字で一件ずつじゃないのですが、これを あ行 5件 か行 5件 さ行 8件 のように集計をかけたい'(_行,_件数) :- append(_,[_行,_次の行|_],[あ,か,さ,た,な,は,ま,や,ら,わ,ん]), '件数(但し0件は除く)'('_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_次の行),_件数). '_行の読み範囲の中に名簿の_ひらがな読みは入っている'(_行,_次の行) :- 名簿(_,_ひらがな読み), _ひらがな読み @>= _行, _ひらがな読み @< _次の行. '件数(但し0件は除く)'(_目標,_件数) :- findall(1,_目標,[_|L]), length([_|L],_件数). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 165代目 #321 # 総当りをする関数を作成して下さい # # VC++2010 # Windows Vista Home SP2 # # 例 # 第1引数 総当りの初めの文字 # 第2引数 総当りの最後の文字 # 第3引数 総当りする桁数 # func('a', 'z', 3); # とした時の動作は # aaa〜zzz、aa〜zz、a〜z # の全てを出力するようにしたいです # # よろしくお願いします # # 総当り(_総当りの初めの文字,_総当りの最後の文字,_総当りする桁数,_総当り) :- 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび), 総当り(_総当りする桁数,_文字ならび,_総当り). 総当り(1,_文字ならび,_文字ならび). 総当り(_桁数,_文字ならび,_総当り) :- 桁数を減じて(_桁数,_桁数_1), 低位桁から総当りを成長させる(_桁数_1,_文字ならび,_総当り). 桁数を減じて(_桁数,_桁数_1) :- _桁数 > 1, succ(_桁数_1,_桁数). 低位桁から総当りを成長させる(_桁数_1,_文字ならび,_総当り) :- 総当り(_桁数_1,_文字ならび,_総当り_2), 総当り_1(_文字ならび,_総当り_2,_総当り_1), append(_総当り_1,_総当り_2,_総当り). 総当り_1(_文字ならび,_総当り_2,_総当り_1) :- findall(_文字列,( 文字列の先頭文字は文字ならび中の一文字(_文字ならび,_総当り_2,_文字列)),_総当り_1). 文字列の先頭文字は文字ならび中の一文字(_文字ならび,_総当り_2,_文字列) :- member(_文字_1,_文字ならび), member(_文字列_2,_総当り_2), atom_concat(_文字_1,_文字列_2,_文字列). 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび) :- 文字範囲を文字コード範囲に変換(_総当りの初めの文字,_総当りの最後の文字,_総当りの初めの文字コード,_総当りの最後の文字コード), findall(_文字,( 一文字を得る(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字)),_文字ならび). 文字範囲を文字コード範囲に変換(_総当りの初めの文字,_総当りの最後の文字,_総当りの初めの文字コード,_総当りの最後の文字コード) :- char_code(_総当りの初めの文字,_総当りの初めの文字コード), char_code(_総当りの最後の文字,_総当りの最後の文字コード). 一文字を得る(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字) :- between(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字コード), char_code(_文字,_文字コード). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/806 # # # 【 課題 】鶴亀算:頭の数と足の数を入力し,鶴と亀の数を出力しなさい.計算できない場合は,その旨メッセージを出力しなさい. # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI 】制限なし # 【 期限 】1/23 # 【 Ver 】1.6.0_21 # 【 補足 】プログラムに適切なコメントを入れてください. # # よろしくお願いします # # '_1'(_1,_2,_3,_4) :- '_2'(_5,_1), '_2'(_6,_2), '_3'(_,_,_7,_8,_1,_2), '_2'(_7,_3), '_2'(_8,_4). '_3'([],[],[],[],[],[]). '_3'([_,_|_1],[],[_|_2],[],[_|_3],[_,_|_4]) :- '_3'(_1,[],_2,[],_3,_4). '_3'([],[_,_,_,_|_1],[],[_|_2],[_|_3],[_,_,_,_|_4]) :- '_3'([],_1,[],_2,_3,_4). '_3'([_,_|_1],[_,_,_,_|_2],[_|_3],[_|_4],[_,_|_5],[_,_,_,_,_,_|_6]) :- '_3'(_1,_2,_3,_4,_5,_6). % 以下のサイトは # お題: # 例:数列[3,1,-7,1,5]について、 # ->[4,-3,-2,3] (累計) # ->12 (絶対値の合計) # のように計算する。 # 最初の数列の並び順を変えると、最後の合計計も変わる。 # 任意数列について、上記合計が最小になるように並び替える関数を作成 '例:数列[3,1,-7,1,5]について、 ->[4,-3,-2,3] (累計) ->12 (絶対値の合計) のように計算する。 任意数列について、上記合計が最小になるように並び替える'(_数列,_最小となる数列) :- 絶対値の合計が最小になるように並び替える(_数列,_,_最小となる数列). 絶対値の合計が最小になるように並び替える(_数列,_最小の絶対値,_絶対値の合計が最小となる数列):- length(_数列,_要素数), setof([_絶対値の合計,_順列], [_数列,_要素数,_順列,_絶対値の合計] ^ 並べ替える(_数列,_要素数,_順列,_絶対値の合計),_絶対値_数列ならび), 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列). 並べ替える(_数列,_要素数,_順列,_絶対値の合計):- 順列(_数列,_要素数,_順列), 絶対値の合計(_順列,_絶対値の合計). 絶対値の合計が最小となる数列を得る(_絶対値_数列ならび,_最小の絶対値,_絶対値の合計が最小となる数列) :- findmin(_絶対値,( member([_絶対値,_],_絶対値_数列ならび)),_最小の絶対値), member([_最小の絶対値,_絶対値の合計が最小となる数列],_絶対値_数列ならび). 絶対値の合計([_値],_絶対値の合計) :- _絶対値の合計 is abs(_値). 絶対値の合計(_値ならび,_絶対値の合計) :- 累計の途中経過得ながらそれを縮退して行って絶対値を得る(_値ならび,_絶対値の合計). 累計の途中経過得ながらそれを縮退して行って絶対値を得る(_値ならび,_絶対値の合計) :- 累計の途中経過を得る(_値ならび,_累計の途中経過ならび), 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計). 累計の途中経過を得る([_],[]). 累計の途中経過を得る([_数_1,_数_2|R1],[_累計の途中経過|R2]) :- _累計の途中経過 is _数_1 + _数_2, 累計の途中経過を得る([_累計の途中経過|R1],R2). 要素の絶対値の合計(_累計の途中経過ならび,_絶対値の合計) :- findsum(_絶対値,( member(_値,_累計の途中経過ならび), _絶対値 is abs(_値)),_絶対値の合計). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 順列(_,0,[]). 順列(L1,N,[A|R]) :- select(A,L1,R1), N_1 is N - 1, 順列(R1,N_1,R). findmin(V,P,Min) :- findall(V,P,L), min_list(L,Min). findsum(V,P,Sum) :- findall(V,P,L), sum_list(L,Sum). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/806 # # # 【 課題 】鶴亀算:頭の数と足の数を入力し,鶴と亀の数を出力しなさい.計算できない場合は,その旨メッセージを出力しなさい. # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 GUI 】制限なし # 【 期限 】1/23 # 【 Ver 】1.6.0_21 # 【 補足 】プログラムに適切なコメントを入れてください. # # よろしくお願いします # # 鶴亀算(_頭の数,_足の数,_鶴何羽,_亀何匹) :- length(_頭の数ならび表現,_頭の数), length(_足の数ならび表現,_足の数), 鶴亀算(_,_,_鶴の頭ならび表現,_亀の頭ならび表現,_頭の数ならび表現,_足の数ならび表現), length(_鶴の頭ならび表現,_鶴何羽), length(_亀の頭ならび表現,_亀何匹). 鶴亀算([],[],[],[],[],[]). 鶴亀算([_,_|_鶴の足],[],[_|_鶴の頭],[],[_|_頭の数],[_,_|_足の数]) :- 鶴亀算(_鶴の足,[],_鶴の頭,[],_頭の数,_足の数). 鶴亀算([],[_,_,_,_|_亀の足],[],[_|_亀の頭],[_|_頭の数],[_,_,_,_|_足の数]) :- 鶴亀算([],_亀の足,[],_亀の頭,_頭の数,_足の数). 鶴亀算([_,_|_鶴の足],[_,_,_,_|_亀の足],[_|_鶴の頭],[_|_亀の頭],[_,_|_頭の数],[_,_,_,_,_,_|_足の数]) :- 鶴亀算(_鶴の足,_亀の足,_鶴の頭,_亀の頭,_頭の数,_足の数) . % 以下のサイトは # 出典 :: SQL質疑応答スレ 11問目 #617 # MySQLを使っています、よろしくお願いします。 # たとえですがkaimonoというテーブルをつくり、名前・品物・値段という項目を作りました # # 名前 品物 値段 # 佐藤 味噌 500 # 田中 米  1000 # 鈴木 水  200 # # 佐藤の味噌の値段(500)を、値段の列にすべて適応させて500と変更するにはどうしたらよいでしょうか。 # 今回は500としたのですが、実際は数値が変動していていくらなのかわからない状態です # :- dynamic(買い物/3). 買い物(佐藤,味噌,500). 買い物(田中,米,1000). 買い物(鈴木,水,200). '佐藤の味噌の値段(500)を、値段の列にすべて適応させて500と変更するにはどうしたらよいでしょうか。今回は500としたのですが、実際は数値が変動していていくらなのかわからない状態です' :- 佐藤の味噌の値段(_佐藤の味噌の値段), 値段の列にすべて適応させて変更する(_佐藤の味噌の値段). 佐藤の味噌の値段(_佐藤の味噌の値段) :- 買い物(佐藤,味噌,_佐藤の味噌の値段),!. 値段の列にすべて適応させて変更する(_佐藤の味噌の値段) :- '_名前_品物ならびを得る'(_名前_品物ならび), すべて適応させて変更する(_名前_品物ならび,_佐藤の味噌の値段). '_名前_品物ならびを得る'(_名前_品物ならび) :- findall([_名前,_品物],( 買い物(_名前,_品物,_)),_名前_品物ならび). すべて適応させて変更する(_名前_品物ならび,_佐藤の味噌の値段) :- forall(member([_名前,_品物],_名前_品物ならび), once(適応させて変更する(_名前,_品物,_佐藤の味噌の値段))). 適応させて変更する(_名前,_品物,_佐藤の味噌の値段) :- retract(買い物(_名前,_品物,_)), assertz(買い物(_名前,_品物,_佐藤の味噌の値段)). % 以下のサイトは # 出典 :: 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([]. % 以下のサイトは # 出典 :: 正規表現 Part10 #311 # ●正規表現の使用環境 # 練馬、nemery等のリネームソフト # 可能なソフトに乗り換えようと思ってます # # ●検索か置換か? # 置換 # # ●説明 # 1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま #  ファイル名途中の数字はスルーさせたい # 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい # # ●対象データ # キリン#◯☓動物園-10月1 # しろくま#△☓◯動物園-5月12 # 猫(2匹目)#我が家-11月5 # # ●希望する結果 # キリン-10月01 # しろくま-5月12 # 猫(2匹目)-11月05 # # よろしくお願いします # # '1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのままファイル名途中の数字はスルーさせたい 2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_ファイル名,_削除開始文字,_削除終了の次の文字,_置換されたファイル名) :- '1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換されたファイル名_1), '2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_置換されたファイル名_1,_削除開始文字,_削除終了の次の文字,_置換されたファイル名). '1.ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_ファイル名) :- '2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名),!. 'ファイル名末尾の数字が1桁の場合、0をつける。2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、0をつける。'(_ファイル名,_置換されたファイル名). '2桁の場合はそのまま ファイル名途中の数字はスルーさせたい'(_ファイル名) :- sub_atom(_ファイル名,S,2,0,_末尾文字2桁), atom_number(_末尾文字2桁,_). 'ファイル名末尾の数字が1桁の場合、0をつける。'(_ファイル名,_置換されたファイル名) :- 'ファイル名末尾の数字が1桁の場合、'(_ファイル名,S,_末尾文字1桁), '0をつける。'(_ファイル名,S,_末尾文字1桁,_置換されたファイル名). 'ファイル名末尾の数字が1桁の場合、'(_ファイル名,S,_末尾文字1桁) :- sub_atom(_ファイル名,S,1,0,_末尾文字1桁), atom_number(_末尾文字1桁,_). '0をつける。'(_ファイル名,S,_末尾文字1桁,_置換されたファイル名) :- sub_atom(_ファイル名,0,S,1,_前文字列), atomic_list_concat([_前文字列,'0',_末尾文字1桁],_置換されたファイル名). '2.特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_削除開始文字,_削除終了の次の文字,_削除された文字列) :- '削除開始文字と終了の次の文字で指定された範囲を削除する'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列),!. '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_,_,_文字列). '削除開始文字と終了の次の文字で指定された範囲を削除する'(_文字列,_削除開始文字,_削除終了の次の文字,_削除された文字列) :- '削除開始文字と終了の次の文字で指定された範囲を'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列), 削除する(_前文字列,_後文字列,_削除された文字列). '削除開始文字と終了の次の文字で指定された範囲を'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列) :- sub_atom(_文字列,_前文字列,_削除される文字列,_後文字列), sub_atom(_削除される文字列,0,1,_,_削除開始文字), sub_atom(_後文字列,0,1,_,削除終了の次の文字). sub_atom(_文字列,_前文字列,_検索文字列,_後文字列) :- sub_atom(_文字列,S,_,R,_検索文字列), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). 削除する(_前文字列,_後文字列,_削除された文字列) :- atom_concat(_前文字列,_後文字列,_削除された文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- n個収集した最後(30,_前文字列,'キャレッジ・リターンが登場'(_文字列,_前文字列),_末尾を削除された文字列),!. 'キャレッジ・リターンが登場'(_文字列,_前文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列). n個収集した最後(_n個,_射影項,_目標,_n個収集した最後) :- n個収集した(_n個,_射影項,_目標,_n個収集した), 最後(_n個収集した,_n個収集した最後). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). 最後(_ならび,_ならびの最後) :- last(_ならび,_ならびの最後). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- n個収集したm番目(30,30,_前文字列,'キャレッジ・リターンが登場'(_文字列,_前文字列),_末尾を削除された文字列),!. 'キャレッジ・リターンが登場'(_文字列,_前文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列). n個収集したm番目(_n個,_m番目,_射影項,_目標,_n個収集したm番目) :- n個収集した(_n個,_射影項,_目標,_n個収集した), m番目(_m番目,_n個収集した,_n個収集したm番目). n個収集した(_n個,_射影項,_目標,_n個収集した) :- findnsols(_n個,_射影項,_目標,_n個収集した). m番目(_m番目,_ならび,_ならびのm番目) :- nth1(_m番目,_ならび,_ならびのm番目). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- findnsols(30,_前文字列,'キャレッジ・リターンが登場'(_文字列,_前文字列),LL), last(LL,_末尾を削除された文字列),!. 'キャレッジ・リターンが登場'(_文字列,_前文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1323566370/786 # # \rが30回登場したら30回目より後ろの文字を削除したいんですがどう記述したら良いでしょう。 # \rから次の\r間には任意の文字数の文字列があります # 言語はパールです # # $s =~ s/(((.*?)\r){3})(.*$)//s; # print "$1\n$2\n$3\n$4\n"; # これではだめでした # # # 'キャリッジ・リターンが30回登場したら30回目より後ろの文字を削除したい'(_文字列,_末尾を削除された文字列) :- length(_30行ならび,30), 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_文字列,_30行ならび), atomic_list_concat(_30行ならび,_末尾を削除された文字列). 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_,[]) :- !. 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_文字列,[_前文字列|R]) :- 'キャレッジ・リターンが登場'(_文字列,_前文字列,_後文字列), 'キャリッジ・リターンが30回登場するまで行文字列とキャレッジ・リターンをならびに得る'(_後文字列,R). 'キャレッジ・リターンが登場'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,1,R,'\r'), sub_atom(_文字列,0,_,R,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典 :: SQL質疑応答スレ 13問目 # SQLに関して質問です。MySQL5.1.41です。 # # 【チームテーブル(team)】 # -------------------- # チームID  チーム名 # -------------------- # 1      巨人 # 2      阪神 # 3      中日 # # 【選手テーブル(player)】 # -------------------------------------- # 選手ID  チームID  選手名  背番号 # -------------------------------------- # 1     1      阿部   10 # 2     1      杉内   18 # 3     2      金本   6 # 4     2      鳥谷   1 # 5     3      岩瀬   13 # 6     3      谷繁   27 # # この条件で、各チームから背番号最少の選手を抽出するのが目的です。 # 結果イメージは、 # # ---------------------------- # チーム名  選手名  背番号 # ---------------------------- # 巨人    阿部    10 # 阪神    鳥谷    1 # 中日    岩瀬    13 # # です。SQLで # SELECT チーム名, 選手名, 背番号 FROM team LEFT JOIN player USING (チームID) WHERE MIN(背番号); # ではエラーになってしまいました。 # # ご教示宜しくお願いいたします。 # # チーム(1,巨人). チーム(2,阪神). チーム(3,中日). 選手(1,1,阿部,10). 選手(2,1,杉内,18). 選手(3,2,金本,6). 選手(4,2,鳥谷,1). 選手(5,3,岩瀬,13). 選手(6,3,谷繁,27). 各チームから背番号最少の選手を抽出する(_チーム,_選手名,_チーム最小背番号) :- チーム(_チームID,_チーム), 背番号最少の選手を抽出する(_チームID,_選手名,_チーム最小背番号). 背番号最少の選手を抽出する(_チームID,_選手名,_チーム最小背番号) :- 選手を抽出する(_チームID,_選手名,_チーム最小背番号,_残りならび), 背番号最少の(_残りならび,_チーム最小背番号). 選手を抽出する(_チームID,_選手名,_チーム最小背番号,_残りならび) :- findall([_背番号,_選手名],選手(_,_チームID,_選手名,_背番号),_背番号_選手名ならび), select([_チーム最小背番号,_選手名],_背番号_選手名ならび,_残りならび). 背番号最少の(_残りならび,_チーム最小背番号) :- forall(member([_背番号,_],_残りならび),_背番号 @>= _チーム最小背番号). % 以下のサイトは # @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],_軸要素), select(_軸要素,[_最初の位置の値|R],_残りならび),!. 軸要素の選定([_最初の位置の値|R],_軸要素) :- 中間位置の値([_最初の位置の値|R],_中間位置の値), last([_最初の位置の値|R],_最終位置の値), 三値の中央値(_最初の位置の値,_中間位置の値,_最終位置の値,_軸要素). 中間位置の値(L,_中間位置の値) :- length(L,Length), Length_1 is Length // 2, length(L1,Length_1), append(L1,[_中間位置の値|_],L). 三値の中央値(_1,_2,_3,_中央値) :- 順列([_1,_2,_3],3,[_中央値,A,B]), A @>= _中央値, B @=< _中央値. 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), succ(M,N), 順列(Z,M,X). % 以下のサイトは 軸要素の選定(_対象ならび,_軸要素) :- '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'(_対象ならび,_軸要素),!. '最初の位置の値、中間位置の値、最終位置の値、三値の中央値を取る'([_最初の位置の値|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 @> _三値の中央値)). % 以下のサイトは 差分整列(_ならび, _整列したならび) :- 差分整列(_ならび, _整列したならび, []). 差分整列([], _ならび, _ならび). 差分整列([_軸要素|_軸要素以外の要素], _整列したもの, _差分) :- '[_軸要素|_軸要素以外の要素]を整列したものは _整列したもの から _差分 の差分である'(_軸要素,_軸要素以外の要素,_整列したもの,_差分). '[_軸要素|_軸要素以外の要素]を整列したものは _整列したもの から _差分 の差分である'(_軸要素,_軸要素以外の要素,_全体の整列,_差分) :- 軸要素を軸に小と等しいか大に分類する(_軸要素以外の要素, _軸要素, _より小, _より大), '_より小 を整列したものは全体を整列したものから _軸要素 を先頭に加えた _より大 を整列したものの差分である'(_より小,_全体の整列,[_軸要素|_より大の整列]), '_より大 を整列したものは _より大 を整列したものから _差分 の差分である'(_より大, _より大の整列, _差分). '_より小 を整列したものは全体を整列したものから _軸要素 を先頭に加えた _より大 を整列したものの差分である'(_より小,_全体の整列,[_軸要素|_より大の整列]) :- 差分整列(_より小,_全体の整列,[_軸要素|_より大の整列]). '_より大 を整列したものは _より大 を整列したものから _差分 の差分である'(_より大, _より大の整列, _差分) :- 差分整列(_より大,_より大の整列, _差分). 軸要素を軸に小と等しいか大に分類する([],_,[],[]). 軸要素を軸に小と等しいか大に分類する([_要素|_残り分類対象],_軸要素,_より小,_より大) :- 軸要素を軸に小と等しいか大に分類して行く(_要素,_残り分類対象,_軸要素,_より小,_より大). 軸要素を軸に小と等しいか大に分類して行く(_要素,_残り分類対象,_軸要素,_より小,_より大) :- 小と等しいか大に分類する(_要素,_軸要素,_より小_2,_より大_2,_より小,_より大), 軸要素を軸に小と等しいか大に分類する(_残り分類対象,_軸要素,_より小_2,_より大_2). 小と等しいか大に分類する(_要素,_軸要素,_より小,_より大,[_要素|_より小],_より大) :- _要素 @< _軸要素. 小と等しいか大に分類する(_要素,_軸要素,_より小,_より大,_より小,[_要素|_より大]) :- _要素 @>= _軸要素. % 以下のサイトは 整列(L1,L2) :- 差分整列(L1,L2-[]). 差分整列([],L-L). 差分整列(L1,L2-L3) :- 'L1を整列したものはL2とL3の差分リストになっている'(L1,L2-L3). 'L1を整列したものはL2とL3の差分リストになっている'(L1,L2-L3) :- 'L1を、_軸要素、_より小、_より大であるか等しい、に分割する'(L1,_軸要素,_より小,_より大であるか等しい), 差分整列(_より小,L2-[_軸要素|L4]), 差分整列(_より大であるか等しい,L4-L3). 'L1を、_軸要素、_より小、_より大であるか等しい、に分割する'(L1,_軸要素,_より小,_より大であるか等しい) :- 軸要素の選定(L1,_軸要素,R), 軸要素で分割(R,_軸要素,_より小,_より大であるか等しい). 軸要素の選定([_軸要素|R],_軸要素,R). 軸要素で分割([],_,[],[]). 軸要素で分割(L,_軸要素,_より小,_より大であるか等しい) :- '軸要素より小さいか、あるいは、より大であるか等しいに分割して行く'(L,_軸要素,_より小,_より大であるか等しい). '軸要素より小さいか、あるいは、より大であるか等しいに分割して行く'([A|R],_軸要素,[A|_より小],_より大であるか等しい) :- A @< _軸要素, 軸要素で分割(R,_軸要素,_より小,_より大であるか等しい). '軸要素より小さいか、あるいは、より大であるか等しいに分割して行く'([A|R],_軸要素,_より小,[A|_より大であるか等しい]) :- A @>= _軸要素, 軸要素で分割(R,_軸要素,_より小,_より大であるか等しい). % 以下のサイトは # # 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). % 以下のサイトは 小さい順に取り出す(_ならび,_取り出すもの) :- 一番小さいもの(_ならび,_一番小さいもの,_残りならび), 小さい順に取り出す(_一番小さいもの,_残りならび,_取り出すもの). 一番小さいもの(_ならび,_一番小さいもの,_残りならび) :- select(_一番小さいもの,_ならび,_残りならび), 全ての残りならびの中のものは一番小さいものと等しいか大きい(_一番小さいもの,_残りならび),!. 全ての残りならびの中のものは一番小さいものと等しいか大きい(_一番小さいもの,_残りならび) :- forall(member(_残りならびの中のもの,_残りならび),_残りならびの中のもの @>= _一番小さいもの). 小さい順に取り出す(_取り出すもの,_,_取り出すもの). 小さい順に取り出す(_,_残りならび,_取り出すもの) :- 小さい順に取り出す(_残りならび,_取り出すもの). % 以下のサイトは # # ガリ夫くん:スマ子さん、最近実は数字萌えに目覚めたんです! # # スマ子さん: 藪から棒にアブノーマル宣言をされても困るのだけれども……。 # # ガリ夫くん:特に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) :- '加算器型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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を(L) :- 要素数2以下のフィボナッチ数列(L). フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). 要素数2以下のフィボナッチ数列([1]). 要素数2以下のフィボナッチ数列([1,1]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). % 以下のサイトは # 出典 :: twitter_by_@yantene_20150911 # 受験番号、 # 先頭二桁が入学年度(2016年度)、 # 次の一桁が受験先学年種別(博士前期)、 # 次の一桁が試験種別(学内入試)、 # 次の一桁が受験先系(3系)、 # 最後三桁が連番、といったところかな? 'といったところかな?'. '受験番号、 先頭二桁が入学年度(2016年度)、 次の一桁が受験先学年種別(博士前期)、 次の一桁が試験種別(学内入試)、 次の一桁が受験先系(3系)、 最後三桁が連番、といったところかな?'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番) :- '受験番号、'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番). '受験番号、'(_受験番号,_年度,_受験先学年種別,_試験種別,_受験先系,_連番) :- 先頭二桁が入学年度(_受験番号,_年度), 次の一桁が受験先学年種別(_受験番号,_受験先学年種別), 次の一桁が試験種別(_受験番号,_試験種別), 次の一桁が受験先系(_受験番号,_受験先系), 最後三桁が連番(_受験番号,_連番), 'といったところかな?'. 先頭二桁が入学年度(_受験番号,_年度) :- 整数の西暦年を得る(_受験番号,_整数の西暦年), atom_number(_年度数字列,_整数の西暦年), atom_concat(_年度数字列,年度,_年度). 整数の西暦年を得る(_受験番号,_整数の西暦年) :- sub_atom(_受験番号,0,2,_,_年度_1), atom_number(_年度_1,_整数の西暦年の下2桁), _整数の西暦年 is _整数の西暦年の下2桁 + 2000. 次の一桁が受験先学年種別(_受験番号,_受験先学年種別) :- sub_atom(_受験番号,2,1,_,_受験先学年種別コード), 受験先学年種別コード(_受験先学年種別,_受験先学年種別コード). 受験先学年種別コード(修士過程,'1'). 受験先学年種別コード(博士過程前期,'2'). 受験先学年種別コード(博士過程後期,'3'). 次の一桁が試験種別(_受験番号,_試験種別) :- sub_atom(_受験番号,3,1,_,_試験種別コード), 試験種別コード(_試験種別,_試験種別コード). 試験種別コード(学内入試,'1'). 試験種別コード(学外入試,'2'). 次の一桁が受験先系(_受験番号,_受験先系) :- sub_atom(_受験番号,4,1,_,_受験先系コード), 受験先系コード('1系','1'). 受験先系コード('2系','2'). 受験先系コード('3系','3'). 最後の三桁が連番(_受験番号,_連番) :- sub_atom(_受験番号,5,3,_,_連番). % 以下のサイトは デバッガを使ってProlog-KABAを解析したメモです。 OS(CPM86? MS/DOS?)が何か。デバッガは何を使ったかは不明です。'. % 以下のサイトは '1から10までの合計'(_1から10までの合計) :- '1から10までの合計'(1,1,_1から10までの合計). '1から10までの合計'(_n,_1から_nまでの合計,_1から10までの合計) :- '第一引数(_n)が10に到達したら停止する。解は第二引数にある。それを第三引数から取り出す。'(_n,_1から_nまでの合計,_1から10までの合計),!. '1から10までの合計'(_n,_1から_nまでの合計,_1から10までの合計) :- '_nが10になるまで、ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算し続ける'(_n,_1から_nまでの合計,_1から10までの合計). '第一引数(_n)が10に到達したら停止する。解は第二引数にある。それを第三引数から取り出す。'(10,_1から10までの合計,_1から10までの合計). '_nが10になるまで、ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算し続ける'(_n,_1から_nまでの合計,_1から10までの合計) :- 'ここまでの合計(1から_nまでの合計)に_n_2則ち_n+1を加算'(_n,_1から_nまでの合計,_n_2,_1から_n_2までの合計), '1から10までの合計'(_n_2,_1から_n_2までの合計,_1から10までの合計). 'ここまでの合計(1から_nまでの合計)に_n_2則ち_n+1を加算'(_n,_1から_nまでの合計,_n_2,_1から_n_2までの合計) :- '_n_2則ち_n+1'(_n,_n_2), '1から_nまでの合計に_n_2を加算'(_1から_nまでの合計,_n_2,_1から_n_2までの合計). '_n_2則ち_n+1'(_n,_n_2) :- succ(_n,_n_2). '1から_nまでの合計に_n_2を加算'(_1から_nまでの合計,_n_2,_1から_n_2までの合計) :- _1から_n_2までの合計 is _1から_nまでの合計 + _n_2. % 以下のサイトは '1から10までの合計'(_1から10までの合計) :- '1から10までの合計'(1,1,_1から10までの合計). '1から10までの合計'(_n,_1から_nまでの合計,_1から10までの合計) :- '第一引数(_n)が10に到達したら停止する。解は第二引数にある。それを第三引数から取り出す。'(_n,_1から_nまでの合計,_1から10までの合計),!. '1から10までの合計'(_n,_1から_nまでの合計,_1から10までの合計) :- '_nが10になるまで、ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算し続ける'(_n,_1から_nまでの合計,_1から10までの合計). '第一引数(_n)が10に到達したら停止する。解は第二引数にある。それを第三引数から取り出す。'(10,_1から10までの合計,_1から10までの合計). '_nが10になるまで、ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算し続ける'(_n,_1から_nまでの合計,_1から10までの合計) :- 'ここまでの合計(1から_nまでの合計)に_n_2実は_n+1を加算'(_n,_1から_nまでの合計,_n_2,_1から_n_2までの合計), '1から10までの合計'(_n_2,_1から_n_2までの合計,_1から10までの合計). 'ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算'(_n,_1から_nまでの合計,_n_2,_1から_n_2までの合計) :- '_n_2実は_n+1'(_n,_n_2), '1から_nまでの合計に_n_2を加算'(_1から_nまでの合計,_n_2,_1から_n_2までの合計). '_n_2実は_n+1'(_n,_n_2) :- succ(_n,_n_2). '1から_nまでの合計に_n_2を加算'(_1から_nまでの合計,_n_2,_1から_n_2までの合計) :- _1から_n_2までの合計 is _1から_nまでの合計 + _n_2. % 以下のサイトは '1から10までの合計'(_1から10までの合計) :- '1から10までの合計'(1,1,_1から10までの合計). '1から10までの合計'(_n,_1から_nまでの合計,_1から10までの合計) :- '第一引数(_n)が10に到達したら停止する。解は第二引数にある。それを第三引数から取り出す。'(_n,_1から_nまでの合計,_1から10までの合計),!. '1から10までの合計'(_n,_1から_nまでの合計,_1から10までの合計) :- '_nが10になるまで、ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算し続ける'(_n,_1から_nまでの合計,_1から10までの合計). '第一引数(_n)が10に到達したら停止する。解は第二引数にある。それを第三引数から取り出す。'(10,_1から10までの合計,_1から10までの合計). '_nが10になるまで、ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算し続ける'(_n,_1から_nまでの合計,_1から10までの合計) :- 'ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算'(_n,_1から_nまでの合計,_n_2,_1から_n_2までの合計), '1から10までの合計'(_n_2,_1から_n_2までの合計,_1から10までの合計). 'ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算'(_n,_1から_nまでの合計,_n_2,_1から_n_2までの合計) :- '_n+1(_n_2)'(_n,_n_2), '1から_nまでの合計に_n_2を加算'(_1から_nまでの合計,_n_2,_1から_n_2までの合計). '_n+1(_n_2)'(_n,_n_2) :- succ(_n,_n_2). '1から_nまでの合計に_n_2を加算'(_1から_nまでの合計,_n_2,_1から_n_2までの合計) :- _1から_n_2までの合計 is _1から_nまでの合計 + _n_2. % 以下のサイトは '1から10までの合計'(_1から10までの合計) :- '1から10までの合計'(1,1,_1から10までの合計). '1から10までの合計'(_n,_1から_nまでの合計,_1から10までの合計) :- '第一引数(_n)が10に到達したら停止する。解は第二引数にある。それを第三引数から取り出す。'(_n,_1から_nまでの合計,_1から10までの合計),!. '1から10までの合計'(_n,_1から_nまでの合計,_1から10までの合計) :- '_nが10になるまで、ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算し続ける'(_n,_1から_nまでの合計,_1から10までの合計). '第一引数(_n)が10に到達したら停止する。解は第二引数にある。それを第三引数から取り出す。'(10,_1から10までの合計,_1から10までの合計). '_nが10になるまで、ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算し続ける'(_n,_1から_nまでの合計,_1から10までの合計) :- 'ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算'(_n,_1から_nまでの合計,_n_2,_1から_n_2までの合計), '1から10までの合計'(_n_2,_1から_n_2までの合計,_1から10までの合計). 'ここまでの合計(1から_nまでの合計)に_n+1(_n_2)を加算'(_n,_1から_nまでの合計,_n_2,_1から_n_2までの合計) :- succ(_n,_n_2), _1から_n_2までの合計 is _1から_nまでの合計 + _n_2. % 以下のサイトは # 出典 :: 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,_終了状態). % 以下のサイトは # SQL質疑応答スレ 11問目 #730 # MySQLで、以下のような2つのテーブルがあり、parent_idはparentの外部キーとなってます。 # # parent # id p_value # 1 AAA # 2 BBB # # children # parent_id c_value # 1 aaa # 1 bbb # 1 ccc # 2 ddd # 2 eee # # これを # # parent_id p_value c_value # 1 AAA (aaa, bbb, ccc) # 2 BBB (ddd, eee) # # のような形で取り出すことはできますか? # GROUP BYでparent_idでまとめることはできたのですが、c_valueをまとめて取り出す方法がわかりません。 # # parent(1,'AAA'). parent(2,'BBB'). children(1,aaa). children(1,bbb). children(1,ccc). children(2,ddd). children(2,eee). 結合情報を一行に纏める(_parent_id,_p_value,_c_valueならび) :- 'parentから鍵_parent_idならびを得る'(_parent_idならび), '鍵によって結合してparentからp_valueをchildrenからc_valueならびを得る'(_parent_id,_pvalue,_c_valueならび). 'parentから鍵_parent_idならびを得る'(_parent_idならび) :- setof(_parent_id,( [_parent_id,_p_value] ^ parent(_parent_id,_p_value)),_parent_idならび), '鍵によって結合してparentからp_valueをchildrenからc_valueならびを得る'(_parent_id,_pvalue,_c_valueならび) :- member(_parent_id,_parent_idならび), parentからp_valueをchildrenからc_valueならびを得る(_parent_id,_p_value,_c_valueならび). parentからp_valueをchildrenからc_valueならびを得る(_parent_id,_p_value,_c_valueならび) :- parentからp_valueを(_parent_id,_p_value), childrenからc_valueならびを得る(_parent_id,_c_valueならび). parentからp_valueを(_parent_id,_p_value) :- parent(_parent_id,_p_value). childrenからc_valueならびを得る(_parent_id,_c_valueならび) :- findall(_c_value,( children(_parent_id,_c_value)),_c_valueならび). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #33 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):1から15の数字から5個の数字を取って同じ数字が # 使われない並びの通りをすべて表示させなさい。 # 例:1 2 3 4 5 # 1 3 2 4 5 # 11 12 10 9 8 # :- op(750,xfx,すべて). '1から15の数字から5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる' :- '1から15の数字から'(_1から15の数字), '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字). '1から15の数字から'(_1から15の数字) :- findall(N,between(1,15,N),_1から15の数字). '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字) :- 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) すべて 表示させる(_同じ数字が使われない並び). 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) :- 順列(_1から15の数字,5,_同じ数字が使われない並び). 表示させる(_同じ数字が使われない並び) :- atomic_list_concat(_同じ数字が使われない並び,' ',_表示文字列), writef('%w\n',[_表示文字列]). P すべて Q :- forall(P,Q). 順列(_,0,[]). 順列(L1,N,[A|L2]) :- select(A,L1,R), succ(M,N), 順列(R,M,L2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #33 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):1から15の数字から5個の数字を取って同じ数字が # 使われない並びの通りをすべて表示させなさい。 # 例:1 2 3 4 5 # 1 3 2 4 5 # 11 12 10 9 8 # :- op(750,xfx,すべて). '1から15の数字から5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる' :- '1から15の数字から'(_1から15の数字), '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字). '1から15の数字から'(_1から15の数字) :- findall(N,between(1,15,N),_1から15の数字). '5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる'(_1から15の数字) :- 同じ数字が使われない並びの通りを(_1から15の数字,5,_同じ数字が使われない並び) すべて 表示させる(_同じ数字が使われない並び). 同じ数字が使われない並びの通りを(_,0,[]). 同じ数字が使われない並びの通りを(L1,N,[_数字|L2]) :- select(_数字,L1,R), succ(M,N), 同じ数字が使われない並びの通りを(R,M,L2). 表示させる(_同じ数字が使われない並び) :- atomic_list_concat(_同じ数字が使われない並び,' ',_表示文字列), writef('%w\n',[_表示文字列]). P すべて Q :- forall(P,Q). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/33 # # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク):1から15の数字から5個の数字を取って同じ数字が # 使われない並びの通りをすべて表示させなさい。 # 例:1 2 3 4 5 # 1 3 2 4 5 # 11 12 10 9 8 # '1から15の数字から5個の数字を取って同じ数字が使われない並びの通りをすべて表示させる' :- forall(順列([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15],5,L),表示させる(L)). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), succ(M,N), 順列(Z,M,X). 表示させる(L) :- atomic_list_concat(L,' ',_表示文字列), writef('%w\n',[_表示文字列]). % 以下のサイトは # 出典 :: SQL質疑応答スレ 12問目 #365 # ・DB名:Firebird1.03 # ・テーブル #  ■メイン #   受注番号 受注日 注文社 #   11    2011/12/20 A社 #   12    2011/12/21 B社 #  ■サブ #   連番 受注番号 商品コード 数 #   50  11    A10    100 #   51  11    C30    20 #   52  12    A10    10 #  ■商品 #   商品コード 商品名 カテゴリ 納品番号(商品ごとで重複していません) #   A10     コート 洋服   100 #   C30     帯   和服   504 # # メインの受注番号とサブの受注番号、サブの商品コードと商品の商品コードで # リンクしています。 # # 欲しい結果 # 受注日の期間(いつからいつまで)と、商品のカテゴリと納品番号で、 # 受注の全内容(商品)が知りたいです。 # 受注日:2011/12/01から12/31まで # カテゴリ:洋服 納品番号:100で検索をして # # 受注番号 受注日 注文者 商品コード 商品名 数量 # 11    2011/12/20 A社 A10    コート 100 # 11    2011/12/20 A社 C30    帯   20----★ # 12    2011/12/21 B社 A10    コート 10 # ★受注の全内容が知りたいので、該当する受注番号のサブはすべて表示 # したい。メインの内容は重複表示となります。 # # 丸投げですみませんが、どなたかSQL文をお願いできませんでしょうか。 # テーブルが3つになるとどうしてよいものかわからないです。 # よろしくお願いします。 # # # '受注日の期間(いつからいつまで)と、商品の商品カテゴリと納品番号で、受注の全内容(商品)が知りたい'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- '受注番号候補を得て、それを鍵に、データベースから選択する'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,LL1), 受注番号順に表示する(LL1). '受注番号候補を得て、それを鍵に、データベースから選択する'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,LL1) :- 受注番号候補を得る(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,_受注番号ならび), 'それを鍵に、データベースから選択する'(_受注番号ならび,LL1). 受注番号候補を得る(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号,_受注番号ならび) :- setof(_受注番号, [_受注番号,_受注日,_注文社,_受注日,_受注日下限,_受注日上限,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号] ^ ( '受注日範囲のメインの受注番号からサブ・商品を結合可能な受注番号'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号)),_受注番号ならび). '受注日範囲のメインの受注番号からサブ・商品を結合可能な受注番号'(_受注日下限,_受注日上限,_商品カテゴリ,_納品番号) :- 受注日範囲のメインの受注番号から(_受注日下限,_受注日上限,_受注番号,_受注日,_注文社), 'サブ・商品を結合可能な受注番号'(_受注番号,_受注日,_注文社,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号). 受注日範囲のメインの受注番号から(_受注日下限,_受注日上限,_受注番号,_受注日,_注文社) :- メイン(_受注番号,_受注日,_注文社), _受注日 @>= _受注日下限, _受注日 @=< _受注日上限. 'サブ・商品を結合可能な受注番号'(_受注番号,_受注日,_注文社,_連番,_受注番号,_商品コード,_数量,_商品名,_商品カテゴリ,_納品番号) :- サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_商品カテゴリ,_納品番号). 'それを鍵に、データベースから選択する'(_受注番号ならび,LL1) :- findall([_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量],( append(_,[_受注番号|_],_受注番号ならび), 受注番号を鍵にデータベースからの選択(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量)),LL1). 受注番号を鍵にデータベースを結合(_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量) :- メイン(_受注番号,_受注日,_注文社), サブ(_連番,_受注番号,_商品コード,_数量), 商品(_商品コード,_商品名,_商品カテゴリ,_納品番号). 受注番号順に表示する(LL1) :- 整列(LL1,LL2), 表示する(LL2). 表示する(LL) :- 見出しを表示する, forall(append(_,[[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量]|_],LL), writef('%10l %8l %8c %8c %8c %14l %8r\n',[_受注番号,_受注日,_注文者,_商品コード,_商品名,_数量])). 見出しを表示する :- write('受注番号 受注日 注文者 商品コード 商品名 数量\n'). % 以下のサイトは # 出典 :: twitter_by_horiesiniti_20150901_2 # 晴れの翌日はそれぞれ1/3ずつの確率で晴れ 曇り 雨 # 曇りの翌日はそれぞれ1/2の確立で曇り 雨 # 雨の翌日はそれぞれ1/2の確立で晴れか曇り # 初日を晴れとしてn日間の間の晴れ曇り雨の割合を答えよ。 翌日の天気確率(晴れ,晴れ,1 rdiv 3). 翌日の天気確率(晴れ,曇り,1 rdiv 3). 翌日の天気確率(晴れ,雨,1 rdiv 3). 翌日の天気確率(曇り,曇り,1 rdiv 2). 翌日の天気確率(曇り,雨,1 rdiv 2). 翌日の天気確率(雨,晴れ,1 rdiv 2). 翌日の天気確率(雨,曇り,1 rdiv 2). '初日を晴れとしてn日間の間の晴れ曇り雨の割合'(_n日間,_m日目,_天気,_確率) :- findall([_m日目,_天気,_確率],( '全ての天気節点の確率'(_n日間,_m日目,_天気の変遷,_天気,_確率)),_天気節点の確率ならび), 'n日間の天気の確率を得る'(_n日間,_天気節点の確率ならび,_m日目,_天気,_確率). '全ての天気節点の確率'(_n日間,_m日目,_天気の変遷,_天気,_確率) :- '天気節点での確率'(_n日間,1,_m日目,晴れ,1,[晴れ],_天気の変遷,_天気,_確率). '天気節点での確率'(_n日間,_m日目,_m日目,_天気,_確率,_天気の変遷,_天気の変遷,_天気,_確率). '天気節点での確率'(_n日間,_m_1日目,_m日目,_天気_1,_確率_1,_天気の変遷_1,_天気の変遷,_天気,_確率) :- 深さ優先で天気節点の確率を探索する(_n日間,_m_1日目,_m日目,_天気_1,_確率_1,_天気の変遷_1,_天気の変遷,_天気,_確率). 深さ優先で天気節点の確率を探索する(_n日間,_m_1日目,_m日目,_天気_1,_確率_1,_天気の変遷_1,_天気の変遷,_天気,_確率) :- _m_1日目 < _n日間, 翌日の天気確率を計算する(_天気_1,_確率_1,_翌日の天気,_確率_3), succ(_m_1日目,_m_2日目), '天気節点での確率'(_n日間,_m_2日目,_m日目,_翌日の天気,_確率_3,[_翌日の天気|_天気の変遷_1],_天気の変遷,_天気,_確率). 翌日の天気確率を計算する(_天気_1,_確率_1,_翌日の天気,_確率_3) :- 翌日の天気確率(_天気_1,_翌日の天気,_確率_2), _確率_3 is _確率_1 * _確率_2. 'n日間の天気の確率を得る'(_n日間,_天気節点の確率ならび,_m日目,_天気,_確率) :- between(1,_n日間,_m日目), member(_天気,[晴れ,曇り,雨]), findsum(_確率_1,member([_m日目,_天気,_確率_1],_天気節点の確率ならび),_確率). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは '13桁のISBNコードを検査せよ。'(_13桁のISBNコード) :- '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数), '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数), '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数). '各桁を数値に変換した上で、12要素の数値ならびと最終桁の数に分離し'(_13桁のISBNコード,_12要素の数値ならび,_最終桁の数) :- 各桁を数値に変換した上で(_13桁のISBNコード,_13要素の数値ならび), '12要素の数値ならびと最終桁の数に分離し'(_13要素の数値ならび,_12要素の数値ならび,_最終桁の数). 各桁を数値に変換した上で(_13桁のISBNコード,_13要素の数値ならび) :- findall(_数値,各桁を数値に変換する(_13桁のISBNコード,_数値),_13要素の数値ならび). 各桁を数値に変換する(_13桁のISBNコード,_数値) :- sub_atom(_13桁のISBNコード,_,1,_,_数字), atom_number(_数字,_数値). '12要素の数値ならびと最終桁の数に分離し'(_13要素の数値ならび,_12要素の数値ならび,_最終桁の数) :- append(_12要素の数値ならび,[_最終桁の数],_13要素の数値ならび). '12要素の数値ならびを逆順にして、順に3,1を掛けて加算し'(_12要素の数値ならび,_加算された数) :- '12要素の数値ならびを逆順にして'(_12要素の数値ならび,_反転した12要素の数値ならび), '順に3,1を掛けて加算し'(_反転した12要素の数値ならび,_加算された数). '12要素の数値ならびを逆順にして'(_12要素の数値ならび,_反転した12要素の数値ならび) :- reverse(_12要素の数値ならび,_反転した12要素の数値ならび). '順に3,1を掛けて加算し'(_反転した12要素の数値ならび,_加算された数) :- findsum(S,'順に3,1を掛けて'(_反転した12要素の数値ならび,S),_加算された数). '順に3,1を掛けて'(_反転した12要素の数値ならび,S) :- 順に(_反転した12要素の数値ならび,N1,N2), '3,1を掛けて'(N1,N2,S). 順に(_反転した12要素の数値ならび,N1,N2) :- append(L0,[N1,N2|_],_反転した12要素の数値ならび), 要素数が偶数(L0). 要素数が偶数(L) :- length(L,_要素数), 0 is _要素数 mod 2. '3,1を掛けて'(N1,N2,S) :- S is N1 * 3 + N2 * 1. '加算された数を10で割った余りをさらに10から引いたものが最終桁の数になる'(_加算された数,_最終桁の数) :- _最終桁の数 is 10 - (_加算された数 mod 10). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出典:: 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回登場したら'(_文字列,_)). % 以下のサイトは 木の深さを調べる(_ならび,_要素,_深さ) :- 木の深さを調べる(_ならび,1,_要素,_深さ). 木の深さを調べる([_アトミックな要素|_],_深さ,_アトミックな要素,_深さ) :- '要素がアトミックなら停止'(_アトミックな要素). 木の深さを調べる(_ならび,_深さ_1,_要素,_深さ) :- 要素の深さを順に調べる(_ならび,_深さ_1,_要素,_深さ). '要素がアトミックなら停止'(_アトミックな要素) :- atomic(_アトミックな要素). 要素の深さを順に調べる([_構造|R],_深さ_1,_要素,_深さ) :- 構造の各要素の深さを調べる(_構造,_深さ_1,_要素,_深さ). 要素の深さを順に調べる([_|R],_深さ_1,_要素,_深さ) :- 木の深さを調べる(R,_深さ_1,_要素,_深さ). 構造の各要素の深さを調べる(_構造,_深さ_1,_要素,_深さ) :- succ(_深さ_1,_深さ_2), 木の深さを調べる(_構造,_深さ_2,_要素,_深さ). % 以下のサイトは # append/3 に細工してみて、appendの性質を考えてみる。 append([],L,L). append([U|X],Y,[U|Z]) :- append(X,Y,Z). % ご存知 append/3 だが、このコードをちょっと細工する。 ap([],L1,L2) :- ap_1(L1,L2). ap([U|X],Y,[W|Z]) :- ap_2(U,W), ap(X,Y,Z). ap_1([],[]). ap_1([U|R1],[W|R2]) :- ap_2(U,W), ap_1(R1,R2). ap_2(U,W) :- succ(U,W). % これで、 ?- ap(L1,[A|L2],[3,4,5]). L1 = [], A = 2, L2 = [3, 4] ; L1 = [2], A = 3, L2 = [4] ; L1 = [2, 3], A = 4, L2 = [] ; false. % 注目するべきことは、A,L1,L2に5という値は出てこない。 % つまり、ap_2/2 の処理結果のみが現れるということだ。 % succ(U,W) 乃ち、 U is W - 1, が実行された結果のみ現れている。 % % 当たり前といえば当たり前のことではあるが、 % 中間的な結果表示ではなく、全て実行結果が現れるのがこの述語の特徴である。 % 以下のサイトは 二重再帰のお題(X,Y,Z) :- 'XとY共に0の場合、Zは1である。これが停止節である。'(X,Y,Z). 二重再帰のお題(X,Y,Z) :- 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z). 'XとY共に0の場合、Zは1である。これが停止節である。'(0,0,1). 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z) :- 'Xが0より大きい場合は、Xを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1から1を減じたのがZである'(X,Y,Z),!. 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z) :- 'Yが0より大きい場合は、Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1に3を加えたのがZである'(X,Y,Z). 'Xが0より大きい場合は、Xを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1から1を減じたのがZである'(X,Y,Z) :- 'Xが0より大きい場合は、'(X), 'Xを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1), 'その第三引数で得られた値Z_1から1を減じたのがZである'(Z_1,Z). 'Xが0より大きい場合は、'(X) :- X > 0. 'Xを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1) :- 'Xを1減じて'(X,X_1), 二重再帰のお題(X_1,Y,Z_1). 'Xを1減じて'(X,X_1) :- X_1 is X - 1. 'その第三引数で得られた値Z_1から1を減じたのがZである'(Z_1,Z) :- succ(Z,Z_1). 'Yが0より大きい場合は、Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1に3を加えたのがZである'(X,Y,Z) :- 'Yが0より大きい場合は、'(Y), 'Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1), 'その第三引数で得られた値Z_1に3を加えたのがZである'(Z_1,Z). 'Yが0より大きい場合は、'(Y) :- Y > 0. 'Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1) :- 'Xに1を加えYを1減じて'(X,Y,X_1,Y_1), 二重再帰のお題(X_1,Y_1,Z_1). 'Xに1を加えYを1減じて'(X,Y,X_1,Y_1) :- 'Xに1を加え'(X,X_1), 'Yを1減じて'(Y,Y_1). 'Xに1を加え'(X,X_1) :- succ(X,X_1). 'Yを1減じて'(Y,Y_1) :- Y_1 is Y - 1. 'その第三引数で得られた値Z_1に3を加えたのがZである'(Z_1,Z) :- Z is Z_1 + 3. % 以下のサイトは 二重再帰のお題(X,Y,Z) :- 'XとY共に0の場合、Zは1である。これが停止節である。'(X,Y,Z). 二重再帰のお題(X,Y,Z) :- 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z). 'XとY共に0の場合、Zは1である。これが停止節である。'(0,0,1). 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z) :- 'Xが0より大きい場合は、Xを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1から1を減じたのがZである'(X,Y,Z),!. 'XかYが0より大きい場合は、値を変化させながら『二重再帰のお題』を再帰する'(X,Y,Z) :- 'Yが0より大きい場合は、Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1に3を加えたのがZである'(X,Y,Z). 'Xが0より大きい場合は、Xを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1から1を減じたのがZである'(X,Y,Z) :- 'Xが0より大きい場合は、'(X), 'Xを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1), 'その第三引数で得られた値Z_1から1を減じたのがZである'(Z_1,Z). 'Xが0より大きい場合は、'(X) :- X > 0. 'Xを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1) :- 'Xを1減じて'(X,X_1), 二重再帰のお題(X_1,Y,Z_1). 'Xを1減じて'(X,X_1) :- X_1 is X - 1. 'その第三引数で得られた値Z_1から1を減じたのがZである'(Z_1,Z) :- succ(Z,Z_1). 'Yが0より大きい場合は、Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、その第三引数で得られた値Z_1に3を加えたのがZである'(X,Y,Z) :- 'Yが0より大きい場合は、'(Y), 'Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1), 'その第三引数で得られた値Z_1に3を加えたのがZである'(Z_1,Z). 'Yが0より大きい場合は、'(Y) :- Y > 0. 'Xに1を加えYを1減じて『二重再帰のお題』を再帰した上で、'(X,Y,Z_1) :- 'Xに1を加えYを1減じて'(X,Y,X_1,Y_1), 二重再帰のお題(X_1,Y_1,Z_1). 'Xに1を加えYを1減じて'(X,Y,X_1,Y_1) :- 'Xに1を加え'(X,X_1), 'Yを1減じて'(Y,Y_1). 'Xに1を加え'(X,X_1) :- succ(X,X_1). 'Yを1減じて'(Y,Y_1) :- Y_1 is Y - 1. 'その第三引数で得られた値Z_1に3を加えたのがZである'(Z_1,Z) :- Z is Z_1 + 3. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を表示する(_n) :- n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび), 表示する(_n番目までのフィボナッチ数ならび). n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を(L) :- 要素数2以下のフィボナッチ数列(L). フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). 要素数2以下のフィボナッチ数列([1]). 要素数2以下のフィボナッチ数列([1,1]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). 表示する(_n番目までのフィボナッチ数ならび) :- writef('%t\n',[_n番目までのフィボナッチ数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # n番目までのフィボナッチ数列を表示する(_n) :- n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび), 表示する(_n番目までのフィボナッチ数ならび). n番目までのフィボナッチ数列を(_n,_n番目までのフィボナッチ数ならび) :- n番目までの(_n,_n番目までのフィボナッチ数ならび), フィボナッチ数列を(_n番目までのフィボナッチ数ならび). n番目までの(_n,_n番目までのフィボナッチ数ならび) :- length(_n番目までのフィボナッチ数ならび,_n). フィボナッチ数列を([1]) :- !. フィボナッチ数列を([1,1]) :- !. フィボナッチ数列を([1,1|R]) :- フィボナッチ数でならびを満たす([1,1|R]). フィボナッチ数でならびを満たす([A,B,C]) :- C is A + B,!. フィボナッチ数でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数でならびを満たす([B,C|R]). 表示する(_n番目までのフィボナッチ数ならび) :- writef('%t\n',[_n番目までのフィボナッチ数ならび]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1267796762/657 # # 【 課題 】 # (4)配列を使って、n番目までのフィボナッチ数列を表示するプログラム。 # 最大何番目の値が求められるか確かめること。 # # 【 形態 】http://ime.nu/www.javadrive.jp/install/jdk/で設定したのですが1でしょうか… # 【 期限 】12月16日です # 【 Ver  】1.6.0_22 # 【 補足 】ぎりぎりで丸投げですがよろしくお願いします! # # 'n番目までのフィボナッチ数列を表示する'(N) :- n番目までのフィボナッチ数列を(N,L), 表示する(L). n番目までのフィボナッチ数列を(N,L) :- n番目までの(N,L), フィボナッチ数列を(L). n番目までの(N,L) :- length(L,N). フィボナッチ数列を([1]) :- !. フィボナッチ数列を([1,1]) :- !. フィボナッチ数列を([1,1|R]) :- フィボナッチ数列でならびを満たす([1,1|R]). フィボナッチ数列でならびを満たす([A,B,C]) :- C is A + B,!. フィボナッチ数列でならびを満たす([A,B,C|R]) :- C is A + B, フィボナッチ数列でならびを満たす([B,C|R]),!. 表示する(L) :- writef('%t\n',[L]). % 以下のサイトは 文字列の中である副文字列の最後の出現を検出する(_文字列,_前文字列,_ある副文字列,_後文字列) :- 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列), 最後の出現を検出する(_後文字列,_ある副文字列). 文字列の中である副文字列の(_文字列,_前文字列,_ある副文字列,_後文字列) :- 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,_,_語彙の先頭文字). % 以下のサイトは しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびになければしりとりを終了する(_前の語彙,_語彙ならび,[]) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- atom_chars(_前の語彙,Chars), last(Chars,_語彙の先頭文字). 語彙が語彙ならびになければ(_語彙の先頭文字,_語彙ならび) :- forall(select(_語彙,_語彙ならび,_),\+(atom_chars(_語彙,[_語彙の先頭文字|_]))). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), atom_chars(_語彙,[_語彙の先頭文字|_]). % 以下のサイトは しりとり(_前の語彙,_語彙ならび,_しりとりならび) :- 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,_しりとりならび). しりとり(_,_,[]). 前の語彙の末尾文字を先頭文字とする語彙が語彙ならびにあればしりとりを続ける(_前の語彙,_語彙ならび,[_語彙|R]) :- 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび), しりとり(_語彙,_残り語彙ならび,R). 前の語彙の末尾文字を先頭文字とする語彙を得る(_前の語彙,_語彙ならび,_語彙,_残り語彙ならび) :- 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字), 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび). 前の語彙の末尾文字を先頭文字とする(_前の語彙,_語彙の先頭文字) :- atom_chars(_前の語彙,Chars), last(Chars,_語彙の先頭文字). 語彙を得る(_語彙の先頭文字,_語彙ならび,_語彙,_残り語彙ならび) :- select(_語彙,_語彙ならび,_残り語彙ならび), atom_chars(_語彙,[_語彙の先頭文字|_]). % 以下のサイトは '二つの2行3列の行列A、Bに対して 和A+B を求める'(_2行3列の行列A,_2行3列の行列B,_行列Aと行列Bの和行列) :- '二つの2行3列の行列A、Bの対応する成分の和を成分とする2行3列の行列を得る'(_2行3列の行列A,_2行3列の行列B,_行列Aと行列Bの和行列). '二つの2行3列の行列A、Bの対応する成分の和を成分とする2行3列の行列を得る'([],[],[]). '二つの2行3列の行列A、Bの対応する成分の和を成分とする2行3列の行列を得る'([_行A|R1],[_行B|R2],[_行C|R3]) :- '_行Aと_行Bの各成分を加えて_行Cを得る'(_行A,_行B,_行C), '二つの2行3列の行列A、Bの対応する成分の和を成分とする2行3列の行列を得る'(R1,R2,R3). '_行Aと_行Bの各成分を加えて_行Cを得る'([],[],[]). '_行Aと_行Bの各成分を加えて_行Cを得る'([_列A|R1],[_列B|R2],[_列C|R3]) :- _列C is _列A + _列B, '_行Aと_行Bの各成分を加えて_行Cを得る'(R1,R2,R3). % 以下のサイトは '二つの2行3列の行列A、Bに対して 和A+B を求める'(_2行3列の行列A,_2行3列の行列B,_行列Aと行列Bの和行列) :- _2行3列の行列A = [[A11,A12,A13],[A21,A22,A23]], _2行3列の行列B = [[B11,B12,B13],[B21,B22,B23]], _行列Aと行列Bの和行列 = [[C11,C12,C13],[C21,C22,C23]], 各対応する成分を加えた2行3列の行列を得る(A11,A12,A13,A21,A22,A23,B11,B12,B13,B21,B22,B23,_行列Aと行列Bの和行列). 各対応する成分を加えた2行3列の行列を得る(A11,A12,A13,A21,A22,A23,B11,B12,B13,B21,B22,B23,[[C11,C12,C13],[C21,C22,C23]]) :- C11 is A11 + B11, C12 is A12 + B12, C13 is A13 + B13, C21 is A21 + B21, C22 is A22 + B22, C23 is A23 + B23. % 以下のサイトは '二つの2行3列の行列A、Bに対して 和A+B を求める'(_2行3列の行列A,_2行3列の行列B,_行列Aと行列Bの和行列) :- _2行3列の行列A = [[A11,A12,A13],[A21,A22,A23]], _2行3列の行列B = [[B11,B12,B13],[B21,B22,B23]], _行列Aと行列Bの和行列 = [[C11,C12,C13],[C21,C22,C23]], C11 is A11 + B11, C12 is A12 + B12, C13 is A13 + B13, C21 is A21 + B21, C22 is A22 + B22, C23 is A23 + B23. % 以下のサイトは 互いに素(L1,L2) :- \+((member(_要素,L1),member(_要素,L2)). % 以下のサイトは # 出典 :: Yahoo 知恵袋 pata0103さんの質問 # - - - # 1 2 - # 1 - 3 # このようなテキストファイルを読み取って # int a[3][3]という配列に # 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する # といったことをするにはどのようにコードを書けばいいのでしょう? # 簡単なことで申し訳ありませんがよろしくお願いします。 # '- - - 1 2 - 1 - 3 このようなテキストファイルを読み取って int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(_ファイル,_a) :- テキストファイルを読み取って(_ファイル,_Lines), 'int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(Lines,_a). このようなテキストファイルを読み取って(_ファイル,Lines) :- get_lines(_ファイル,Lines). 'int a[3][3]という配列に 座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(Lines,_a) :- findall(L,( 読み取った行をならびに変換し(Line,L1), 'ならびの各要素に、座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(L1,L)),_a). 読み取った行をならびに変換し(Line,L1) :- member(Line,Lines), split(Line,[' '],L1). 'ならびの各要素に、座標(i,j)が ”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(L1,L) :- findall(B,( member(A,L1), '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(A,B)),L). '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(-,-1) :- !. '”-” ならa[i][j]にー1を代入し、数字ならその数字を代入する'(_数字,_数字). get_line(Line) :- read_line_to_codes(user_input,Codes), atom_codes(Line,Codes). get_lines([]) :- at_end_of_stream(user_input),!. get_lines([Line|R]) :- get_line(Line), get_lines(R). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/111 # # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- '"CGUU"が検出された場合のギャップ("-")と前後の文字ならび'(R1,R2,R3,L1,L2), 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3), '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列). '"CGUU"が検出された場合のギャップ("-")と前後の文字ならび'(R1,R2,R3,L1,L2) :- 文字列を文字ならびに変換し(_文字列,_文字ならび), 'ギャップ("-")と前後の文字ならびを得る'(_文字ならび,R1,R2,R3,L1,L2). 文字列を文字ならびに変換し(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 'ギャップ("-")と前後の文字ならびを得る'(_文字ならび,R1,R2,R3,L1,L2) :- append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|L2]],_文字ならび). 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3) :- 'R1は[]であるか全ての要素がギャップ("-")のリストである'(R1), 'R2は[]であるか全ての要素がギャップ("-")のリストである'(R2), 'R3は[]であるか全ての要素がギャップ("-")のリストである'(R3). 'R1は[]であるか全ての要素がギャップ("-")のリストである'(R1) :- forall(member(_要素,R1),_要素='-'). 'R2は[]であるか全ての要素がギャップ("-")のリストである'(R2) :- forall(member(_要素,R2),_要素='-'). 'R3は[]であるか全ての要素がギャップ("-")のリストである'(R3) :- forall(member(_要素,R3),_要素='-'). '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列) :- 'L1から前文字列を得る'(L1,_前文字列), 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU), 'L2から後文字列を得る'(L2,_後文字列). 'L1から前文字列を得る'(L1,_前文字列) :- atom_chars(_前文字列,L1). 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU) :- 'ギャップ("-")を含んだ"CGUU"文字ならびを作り'(R1,R2,R3,_ギャップを含んだCGUU文字ならび), 'ギャップ("-")を含んだ"CGUU"に変換する'(_ギャップを含んだCGUU文字ならび,_ギャップを含んだCGUU). 'ギャップ("-")を含んだ"CGUU"文字ならびを作り'(R1,R2,R3,_ギャップを含んだCGUU文字ならび) :- append([['C'|R1],['G'|R2],['U'|R3],['U']],_ギャップを含んだCGUU文字ならび), 'ギャップ("-")を含んだ"CGUU"に変換する'(_ギャップを含んだCGUU文字ならび,_ギャップを含んだCGUU) :- atom_chars(_ギャップを含んだCGUU,_ギャップを含んだCGUU文字ならび). 'L2から後文字列を得る'(L2,_後文字列) :- atom_chars(_後文字列,L2). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1312201995/111 # # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '"CGUU"をギャップ("-")を含んでいても検出'(_文字列,_前文字列,_CGUU,_後文字列) :- '"CGUU"が検出された場合のギャップと前後の文字ならび'(R1,R2,R3,L1,L2), 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3), '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列). '"CGUU"が検出された場合のギャップと前後の文字ならび'(R1,R2,R3,L1,L2) :- atom_chars(_文字列,_文字ならび), append([L1,['C'|R1],['G'|R2],['U'|R3],['U'|L2]],_文字ならび). 'R1,R2,R3は全て[]であるか全ての要素がギャップ("-")のリストである'(R1,R2,R3) :- forall(member(_1,R1),_1='-'), forall(member(_2,R2),_2='-'), forall(member(_3,R3),_3='-'). '前文字列・ギャップ("-")を含んだ"CGUU"・後文字列を得る'(L1,R1,R2,R3,L2,_前文字列,_ギャップを含んだCGUU,_後文字列) :- atom_chars(_前文字列,L1), 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU), atom_chars(_後文字列,L2). 'ギャップ("-")を含んだ"CGUU"'(R1,R2,R3,_ギャップを含んだCGUU) :- append([['C'|R1],['G'|R2],['U'|R3],['U']],_ギャップを含んだCGUU文字ならび), atom_chars(_ギャップを含んだCGUU,_ギャップを含んだCGUU文字ならび). % 以下のサイトは # 出典 :: 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,_後文字列). % 以下のサイトは 整数からString(_桁,_整数,_String) :- 整数からStringを生成する(_桁,_整数,'',_String). 整数からStringを生成する(_桁,_整数,_ここまで成長したString,_String) :- '_整数が0になったら桁数になるまで先頭に0を付加して終了する'(_桁,_整数,_ここまで成長したString,_String),!. 整数からStringを生成する(_桁,_整数,_ここまで成長したString,_String) :- '_整数を10で割った剰余を数値コード変換して、順に、Stringの先頭に付加していく'(_桁,_整数,_ここまで成長したString,_String). '_整数が0になったら桁数になるまで先頭に0を付加して終了する'(_桁,_整数,_ここまで成長したString,_String) :- 'Stringが桁数になったら(桁数が0になったら)終了する'(_桁,_整数,_ここまで成長したString,_String). '_整数が0になったら桁数になるまで先頭に0を付加して終了する'(_桁,_整数,_ここまで成長したString,_String) :- '整数が0になったら先頭に0を付加していく'(_桁,_整数,_ここまで成長したString,_String). 'Stringが桁数になったら(桁数が0になったら)終了する'(0,_,_String,_String). '整数が0になったら先頭に0を付加していく'(_桁,0,_ここまで成長したString,_String) :- succ(_桁_1,_桁), '_整数が0になったら桁数になるまで先頭に0を付加して終了する'(_桁_1,0,[48|_ここまで成長したString],_String). '_整数を10で割った剰余を数値コード変換して、順に、Stringの先頭に付加していく'(_桁,_整数,_ここまで成長したString,_String) :- '_整数を10で割った剰余を数値コード変換して、'(_整数,_末尾桁を除いた整数,_数値コード), '順に、Stringの先頭に付加していく'(_桁,_末尾桁を除いた整数,_数値コード,_ここまで成長したString,_String). '_整数を10で割った剰余を数値コード変換して、'(_整数,_末尾桁を除いた整数,_数値コード) :- _数値コード is _整数 mod 10 + 48, _末尾桁を除いた整数 is _整数 // 10. '順に、Stringの先頭に付加していく'(_桁,_末尾桁を除いた整数,_数値コード,_ここまで成長したString,_String) :- succ(_桁_1,_桁), 整数からStringを生成する(_桁_1,_末尾桁を除いた整数,[_数値コード|_ここまで成長したString],_String). % 以下のサイトは 整数から文字列(_桁,_整数,_文字列) :- 整数から文字列を生成する(_桁,_整数,'',_文字列). 整数から文字列を生成する(_桁,_整数,_ここまで成長した文字列,_文字列) :- '_整数が0になったら指定桁数に達するまで先頭に0を付加して終了する'(_桁,_整数,_ここまで成長した文字列,_文字列),!. 整数から文字列を生成する(_桁,_整数,_ここまで成長した文字列,_文字列) :- '_整数を10で割った剰余を文字変換して、順に、文字列の先頭に付加していく'(_桁,_整数,_ここまで成長した文字列,_文字列). '_整数が0になったら指定桁数に達するまで先頭に0を付加して終了する'(_桁,_整数,_ここまで成長した文字列,_文字列) :- '文字列が指定桁数に達したら(0になったら)終了する'(_桁,_整数,_ここまで成長した文字列,_文字列). '_整数が0になったら指定桁数に達するまで先頭に0を付加して終了する'(_桁,_整数,_ここまで成長した文字列,_文字列) :- '_整数が0になったら先頭に0を付加していく'(_桁,_整数,_ここまで成長した文字列,_文字列). '文字列が指定桁数に達したら(0になったら)終了する'(0,_,_文字列,_文字列). '_整数が0になったら先頭に0を付加していく'(_桁,0,_ここまで成長した文字列,_文字列) :- atom_concat('0',_ここまで成長した文字列,_先頭に0が付加された文字列), succ(_桁_1,_桁), '_整数が0になったら桁数になるまで先頭に0を付加して終了する'(_桁_1,0,_先頭に0が付加された文字列,_文字列). '_整数を10で割った剰余を文字変換して、順に、文字列の先頭に付加していく'(_桁,_整数,_ここまで成長した文字列,_文字列) :- '_整数を10で割った剰余を文字変換して、'(_整数,_末尾桁を除いた整数,_先頭に付加する数字), '順に、文字列の先頭に付加していく'(_桁,_末尾桁を除いた整数,_先頭に付加する数字,_ここまで成長した文字列,_文字列). '_整数を10で割った剰余を文字変換して、'(_整数,_末尾桁を除いた整数,_先頭に付加する数字) :- _整数を10で割った剰余 is _整数 mod 10, _末尾桁を除いた整数 is _整数 // 10, atom_number(_先頭に付加する数字,_整数を10で割った剰余). '順に、文字列の先頭に付加していく'(_桁,_末尾桁を除いた整数,_先頭に付加する数字,_ここまで成長した文字列,_文字列) :- succ(_桁_1,_桁), atom_concat(_先頭に付加する数字,_ここまで成長した文字列,_先頭に数字が付加された文字列), 整数から文字列を生成する(_桁_1,_末尾桁を除いた整数,_先頭に数字が付加された文字列,_文字列). % 以下のサイトは 行文字列入力(_行文字列,_終了状態) :- 一文字を得る(_文字), 文字ならび入力(_文字,_文字ならび,_終了状態), 文字ならびを行文字列に変換する(_行文字列,_文字ならび). 文字ならび入力(_文字,_文字ならび,_終了状態) :- 入力文字が改行またはend_of_fileで終了する(_文字,_文字ならび,_終了状態),!. 文字ならび入力(_文字,_文字ならび,_終了状態) :- 文字を読み込みながら文字ならび入力を続ける(_文字,_文字ならび,_終了状態). 入力文字が改行またはend_of_fileで終了する(end_of_file,[],end_of_file) :- !. 入力文字が改行またはend_of_fileで終了する('\n',[],改行). 文字を読み込みながら文字ならび入力を続ける(_文字,[_文字|R],_終了状態) :- 一文字を得る(_次の文字), 文字ならび入力(_次の文字,R,_終了状態). 一文字を得る(_文字) :- get_char(_文字). 文字ならびを行文字列に変換する(_行文字列,_文字ならび) :- atom_chars(_行文字列,_文字ならび). % 以下のサイトは 行入力(_行,_終了状態) :- 一文字を得る(_文字), 文字ならび入力(_文字,_文字ならび,_終了状態), atom_chars(_行,_文字ならび). 文字ならび入力(_文字,_文字ならび,_終了状態) :- 入力文字が改行またはend_of_fileで終了する(_文字,_文字ならび,_終了状態),!. 文字ならび入力(_文字,_文字ならび,_終了状態) :- 文字を読み込みながら文字ならび入力を続ける(_文字,_文字ならび,_終了状態). 入力文字が改行またはend_of_fileで終了する(end_of_file,[],end_of_file) :- !. 入力文字が改行またはend_of_fileで終了する('\n',[],改行). 文字を読み込みながら文字ならび入力を続ける(_文字,[_文字|R],_終了状態) :- 一文字を得る(_次の文字), 文字ならび入力(_次の文字,R,_終了状態). 一文字を得る(_文字) :- get_char(_文字). % 以下のサイトは mergesort([],[]) :- !. mergesort([A],[A]) :- !. mergesort(L, L3) :- ならびを二分する(L, L1, L2), mergesort(L1, L1_2), mergesort(L2, L2_2), merge(L1_2,L2_2,L3). merge([],L,L) :- !. merge(L,[],L) :- !. merge([A|R1],[B|R2],[A|R3]) :- A @=< B, merge(R1,[B|R2],R3). merge([A|R1],[B|R2],[B|R3]) :- A @> B, merge([A|R1],R2,R3). ならびを二分する([],[],[]) :- !. ならびを二分する(_ならび,_前半ならび,_後半ならび) :- 二分されたならびの要素数(_ならび,_二分されたならびの要素数), 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび), append(_前半ならび,_後半ならび,_ならび),!. 二分されたならびの要素数(_ならび,_二分されたならびの要素数) :- length(_ならび,_ならびの長さ), _二分されたならびの要素数 is _ならびの長さ // 2. 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび) :- length(_前半ならび,_二分されたならびの要素数), length(_後半ならび_1,_二分されたならびの要素数), append(_後半ならび_1,_,_後半ならび). % 以下のサイトは ならびを二分する(_ならび,_前半ならび,_後半ならび) :- 二分されたならびの要素数(_ならび,_二分されたならびの要素数), 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび), append(_前半ならび,_後半ならび,_ならび),!. 二分されたならびの要素数(_ならび,_二分されたならびの要素数) :- length(_ならび,_ならびの長さ), _二分されたならびの要素数 is _ならびの長さ // 2. 二分されたならびを得る(_二分されたならびの要素数,_前半ならび,_後半ならび) :- length(_前半ならび,_二分されたならびの要素数), length(_後半ならび_1,_二分されたならびの要素数), append(_後半ならび_1,_,_後半ならび). % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換してその桁数を得る(_整数,_数字ならび,_数字部分の桁), 頭部の零ならびを作り数字ならびを追加した頭部零数字ならびを作る(_桁,_数字ならび,_数字部分の桁,_頭部零数字ならび), 頭部零数字ならびを数値を表す文字列に変換する(_頭部零数字ならび,_数値を表す文字列). 整数を数字ならびに変換してその桁数を得る(_整数,_数字ならび,_数字部分の桁) :- number_chars(_整数,_数字ならび), length(_数字ならび,_数字部分の桁). 頭部の零ならびを作り数字ならびを追加した頭部零数字ならびを作る(_桁,_数字ならび,_数字部分の桁,_頭部零数字ならび) :- _頭部零の桁 is _桁 - _数字部分の桁, findall('0',between(1,_頭部零の桁,_),_頭部零数字ならび,_数字ならび). 頭部零数字ならびを数値を表す文字列に変換する(_頭部零数字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_頭部零数字ならび). % 以下のサイトは 整数から頭部零文字列(_桁,_整数,_数値を表す文字列) :- 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび), 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび,_文字ならび), 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列). 整数を数字ならびに変換して桁数要素の変数ならびの後半に埋め込む(_桁,_整数,_頭部零文字ならび,_文字ならび) :- length(_文字ならび,_桁), number_chars(_整数,_数字ならび), append(_頭部零文字ならび,_数字ならび,_文字ならび). 頭部の零ならびは後から変数に零を埋める(_頭部零文字ならび) :- findall('0',( member(_要素,_頭部零文字ならび),var(_要素)),_頭部零文字ならび). 文字ならびを数値を表す文字列に変換する(_文字ならび,_数値を表す文字列) :- atom_chars(_数値を表す文字列,_文字ならび). % 以下のサイトは 末尾までの空白列を取り除いた文字列(_文字列,_末尾までの空白列を取り除いた文字列) :- sub_atom(_文字列,0,_,R,_末尾までの空白列を取り除いた文字列), \+(sub_atom(_末尾までの空白列を取り除いた文字列,_,1,0,' ')), 末尾までの空白列(_文字列,R,_末尾までの空白列). 末尾までの空白列(_文字列,R,_末尾までの空白列) :- 末尾までの(_文字列,R,_末尾までの空白列), 空白列(_末尾までの空白列). 末尾までの(_文字列,R,_末尾までの空白列) :- sub_atom(_文字列,_,R,0,_末尾までの空白列). 空白列(_末尾までの空白列) :- forall(sub_atom(_末尾までの空白列,_,1,_,_文字),_文字 = ' '). % 以下のサイトは # 出典 :: 削除されたツイート % Prolog さてどうするの? 将来青函トンネル内で焼身自殺男が現れることは確実だ. 'さてどうするの?'(それでも走り抜ける) :- 将来青函トンネル内で焼身自殺男が現れることは確実だ. 'さてどうするの?'(停車して消火に努める) :- 将来青函トンネル内で焼身自殺男が現れることは確実だ. % 以下のサイトは 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は存在せず'([],Y). 'Xの前方リストにYは存在せず'([Y|_],Y) :- !,fail. 'Xの前方リストにYは存在せず'([_|R],Y) :- 'Xの前方リストにYは存在せず'(R,Y). 'Xの後方リストにYは存在する'([Y|_],Y). 'Xの後方リストにYは存在する'([_|R],Y) :- 'Xの後方リストにYは存在する'(R,Y). % 以下のサイトは 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. % 以下のサイトは % ?- append(L1,[E|L2],[1,2,3]). % L1 = [], E = 1, L2 = [2,3]; % L1 = [1], E = 2, L2 = [3]; % L1 = [1,2], E = 3, L2 = []. % % append/3の定義 % % append([],L,L). % append([U|L1],L2,[U|L3]) :- % append(L1,L2,L3). % % append/3 を 'リストを注目要素、その前リスト、後リストに分割する'/4 に変形。 % 'リストを注目リスト、その前リスト、後リストに分割する'(_リスト,_前リスト,_注目リスト,_後リスト) :- append([_前リスト,_注目リスト,_後リスト],_リスト). ?- 'リストを注目リスト、その前リスト、後リストに分割する'([1,2,3],_前リスト,_注目リスト,_後リスト). _前リスト = _注目リスト, _注目リスト = [], _後リスト = [1, 2, 3] ; _前リスト = [], _注目リスト = [1], _後リスト = [2, 3] ; _前リスト = [], _注目リスト = [1, 2], _後リスト = [3] ; _前リスト = _後リスト, _後リスト = [], _注目リスト = [1, 2, 3] ; _前リスト = [1], _注目リスト = [], _後リスト = [2, 3] ; _前リスト = [1], _注目リスト = [2], _後リスト = [3] ; _前リスト = [1], _注目リスト = [2, 3], _後リスト = [] ; _前リスト = [1, 2], _注目リスト = [], _後リスト = [3] ; _前リスト = [1, 2], _注目リスト = [3], _後リスト = [] ; _前リスト = [1, 2, 3], _注目リスト = _後リスト, _後リスト = [] ; false. % 以下のサイトは # 出典 :: この話題は はにわさん のツイートを種にしています '0,1,2,3,・・・という数列'(X) :- '0,1,2,3,・・・という数列'(0,X). '0,1,2,3,・・・という数列'(X,X). '0,1,2,3,・・・という数列'(N,X) :- succ(N,N_2), '0,1,2,3,・・・という数列'(N_2,X). '1,2,4,8,・・・という数列'(X) :- '1,2,4,8,・・・という数列'(0,X). '1,2,4,8,・・・という数列'(X) :- '0,1,2,3,・・・という数列'(N), X is 2 ^ N. %%%%%%%%%%%% 実行列 %%%%%%%%%%%%%% ?- '0,1,2,3,・・・という数列'(X). X = 0; X = 1; X = 2; X = 3; X = 4; X = 5. ?- '0,1,2,3,・・・という数列'(36). true. ?- '0,1,2,3,・・・という数列'(-36). % 深い眠りに就く ?- '1,2,4,8,・・・という数列'(X). X = 1; X = 2; X = 4; X = 8; X = 16. ?- '1,2,4,8,・・・という数列'(57). % 深い眠りに就く ?- '1,2,4,8,・・・という数列'(X),X < 57. X = 1; X = 2; X = 4; X = 8; X = 16; X = 32; % 深い眠りに就く ?- '1,2,4,8,・・・という数列'(X),X >= 57. X = 64; X = 128; X = 256. ?- findall(X,('1,2,4,8,・・・という数列'(X),X<57),L). % 浅い眠りの後 スタックオーバーフロー ERROR ?- findall(X,('1,2,4,8,・・・という数列'(X),(X>=57,!,fail;X < 57)),L). L = [1, 2, 4, 8, 16, 32]. ?- % 以下のサイトは 自然数生成(X) :- 自然数生成(0,X). 自然数生成(X,X). 自然数生成(N,X) :- succ(N,N_2), 自然数生成(N_2,X). '1,2,4,8,・・・という数列'(X) :- 自然数生成(N), X is 2 ^ N. % 以下のサイトは % *** 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'). % 以下のサイトは 'コールユーブンゲン No.45 a) の階名'(['ミ-1','ミ-1','ド-1','ソ-1','ファ-1','ミ-1','ファ-1','レ-1','ラ-1','ソ-1','ファ-1','ソ-1','ミ-1','シ-1','ド-2','ファ-1','ラ-1','レ-1','ファ-1','シ-0','ソ-1','ファ-1','ミ-1','ド-1','ソ-1','ファ-1','ミ-1','ラ-1','ファ-1','ド-2','シ-1','ラ-1','ソ-1','ド-2','ミ-1','ラ-1','レ-1','ファ-1','シ-0','レ-1','ソ-1','ド-1','ミ-1','ド-2','シ-1','ラ-1','ド-2','ラ-1','シ-1','ミ-1','シ-1','ド-2','シ-1','ラ-1','ソ-1','ファ-1','ラ-1','ファ-1','ソ-1','ド-1','ソ-1','ラ-1','シ-1','ド-2','ソ-1','レ-2','シ-1','ド-2','ラ-1','ド-2','ラ-1','シ-1','ラ-1','ミ-1','レ-1','ラ-1','ソ-1','ラ-1','ファ-1','ミ-1','ソ-1','ド-1','ド-1','レ-1','ミ-1','ファ-1','ソ-1','ラ-1','ファ-1','ド-2','ラ-1','ソ-1','ファ-1','ラ-1','レ-1','レ-1','ミ-1','ファ-1','ソ-1','ラ-1','シ-1','ソ-1','レ-2','ド-2','シ-1','ド-2','ミ-1','シ-1','ド-2','シ-1','ラ-1','ド-1','ソ-1','ラ-1','ソ-1','ファ-1','ラ-1','ミ-1','ファ-1','ド-1','レ-1','シ-0','レ-1','ソ-1','ド-1']). 'この練習曲がコールユーブンゲンの代表曲だという根拠として、音階の出現数が最も多いことが挙げられる。それではそのことを示す資料を作っておくことにしよう。' :- 'コールユーブンゲン No.45 a) の音階出現表'. 'コールユーブンゲン No.45 a) の音階出現表' :- forall(('コールユーブンゲン No.45 a) に出現する音階とその出現数'(A,B,_出現数),_出現数 > 0), writef('%t,%t,%t\n',[A,B,_出現数])). 'コールユーブンゲン No.45 a) に出現する音階とその出現数'(A,B,_出現数) :- 'コールユーブンゲン No.45 a) に出現する音階と'(L,A,B), その出現数(L,A,B,_出現数). 'コールユーブンゲン No.45 a) に出現する音階と'(L,A,B) :- 'コールユーブンゲン No.45 a) の階名'(L), setof(A,member(A,L),L2), 順列(L2,2,[A,B]). その出現数(L,A,B,_出現数) :- count(append(_,[A,B|_],L),_出現数). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一個ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一個ずつ取り出して行く(L1,A,R2) :- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは シャッフル(L1,L2) :- length(L1,Len), findall(N,between(1,Len,N),L), シャッフル(Len,L,L1,L2). シャッフル(0,_,_,[]) :- !. シャッフル(Len,L,L1,[_値|R]) :- 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R). 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R) :- 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値), succ(Len_1,Len), シャッフル(Len_1,L_1,L1,R). 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値) :- 得られた乱数の位置にある(Len,L,M), 'L1の値を取り出す'(L,L1,M,L_1,_値). 得られた乱数の位置にある(Len,L,M) :- N is random(Len) + 1, nth1(N,L,M). 'L1の値を取り出す'(L,L1,M,L_1,_値) :- nth1(M,L1,_値), select(M,L,L_1). % 以下のサイトは 数字に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値) :- sub_atom(_文字列,_前文字列,_一致文字列,_後文字列), freeze(_文字列,catch(atom_number(_一致文字列,_数値),E,fail)). 偶数に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値) :- 数字に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値), 0 is _数値 mod 2. 奇数に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値) :- 数字に一致する(_文字列,_前文字列,_一致文字列,_後文字列,_数値), 1 is _数値 mod 2. sub_atom(_文字列,_前文字列,_一致文字列,_後文字列) :- freeze(_文字列,sub_atom(_文字列,S,_,R,_一致文字列)), freeze(_文字列,sub_atom(_文字列,0,S,_,_前文字列)), freeze(_文字列,sub_atom(_文字列,_,R,0,_後文字列)). % 以下のサイトは ニュートン法によって平方根を求める(_c,_平方根) :- 平方根に最も近い大きい方の整数を探す(0,0,_c,_xn), 交点のx座標を求める(0,_c,_xn,10,_平方根),!. 平方根に最も近い大きい方の整数を探す(_xn_2,_xn,_c,_xn) :- _xn_2 * _xn_2 >= _c. 平方根に最も近い大きい方の整数を探す(N_1,_,_c,_xn) :- succ(N_1,N_2), 平方根に最も近い大きい方の整数を探す(N_2,N_1,_c,_xn). 交点のx座標を求める(_i,_c,_平方根,_n,_平方根) :- _i >= _n. 交点のx座標を求める(_i_1,_c,_xn_1,_n,_平方根) :- succ(_i_1,_i_2), _xn_2 is (_xn_1 + _c / _xn_1) / 2, 交点のx座標を求める(_i_2,_c,_xn_2,_n,_平方根). % 以下のサイトは 文字列ならびのならび結合(_文字列ならびのならび,_膠着語,_文字列) :- findall(_副文字列,( member(_文字列ならび,_文字列ならびのならび), atomic_list_concat(_文字列ならび,_副文字列)),_副文字列ならび), atomic_list_concat(_副文字列ならび,_膠着語,_文字列). 文字列ならびのならび結合(_文字列ならびのならび,_文字列) :- findall(_副文字列,( member(_文字列ならび,_文字列ならびのならび), atomic_list_concat(_文字列ならび,_副文字列)),_副文字列ならび), atomic_list_concat(_副文字列ならび,_文字列). ?- 文字列ならびのならび結合([[尾崎,隆大],[佐,智,子]],'+',_文字列). _文字列 = '尾崎隆大+佐智子'. % 以下のサイトは :- op(700,xfx,は). :- op(650,xfx,が). :- op(650,xfx,以上). :- op(600,xf,以上). :- op(600,xf,以下). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 135416 以下, _給与所得控除の額 は 54167. 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 135417 以上 149999 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.4). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 150000 以上 299999 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.3 + 15000). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 300000 以上 549999 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.2 + 45000). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 550000 以上 833333 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.1 + 100000). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 833334 以上 1249999 以下, _給与所得控除の額 は 切り上げ(_社会保険料控除後の給与等の金額 * 0.05 + 141667). 別表第1(_社会保険料控除後の給与等の金額,_給与所得控除の額) :- _社会保険料控除後の給与等の金額 が 1250000 以上, _給与所得控除の額 は 204167. _値 は 切り上げ(_式) :- _値 is ceiling(_式),!. _値 は _式 :- _値 is _式. A が B 以上 :- A >= B. A が B 以下 :- A =< B. A が B 以上 C 以下 :- A >= B, A =< C. % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- read_term_from_atom(_行,(_身長,_体重),[]), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 % 以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法を用いて、1次関数 ax+b をモデルとして近似し、係数a,bを決定する。 最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小と するような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. % 以下のサイトは 'Σ'(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k),_目標),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '最小二乗法を用いて、1次関数 ax+b をモデルとして近似し、係数a,bを決定する。 最小二乗法とは、測定で得られた数値の組を、適当なモデルから想定される 想定する関数が測定値に対してよい近似となるように、残差の二乗和を最小と するような係数を決定する方法。'(_測定で得られた数値の組,_a,_b) :- length(_測定で得られた数値の組,_標本数), '測定で得られた数値の組をLx,Lyに分解する'(_測定で得られた数値の組,Lx,Ly), '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b). '測定で得られた数値の組をLx,Lyに分解する'([],[],[]). '測定で得られた数値の組をLx,Lyに分解する'([(X,Y)|R],[X|Rx],[Y|Ry]) :- '測定で得られた数値の組をLx,Lyに分解する'(R,Rx,Ry). '適当なモデルから想定される1次関数 ax+b を用いて近似するときに、 想定する関数が測定値に対してよい近似となるように、残差の二乗和を 最小とするような係数を決定する'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- 係数aの式の分子(_標本数,Lx,Ly,_分子), 係数aの式の分母(_標本数,Lx,Ly,_分母), _a is _分子 / _分母. 係数aの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), _分子 is _標本数 * _合計_1 - _合計_2 * _合計_3. 係数aの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. 係数b(_標本数,Lx,Ly,_b) :- 係数bの式の分子(_標本数,Lx,Ly,_分子), 係数bの式の分母(_標本数,Lx,Ly,_分母), _b is _分子 / _分母. 係数bの式の分子(_標本数,Lx,Ly,_分子) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), _分子 is _合計_1 * _合計_2 - _合計_3 * _合計_4. 係数bの式の分母(_標本数,Lx,Ly,_分母) :- 'Σ'(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), 'Σ'(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), _分母 is _標本数 * _合計_1 - _合計_2 ^ 2. % 以下のサイトは Σ(_n_1,_n_2,_k,_目標の集約値,_目標,_集約合計) :- findsum(_目標の集約値,( between(_n_1,_n_2,_k), call(_目標)),_集約合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), Σ(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_4), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), Σ(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), Σ(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_5), Σ(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは sigma(_n_1,_n_2,_k,S,P,_合計) :- findsum(S,( between(_n_1,_n_2,_k), call(P)),_合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_1), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_2), sigma(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_3), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_4), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_1), sigma(1,_標本数,_k,S,nth1(_k,Ly,S),_合計_2), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),nth1(_k,Ly,Y),S is X * Y),_合計_3), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_4), sigma(1,_標本数,_k,S,(nth1(_k,Lx,X),S is X ^ 2),_合計_5), sigma(1,_標本数,_k,S,nth1(_k,Lx,S),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは sigma(_n_1,_n_2,S,P,_合計) :- findsum(S,P,_合計). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). '一次方程式 y=ax+b の係数_a,_bを最小二乗法を使って得る'(_標本数,Lx,Ly,_a,_b) :- 係数a(_標本数,Lx,Ly,_a), 係数b(_標本数,Lx,Ly,_b). 係数a(_標本数,Lx,Ly,_a) :- sigma(1,_標本数,S,(nth1(_nth1,Lx,X),nth1(_nth1,Ly,Y),S is X * Y),_合計_1), sigma(1,_標本数,S,member(S,Lx),_合計_2), sigma(1,_標本数,S,member(S,Ly),_合計_3), sigma(1,_標本数,S,(member(X,Lx),S is X ^ 2),_合計_4), sigma(1,_標本数,S,member(S,Lx),_合計_5), _a is (_標本数 * _合計_1 - _合計_2 * _合計_3) / ( _標本数 * _合計_4 - _合計_5 ^ 2). 係数b(_標本数,Lx,Ly,_b) :- sigma(1,_標本数,S,(member(X,Lx),S is X * X),_合計_1), sigma(1,_標本数,S,member(S,Ly),_合計_2), sigma(1,_標本数,S,(nth1(_nth1,Lx,X),nth1(_nth1,Ly,Y),S is X * Y),_合計_3), sigma(1,_標本数,S,member(S,Lx),_合計_4), sigma(1,_標本数,S,(member(X,Lx),S is X * X),_合計_5), sigma(1,_標本数,S,member(S,Lx),_合計_6), _b is (_合計_1 * _合計_2 - _合計_3 * _合計_4) / ( _標本数 * _合計_5 - _合計_6 ^ 2). % 以下のサイトは # 出典 :: CodeIQ q1565 # 【問題】 # できるだけ多くの人数で、肩車をしようと思います。 #      # # 肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。 # # # 【例】 # 一行ごとに、身長と体重のセットが与えられます。次の例は、5人の身長と体重を表しています。 # 166 71 # 178 84 # 176 94 # 174 85 # 174 65 # # # この中から肩車をする人間を選ぶと、身長と体重が # (166, 71) # (174, 85) # (176, 94) # の3人が最大人数になります。 # # ※身長と体重共に、上の人が下の人“より小さい”場合に肩車が許されるとしていますので、 #  (174, 85)の上に(174, 65)が乗ることはできません。 'できるだけ多くの人数で、肩車をしようと思います。      肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_最大人数) :- 身長と体重のセットを得る(_身長と体重のセット), 'できるだけ多くの人数で、肩車をしようと思います。'(_身長と体重のセット,_最大人数). 身長と体重のセットを得る(_身長と体重のセット) :- 行を得る(_行,_終了状態), 身長と体重のセットを得る(_終了状態,_行,_身長と体重のセット). 身長と体重のセットを得る(入力終了,_,[]) :- !. 身長と体重のセットを得る(_,_行,_身長体重ならび) :- 入力終了になるまで行入力を続ける(_,_行,_身長体重ならび). 入力終了になるまで行入力を続ける(_,_行,[[_身長,_体重]|_残りの行ならび]) :- read_term_from_atom(_行,(_身長,_体重),[]), 行を得る(_次の行,_終了状態), 身長と体重のセットを得る(_終了状態,_次の行,_残りの行ならび). 'できるだけ多くの人数で、肩車をしようと思います。'(_人間ならび,_最大人数) :- findall(_肩車人数,( 肩車人数(_人間ならび,_肩車人数)),_肩車人数ならび), max_list(_肩車人数ならび,_最大人数). 肩車人数(_人間ならび,_肩車人数) :- select(_取りだされた人間,_人間ならび,_残りの人間ならび), 肩車を重ねる(_取りだされた人間,_残りの人間ならび,_肩車重ね), length(_肩車重ね,_肩車人数). 肩車を重ねる(_自分,_人間ならび,[_自分|_肩車重ね]) :- 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね). 肩車を重ねる(_一番上の人間,_,[_一番上の人間]). 上の人を選択できる限り選択する(_自分,_人間ならび,_肩車重ね) :- select(_上の人間,_人間ならび,_残りの人間ならび), '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'(_上の人間,_自分), 肩車を重ねる(_上の人間,_残りの人間ならび,_肩車重ね). '肩車できる条件は、自分より上の人間の、「身長」と「体重」の値両方が、自分より小さい場合に限ります。'([_上の人間の身長,_上の人間の体重],[_自分の身長,_自分の体重]) :- _上の人間の身長 @< _自分の身長, _上の人間の体重 @< _自分の体重. 行を得る(_行,_終了状態) :- get_char(_文字), 行を得る(_文字,_文字ならび,_終了状態), atomic_list_concat(_文字ならび,_行). 行を得る(_入力文字,[],_終了状態) :- 入力文字が改行文字またはend_of_fileの時停止する(_入力文字,_終了状態),!. 行を得る(_文字,_行ならび,_終了状態) :- 行を得るために文字入力を続ける(_文字,_行ならび,_終了状態). 入力文字が改行文字またはend_of_fileの時停止する('\n',改行終了). 入力文字が改行文字またはend_of_fileの時停止する(end_of_file,入力終了). 行を得るために文字入力を続ける(_文字,[_文字|_残りの文字ならび],_終了状態) :- get_char(_次の文字), 行を得る(_次の文字,_残りの文字ならび,_終了状態). % 以下のサイトは # 出典 :: 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(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは 検索した用語の医療用語である確信度(_文字列,_検索した用語,_変位,_文字数,_医療用語,_医療用語文字数,_確信度) :- 最も長い医療用語(_最も長い医療用語文字数), 検索した用語(_文字列,_最も長い医療用語文字数,_変位,_文字数,_検索した用語), 検索した用語は医療用語でありその確信度は(_検索した用語,_文字数,_医療用語,_医療用語文字数,_確信度). 最も長い医療用語文字数(_最も長い医療用語文字数) :- findmax(_文字数,( 医療用語集(_医療用語), sub_atom(_医療用語,0,_文字数,0,_医療用語)),_最も長い医療用語文字数). 検索した用語(_文字列,_最も長い医療用語文字数,_変位,_文字数,_検索した用語) :- sub_atom(_文字列,_変位,_文字数,_,_検索した用語), between(1,_最も長い医療用語文字数,_文字数). 検索した用語は医療用語の一部を構成する(_検索した用語,_文字数,_医療用語,_医療用語文字数) :- 医療用語集(_医療用語), sub_atom(_医療用語,0,_医療用語の文字数,0,_医療用語), sub_atom(_医療用語,_,_文字数,_,_検索した用語). 検索した用語は医療用語でありその確信度は(_検索した用語,_文字数,_医療用語,_医療用語文字数,_確信度) :- 検索した用語は医療用語の一部を構成する(_検索した用語,_文字数,_医療用語,_医療用語文字数), _確信度 is _文字数 / _医療用語の文字数. % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p62-65 # # n-gram :: 文字列から文字の出現確率を求める。 # 'n-gram'(_文字列,_文字,_出現確率) :- 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数), 文字の出現頻度(_文字列,_文字,_文字の出現頻度), _出現確率 is _文字の出現頻度 / _文字の出現頻度の総数. 文字の出現頻度の総数を求める(_文字列,_文字の出現頻度の総数) :- sub_atom(_文字列,_,_文字の出現頻度の総数,_,_文字列). 文字の出現頻度(_文字列,_文字,_文字の出現頻度) :- 重複なく文字を取り出す(文字列,_文字), 頻度(文字を取り出す(_文字列,_文字),_文字の出現頻度). 重複なく文字を取り出す(_文字列,_文字) :- 文字の集合(_文字列,_文字の集合), member(_文字,_文字の集合). 文字の集合(_文字列,_文字の集合) :- setof(C,(A,B,C) ^ sub_atom(_文字列,A,1,B,C),_文字の集合). 文字を取り出す(_文字列,_文字) :- sub_atom(_文字列,_,1,_,_文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p90 # # 2つの文字列の先頭から一致する文字数を返す。 # '2つの文字列の先頭から一致する文字数を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する文字数) :- '2つの文字列の先頭から一致する文字数の最大値を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する文字数). '2つの文字列の先頭から一致する文字数の最大値を返す'(_文字列_1,_文字列_2,_2つの文字列の先頭から一致する最大文字数) :- findall(文字数,'2つの文字列の先頭から一致する文字数'(_文字列_1,_文字列_2,_文字数),_文字数ならび), max_list(_文字数ならび,_2つの文字列の先頭から一致する最大文字数). '2つの文字列の先頭から一致する文字数'(_文字列_1,_文字列_2,_文字数) :- sub_atom(_文字列_1,0,_文字数,_,_副文字列), sub_atom(_文字列_2,0,_文字数,_,_副文字列). % 以下のサイトは # 出典 :: わかりやすい Javaによる医療言語処理入門 p60-61 # 文字列から二文字の出現頻度を求める。 # 二文字の出現頻度(_文字列,_二文字,_二文字の出現頻度) :- 重複なく二文字を取り出す(文字列,_二文字), 頻度(二文字を取り出す(_文字列,_二文字),_二文字の出現頻度). 重複なく二文字を取り出す(_文字列,_二文字) :- 二文字の集合(_文字列,_二文字の集合), member(_二文字,_二文字の集合). 二文字の集合(_文字列,_二文字の集合) :- setof(C_2,(A,B,C_2) ^ sub_atom(_文字列,A,2,B,C_2),_二文字の集合). 二文字を取り出す(_文字列,_二文字) :- sub_atom(_文字列,_,2,_,_二文字). 頻度(P,_頻度) :- findall(1,P,L), length(L,_頻度). % 以下のサイトは 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). % 以下のサイトは # # 出典::鈴森(@_TRTA)さんのtwitter_20150119より # この部屋には10種類の人間がいる。二進法を解す私と解せぬルームメイトである。 # 'この部屋には10種類の人間がいる。二進法を解す私と解せぬルームメイトである。'(_この部屋,_種類,X,Y) :- この部屋には二進法を解す私がいる(_種類,X), この部屋には二進法を解せぬルームメートがいる(_この部屋,_種類,Y). この部屋には二進法を解す私がいる(_この部屋,1,私) :- この部屋にいる(私,_この部屋), 二進法を解す(私,10,1,0). この部屋には二進法を解せぬルームメートがいる(_この部屋,0,ルームメート) :- この部屋にいる(ルームメート,_この部屋), 二進法を解せぬ(ルームメート,10,10). この部屋にいる(_,_この部屋) :- この部屋(_この部屋). この部屋(_この部屋). 二進法を解す(_,10,1,0). 二進法を解せぬ(_,10,10). % 以下のサイトは パターンで変数ならびを埋める(_変数ならび,_パターン) :- 停止条件は_変数ならびの長さが_パターンの長さに等しいか小さくなった時(_変数ならび,_パターン),!. パターンで変数ならびを埋める(_変数ならび,_パターン) :- パターンで順に単一化して行く(_変数ならび,_パターン). パターンで順に単一化して行く(_変数ならび_1,_パターン) :- copy_term(_パターン,_複写パターン), append(_複写パターン,_変数ならび_2,_変数ならび_1), パターンで変数ならびを埋める(_変数ならび_2,_パターン). 停止条件は_変数ならびの長さが_パターンの長さに等しいか小さくなった時(_変数ならび,_パターン) :- copy_term(_パターン,_複写パターン), append(_変数ならび,_,_複写パターン). % 以下のサイトは 小の月(_小の月) :- '十二ヶ月の中で定められた月末日が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). この大の月でない月を小の月という(_大の月,_小の月) :- \+(_大の月 = _小の月). % 以下のサイトは % ところで小の月のもっとも好ましい定義は 小の月(2). 小の月(4). 小の月(6). 小の月(9). 小の月(11). % 以下のサイトは 小の月(_小の月) :- 十二ヶ月の中で定められた月末日が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). % 以下のサイトは 文(文(_主部,_述部)) --> 主部(_主部), 述部(_述部). 主部(主部(_名詞句)) --> 名詞句(_名詞句). 名詞句(名詞句(_名詞,_後置詞)) --> 名詞(_名詞),後置詞(_後置詞). 名詞(名詞(佐智子)) --> [佐智子]. 名詞(名詞(隆大)) --> [隆大]. 名詞(名詞(私)) --> [私]. 後置詞(後置詞(が)) --> [が]. 後置詞(後置詞(は)) --> [は]. 述部(述部(_動詞)) --> 動詞(_動詞). 述部(述部(_形容詞)) --> 形容詞(_形容詞), {形容詞は終止形(_形容詞)}. 述部(述部(_名詞,_助動詞)) --> 名詞(_名詞),助動詞(_助動詞). 述部(述部(_形容詞,_動詞)) --> 形容詞(_形容詞), {形容詞は連用形(_形容詞)}, 動詞(_動詞). 動詞(動詞(泳ぐ)) --> [泳ぐ]. 形容詞(形容詞([美しい,終止形])) --> [美しい]. 形容詞(形容詞([美しく,連用形])) --> [美しく]. 形容詞(形容詞([速い,終止形])) --> [速い]. 形容詞(形容詞([速く,連用形])) --> [速く]. 助動詞(助動詞(です)) --> [です]. '形容詞は連用形'(形容詞([_,連用形])). '形容詞は終止形'(形容詞([_,終止形])). % 以下のサイトは 文(文(_主部,_述部)) --> 主部(_主部), 述部(_述部). 主部(主部(_名詞句)) --> 名詞句(_名詞句). 名詞句(名詞句(_名詞,_後置詞)) --> 名詞(_名詞),後置詞(_後置詞). 名詞(名詞(佐智子)) --> [佐智子]. 名詞(名詞(隆大)) --> [隆大]. 名詞(名詞(私)) --> [私]. 後置詞(後置詞(が)) --> [が]. 後置詞(後置詞(は)) --> [は]. 述部(述部(_動詞)) --> 動詞(_動詞). 述部(述部(_形容詞)) --> 形容詞(_形容詞), {終止形(_形容詞)}. 述部(述部(_名詞,_助動詞)) --> 名詞(_名詞),助動詞(_助動詞). 述部(述部(_形容詞,_動詞)) --> 形容詞(_形容詞), {連用形(_形容詞)}, 動詞(_動詞). 動詞(動詞(泳ぐ)) --> [泳ぐ]. 形容詞(形容詞([美しい,終止形])) --> [美しい]. 形容詞(形容詞([美しく,連用形])) --> [美しく]. 形容詞(形容詞([速い,終止形])) --> [速い]. 形容詞(形容詞([速く,連用形])) --> [速く]. 助動詞(助動詞(です)) --> [です]. 連用形(形容詞([_,連用形])). 終止形(形容詞([_,終止形])). ?- 文(X,[佐智子,が,泳ぐ],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), R = [] ; false. ?- 文(X,[佐智子,が,A],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), A = 泳ぐ, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞([美しい, 終止形]))), A = 美しい, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞([速い, 終止形]))), A = 速い, R = [] ; false. ?- 文(X,[A,は,B,泳ぐ],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), A = 佐智子, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 佐智子, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 佐智子, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 佐智子, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 佐智子, B = 速く, R = [] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(動詞(泳ぐ))), A = 隆大, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 隆大, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 隆大, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 隆大, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 隆大, B = 速く, R = [] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(動詞(泳ぐ))), A = 私, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 私, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 私, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 私, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 私, B = 速く, R = []. ?- % 以下のサイトは 文(文(_主部,_述部)) --> 主部(_主部), 述部(_述部). 主部(主部(_名詞句)) --> 名詞句(_名詞句). 名詞句(名詞句(_名詞,_後置詞)) --> 名詞(_名詞),後置詞(_後置詞). 名詞(名詞(佐智子)) --> [佐智子]. 名詞(名詞(隆大)) --> [隆大]. 名詞(名詞(私)) --> [私]. 後置詞(後置詞(が)) --> [が]. 後置詞(後置詞(は)) --> [は]. 述部(述部(_動詞)) --> 動詞(_動詞). 述部(述部(_形容詞)) --> 形容詞(_形容詞), {終止形(_形容詞)}. 述部(述部(_名詞,_助動詞)) --> 名詞(_名詞),助動詞(_助動詞). 述部(述部(_形容詞,_動詞)) --> 形容詞(_形容詞), {連用形(_形容詞)}, 動詞(_動詞). 動詞(動詞(泳ぐ)) --> [泳ぐ]. 形容詞(形容詞(美しい)) --> [美しい]. 形容詞(形容詞(美しく)) --> [美しく]. 形容詞(形容詞(速い)) --> [速い]. 形容詞(形容詞(速く)) --> [速く]. 助動詞(助動詞(です)) --> [です]. 連用形(形容詞(美しく)). 終止形(形容詞(美しい)). ?- 文(X,[佐智子,が,泳ぐ],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), R = [] ; false. ?- 文(X,[佐智子,が,A],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), A = 泳ぐ, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞([美しい, 終止形]))), A = 美しい, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞([速い, 終止形]))), A = 速い, R = [] ; false. ?- 文(X,[A,は,B,泳ぐ],R). X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), A = 佐智子, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 佐智子, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 佐智子, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 佐智子, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 佐智子, B = 速く, R = [] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(動詞(泳ぐ))), A = 隆大, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 隆大, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 隆大, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 隆大, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 隆大, B = 速く, R = [] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(動詞(泳ぐ))), A = 私, B = 泳ぐ, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([美しい, 終止形]))), A = 私, B = 美しい, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([速い, 終止形]))), A = 私, B = 速い, R = [泳ぐ] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([美しく, 連用形]), 動詞(泳ぐ))), A = 私, B = 美しく, R = [] ; X = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞([速く, 連用形]), 動詞(泳ぐ))), A = 私, B = 速く, R = []. ?- % 以下のサイトは 文 --> 主部, 述部. 主部 --> 名詞句. 名詞句 --> 名詞,後置詞. 名詞 --> [佐智子]. 名詞 --> [隆大]. 後置詞 --> [が]. 後置詞 --> [は]. 述部 --> 動詞. 述部 --> 形容詞. 動詞 --> [泳ぐ]. 形容詞 --> [美しい]. 形容詞 --> [速い]. ?- 文([佐智子,が,泳ぐ],R). R = []. ?- 文(X,R). X = [佐智子,が,泳ぐ|$VAR(R)] ; X = [佐智子,が,美しい|$VAR(R)] ; X = [佐智子,が,速い|$VAR(R)] ; X = [佐智子,は,泳ぐ|$VAR(R)] ; X = [佐智子,は,美しい|$VAR(R)] ; X = [佐智子,は,速い|$VAR(R)] ; X = [隆大,が,泳ぐ|$VAR(R)] ; X = [隆大,が,美しい|$VAR(R)] ; X = [隆大,が,速い|$VAR(R)] ; X = [隆大,は,泳ぐ|$VAR(R)] ; X = [隆大,は,美しい|$VAR(R)] ; X = [隆大,は,速い|$VAR(R)]. ?- 文([佐智子,は,X],R). X = 泳ぐ, R = [] ; X = 美しい, R = [] ; X = 速い, R = [] ; false. ?- % 以下のサイトは 文(文(_主部,_述部)) --> 主部(_主部), 述部(_述部). 主部(主部(_名詞句)) --> 名詞句(_名詞句). 名詞句(名詞句(_名詞,_後置詞)) --> 名詞(_名詞),後置詞(_後置詞). 名詞(名詞(佐智子)) --> [佐智子]. 名詞(名詞(隆大)) --> [隆大]. 名詞(名詞(私)) --> [私]. 後置詞(後置詞(が)) --> [が]. 後置詞(後置詞(は)) --> [は]. 述部(述部(_動詞)) --> 動詞(_動詞). 述部(述部(_形容詞)) --> 形容詞(_形容詞). 述部(述部(_名詞,_助動詞)) --> 名詞(_名詞),助動詞(_助動詞). 動詞(動詞(泳ぐ)) --> [泳ぐ]. 形容詞(形容詞(美しい)) --> [美しい]. 形容詞(形容詞(速い)) --> [速い]. 助動詞(助動詞(です)) --> [です]. ?- 文(_解析木,[佐智子,は,泳ぐ],_残り語ならび). _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), _残り語ならび = [] ; false. ?- 文(_解析木,[佐智子,は,_語彙_1],_残り語ならび). _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), _語彙_1 = 泳ぐ, _残り語ならび = [] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞(美しい))), _語彙_1 = 美しい, _残り語ならび = [] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞(速い))), _語彙_1 = 速い, _残り語ならび = [] ; false. ?- 文(_解析木,_文候補の語ならび,_残り語ならび). _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(動詞(泳ぐ))), _文候補の語ならび = [佐智子, が, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞(美しい))), _文候補の語ならび = [佐智子, が, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(形容詞(速い))), _文候補の語ならび = [佐智子, が, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [佐智子, が, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [佐智子, が, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(が))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [佐智子, が, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(動詞(泳ぐ))), _文候補の語ならび = [佐智子, は, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞(美しい))), _文候補の語ならび = [佐智子, は, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(形容詞(速い))), _文候補の語ならび = [佐智子, は, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [佐智子, は, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [佐智子, は, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(佐智子), 後置詞(は))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [佐智子, は, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(動詞(泳ぐ))), _文候補の語ならび = [隆大, が, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(形容詞(美しい))), _文候補の語ならび = [隆大, が, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(形容詞(速い))), _文候補の語ならび = [隆大, が, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [隆大, が, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [隆大, が, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(が))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [隆大, が, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(動詞(泳ぐ))), _文候補の語ならび = [隆大, は, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞(美しい))), _文候補の語ならび = [隆大, は, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(形容詞(速い))), _文候補の語ならび = [隆大, は, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [隆大, は, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [隆大, は, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(隆大), 後置詞(は))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [隆大, は, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(動詞(泳ぐ))), _文候補の語ならび = [私, が, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(形容詞(美しい))), _文候補の語ならび = [私, が, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(形容詞(速い))), _文候補の語ならび = [私, が, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [私, が, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [私, が, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(が))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [私, が, 私, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(動詞(泳ぐ))), _文候補の語ならび = [私, は, 泳ぐ|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞(美しい))), _文候補の語ならび = [私, は, 美しい|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(形容詞(速い))), _文候補の語ならび = [私, は, 速い|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(名詞(佐智子), 助動詞(です))), _文候補の語ならび = [私, は, 佐智子, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(名詞(隆大), 助動詞(です))), _文候補の語ならび = [私, は, 隆大, です|_残り語ならび] ; _解析木 = 文(主部(名詞句(名詞(私), 後置詞(は))), 述部(名詞(私), 助動詞(です))), _文候補の語ならび = [私, は, 私, です|_残り語ならび]. ?- % 以下のサイトは 成績(尾崎,前期,国語,30). 成績(尾崎,前期,社会,40). 成績(山崎,前期,国語,20). 成績(山崎,前期,社会,50). 成績(尾崎,後期,国語,50). 成績(山崎,後期,国語,40). 集約合計を得る(_目標,_集約対象項,_集約鍵ならび,_集約値) :- 鍵となる値ならび(_集約鍵ならび,_目標,_鍵となる値ならび), 集約する鍵値毎に合計を得る(_目標,_集約対象項,_鍵となる値ならび,_集約鍵ならび,_集約値). 集約する鍵値毎に合計を得る(_目標,_集約対象項,_鍵となる値ならび,_集約鍵ならび,_集約値) :- member(_集約鍵ならび,_鍵となる値ならび), 対象項の合計をとる(_集約対象項,_目標,_集約値). 対象項の合計をとる(_対象項,_目標,_合計) :- findall(_対象項,_目標,L), 合計をとる(L,_合計). 鍵となる値ならび(_集約鍵ならび,_目標,_鍵となる値ならび) :- term_variables(_目標,_全ての変数ならび), setof(_集約鍵ならび,_全ての変数ならび ^ _目標,_鍵となる値ならび). % 実行例 合計をとる(L,_合計) :- 'Lが数値ならび場合、sum_listで合計を得る'(L,_合計). 合計をとる(L,_合計ならび) :- 'Lの要素がならびの場合、ならび要素ごとの合計ならびを得る'(L,_合計ならび). 'Lが数値ならび場合、sum_listで合計を得る'([],0). 'Lが数値ならび場合、sum_listで合計を得る'([A|R],_合計) :- number(A), sum_list([A|R],_合計). 'Lの要素がならびの場合、ならび要素ごとの合計ならびを得る'(L,_合計ならび) :- 'Lの要素がならびの場合'(L), ならび要素ごとの合計ならびを得る(L,_合計ならび). 'Lの要素がならびの場合'(L) :- L = [L1|R], is_list(L1). ならび要素ごとの合計ならびを得る(LL,_合計ならび) :- 転置(LL,LL2), '転置されたLL2の各要素をsum_listしたならびを得る'(LL2,_合計ならび). '転置されたLL2の各要素をsum_listしたならびを得る'(LL2,_合計ならび) :- findall(_合計,( member(L,LL2), sum_list(L,_合計)),_合計ならび). 転置([],[],[]):- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]):- 転置(R2,R3,R4). 転置([[]|_],[]):- !. 転置(L,[L1|R2]):- 転置(L,L2,L1), 転置(L2,R2). % 以下のサイトは ワンペア(_手札,_ペア数字,_残りの手札) :- 'ワンペアとは、手札に二枚の同位な数字があり、かつ、ツーペア、スリーカード、フォーカード、フルハウスの可能性がないものである。'(_手札,_ペア数字,_残りの手札). 'ワンペアとは、手札に二枚の同位な数字があり、かつ、ツーペア、スリーカード、フォーカード、フルハウスの可能性がないものである。'(_手札,_ペア数字,_残りの手札) :- 手札に二枚の同位な数字があり(_手札,_ペア数字,_ペア数字,_残りの手札), 'ツーペア、スリーカード、フォーカード、フルハウスの可能性がない'(_ペア数字,_残りの手札). 手札に二枚の同位な数字があり(_手札,_数字,_数字,_残りの手札) :- 二枚の札を選択(_手札,(_数字,_),(_数字,_),_残りの手札). 二枚の札を選択(_手札,(_数字_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 // _最大公約数. % 以下のサイトは # assertz/retractや大域変数を使わない自作findall。 # 現在目標はユーザ定義述語の単項のみ。 # 連言、選言、組込述語は不可。連言、選言、決定性の組込述語は # これから手を入れれば解決できるが、非決定性の組込述語は永久に無理。 % % このコード間違っていました。n番目のclause選択にfailすることが % あり得て、その場合このコードだと、即終了してしまいます。 項の収集(_収集項,_副目標,_収集項ならび) :- 副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- predicate_property(_頭部,number_of_clauses(_節数)), 副目標の実行結果を収集する(1,_節数,_頭部,_収集項,_収集項ならび). 副目標の実行結果を収集する(_n番目,_節数,_,_,[]) :- _n番目 > _節数,!. 副目標の実行結果を収集する(_n番目,_節数,_頭部,_収集項,[_収集項_n|R]) :- succ(_n番目,_次の), 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R). 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n),!, 副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). 副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- 副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目のclauseの実行(_n番目,_頭部_n). n番目のclauseの実行(_n番目,_頭部_n) :- n番目のclauseを得る(_n番目,_頭部_n,_本体_n), call(_本体_n). n番目のclauseを得る(_n番目,_頭部,_本体) :- nth_clause(_頭部,_n番目,Reference), clause(_頭部,_本体,Reference). % 以下のサイトは # assertz/retractや大域変数を使わず、単位節の引数情報をリストに収集する。 # 単位節情報の収集(_収集項,_副目標,_収集項ならび) :- 単位節副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 単位節副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- predicate_property(_頭部,number_of_clauses(_節数)), 単位節副目標の実行結果を収集する(1,_節数,_頭部,_収集項,_収集項ならび). 単位節副目標の実行結果を収集する(_n番目,_節数,_,_,[]) :- _n番目 > _節数,!. 単位節副目標の実行結果を収集する(_n番目,_節数,_頭部,_収集項,L) :- succ(_n番目,_次の), 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,L). 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,[_収集項_n|R]) :- '頭部、収集項を保存した上で、n番目の単位節clauseを実行する'(_n番目,_頭部,_収集項,_収集項_n),!, 単位節副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). 単位節副目標の実行結果を再帰的に収集する(_n番目,_次の,_節数,_頭部,_収集項,_収集項_n,R) :- 単位節副目標の実行結果を収集する(_次の,_節数,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目の単位節clauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目の単位節clauseを得る(_n番目,_頭部_n). n番目の単位節clauseを得る(_n番目,_頭部_n) :- nth_clause(_頭部_n,_n番目,Reference), clause(_頭部_n,true,Reference). % 以下のサイトは # assertz/retractや大域変数を使わない自作findall。 # 現在目標はユーザ定義述語の単項のみ。 # 連言、選言、組込述語は不可。連言、選言、決定性の組込述語は # これから手を入れれば解決できるが、非決定性の組込述語は永久に無理。 % % このコード間違っていました。n番目のclause選択にfailすることが % あり得て、その場合このコードだと、即終了してしまいます。 単位節の収集(_収集項,_副目標,_収集項ならび) :- 副目標の実行結果を収集する(_副目標,_収集項,_収集項ならび). 副目標の実行結果を収集する(_頭部,_収集項,_収集項ならび) :- 副目標の実行結果を収集する(1,_頭部,_収集項,_収集項ならび). 副目標の実行結果を収集する(_n番目,_頭部,_収集項,[_収集項_n|R]) :- 副目標の実行結果を再帰的に収集する(_n番目,_頭部,_収集項,_収集項_n,R). 副目標の実行結果を収集する(_,_,_,[]). 副目標の実行結果を再帰的に収集する(_n番目,_頭部,_収集項,_収集項_n,R) :- '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番面,_頭部,_収集項,_収集項_n), succ(_n番目,_次の), 副目標の実行結果を収集する(_次の,_頭部,_収集項,R). '頭部、収集項を保存した上で、n番目のclauseを実行する'(_n番目,_頭部,_収集項,_収集項_n) :- copy_term((_頭部,_収集項),(_頭部_n,_収集項_n)), n番目のclauseの実行(_n番目,_頭部_n). n番目のclauseの実行(_n番目,_頭部_n) :- n番目のclauseを得る(_n番目,_頭部_n,_本体_n), call(_本体_n). n番目のclauseを得る(_n番目,_頭部,_本体) :- nth_clause(_頭部,_n番目,Reference), clause(_頭部,_本体,Reference). % 以下のサイトは '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(_文字,_行文字ならび),_文字 = ' '). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- sub_atom(_横書文書,S,1,R,'\n'), sub_atom(_横書文書,0,S,_,_前文字列), sub_atom(_横書文書,_,R,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- findmax(_文字数,( member(_行,_行ならび), atom_length(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- findall(_空白を付加した文字列,( member(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- atom_length(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), atom_concat(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _nth1 is _最大文字列長 - _文字列長, findall(' ',( between(1,_nth1,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- findall(_文字ならび,( member(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- findall(_文字列,( member(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- findall(_反転した行文字列,( member(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), findall(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- findall(' ',( between(1,_列間隔文字数,_)),_列間隔文字ならび), atomic_list_concat(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- member(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), atomic_list_concat(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- atomic_list_concat(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). findmax(A,P,_最大値) :- findall(A,P,L), max_list(L,_最大値). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # :- op(700,xfx,は). 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,0,_縦書文書). 横書文書を縦書文書に変形する(_横書文書,_列間隔文字数,_縦書文書) :- 改行を区切りに行ならびに変形する(_横書文書,_行ならび), 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書). 行ならびを縦書文書に変形する(_行ならび,_列間隔文字数,_縦書文書) :- 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび), 行ならびを転置する(_矩形ならび,_転置した矩形ならび), 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書). 矩形ならびの各要素行の内容を反転して縦書文書にする(_転置した矩形ならび,_列間隔文字数,_縦書文書) :- 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび), 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 改行を区切りに行ならびに変形する(_横書文書,[_前文字列|R]) :- 改行を区切りに(_横書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_横書文書,_前文字列,_後文字列) :- 副文字列(_横書文書,_先頭からの変位,1,_末尾からの変位,'\n'), 副文字列(_横書文書,0,_先頭からの変位,_,_前文字列), 副文字列(_横書文書,_,_末尾からの変位,0,_後文字列),!. 最大文字列長を調べその長さに揃えて文書を矩形にする(_行ならび,_矩形ならび) :- 最大文字列長を調べ(_行ならび,_最大文字列長), その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび). 最大文字列長を調べ(_行ならび,_最大文字列長) :- 解の最大値(_文字数,( 行ならびから行を取り出す(_行,_行ならび), 文字列長(_行,_文字数)),_最大文字列長). その長さに揃えて文書を矩形にする(_行ならび,_最大文字列長,_矩形ならび) :- 解を集める(_空白を付加した文字列,( 行ならびから行を取り出す(_行,_行ならび), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列)),_矩形ならび). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_空白を付加した文字列) :- 文字列長(_行,_文字列長), 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列). 最大文字列長に達しない部分は空白を付加する(_行,_最大文字列長,_文字列長,_空白を付加した文字列) :- 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列), 二つの文字列を結合する(_行,_空白文字列,_空白を付加した文字列). 達しない文字数の空白(_最大文字列長,_文字列長,_空白文字列) :- _最大文字列長と文字列長の差 は _最大文字列長 - _文字列長, 解を集める(' ',( 整数を順に生成する(1,_最大文字列長と文字列長の差,_)),_空白文字ならび), 文字ならびを文字列に変換する(_空白文字列,_空白文字ならび). 行ならびを転置する(_矩形ならび,_転置された矩形ならび) :- 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび), 転置(_矩形文字ならび,_転置された矩形文字ならび), 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび). 矩形文字ならびに変換する(_矩形ならび,_矩形文字ならび) :- 解を集める(_文字ならび,( 矩形ならびから行を取り出す(_行,_矩形ならび), 文字列を文字ならびに変換する(_行,_文字ならび)),_矩形文字ならび). 転置された矩形文字ならびを行ならびに変換(_転置された矩形文字ならび,_転置された矩形ならび) :- 解を集める(_文字列,( 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび), 文字ならびを文字列に変換する(_文字列,_文字ならび)),_転置された矩形ならび). 転置した矩形ならびの各行文字列を反転する(_転置した矩形ならび,_反転した行文字列) :- 要素の取り出し(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列). 矩形ならびの各要素行の内容を反転する(_転置した矩形ならび,_要素が反転した転置した矩形ならび) :- 解を集める(_反転した行文字列,( 矩形ならびから行を取り出す(_行文字列,_転置した矩形ならび), 文字列の反転(_行文字列,_反転した行文字列)),_要素が反転した転置した矩形ならび). 縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで縦書文書に変形する(_要素が反転した転置した矩形ならび,_列間隔文字数,_縦書文書). 列間隔文字を挟んで縦書文書に変形する(_矩形ならび,_列間隔文字数,_縦書文書) :- 列間隔文字を挟んで(_矩形ならび,_列間隔文字数,_矩形ならび_1), 縦書文書に変形する(_矩形ならび_1,_縦書文書). 列間隔文字を挟んで(_矩形ならび_1,_列間隔文字数,_矩形ならび_2) :- 列間隔文字(_列間隔文字数,_列間隔文字), 解を集める(_行,( 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行)),_矩形ならび_2). 列間隔文字(_列間隔文字数,_列間隔文字) :- 解を集める(' ',( 整数を順に生成する(1,_列間隔文字数,_)),_列間隔文字ならび), 文字列を結合する(_列間隔文字ならび,_列間隔文字). 行文字の間に列間隔文字を挿入する(_矩形ならび_1,_列間隔文字,_行) :- 矩形ならびから行を取り出す(_行_1,_矩形ならび_1), 文字列を文字ならびに変換する(_行_1,_文字ならび), 文字列を結合する(_文字ならび,_列間隔文字,_行). 縦書文書に変形する(_矩形ならび_1,_縦書文書) :- 文字列を結合する(_矩形ならび_1,'\n',_縦書文書). 文字列の反転(_文字列,_反転した文字列) :- 文字列を文字ならびに変換する(_文字列,_文字ならび), 文字ならびを反転する(_文字ならび,_反転した文字ならび), 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_開始位置,_長さ,_残り文字数,_副文字列) :- sub_atom(_文字列,_開始位置,_長さ,_残り文字数,_副文字列). 矩形ならびから行を取り出す(_行,_矩形ならび) :- member(_行,_矩形ならび). 矩形文字ならびから文字ならびを取り出す(_文字ならび,_転置された矩形文字ならび) :- member(_文字ならび,_転置された矩形文字ならび). 行ならびから行を取り出す(_行,_行ならび) :- member(_行,_行ならび). 二つの文字列を結合する(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 文字列を結合する(_文字列ならび,_挿入文字,_結合した文字列) :- atomic_list_concat(_文字列ならび,_挿入文字,_結合した文字列). 文字列を結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 文字列を文字ならびに変換する(_文字列,_文字ならび) :- atom_chars(_文字列,_文字ならび). 文字ならびを反転する(_文字ならび,_反転した文字ならび) :- reverse(_文字ならび,_反転した文字ならび). 文字ならびを文字列に変換する(_反転した文字列,_反転した文字ならび) :- atom_chars(_反転した文字列,_反転した文字ならび). 文字列長(_文字列,_文字列長) :- atom_length(_文字列,_文字列長). 整数を順に生成する(1,_列間隔文字数,_) :- between(1,_列間隔文字数,_). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 解を集める(_候補項,_目標,_解ならび) :- findall(_候補項,_目標,_解ならび). 解の最大値(_候補項,_目標,_解の最大値) :- findall(_候補項,_目標,_解ならび), 最大値(_解ならび,_解の最大値). 最大値(_ならび,_最大値) :- select(_最大値,_ならび,_残りならび), forall(member(_値,_残りならび),_最大値 @>= _値). 解の最小値(_候補項,_目標,_解の最小値) :- findall(_候補項,_目標,_解ならび), 最小値(_解ならび,_解の最小値). 最小値(_ならび,_最小値) :- select(_最小値,_ならび,_残りならび), forall(member(_値,_残りならび),_最小値 @=< _値). _値 は _式 :- _値 is _式. % 以下のサイトは '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). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1197620454/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). % 以下のサイトは 分割(_軸要素,_リスト,_軸要素より大きい要素のリスト,_軸要素に等しいか小さい要素のリスト) :- 軸要素より大きい要素のリスト(_軸要素,_リスト,_軸要素より大きい要素のリスト), 軸要素に等しいか小さい要素のリスト(_軸要素,_リスト,_軸要素に等しいか小さい要素のリスト). 軸要素より大きい要素のリスト(_軸要素,_リスト,_軸要素より大きい要素のリスト) :- findall(_軸要素より大きい要素,( member(_軸要素より大きい要素,_リスト), _軸要素より大きい要素 @> _軸要素),_軸要素より大きい要素のリスト). 軸要素に等しいか小さい要素のリスト(_軸要素,_リスト,_軸要素に等しいか小さい要素のリスト) :- findall(_軸要素に等しいか小さい要素,( member(_軸要素に等しいか小さい要素,_リスト), _軸要素に等しいか小さい要素 @=< _軸要素),_軸要素に等しいか小さい要素のリスト). % 以下のサイトは 'PGMファイルの読み取り'(_入力ファイル) :- abolish(画像構造/2), raw_read_pgm(_入力ファイル). raw_read_pgm(_入力ファイル,_画像構造ならび) :- headerを読み取る(_入力ファイル,_headerの文字数), 画像データの読み込み(_入力ファイル,_headerの文字数,_画像データ), assertz(画像構造(画像データ,_画像データ)). headerを読み取る(_入力ファイル,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- open(_入力ファイル,read,Input), '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), close(Input). '型・矩形サイズ・色の深さを得る'(Input,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line), '型・矩形サイズ・色の深さを得る'(Input,Line,[],0,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数), '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ). '型・矩形サイズ・色の深さを得る'(Input,Line,[_色の深さ,_矩形サイズ,_型],_ヘッダの文字数,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- !. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数),!. '型・矩形サイズ・色の深さを得る'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). 'コメント行は無視して、_ヘッダの文字数だけ更新'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- sub_atom(Line,0,1,_,'#'), '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2), get_line(Input,Line2), '型・矩形サイズ・色の深さを得る'(Input,Line2,L1,_ヘッダの文字数_2,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '改行を含むコメント行の文字数を求めて_ヘッダ文字数を更新する'(Line,_ヘッダ文字数_1,_ヘッダ文字数_2) :- atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数 + Length + 1. '型・矩形サイズ・色の深さを埋めていく'(Input,Line,L1,_ヘッダの文字数_1,_型,_矩形サイズ,_色の深さ,_ヘッダの文字数) :- get_line(Input,Line2), atom_length(Line,Length), _ヘッダの文字数_2 is _ヘッダの文字数_1 + Length + 1, '型・矩形サイズ・色の深さを得る'(Input,Line2,_ヘッダの文字数_2,[Line|L1],_型,_矩形サイズ,_色の深さ,_ヘッダの文字数). '型・矩形サイズ・色の深さを定義する'(_型,_矩形サイズ,_色の深さ) :- assertz(画像構造(型,_型)), assertz(画像構造(矩形サイズ,_矩形サイズ)), assertz(画像構造(色の深さ,_色の深さ)). 画像データの読み込み(_入力ファイル,_ヘッダの文字数,_画像データ) :- open(_入力ファイル,read,Input,[type(binary)]), ヘッダ部分を空読み(Input,_ヘッダの文字数), 画像データ部分の読み取り(Input,_画像データ), close(input). ヘッダ部分を空読み(Input,_ヘッダの文字数) :- between(1,_ヘッダの文字数,N), get_byte(Input,_), N = _ヘッダの文字数,!. 画像データ部分の読み取り(Input,_画像データ) :- findall(C,(repeat,get_byte(Input,C),(C = -1,!,fail;true)),_画像データ). get_line(Input,Line) :- get_char(Input,A), get_line(Input,A,L), atom_chars(Line,L). get_line(Input,'\n',[]) :- !. get_line(Input,A,[A|R]) :- get_char(Input,B), get_line(Input,B,R). % 以下のサイトは マンハッタン距離(_座標点_1,_座標点_2,_マンハッタン距離) :- _マンハッタン距離 = _2点間の距離, 'マンハッタン距離またはL1-距離は、幾何学における距離概念のひとつ。 各座標の差(の絶対値)の総和を2点間の距離とする。'(_座標点_1,_座標点_2,_2点間の距離). 'マンハッタン距離またはL1-距離は、幾何学における距離概念のひとつ。 各座標の差(の絶対値)の総和を2点間の距離とする。'(_座標点_1,_座標点_2,_2点間の距離) :- 総和(_各座標の差,( '各座標の差(の絶対値)の'(_座標点_1,_座標点_2,_各座標の差)),_2点間の距離). 総和(A,P,_総和) :- findall(A,P,L), sum_list(L,_総和). '各座標の差(の絶対値)の'(M,N,_各座標の差) :- 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差). '各座標の差(の絶対値)の'(_座標点_1,_座標点_2,_各座標の差) :- 各座標が複合項であれば対応する座標要素の差を取る(_座標点_1,_座標点_2,_各座標の差). 各座標が複合項であれば対応する座標要素の差を取る((M,S1),(N,S2),_各座標の差) :- 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差). 各座標が複合項であれば対応する座標要素の差を取る((_,S1),(_,S2),_各座標の差) :- '各座標の差(の絶対値)の'(S1,S2,_各座標の差). 'M,Nが数であればその差の絶対値を取る'(M,N,_各座標の差) :- number(M), number(N), _各座標の差 is abs(M - N). % 以下のサイトは '先頭がa、末尾がzの副文字列'(_文字列,_副文字列) :- 副文字列の(_文字列,_副文字列), 先頭がa(_副文字列), 末尾がz(_副文字列). 副文字列の(_文字列,_副文字列) :- sub_atom(_文字列,_,_,_,_副文字列). 先頭がa(_副文字列) :- sub_atom(_副文字列,0,1,_,a). 末尾がz(_副文字列) :- sub_atom(_副文字列,_,1,0,z). % 以下のサイトは エラトステネスの篩([],[]) :- !. エラトステネスの篩([_確定した素数|R1],[_確定した素数|R2]) :- 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2). 'R1の中の_確定した素数で割り切れないものだけを残し篩に掛ける'(_確定した素数,R1,R2) :- 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび), エラトステネスの篩(_残ったならび,R2). 'R1の中の_確定した素数で割り切れないものだけを残す'(_確定した素数,R1,_残ったならび) :- findall(_確定した素数で割り切れないもの,( 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの)),_残ったならび). 'R1の中で_確定した素数で割り切れないもの'(R1,_確定した素数,_確定した素数で割り切れないもの) :- member(_確定した素数で割り切れないもの,R1), \+(0 is _確定した素数で割り切れないもの mod _確定した素数). % 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,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までの整数ならび), '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,_検索文字列). % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 給油所(志村,'300203'). 給油所(上野毛,'300206'). 給油所(横浜南,'370113'). 給油所(熊谷,'370105'). 給油所(けやき台,'370109'). 給油所(秩父21,'370111'). 給油所(狭山ヶ丘,'370112'). 売上保存(_保存月,_保存日) :- '保存日から入力年月日を得て、一日分のデータを売上保存ファイルに書き足す。'(_保存月,_保存日). '保存日から入力年月日を得て、一日分のデータを売上保存ファイルに書き足す。'(_保存月,_保存日) :- '保存日から入力年月日を得て、'(_保存日,_入力年月日), '一日分のデータを売上保存ファイルに書き足す。'(_保存月,_入力年月日). '保存日から入力時刻下限、上限を得て、'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). '一日分のデータを売上保存ファイルに書き足す。'(_保存月,_入力年月日) :- forall(売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ), 売上保存の一日分データを書き出す(_出力,_一日分データ)). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力) :- 給油所(_給油所,_出荷場所), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻が指定と一致する(_16,_出荷場所,_20,_入力年月日)),_一日分データ). 出荷場所と入力時刻が指定と一致する(_出荷場所,_出荷場所,_入力時刻,_入力年月日) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,[]) :- close(_出力). 売上保存の一日分データを書き出す(_出力,[]) :- 売上保存の一日分データを書き出して行く(_出力,_一日分データ). 売上保存の一日分データを書き出して行く(_出力,_一日分データ) :- 売上保存一行表示(_出力,_組), 売上保存の一日分データを書き出す(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], format(_出力,'~w.\n',[_売上]). % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 売上保存(_保存月,_保存日) :- '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日), 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り), 売上保存の一日分データを書き出す(_出力,_一日分データ), _残り = []. '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ,_残り) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力,_残り) :- append(_,[[_給油所,_出荷場所]|_残り],[[志村,'300203'],[上野毛,'300206'],[熊谷,'370105'],[けやき台,'370109'],[秩父21,'370111'],[狭山ヶ丘,'370112'],[横浜南,'370113']]), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻から組を得る(_16,_出荷場所,_20,_入力年月日)),_一日データ). 出荷場所と入力時刻から組を得る(_出荷場所,_出荷場所,_入力時刻,_入力年月日,_組) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,_一日分データ) :- append(_,[_組|_残り],_一日分データ), 売上保存一行表示(_出力,_組), 売上保存の一日分書き出しを完了する(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], writeq(_出力,_売上), write(_出力,'.\n'). 売上保存の一日分書き出しを完了する(_出力,[]) :- close(_出力). % 以下のサイトは # 出典 :: 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). % 以下のサイトは # # 出典: この作品の出典を@WARAI_SHINTOさんとしていたのですが、元々は@fukukucchiさんのものと思われます。 # # 今日矯正歯科で起きた大事件を絵に描いてみた をPrologの述語としてみる。 # ''(_は) :- 今日矯正歯科で起きた大事件を絵に描いてみた(_は). 今日矯正歯科で起きた大事件を絵に描いてみた(痛いというより重いです). % 以下のサイトは %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 情報をリストで保持する (Prologではあまり使いません) wrrior([[nagisa_misumi, futari_ha, black], [honoka_yukishiro, futari_ha, white], [hikari_kujo, max_heart, luminus], [saki_hyuga, splash_star, bloom], [mai_misho, splash_star, eaglette], [nozomi_yumehara, yes, dream], [rin_natsuki, yes, rouge], [urara_kasugano, yes, lemonade], [komachi_akimoto, yes, mint], [karen_minazuki, yes, aqua], [geki, juranger, tirano], [goushi, juranger, manmos], [dan, juranger, torikera], [boy, juranger, tiger], [mei, juranger, ptera], [burai, juranger, dragon]]). series([[precure, splash_star], [precure, futari_ha], [precure, yes], [super_squadron, juranger]]). ?- wrrior(L1),series(L2), member([Name,B,_],L1), member([precure,B],L2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 先にfindall をしてしまうのもあります warrior(nagisa_misumi, futari_ha, black). warrior(honoka_yukishiro, futari_ha, white). warrior(hikari_kujo, max_heart, luminus). warrior(saki_hyuga, splash_star, bloom). warrior(mai_misho, splash_star, eaglette). warrior(nozomi_yumehara, yes, dream). warrior(rin_natsuki, yes, rouge). warrior(urara_kasugano, yes, lemonade). warrior(komachi_akimoto, yes, mint). warrior(karen_minazuki, yes, aqua). warrior(geki, juranger, tirano). warrior(goushi, juranger, manmos). warrior(dan, juranger, torikera). warrior(boy, juranger, tiger). warrior(mei, juranger, ptera). warrior(burai, juranger, dragon). series(precure, splash_star). series(precure, futari_ha). series(precure, yes). series(super_squadron, juranger). ?- findall([A,B],warrior(A,B,_),L1), findall([C],series(precure,C),L2), member([Name,Key],L1), member([Key],L2). ?- findall([A,B],warrior(A,B,_),L1), findall(C,series(precure,C),L2), member([Name,Key],L1), member(Key,L2). ?- findall([A,B],warrior(A,B,_),L1), findall(C,series(precure,C),L2), append(_,[[Name,Key]|_],L1), append(_,[C|_],L2). % 以下のサイトは # 出典::twitter_by_@Fuwarin_20150213 # 画像::https://pbs.twimg.com/media/B9rHyK2CQAEkcKP.jpg # # 1) 縦に2つに折る # 2) 横に4つにたたんで、折りしろをつける # 3) 上から4分の1のところを前に折り、もう一度前に折る # 4) 縦に3つにたたんで折りしろをつける # 5) 裏側の部分をはさみ込むように折る # 6) つま先部分を折り込む # 7) 裏返して底の部分を中に折り込む % 以下のサイトは たしざんの繰り上がり(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび),!. たしざんの繰り上がり(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- 下位桁から上位桁に向けて順に繰り上がりを再帰的に計算する(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび). '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(0,L,L) :- !. '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(N,[],[N]). 下位桁から上位桁に向けて順に繰り上がりを再帰的に計算する(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- append(L1,[_最終桁],_上位桁ならび), たしざん(_最終桁,_繰り上がり,_最下位桁たしざん結果,_繰り上がり_1), たしざんの繰り上がり(_繰り上がり_1,L1,_繰り上がった上位桁ならび_1), append(_繰り上がった上位桁ならび_1,[_最下位桁たしざん結果],_繰り上がった上位桁ならび). たしざん(0,0,0,0). たしざん(0,1,1,0). たしざん(0,2,2,0). たしざん(0,3,3,0). たしざん(0,4,4,0). たしざん(0,5,5,0). たしざん(0,6,6,0). たしざん(0,7,7,0). たしざん(0,8,8,0). たしざん(0,9,9,0). たしざん(2,0,3,0). たしざん(2,1,4,0). たしざん(2,2,5,0). たしざん(2,3,6,0). たしざん(2,4,6,0). たしざん(2,5,7,0). たしざん(2,6,8,0). たしざん(2,7,9,0). たしざん(2,8,0,1). たしざん(2,9,1,1). たしざん(3,0,3,0). たしざん(3,1,4,0). たしざん(3,2,5,0). たしざん(3,3,6,0). たしざん(3,4,7,0). たしざん(3,5,8,0). たしざん(3,6,9,0). たしざん(3,7,0,1). たしざん(3,8,1,1). たしざん(3,9,2,1). たしざん(4,0,4,0). たしざん(4,1,5,0). たしざん(4,2,6,0). たしざん(4,3,7,0). たしざん(4,4,8,0). たしざん(4,5,9,0). たしざん(4,6,0,1). たしざん(4,7,1,1). たしざん(4,8,2,1). たしざん(4,9,3,1). たしざん(5,0,5,0). たしざん(5,1,6,0). たしざん(5,2,7,0). たしざん(5,3,8,0). たしざん(5,4,9,0). たしざん(5,5,0,1). たしざん(5,6,1,1). たしざん(5,7,2,1). たしざん(5,8,3,1). たしざん(5,9,4,1). たしざん(6,0,6,0). たしざん(6,1,7,0). たしざん(6,2,8,0). たしざん(6,3,9,0). たしざん(6,4,0,1). たしざん(6,5,1,1). たしざん(6,6,2,1). たしざん(6,7,3,1). たしざん(6,8,4,1). たしざん(6,9,5,1). たしざん(7,0,7,0). たしざん(7,1,8,0). たしざん(7,2,9,0). たしざん(7,3,0,1). たしざん(7,4,1,1). たしざん(7,5,2,1). たしざん(7,6,3,1). たしざん(7,7,4,1). たしざん(7,8,5,1). たしざん(7,9,6,1). たしざん(8,0,8,0). たしざん(8,1,9,0). たしざん(8,2,0,1). たしざん(8,3,1,1). たしざん(8,4,2,1). たしざん(8,5,3,1). たしざん(8,6,4,1). たしざん(8,7,5,1). たしざん(8,8,6,1). たしざん(8,9,7,1). たしざん(9,0,9,0). たしざん(9,1,0,1). たしざん(9,2,1,1). たしざん(9,3,2,1). たしざん(9,4,3,1). たしざん(9,5,4,1). たしざん(9,6,5,1). たしざん(9,7,6,1). たしざん(9,8,7,1). たしざん(9,9,8,1). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/669 # # oracleなんですが、次の表に # # 日付 数 # 1/1 5 # 1/2 2 # 1/3 -8 # 1/4 6 # 1/5 8 # # 残と繰越を計算して↓のようにしたいのですが # どのようなSQLにすればいいでしょうか?>< # # 日付 残 数 繰越 # 1/1 0 5 5 ←初日の残はゼロ、繰越=残+数 # 1/2 5 2 7 ←残=前日の繰越 # 1/3 7 -8 -1 # 1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに # 1/5 6 8 14 # # テーブル('1/1',5). テーブル('1/2',2). テーブル('1/3',-8). テーブル('1/4',6). テーブル('1/5',8). '初日(1/1)の残'(0). 'oracleなんですが、次の表に 日付 数 1/1 5 1/2 2 1/3 -8 1/4 6 1/5 8 残と繰越を計算して↓のようにしたいのです どのようなSQLにすればいいでしょうか?>< 日付 残 数 繰越 1/1 0 5 5 ←初日の残はゼロ、繰越=残+数 1/2 5 2 7 ←残=前日の繰越 1/3 7 -8 -1 1/4 0 6 6 ←前日の繰越がマイナスなら残はゼロに 1/5 6 8 14'(_日付,_残,_数,_繰越) :- findall([_日付,_数],テーブル(_日付,_数),_日付_数ならび), '初日(1/1)の残'(_初日の残), '残と繰越の計算'(_初日の残,_日付_数ならび,_日付,_残,_数,_繰越). '残と繰越の計算'(_前日の繰越,[[_日付_1,_数_1]|R],_日付,_残,_数,_繰越) :- '前日繰越と数から残、繰越を求める'(_前日の繰越,_数_1,_残_1,_繰越_1), '残と繰越を非決定性に計算'(_残_1,_日付_1,_数_1,R,_繰越_1,_日付,_残,_数,_繰越). '残と繰越を非決定性に計算'(_残,_日付,_数,_,_繰越,_日付,_残,_数,_繰越). '残と繰越を非決定性に計算'(_残_1,_,_,R,_繰越_1,_日付,_残,_数,_繰越) :- '残と繰越の計算'(_繰越_1,R,_日付,_残,_数,_繰越). '前日繰越と数から残、繰越を求める'(_前日の繰越,_数,_残,_繰越) :- '前日の繰越がマイナスなら残はゼロに、さもなくば、残=前日の繰越'(_前日の繰越,_残), _繰越 is _残 + _数. '前日の繰越がマイナスなら残はゼロに、さもなくば、残=前日の繰越'(_前日の繰越,_残) :- 前日の繰越がマイナスなら残はゼロに(_前日の繰越,_残). '前日の繰越がマイナスなら残はゼロに、さもなくば、残=前日の繰越'(_前日の繰越,_残) :- 'さもなくば、残=前日の繰越'(_前日の繰越,_残). 前日の繰越がマイナスなら残はゼロに(_前日の繰越,_残) :- _前日の繰越 < 0, _残 = 0. 'さもなくば、残=前日の繰越'(_前日の繰越,_残) :- _前日の繰越 >= 0, _前日の繰越 = _残. % 以下のサイトは % Prolog 定家の天才を如実に示す歌。 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る :- 霜まよふ, そらにしをれし, 雁が音の, かへるつばさに, 春雨ぞ降る. % 以下のサイトは 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% 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), 'Nを1から増加しながら0-Nの内2要素を取り2項の合計がNであるような重複順列を生成'(N,X,Y). 'Nを1から増加しながら0-Nの内2要素を取り2項の合計がNであるような重複順列を生成'(N,X,Y) :- findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). % 以下のサイトは ペア数の実装(0,0). ペア数の実装(X,Y) :- nth1(N,_,_), findall(M,between(0,N,M),L), 重複順列(L,2,[X,Y]), N is X + Y. 重複順列(L,0,[]). 重複順列(L,N,[A|R3]) :- N > 0, member(A,L), N_1 is N - 1, 重複順列(L,N_1,R3). %%%%%%%%%%%%%%%%%%%% ?- ペア数の実装(X,Y). X = Y, Y = 0 ; X = 0, Y = 1 ; X = 1, Y = 0 ; X = 0, Y = 2 ; X = Y, Y = 1 ; X = 2, Y = 0 ; X = 0, Y = 3 ; X = 1, Y = 2 ; X = 2, Y = 1 ; X = 3, Y = 0 ; X = 0, Y = 4 ; X = 1, Y = 3 ; X = Y, Y = 2 ; X = 3, Y = 1 ; X = 4, Y = 0 ; X = 0, Y = 5, ・・・ % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- atom_chars(_文字列,_文字ならび), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび(_文字ならび,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび), atom_chars(_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび). '隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび'([],[]). '隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび'([A],[A]). '隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび'([A,B|R1],[A,_大きい方の文字|R2]) :- 隣り合う文字の大きい方の文字(A,B,_大きい方の文字), '隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字ならび'([B|R1],R2). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_副文字列_2,( sub_atom(_文字列,_,2,_残り文字数,_副文字列), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_副文字列,_残り文字数,_副文字列_2)),L), atomic_list_concat(L,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_副文字列,_残り文字数,_副文字列_2) :- 隣り合う2文字の大きい方の文字(_副文字列,_文字_1,_文字_2,_大きい方の文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_残り文字数,_文字_1,_文字_2,_大きい方の文字,_副文字列_2). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(0,_文字_1,_文字_2,_大きい方の文字,_副文字列_2) :- atomic_list_concat([_文字_1,_大きい方の文字,_文字_2],_副文字列_2),!. 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_,_文字_1,_文字_2,_大きい方の文字,_副文字列_2) :- atomic_list_concat([_文字_1,_大きい方の文字],_副文字列_2). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/910 # お題:2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を # 隣り合う文字の間に挿入した文字列を返す。 # 例 # "Personal" -> "Peerrsssoonnall" # "Hello, world!" -> "Heellllooo,, wwworrrlldd!" # # '2文字以上の文字列が与えられたとき、隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列を返す。'(_文字列,_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- findall(_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列,( sub_atom(_文字列,_,2,_,_2文字), 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列)),L), sub_atom(_文字列,0,1,_,_最初の文字), atomic_list_concat([_最初の文字|L],_全ての隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う文字の大きい方の文字を隣り合う文字の間に挿入(_2文字,_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列) :- 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字), atomic_list_concat([_大きい方の文字,_文字_2],_隣り合う文字の大きい方の文字を隣り合う文字の間に挿入した文字列). 隣り合う2文字の大きい方の文字(_2文字,_文字_1,_文字_2,_大きい方の文字) :- sub_atom(_2文字,0,1,_,_文字_1), sub_atom(_2文字,1,1,_,_文字_2), 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_大きい方の文字). 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_1) :- _文字_1 @>= _文字_2. 隣り合う文字の大きい方の文字(_文字_1,_文字_2,_文字_2) :- _文字_1 @< _文字_2. % 以下のサイトは 親(為義). 親(頼朝). 親(範頼). 子(頼朝). 子(範頼). 子(公暁). 親子テーブル候補(_親子テーブル候補) :- 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合である親と子の直積上の(_属性集合_親_と_属性集合_子の直積), 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補). 属性集合である親と子の直積上の(_親と子の直積) :- 属性集合_親(_属性集合_親), 属性集合_子(_属性集合_子), 直積([_属性集合_親,_属性集合_子],_親と子の直積). 属性集合_親(_属性集合_親) :- setof(_親,親(_親),_属性集合_親). 属性集合_子(_属性集合_子) :- setof(_子,子(_子),_属性集合_子). 直積(_集合ならび,_直積集合) :- member項の生成(_集合ならび,_member項,_要素変数ならび), findall(_要素変数ならび,_member項,_直積集合). member項の生成([_集合],member(_要素変数,_集合),[_要素変数]). member項の生成([_集合|R1],(member(_要素変数,_集合),U),[_要素変数|R2]) :- member項の生成(R1,U,R2). 冪集合(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合). 部分集合(_,[]). 部分集合(A,B) :- length(A,C), between(1,C,D), 組合せ(A,D,B) . 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). 部分集合候補(_属性集合_親_と_属性集合_子の直積,_親子テーブル候補) :- 冪集合(_属性集合_親_と_属性集合_子の直積,_冪集合), member(_親子テーブル候補,_冪集合). % 以下のサイトは 親(為義). 親(頼朝). 親(載家). 子(頼朝). 子(載家). 属性集合である親と子の直積上の部分集合候補(_親子テーブル候補) :- 属性集合親(_属性集合親), 属性集合子(_属性集合子), 直積(_属性集合親,_属性集合子,_親と子の直積), member(_直積上の部分集合の組,_親と子の直積), 冪集合(_親と子の直積,_冪集合), member(_親子テーブル候補,_冪集合). 属性集合親(_属性集合親) :- setof(_親,親(_親),_属性集合親). 属性集合子(_属性集合子) :- setof(_子,子(_子),_属性集合子). 直積(L1,L2,LL) :- findall([A,B],( member(A,L1), member(B,L2)),LL). '冪集合'(_集合,_冪集合) :- findall(L,部分集合(_集合,L),_冪集合). '部分集合'(_,[]). '部分集合'(A,B) :- length(A,C), between(1,C,D), 組合せ(A,D,B) . 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). % 以下のサイトは % [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(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは merge_sort(L1,L2) :- merge_sort_0(L1,L1_1), merge_sort_1(L1_1,L2). merge_sort_0([],[]). merge_sort_0([A],[[A]]). merge_sort_0([A,B|R1],[[A,B]|R2]) :- A @< B, merge_sort_0(R1,R2). merge_sort_0([A,B|R1],[[B,A]|R2]) :- A @>= B, merge_sort_0(R1,R2). merge_sort_1([L],L) :- !. merge_sort_1(L1,L2) :- merge_sort_2(L1,L1_2), merge_sort_1(L1_2,L2). merge_sort_2([],[]). merge_sort_2([L1],[L1]). merge_sort_2([L1,L2|R1],[L|R2]) :- merge(L1,L2,L), merge_sort_2(R1,R2). merge([],X,X) :- !. merge(X,[],X) :- !. merge([A|R1],[B|R2],[A|R3]) :- A @< B, merge(R1,[B|R2],R3). merge([A|R1],[B|R2],[B|R3]) :- A @>= B, merge([A|R1],R2,R3). % 以下のサイトは ローンパターン述語(_ファイル名,Instream,_外部述語,_貸し出し述語) :- open(_ファイル名,read,Instream), 外部述語への貸し出し(_外部述語,_貸し出し述語), close(Instream). 外部述語への貸し出し(_外部述語,_貸し出し述語) :- call(_外部述語,_貸し出し述語). 読み込み述語(Stream,_項) :- read(Stream,_項). 外部述語(_借入述語) :- repeat, ( arg(1,_借入述語,Stream),at_end_of_stream(Stream),!; call(_借入述語), arg(2,_借り入れ述語,_項), writef('%q\n',[_項]), fail). ?- ローンパターン述語('temp1.pro',Instream,外部述語,読み込み述語(Instream,_項)). % 以下のサイトは ローンパターン述語(_ファイル名,Instream,_外部述語,_貸し出し述語) :- open(_ファイル名,read,Instream), 外部述語への貸し出し(_外部述語,_貸し出し述語), close(Instream). 外部述語への貸し出し(_外部述語,_貸し出し述語) :- call(_外部述語,_貸し出し述語). 読み込み述語(Stream,_項) :- read(Stream,_項). 外部述語(_借入述語) :- arg(1,_借入述語,Stream), at_end_of_stream(Stream). 外部述語(_借入述語) :- copy_term(_借入述語,_借入述語_2), call(_借入述語), arg(2,_借り入れ述語,_項), writef('%q\n',[_項]), 外部述語(_借入述語_2). ?- ローンパターン述語('temp1.pro',Instream,外部述語,読み込み述語(Instream,_項)). % 以下のサイトは ローンパターン述語(_ファイル名,Instream,_外部述語,_貸し出し述語) :- open(_ファイル名,read,Instream), 外部述語への貸し出し(_外部述語,_貸し出し述語), close(Instream). 外部述語への貸し出し(_外部述語,_貸し出し述語) :- call(_外部述語,_貸し出し述語). 読み込み述語(Stream,_項) :- read(Stream,_項). 外部述語(_借入述語) :- arg(1,_借入述語,Stream), at_end_of_stream(Stream). 外部述語(_借入述語) :- call(_借入述語), arg(2,_借り入れ述語,_項), writef('%q\n',[_項]), 外部述語(_借入述語). ?- ローンパターン述語('temp1.pro',Instream,外部述語,読み込み述語(Instream,_項)). % 以下のサイトは 繰り上がり(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび),!. 繰り上がり(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- 下位桁から上位桁に向けて順に繰り上がりを再帰的に計算する(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび). '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(0,L,L) :- !. '繰り上がりの停止条件は_繰り上がりが0_又は_上位桁ならびが[]になった時である'(N,[],[N]). 下位桁から上位桁に向けて順に繰り上がりを再帰的に計算する(_繰り上がり,_上位桁ならび,_繰り上がった上位桁ならび) :- append(L1,[_最終桁],_上位桁ならび), 加算(_最終桁,_繰り上がり,_最下位桁加算結果,_繰り上がり_1), 繰り上がり(_繰り上がり_1,L1,_繰り上がった上位桁ならび_1), append(_繰り上がった上位桁ならび_1,[_最下位桁加算結果],_繰り上がった上位桁ならび). 加算(M,N,_加算結果,_繰り上がり) :- _加算結果 is (M + N) mod 10, _繰り上がり is (M + N) // 10. % 以下のサイトは # 出典:: 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). % 以下のサイトは % % Prolog % '花は 花は 花は咲く いつか生まれる君に 花は 花は 花は咲く わたしは何を残しただろう'(_花は_花は_花は咲く_1,_いつか生まれる君に,_花は_花は_花は咲く_2,_わたしは何を残しただろう) :- '花は 花は 花は咲く'(1,_花は_花は_花は咲く_1), いつか生まれる君に(_いつか生まれる君に), '花は 花は 花は咲く'(2,_花は_花は_花は咲く_2), わたしは何を残しただろう(_わたしは何を残しただろう). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall('「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数),assertz(成績(_科目,_点数))). '「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める(_合計) :- findall(_点数,成績(_,_点数),_点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_平均) :- '3科目の合計を求める(_合計), _平均 is _合計 / 3. % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall('「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数),assertz(成績(_科目,_点数))). '「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める(_合計) :- findall(_点数,成績(_,_点数),_点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_平均) :- '3科目の合計を求める(_合計), _平均 is _合計 / 3. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/177 # # # [2]下記の九九の表を作るプログラムを作れ # # 1 # 2 4 # 3 6 9 # ....... # 8 16 24...64 # 9 18 27...72 # 変則的な九九の表を作る :- '_列が_行を超えない範囲で、積を生成する'(_行,_列,_積), '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_積), _行 = 9. '_列が_行を超えない範囲で、積を生成する'(_行,_列,_積) :- '_列が_行を超えない範囲で、'(_行,_列), 積を生成する(_行,_列,_積). '_列が_行を超えない範囲で、'(_行,_列) :- between(1,9,_行), between(1,_行,_列). 積を生成する(_行,_列,_積) :- _積 is _行 * _列. '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_) :- 'ただし、最後の9行9列の積は表示しない。'(_行,_列),!. '生成された積を表示する。ただし、最後の9行9列の積は表示しない。'(_行,_列,_積) :- '基本的に積を表示するが、_行=_列の場合改行する'(_行,_列,_積). 'ただし、最後の9行9列の積は表示しない。'(9,9). '基本的に積を表示するが、_行=_列の場合改行する'(_行,_列,_積) :- '基本的に積を表示するが、'(_積), '_行=_列の場合改行する'(_行,_列). '基本的に積を表示するが、'(_積) :- writef('%3r ',[_積]). '_行=_列の場合改行する'(_行,_列) :- _行 = _列, nl. % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた部分がある # 或る文字がn回以上続いた部分がある(_n,_或る文字,_文字列) :- sub_atom(_文字列,_,_文字列長,_,_適合文字列), _文字列長 >= _n, forall(sub_atom(_適合文字列,_,1,_,_文字),_或る文字 = _文字). % 以下のサイトは # # 文字列の中で或る文字が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,_乗算記号度数). % 以下のサイトは # # 出典::鈴森(@_TRTA)さんのtwitter_20150119より # この部屋には10種類の人間がいる。二進法を解す私と解せぬルームメイトである。 # 'この部屋には10種類の人間がいる。二進法を解す私と解せぬルームメイトである。'(_この部屋,_種類,X,Y) :- この部屋には二進法を解す私がいる(_種類,X), この部屋には二進法を解せぬルームメートがいる(_この部屋,_種類,Y). この部屋には二進法を解す私がいる(_この部屋,1,私) :- この部屋にいる(私,_この部屋), 二進法を解す(私,10,1,0). この部屋には二進法を解せぬルームメートがいる(_この部屋,0,ルームメート) :- この部屋にいる(ルームメート,_この部屋), 二進法を解せぬ(ルームメート,10,10). この部屋にいる(_,_この部屋) :- この部屋(_この部屋). この部屋(_この部屋). 二進法を解す(_,10,1,0). 二進法を解せぬ(_,10,10). % 以下のサイトは # # 出典::鈴森(@_TRTA)さんのtwitter_20150119より # この部屋には10種類の人間がいる。二進法を解す私と解せぬルームメイトである。 # 'この部屋には10種類の人間がいる。二進法を解す私と解せぬルームメイトである。'(_種類,X) :- 二進法を解す私(_種類,X). 'この部屋には10種類の人間がいる。二進法を解す私と解せぬルームメイトである。'(_種類,X) :- 二進法を解せぬルームメート(_種類,X). 二進法を解す私(1,_私) :- 二進法を解する(_私), 私(_私). 二進法を解せぬルームメート(0,_ルームメート) :- 二進法を解せぬ(_ルームメート), ルームメイト(_ルームメート). % 以下のサイトは # 指数表記を使わずに整数を素因数分解することを考えます。 # つまり、「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. % 以下のサイトは 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る(_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る,_歌釈) :- 霜まよふ(_霜まよふ,_歌釈), そらにしをれし(_そらにしをれし,_歌釈), 雁が音の(_雁が音の,_歌釈), かへるつばさに(_かへるつばさに,_歌釈), 春雨ぞ降る(_春雨ぞ降る,_歌釈). % 以下のサイトは 霜まよふそらにしをれし雁が音のかへるつばさに春雨ぞ降る(_霜まよふ,_そらにしをれし,_雁が音の,_かへるつばさに,_春雨ぞ降る) :- 霜まよふ(_霜まよふ), そらにしをれし(_そらにしをれし), 雁が音の(_雁が音の), かへるつばさに(_かへるつばさに), 春雨ぞ降る(_春雨ぞ降る). % 以下のサイトは 着脱(0,Y,Y). 着脱(s(X),Y,s(Z)) :- 着脱(X,Y,Z). 重ね着(X,Y,Z) :- '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'X,YがatomでZのみ変数の場合'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'X,ZがatomでYのみ変数の場合'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'Y,ZがatomでXのみ変数の場合'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'X,Yが変数でZのみatomの場合'(X,Y,Z). '重ね着の双方向性の完全な定義が難しいのでX,Y,Zがatomか変数かで分類する'(X,Y,Z) :- 'X,Y,Zすべて変数の場合'(X,Y,Z). 'X,Yが変数でZのみatomの場合'(X,Y,Z) :- 'X,Yが変数でZのみatom'(X,Y,Z), 装い(S3,Z), 着脱(S1,S2,S3), 装い(S1,X), 装い(S2,Y). 'X,Yが変数でZのみatom'(X,Y,Z) :- var(X), var(Y), atom(Z). 'X,YがatomでZのみ変数の場合'(X,Y,Z) :- 'X,YがatomでZのみ変数'(X,Y,Z), 装い(S1,X), 装い(S2,Y), 着脱(S1,S2,S3), 装い(S3,Z). 'X,YがatomでZのみ変数'(X,Y,Z) :- atom(X), atom(Y), var(Z). 'X,ZがatomでYのみ変数の場合'(X,Y,Z) :- 'X,ZがatomでYのみ変数'(X,Y,Z), 装い(S1,X), 装い(S3,Z), 着脱(S1,S2,S3), 装い(S2,Y). 'X,ZがatomでYのみ変数'(X,Y,Z) :- atom(X), atom(Z), var(Y). 'Y,ZがatomでXのみ変数の場合'(X,Y,Z) :- 'Y,ZがatomでXのみ変数'(X,Y,Z), 装い(S2,Y), 装い(S3,Z), 着脱(S1,S2,S3), 装い(S1,X). 'Y,ZがatomでXのみ変数'(X,Y,Z) :- var(X), atom(Y), atom(Z). 'X,Y,Zすべて変数の場合'(X,Y,Z) :- 'X,Y,Zすべて変数'(X,Y,Z), 装い(S1,X), 装い(S2,Y), 装い(S3,Z), 着脱(S1,S2,S3). 'X,Y,Zすべて変数'(X,Y,Z) :- var(X), var(Y), var(Z). 装い(0,グットキラメキ). 装い(s(S),Y) :- 装い(S,Z), 次の(Z,Y). 次の(グットキラメキ,リュウスパーション) :- !. 次の(リュウスパーション,マチカネハチロー) :- !. 次の(マチカネハチロー,コーヨー) :- !. 次の(コーヨー,サルノキング) :- !. 次の(サルノキング,ケンロクオー) :- !. 次の(ケンロクオー,ニューキミノナハ) :- !. 次の(ニューキミノナハ,ロングホーク) :- !. 次の(ロングホーク,カネツセーキ) :- !. 次の(カネツセーキ,オンワードベル) :- !. 次の(オンワードベル,コンチネンタル) :- !. 次の(コンチネンタル,ランリョウオー) :- !. 次の(ランリョウオー,グットキラメキ) :- !. % 以下のサイトは 着脱(0,Y,Y). 着脱(s(X),Y,s(Z)) :- 着脱(X,Y,Z). 重ね着(X,Y,Z) :- 装い(S1,X), 装い(S2,Y), 着脱(S1,S2,S3), 装い(S3,Z) . 装い(0,グットキラメキ) :- !. 装い(s(X),Y) :- 次の(Z,Y), 装い(X,Z). 次の(X,Y) :- atom(X),atom(Y), 次の馬名(X,Y). 次の(X,Y) :- atom(X),var(Y), 次の馬名(X,Z), 次の(X,Z,Y). 次の(X,Y) :- atom(Y),var(X), 次の馬名(Z,Y), 次の2(X,Z,Y). 次の(X,Y,Y). 次の(X,Z,Y) :- 次の馬名(Z2,Y), 次の(X,Z2,Y),!. 次の2(X,X,Y). 次の2(X,Z,Y) :- 次の馬名(Z2,Z), 次の2(X,Z2,Y),!. 次の馬名(グットキラメキ,リュウスパーション) :- !. 次の馬名(リュウスパーション,マチカネハチロー) :- !. 次の馬名(マチカネハチロー,コーヨー) :- !. 次の馬名(コーヨー,サルノキング) :- !. 次の馬名(サルノキング,ケンロクオー) :- !. 次の馬名(ケンロクオー,ニューキミノナハ) :- !. 次の馬名(ニューキミノナハ,ロングホーク) :- !. 次の馬名(ロングホーク,カネツセーキ) :- !. 次の馬名(カネツセーキ,オンワードベル) :- !. 次の馬名(オンワードベル,コンチネンタル) :- !. 次の馬名(コンチネンタル,ランリョウオー) :- !. 次の馬名(ランリョウオー,グットキラメキ) :- !. % 以下のサイトは 併合(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). % 以下のサイトは 併合([],L,L). 併合(L,[],L). 併合([A|R1],[B|R2],[A|R3]) :- A @< B, 併合(R1,[B|R2],R3). 併合([A|R1],[B|R2],[B|R3]) :- A @>= B, 併合([A|R1],R2,R3). % 以下のサイトは %%% 定義-1 %%% sum_list([],0). sum_list([A|R],Sum):- sum_list(R,Sum_1), Sum is A + Sum_1. %%% 定義-2 %%% sum_list(L,Sum) :- sum_list(L,0,Sum). sum_list([],Sum,Sum). sum_list([A|R],Sum_1,Sum) :- Sum_2 is A + Sum_1, sum_list(R,Sum_2,Sum). % 以下のサイトは % 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). % 以下のサイトは # 出典::twitter_by_@twinkfrag_20150108 multifact(0,1) :- !. multifact(_n,_multifact) :- multifact(1,_n,1,1,_multifact). multifact(_n,_nの限界,_,_multifact,_multifact) :- '_nが_nの限界を越えた場合、解は整っている'(_n,_nの限界),!. multifact(_n,_nの限界,_階乗_1,_multifact_1,_multifact) :- '_nを増やしながら、その階乗を計算しmultifactを更新して行く'(_n,_nの限界,_階乗_1,_multifact_1,_multifact). '_nが_nの限界を越えた場合、解は整っている'(_n,_nの限界) :- _n > _nの限界. '_nを増やしながら、その階乗を計算しmultifactを更新して行く'(_n,_nの限界,_階乗_1,_multifact_1,_multifact) :- '_nの階乗を決定し、それを使って_nの_multifactを得る'(_n,_階乗_1,_multifact_1,_階乗_2,_multifact_2), succ(_n,_n_2), multifact(_n_2,_nの限界,_階乗_2,_multifact_2,_multifact). '_nの階乗を決定し、それを使って_nの_multifactを得る'(_n,_階乗_1,_multifact_1,_階乗_2,_multifact_2) :- _階乗_2 is _n * _階乗_1, _multifact_2 is _階乗_2 * _multifact_1. % 以下のサイトは # 出典::twitter_by_@twinkfrag_20150108 :- dynamic(階乗/2). :- dynamic(multifact/2). 階乗(0,1) :- !. 階乗(N,_階乗) :- N > 0, succ(N_1,N), 階乗(N_1,_階乗_1), _階乗 is _階乗_1 * N, asserta((階乗(N,_階乗) :- ! )). multifact(0,1) :- !. multifact(_n,_multifact) :- succ(_n_1,_n), multifact(_n_1,_multifact_1), 階乗(_n,_nの階乗), _multifact is _multifact_1 * _nの階乗, asserta((multifact(_n,_multifact) :- ! )). % 以下のサイトは 相乗平均(_標本ならび,_相乗平均) :- length(_標本ならび,_標本数), 相乗平均(_標本ならび,_標本数,1,_相乗平均). 相乗平均([],N,S,M) :- M is S ^ (1 rdiv N),!. 相乗平均([A|R],N,S,M) :- S1 is A * S, 相乗平均(R,N,S1,M). % 以下のサイトは % 例えば、述語 x/2 が以下のような定義だとする。 x(U,V) :- z(U,V). x(U,V) :- a(U,W),x(W,V). x(U,V) :- b(U,W),x(W,V). % これを以下に変形する。 x(U,V) :- z(U,V). x(U,V) :- 'a(U,W),x(W,V);b(U,W),x(W,V)'(U,V). % これをヒントに x/2 を以下のように変形する。 x(U,V) :- 'z(U,V);(a(U,W),x(W,V);b(U,W),x(W,V))'(U,V). 'z(U,V);(a(U,W),x(W,V);b(U,W),x(W,V))'(U,V) :- z(U,V). 'z(U,V);(a(U,W),x(W,V);b(U,W),x(W,V))'(U,V) :- 'a(U,W),x(W,V);b(U,W),x(W,V)'(U,V). '(a(U,W),x(W,V);b(U,W),x(W,V))'(U,V) :- 'a(U,W),x(W,V)'(U,V). '(a(U,W),x(W,V);b(U,W),x(W,V))'(U,V) :- 'b(U,W),x(W,V)'(U,V). 'a(U,W),x(W,V)'(U,V) :- a(U,W), x(W,V). 'b(U,W),x(W,V)'(U,V) :- b(U,W), x(W,V). % 見て判る通り、変形則は極めて単純。説明の必要もない。 % しかも、このような変形は溯行も可能である。 % % 実際にこのように変形、分割して定義するかどうか別の問題であるが、 % 述語名に記号が使われた場合、その記号が担わされている意味は % 具体的に上記のようなものである。 % 以下のサイトは # 出題場所 :: 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,土曜). % 以下のサイトは partition([],_,[],[]). partition([X|Xs],Pivot,[X|Smalls],Bigs) :- X @< Pivot, partition(Xs,Pivot,Smalls,Bigs). partition([X|Xs],Pivot,Smalls,[X|Bigs]) :- X @>= Pivot, partition(Xs,Pivot,Smalls,Bigs). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% partition([],_,[],[]). partition([X|Xs],Pivot,Smalls,Bigs) :- 'partition :: X @< Pivot; X @>= Pivot'(X,Xs,Pivot,Smalls,Bigs). 'partition :: X @< Pivot; X @>= Pivot'(X,Xs,Pivot,[X|Smalls],Bigs) :- 'partition :: X @< Pivot'(X,Xs,Pivot,Smalls,Bigs). 'partition :: X @< Pivot; X @>= Pivot'(X,Xs,Pivot,Smalls,[X|Bigs]) :- 'partition :: X @>= Pivot'(X,Xs,Pivot,Smalls,Bigs). 'partition :: X @< Pivot'(X,Xs,Pivot,Smalls,Bigs) :- X @< Pivot, partition(Xs,Pivot,Smalls,Bigs). 'partition :: X @>= Pivot'(X,Xs,Pivot,Smalls,Bigs) :- X @>= Pivot, partition(Xs,Pivot,Smalls,Bigs). % 以下のサイトは add(0,Y,Y). add(s(X),Y,s(Z)) :- add(X,Y,Z). 月名による足し算(X,Y,Z) :- 月対応(S1,X), 月対応(S2,Y), add(S1,S2,S3), 月対応(S3,Z) . 月対応(s(0),睦月) :- !. 月対応(s(X),Y) :- 次の(Z,Y), 月対応(X,Z). 次の(睦月,如月). 次の(如月,弥生). 次の(弥生,卯月). 次の(卯月,皐月). 次の(皐月,水無月). 次の(水無月,文月). 次の(文月,葉月). 次の(葉月,長月). 次の(長月,神無月). 次の(神無月,霜月). 次の(霜月,師走). 次の(師走,睦月). % 以下のサイトは % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]). パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する :- findall(_行のずれを意味する空白文字列,member(_,_行数),_空白文字列ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する :- findall(_上の行の数字文字列,( 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列)),_上の行の数字表示部分). _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る :- atomic_list_concat(_上の行の数字表示部分,_上の行の数字表示文字列). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pl 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 % 以下のサイトは # 最近、マシューはポエマーな女子高生に恋をしている。彼女は詩人なんだが、パーコさんと言うんだ。 # # パーコ :「あらゆる物体、すなわち大空、星、大地、その王国などは、精神の最も小さいものにもおよばない。なぜなら、精神はそれらのすべてと自身とを認識するが、物体は何も認識しないからである。」 # # マシュー:「それは新しい詩かい?」 # # パーコ :「違う。パスカルの『パンセ』に記載された有名な一節。知らない人がいるんだ。」 # # マシュー:「Oh...ごめんよ。」 # # パーコ :「人間は自然の中では矮小な生き物にすぎないが、考えることによって宇宙を超える、というパスカルの考え方には実に共感するものがある。」 # # マシュー:「そうだなあ。確かに、マシューの肉体は小さいが、妄想だけはいつもビッグサイズだ!・・・さて、パーコ、デートに行かないか?」 # # パーコ :「うん、そうね。じゃあ、パスカルにちなんで、パスカルの三角形をプログラムで表示して欲しい。もちろん、数学の美しさを生かした記述の仕方をしてね。」 # # 以下の三角形が10行分のパスカルの三角形だ。こちらを再現して欲しい。 # # 1 # 1 1 # 1 2 1 # 1 3 3 1 # 1 4 6 4 1 # 1 5 10 10 5 1 # 1 6 15 20 15 6 1 # 1 7 21 35 35 21 7 1 # 1 8 28 56 70 56 28 8 1 # 1 9 36 84 126 126 84 36 9 1 # # 動作確認はideoneで行う。 # ideoneで正しく動作しない場合は不正解となりますので注意してくれよ。 # 言語は40種類以上サポートしているぞ。 # # ・使用した言語 # ・ソースコード # ・答え # の3つを合わせて記述して欲しい。 % 使用言語 SWI-Prolog % 以下、ソースコード :- op(400,xfx,だけ). :- op(300,xf,分). :- op(400,xfx,が真になる全ての場合). :- op(500,xfx,を). :- op(600,xf,に収集する). :- op(400,xfx,を結合して). :- op(600,xf,を得る). 行のずれを意味する空白文字列(' '). 項表示形式('%6c'). パスカルの三角形 :- パスカルの三角形([_,_,_,_,_,_,_,_,_,_],[1]),!. パスカルの三角形([_],_上の行) :- '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行). パスカルの三角形([_|_行数],_上の行) :- パスカルの三角形の行を順に表示する([_|_行数],_上の行). '第一引数(行数)が空になったら、最終行を表示して終了する'([],_上の行) :- パスカルの三角形の上の行を表示([],_上の行). パスカルの三角形の行を順に表示する([_|_行数],_上の行) :- 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行), パスカルの三角形(_行数,_現在行). 'パスカルの三角形の上の行を表示した上、現在行を計算して生成する'(_行数,_上の行,_現在行) :- 上の行の二項の和(_上の行,_上の行の二項の和) が真になる全ての場合 _上の行の二項の和 を _両端の1が落ちた計算された行 に収集する, パスカルの三角形の上の行を表示(_行数,_上の行), 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行). 上の行の二項の和(_上の行,_上の行の二項の和) :- append(_,[_左上の項,_右上の項|_],_上の行), _上の行の二項の和 is _左上の項 + _右上の項. パスカルの三角形の上の行を表示(_行数,_上の行) :- '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列), 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列), 表示する('%t%t\n',[_行頭からの空白文字列,_上の行の数字表示文字列]). '_行数から行頭からの空白文字列の生成'(_行数,_行頭からの空白文字列) :- 行のずれを意味する空白文字列(_行のずれを意味する空白文字列), _行数 分 だけ _行のずれを意味する空白文字列 を _空白文字列ならび に収集する, _空白文字列ならび を結合して _行頭からの空白文字列 を得る. 上の行の数字表示文字列(_上の行,_上の行の数字表示文字列) :- 上の行の数字表示部分(_上の行,_上の行の数字表示部分), _上の行の数字表示部分 を結合して _上の行の数字表示文字列 を得る. 上の行の数字表示部分(_上の行,_上の行の数字表示部分) :- 項表示形式(_項表示形式), 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) が真になる全ての場合 _上の行の数字文字列 を _上の行の数字表示部分 に収集する. 上の行の項を数字文字列に変換(_上の行,_項表示形式,_上の行の数字文字列) :- member(_項,_上の行), swritef(_上の行の数字文字列,_項表示形式,[_項]). 両端に1を付加して現在行を完成する(_両端の1が落ちた計算された行,_現在行) :- append([1|_両端の1が落ちた計算された行],[1],_現在行). _行数 分 だけ _収集項 を _収集項ならび に収集する :- findall(_収集項,member(_,_行数),_収集項ならび). _目標 が真になる全ての場合 _収集項 を _収集項ならび に収集する :- findall(_収集項,_目標,_収集項ならび). L を結合して A を得る :- atomic_list_concat(L,A). 表示する(_表示形式項,_値ならび) :- writef(_表示形式項,_値ならび). :- nl,パスカルの三角形,nl,halt. % 以下、実行結果 # swipl -f temp1.pro 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 1 6 15 20 15 6 1 1 7 21 35 35 21 7 1 1 8 28 56 70 56 28 8 1 1 9 36 84 126 126 84 36 9 1 % 以下のサイトは 有限個のデータを小さい順に並べた時中央に位置する値(_有限個のデータ,_中央値) :- 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ), 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_中央値) :- length(_小さい順に並べた有限個のデータ,_データ数), 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 中央に位置する値(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値). 'データが奇数個の場合は、中央の位置にある値'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 奇数(_データ数), _中央の位置 is (_データ数 // 2) + 1, nth1(_中央の位置,_小さい順に並べた有限個のデータ,_中央値). 'データが偶数個の場合は、中央に近い2つの値の算術平均をとる'(_小さい順に並べた有限個のデータ,_データ数,_中央値) :- 偶数(_データ数), 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ数,_値_1,_値_2), 算術平均をとる(_値_1,_値_2,_中央値). 偶数(_整数) :- 0 is _整数 mod 2. 奇数(_整数) :- 1 is _整数 mod 2. 中央に近い2つの値の(_小さい順に並べた有限個のデータ,_データ数,_値_1,_値_2) :- _中央に近い位置_1 is _データ数 // 2, succ(_中央に近い位置_1,_中央に近い位置_2), nth1(_中央に近い位置_1,_小さい順に並べた有限個のデータ,_値_1), nth1(_中央に近い位置_2,_小さい順に並べた有限個のデータ,_値_2). 算術平均をとる(_値_1,_値_2,_中央値) :- _中央値 is ( _値_1 + _値_2 ) / 2. 小さい順に並べた時([],[]). 小さい順に並べた時(_有限個のデータ,_小さい順に並べた有限個のデータ) :- 軸要素の選定(_有限個のデータ,_軸要素,_軸要素を除いたならび), 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,_軸要素を除いたならび,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび), '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ). '軸要素で分割した二つの要素ならびを それぞれ小さい順に並べて結合する'(_軸要素,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび,_小さい順に並べた有限個のデータ) :- 小さい順に並べた時(_軸要素より小さい要素ならび,_小さい順にならべた軸要素より小さい要素ならび), 小さい順に並べた時(_軸要素に等しいか大きい要素ならび,_小さい順にならべた軸要素に等しいか大きい要素ならび), append(_小さい順にならべた軸要素より小さい要素ならび,[_軸要素|_小さい順にならべた軸要素に等しいか大きい要素ならび],_小さい順に並べた有限個のデータ). 軸要素の選定([_軸要素|_軸要素を除いたならび],_軸要素,_軸要素を除いたならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_,[],[],[]). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],[A|_軸要素より小さい要素ならび],_軸要素に等しいか大きい要素ならび) :- A @< _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,[A|R],_軸要素より小さい要素ならび,[A|_軸要素に等しいか大きい要素ならび]) :- A @>= _軸要素, 軸要素より小さい要素ならびと軸要素に等しいか大きい要素ならび(_軸要素,R,_軸要素より小さい要素ならび,_軸要素に等しいか大きい要素ならび). % 以下のサイトは '文字列の先頭のカッコのみ外す。ただしカッコの入れ子は許さない。'(_文字列,_先頭のカッコが外された文字列) :- atom_chars(_文字列,_文字リスト), 'リストの先頭のカッコのみ外す。ただしカッコの入れ子は許さない。'(_文字リスト,_先頭のカッコが外された文字リスト), atom_chars(_先頭のカッコが外された文字列,_先頭のカッコが外された文字リスト). 'リストの先頭のカッコのみ外す。ただしカッコの入れ子は許さない。'(['('|Tail],Result) :- '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'(Tail,Result),!. 'リストの先頭のカッコのみ外す。ただしカッコの入れ子は許さない。'(_文字リスト,_文字リスト). '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'(['('|_],_) :- !,fail. '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'([')'|Tail],Tail) :- !. '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'([Head|Tail],[Head|Result]) :- '最初の右カッコ以外はコピー。ただしカッコの入れ子は許さない。'(Tail,Result). % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- '100個の'(_乱数リスト), '乱数値(0-99)をリストに生成します'(_乱数リスト). '100個の'(_乱数リスト) :- length(_乱数リスト,100). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- '100個の'(_乱数リスト), '乱数値(0-99)をリストに生成します'(_乱数リスト). '100個の'(_乱数リスト) :- length(_乱数リスト,100). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは # 出典::twitter_by_TakaoOzaki_20141219 # # 初心者向きのPrologの問題。100個の乱数値(0-99)をリストに生成してください。乱数値(0-99)は _乱数値 is random(100) で取れることとしてください。 # # 初心者でない人には、「あなたは、何通りのプログラムパターンが脳裏を過ぎりますか?」 # '100個の乱数値(0-99)をリストに生成します'(_乱数リスト) :- length(_乱数リスト,100), '乱数値(0-99)をリストに生成します'(_乱数リスト). '乱数値(0-99)をリストに生成します'([]). '乱数値(0-99)をリストに生成します'([_乱数値|R]) :- _乱数値 is random(100), '乱数値(0-99)をリストに生成します'(R). % 以下のサイトは # # qsort # 昇順整列([],[]). 昇順整列(_要素ならび,_昇順に整列した要素ならび) :- 軸要素(_要素ならび,_軸要素,_軸要素を除いた要素ならび), '軸要素より小さい要素ならびを昇順に整列したものと,軸要素に等しいか大きい要素ならびを昇順に整列したものを軸要素を挟んで結合する'(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した要素ならび). 軸要素(_要素ならび,_軸要素,_軸要素を除いた要素ならび) :- select(_軸要素,_要素ならび,_軸要素を除いた要素ならび),!. '軸要素より小さい要素ならびを昇順に整列したものと,軸要素に等しいか大きい要素ならびを昇順に整列したものを軸要素を挟んで結合する'(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した要素ならび) :- 軸要素より小さい要素ならびを昇順に整列したものと(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素より小さい要素ならび), 軸要素に等しいか大きい要素ならびを昇順に整列したものを(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび), 軸要素を挟んで結合する(_昇順に整列した軸要素より小さい要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび,_昇順に整列した要素ならび). 軸要素より小さい要素ならびを昇順に整列したものと(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素より小さい要素ならび) :- findall(_軸要素より小さい要素,( member(_軸要素より小さい要素,_軸要素を除いた要素ならび), _軸要素より小さい要素 @< _軸要素),_軸要素より小さい要素ならび), 昇順整列(_軸要素より小さい要素ならび,_昇順に整列した軸要素より小さい要素ならび). 軸要素に等しいか大きい要素ならびを昇順に整列したものを(_軸要素を除いた要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび) :- findall(_軸要素に等しいか大きい要素,( member(_軸要素に等しいか大きい要素,_軸要素を除いた要素ならび), _軸要素に等しいか大きい要素 @>= _軸要素),_軸要素に等しいか大きい要素ならび), 昇順整列(_軸要素に等しいか大きい要素ならび,_昇順に整列した軸要素に等しいか大きい要素ならび). 軸要素を挟んで結合する(_昇順に整列した軸要素より小さい要素ならび,_軸要素,_昇順に整列した軸要素に等しいか大きい要素ならび,_昇順に整列した要素ならび) :- append(_昇順に整列した軸要素より小さい要素ならび,[_軸要素|_昇順に整列した軸要素に等しいか大きい要素ならび],_昇順に整列した要素ならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/db/1402919549/310 # SQLServer2012です # 日々の売上の合計が一定額を越えた日を知るにはどうすればいいでしょうか? # # 10/1 |\100 # 10/2 |\200 # 10/3 |\300 # 10/4 |\200 # 10/5 |\400 # 10/6 |\100 # # 上記で\1000を越えた日=10/5と出したいです # 売上(10/1,100). 売上(10/2,200). 売上(10/3,300). 売上(10/4,200). 売上(10/5,400). 売上(10/6,100). '日々の売上の合計が一定額を越えた日を知る'(_一定額,_日々の売上の合計が一定額を越えた日) :- 整列した_日付_売上ならび(_整列した_日付_売上ならび), 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_日々の売上の合計が一定額を越えた日), 一定額を越えた(_一定額,_日々の売上の合計),!. 整列した_日付_売上ならび(_整列した_日付_売上ならび) :- findall([_日付,_売上],売上(_日付,_売上),_日付_売上ならび), sort(_日付_売上ならび,_整列した_日付_売上ならび). 日々の売上の合計が(_整列した_日付_売上ならび,_日々の売上の合計,_一定額を越えた日) :- append(LL1,_,_整列した_日付_売上ならび), findsum(_売上,member([_,_売上],LL1),_日々の売上の合計), last(LL1,[_一定額を越えた日,_]). 一定額を越えた(_一定額,_日々の売上の合計) :- _日々の売上の合計 > _一定額. findsum(A,P,Sum) :- findall(A,P,L), sum_list(L,Sum). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- length(_0計測器,2014), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],_0計測器,_行計測器), length(_行計測器,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器,_,[],_行計測器) :- !. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器_1,_パスカルの三角形の底の行,_0計測器_1,_行計測器) :- 排他的論理和を使ったパスカルの三角形の次の行(_パスカルの三角形の底の行,_0計測器_1,_右端に1を付加したパスカルの三角形の次の行,_0計測器_2), _両端に1を付加したパスカルの三角形の次の行 = [1|_右端に1を付加したパスカルの三角形の次の行], 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|_行計測器_1],_両端に1を付加したパスカルの三角形の次の行,_0計測器_2,_行計測器). 排他的論理和を使ったパスカルの三角形の次の行(_行_1,_0計測器,_行_2,_0計測器) :- '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,_行_2,_0計測器). 排他的論理和を使ったパスカルの三角形の次の行([_値_1,_値_2|R1],_0計測器_1,[_排他的論理和|R3],_0計測器) :- '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和), 排他的論理和を使ったパスカルの三角形の次の行([_値_2|R1],_0計測器_2,R3,_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_,_0計測器,_,[]) :- '_0計測器が[]なら計算を打ち切る。'(_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,[1],_0計測器) :- '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1). '_0計測器が[]なら計算を打ち切る。'([]). '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'([_]). '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和) :- 排他的論理和をとり(_値_1,_値_2,_排他的論理和), 排他的論理和が0である場合だけ_0計測器を減じる(_排他的論理和,_0計測器_1,_0計測器_2). 排他的論理和をとり(0,0,0). 排他的論理和をとり(0,1,1). 排他的論理和をとり(1,0,1). 排他的論理和をとり(1,1,0). 排他的論理和が0である場合だけ_0計測器を減じる(0,[_|_0計測器],_0計測器). 排他的論理和が0である場合だけ_0計測器を減じる(1,_0計測器,_0計測器). :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目), writef('0が2014個に達するのは%t行目です。\n',[_何行目]). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],[],_何行目),!. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_,_0ならび,_何行目) :- '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(Ln,_パスカルの三角形の行,_0ならび_1,_何行目) :- パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行), '0ならびの更新'(_パスカルの三角形の次の行,_0ならび_1,_0ならび_2), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|Ln],_パスカルの三角形の次の行,_0ならび_2,_何行目). '0ならびの要素数が2014以上の時は何行目'(Ln,_0ならび,_何行目) :- length(_0ならび,_要素数), _要素数 >= 2014, length(Ln,_何行目). パスカルの三角形の次の行(_パスカルの三角形の行,_パスカルの三角形の次の行) :- findall(N,( append(_,[A,B|_],_パスカルの三角形の行), 排他的論理和(A,B,N)),_上段の対の値から排他的論理和を取ったならび), 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行). 上段の対の値から排他的論理和を取ったならびの両端に1を付加する(_上段の対の値から排他的論理和を取ったならび,_パスカルの三角形の次の行) :- append([1|_上段の対の値から排他的論理和を取ったならび],[1],_パスカルの三角形の次の行). 排他的論理和(0,0,0). 排他的論理和(0,1,1). 排他的論理和(1,0,1). 排他的論理和(1,1,0). '0ならびの更新'([],_0ならび_1,_0ならび_1). '0ならびの更新'([0|R1],_0ならび_1,[0|_0ならび_2]) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). '0ならびの更新'([1|R1],_0ならび_1,_0ならび_2) :- '0ならびの更新'(R1,_0ならび_1,_0ならび_2). % 以下のサイトは 等差数列([_],_公差) :- 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)). % 以下のサイトは ベクトルの内積(_ベクトル_1,_ベクトル_2,_ベクトルの内積) :- findsum(U,( nth1(_nth1,_ベクトル_1,[U1]), nth1(_nth1,_ベクトル_2,[U2]), U is U1 * U2),_ベクトルの内積). % 以下のサイトは ベクトルのノルム(_ベクトル,_ノルム) :- findsum(U2,( member([U1],_ベクトル), U2 is U1 * U1),S), _ノルム is sqrt(S). % 以下のサイトは :- dynamic(下三桁フィボナッチ数/2). 下三桁の足し算の定義節の生成 :- between(0,999,M), between(0,999,N), S is ( M + N ) mod 1000, assertz((下三桁の足し算(M,N,S) :- !)), N = 999, M = 999. 下三桁フィボナッチ数(0,1) :- !. 下三桁フィボナッチ数(1,1) :- !. 下三桁フィボナッチ数(N,X) :- 隣り合う2つの数を加える(N,X), asserta((下三桁フィボナッチ数(N,X) :- !)). 隣り合う2つの数を加える(N,X) :- N_1 is N - 1, N_2 is N - 2, 下三桁フィボナッチ数(N_1,Y), 下三桁フィボナッチ数(N_2,Z), 下三桁の足し算(Y,Z,X). :- 下三桁の足し算の定義節の生成. % 以下のサイトは :- 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)). % 以下のサイトは :- dynamic('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'/2). フィボナッチ数(_n番目,_フィボナッチ数) :- '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数). '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(0, 0) :- !. '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(1, 1) :- !. '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数). '_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1), '_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2), 加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数), '_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数). '_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1) :- _n_1番目 is _n番目 - 1, '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n_1番目,_フィボナッチ数_1). '_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2) :- _n_2番目 is _n番目 - 2, '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n_2番目,_フィボナッチ数_2). 加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数) :- _フィボナッチ数 is _フィボナッチ数_1 + _フィボナッチ数_2. '_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数) :- asserta(('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- ! )). % 以下のサイトは :- dynamic('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'/2). フィボナッチ数(_n番目,_フィボナッチ数) :- '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数). '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '停止節 :: 0番目のフィボナッツ数は0、1番目のフィボナッチ数は1である'(_n番目,_フィボナッチ数),!. '_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数). '停止節 :: 0番目のフィボナッツ数は0、1番目のフィボナッチ数は1である'(0,0). '停止節 :: 0番目のフィボナッツ数は0、1番目のフィボナッチ数は1である'(1,1). '_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- '_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1), '_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2), 加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数), '_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数). '_n-1番目のフィボナッチ数と'(_n番目,_フィボナッチ数_1) :- _n_1番目 is _n番目 - 1, フィボナッチ数(_n_1番目,_フィボナッチ数_1). '_n-2番目のフィボナッチ数を'(_n番目,_フィボナッチ数_2) :- _n_2番目 is _n番目 - 2, フィボナッチ数(_n_2番目,_フィボナッチ数_2). 加算したものになる(_フィボナッチ数_1,_フィボナッチ数_2,_フィボナッチ数) :- _フィボナッチ数 is _フィボナッチ数_1 + _フィボナッチ数_2. '_n番目のフィボナッチ数の計算結果を保存する'(_n番目,_フィボナッチ数) :- asserta(('_n番目のフィボナッチ数は_n-1番目のフィボナッチ数と_n-2番目のフィボナッチ数を加算したものになる'(_n番目,_フィボナッチ数) :- ! )). % 以下のサイトは # # 匿名変数リストを使った割り算 # 匿名変数リストを使った割り算(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ちゃんと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の登場する回数が同じであるようなペアは何組存在するか、答えてください。'(_ペアの組数) :- findall(_2進法で表した時に1の登場する回数,( '1〜2014までの数を2進法で表した時に1の登場する回数'(_数を2進法で表した時に1の登場する回数)),_2進法で表した時に1の登場する回数ならび), 度数(append(_,[_1の回数,_1の回数|_],_数を2進法で表した時に1の登場する回数ならび),_ペアの組数). '1〜2014までの数を2進法で表した時に1の登場する回数'(_数を2進法で表した時に1の登場する回数) :- between(1,2014,_数), '数を2進法で表した時に1の登場する回数'(_数,_数を2進法で表した時に1の登場する回数). '数を2進法で表した時に1の登場する回数'(_実,_数を2進法で表した時に1の登場する回数) :- '数を2進法で表した時に1の登場する回数'(_実,0,_数を2進法で表した時に1の登場する回数). '数を2進法で表した時に1の登場する回数'(0,_1の回数,_1の回数) :- !. '数を2進法で表した時に1の登場する回数'(_実,_1の累積回数,_1の回数) :- _剰余 is _実 mod 2, _商 is _実 // 2, '剰余が1ならば加算'(_剰余,_商,_1の累積回数,_1の回数). '剰余が1ならば加算'(1,_商,_1の累積回数_1,_1の回数) :- succ(_1の累積回数_1,_1の累積回数_2), '数を2進法で表した時に1の登場する回数'(_商,_1の累積回数_2,_1の回数). '剰余が1ならば加算'(0,_商,_1の累積回数_1,_1の回数) :- '数を2進法で表した時に1の登場する回数'(_商,_1の累積回数_1,_1の回数). 度数(_目標,_度数) :- findall(1,_目標,_度数を示す1のならび), length(_度数を示す1のならび,_度数). % 以下のサイトは # # 出典::増井技術士事務所 今週のアルゴリズムの@masuipeoさんからのアルゴリズムの問題 # # 有名な「パスカルの三角形」は「右上の数と左上の数の和」を配置していきますが、 ここでは単純な「和」ではなく、「排他的論理和」を使うことを考えます。 # 1段目から順に配置してみると、以下の図のようになります。 # # 上から順番に配置していったとき、2014番目の「0」が出力されるのは何段目になるかを求めてください。 # # 1番めの「0」は、3段目、2・3・4番目の「0」は5段目に出力されています。 # # 【解答方法】 # 解答フォームの1行目に答えを記入してください。 # 2行目以降はあなたが求めた方法を記入してください。プログラムを書いた場合はコードを貼り付けてください。 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目) :- length(_0計測器,2014), 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_],[1],_0計測器,_行計測器), length(_行計測器,_何行目). 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器,_,[],_行計測器) :- !. 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_行計測器_1,_パスカルの三角形の底の行,_0計測器_1,_行計測器) :- 排他的論理和を使ったパスカルの三角形の次の行(_パスカルの三角形の底の行,_0計測器_1,_右端に1を付加したパスカルの三角形の次の行,_0計測器_2), _両端に1を付加したパスカルの三角形の次の行 = [1|_右端に1を付加したパスカルの三角形の次の行], 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか([_|_行計測器_1],_両端に1を付加したパスカルの三角形の次の行,_0計測器_2,_行計測器). 排他的論理和を使ったパスカルの三角形の次の行(_行_1,_0計測器,_行_2,_0計測器) :- '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,_行_2,_0計測器). 排他的論理和を使ったパスカルの三角形の次の行([_値_1,_値_2|R1],_0計測器_1,[_排他的論理和|R3],_0計測器) :- '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和), 排他的論理和を使ったパスカルの三角形の次の行([_値_2|R1],_0計測器_2,R3,_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_,_0計測器,_,[]) :- '_0計測器が[]なら計算を打ち切る。'(_0計測器). '停止条件 :: _0計測器が[]なら計算を打ち切る。行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1,_0計測器,[1],_0計測器) :- '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'(_行_1). '_0計測器が[]なら計算を打ち切る。'([]). '行の排他的論理和計算が完了したら新しい底の行の右端に1を付加して終了する'([_]). '排他的論理和をとり、0である場合だけ_0計測器を減じる'(_値_1,_値_2,_0計測器_1,_0計測器_2,_排他的論理和) :- 排他的論理和をとり(_値_1,_値_2,_排他的論理和), 排他的論理和が0である場合だけ_0計測器を減じる(_排他的論理和,_0計測器_1,_0計測器_2). 排他的論理和をとり(0,0,0). 排他的論理和をとり(0,1,1). 排他的論理和をとり(1,0,1). 排他的論理和をとり(1,1,0). 排他的論理和が0である場合だけ_0計測器を減じる(0,[_|_0計測器],_0計測器). 排他的論理和が0である場合だけ_0計測器を減じる(1,_0計測器,_0計測器). :- 排他的論理和を使ったパスカルの三角形で2014番目の0は何行目に現れるか(_何行目), writef('0が2014個に達するのは%t行目です。\n',[_何行目]). % 以下のサイトは 昇順鍵整列(L1,_鍵ならび,L2) :- 昇順鍵整列(1,_鍵ならび,L1,KL,L3), 昇順整列(KL,KL2), findall(L,( member(L4,KL2), last(L4,K), member([K|L],L3)),L2). 昇順鍵整列(_,_,[],[],[]) :- !. 昇順鍵整列(N,KL,[L1|R1],[KL_1|KR],[[N|L1]|R3]) :- 鍵生成(N,KL,L1,KL_1), succ(N,N_2), 昇順鍵整列(N_2,KL,R1,KR,R3). 鍵生成(N,KL,L1,KR_2) :- findall(A,( member(K,KL), nth1(K,L1,A)),KR_1), append(KR_1,[N],KR_2). 昇順整列([],[]). 昇順整列([_軸要素|L1],L2) :- 昇順分割(_軸要素,L1,L1_2,L2_2), 昇順整列(L1_2,L1_3), 昇順整列(L2_2,L2_3), append(L1_3,[_軸要素|L2_3],L2). 昇順分割(_,[],[],[]). 昇順分割(A,[B|R2],[B|R3],R4) :- A @>= B, 昇順分割(A,R2,R3,R4). 昇順分割(A,[B|R2],R3,[B|R4]) :- A @< B, 昇順分割(A,R2,R3,R4). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- findall(_日,between(1,_末日整数,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), '第二週以後(最終週の整形)'(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). '第二週以後(最終週の整形)'([],[]) :- !. '第二週以後(最終週の整形)'([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- '第二週以後(最終週の整形)'(R1,R2),!. '第二週以後(最終週の整形)'(L1,[_最終週]) :- 一週間は七日だ(_最終週), append(L1,_,_最終週). 一週間は七日だ([_,_,_,_,_,_,_]). % 以下のサイトは 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が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 = _ガウス行列の階数). 解がない場合(_ガウス行列). % 以下のサイトは '0でない実数をかけた行に、他の行を実数倍したものを加える'(_行列,_行目_1,_行目_2,_実数_1,_実数_2,_行列_2) :- '0でない実数をかけた行に'(_行列,_行目_1,_実数_1,_行ならび_1,_行_1,_残り行ならび), '他の行を実数倍したものを'(_行列,_行目_2,_実数_2,_行_2), 行を加算する(_行_1,_行_2,_行_3), append(_行ならび_1,[_行_3|_残り行ならび],_行列_2). '0でない実数をかけた行に'(_行列,_行目_1,_実数_1,_行ならび_1,_行_1,_残り行ならび) :- append(_行ならび_1,[_行|_残り行ならび],_行列), length([_|_行ならび_1],_行目_1), 実数をかける(_実数_1,_行,_行_1). '他の行を実数倍したものを'(_行列,_行目_2,_実数_2,_行_2) :- append(_行ならび_1,[_行|_残りならび],_行列), length([_|_行ならび_1],_行目_2), 実数をかける(_実数_2,_行,_行_2). 行を加算する([],[],[]). 行を加算する([A|R1],[B|R2],[C|R3]) :- C is A + B, 行を加算する(R1,R2,R3). 実数をかける(_行,_実数,_実数をかけた行) :- 行に実数をかける(_行,_実数,_実数をかけた行). 行に実数をかける([],_,[]). 行に実数をかける([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数をかける(R1,_実数,R2). % 以下のサイトは ある行に実数倍した他の行を加える(_行列,_ある行,_実数,_他の行,_ある行に実数倍した他の行を加えた行列) :- append(L1,[_行_1|R1],_行列), length([_|L1],_ある行), append(L2,[_行_2|R2],_行列), length([_|L2],_他の行), 行に実数をかける(_行_2,_実数,_実数をかけた行), 行と行との加算(_ある行,_実数をかけた行,_ある行に実数倍した他の行を加えた行), append(L1,[_ある行に実数倍した他の行を加えた行|R1],_ある行に実数倍した他の行を加えた行列). 行に実数をかける([],_,[]). 行に実数をかける([A|R1],_実数,[B|R2]) :- B is A * _実数, 行に実数をかける(R1,_実数,R2). 行と行との加算([],[],[]). 行と行との加算([A|R1],[B|R2],[C|R3]) :- C is A + B, 行と行との加算(R1,R2,R3). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- M is _第何行_2 - _第何行_1, '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1), '_第何行_2まで切り取る'(R1,M,A,B,R3), append(L1,[B|R3],_2つの行を交換した行列). '_第何行_1まで切り取る'(_行列,_第何行_1,L1,A,R1) :- append(L1,[A|R1],_行列), length([_|L1],_第何行_1). '_第何行_2まで切り取る'(R1,M,A,B,R3) :- append(L2,[B|R2],R1), length([_|L2],M), append(L2,[A|R2],R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,M,_n_2,[A|R1],A,B,[B|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,M,_n_2,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,M,[B|R1],A,B,[A|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,M,R1,A,B,R2),!. '2つの行を交換する'(M,_n_1,_n_2,[U|R1],A,B,[U|R2]) :- succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- '2つの行を交換する'(1,_第何行_1,_第何行_2,_行列,A,B,_2つの行を交換した行列). '2つの行を交換する'(_,_,_,[],_,_,[]). '2つの行を交換する'(M,_n_1,_n_2,[C|R1],A,B,[D|R2]) :- 交換の選択(M,_n_1,_n_2,C,A,B,D), succ(M,M_2), '2つの行を交換する'(M_2,_n_1,_n_2,R1,A,B,R2). 交換の選択(M,M,_n_2,A,A,B,B) :- !. 交換の選択(M,_n_1,M,B,A,B,A) :- !. 交換の選択(M,_n_1,_n_2,U,A,B,U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). '2つの行のみ交換して埋めた変数ならび'(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは '2つの行を交換する'(_行列,_第何行_1,_第何行_2,_2つの行を交換した行列) :- 値だけ交換し残りは変数のならび(_行列,_2つの行を交換した行列), 残った変数を行列の値で埋める(_行列,_2つの行を交換した行列). 値だけ交換し残りは変数のならび(_行列,_第何行_1,_第何行_2,_2つの行のみ交換して埋めた変数ならび) :- 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2), 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび). 行列の交換する行(_行列,_第何行_1,_第何行_2,_行_1,_行_2) :- nth1(_第何行_1,_行列,_行_1), nth1(_第何行_2,_行列,_行_2). 2つの行のみ交換して埋めた変数ならび(_行列,_第何行_1,_第何行_2,_行_1,_行_2,_2つの行のみ交換して埋めた変数ならび) :- length(_行列,_行列の行数), findall(_,between(1,_行列の行数,_),_2つの行のみ交換して埋めた変数ならび), nth1(_第何行_2,_2つの行のみ交換して埋めた変数ならび,_行_1), nth1(_第何行_1,_2つの行のみ交換して埋めた変数ならび,_行_2). 残った変数を行列の値で埋める([],[]). 残った変数を行列の値で埋める([A|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2),!. 残った変数を行列の値で埋める([_|R1],[A|R2]) :- 残った変数を行列の値で埋める(R1,R2). % 以下のサイトは # # 出典::@nkawagashira 川頭 信之さんからの関数型言語の問題 # この問題に対応するPrologプログラムを書いてみましたが、出題に対する解答受付中で ヒントになってしまうため、この問題の締め切りまで、リンクを切ります。 % 以下のサイトは # 出典::プログラミングのお題スレ Part5 #644 # # お題:硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 # 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 # 内訳は各硬貨の枚数を並べたものとする。 # 複数の解がある場合はすべてを求める。 # 例 # 11枚で1082円のとき # 2 0 1 0 6 2 # # 12枚で777円のとき # 1 0 5 1 3 2 # 1 1 3 0 5 2 # # 25枚で4999円のとき # 9 2 5 4 1 4 # 9 3 3 3 3 4 # 9 4 1 2 5 4 '硬貨がn枚あり、合計金額がk円のとき、その内訳を求める。 硬貨の種類は500円玉、100円玉、50円玉、10円玉、5円玉、1円玉である。 内訳は各硬貨の枚数を並べたものとする。 複数の解がある場合はすべてを求める。'(_n,_k,_500,_100,_50,_10,_5,_1) :- '硬貨がn枚あり、'(_n,L), '合計金額がk円のとき、その内訳を求める。'(L,_k,_500,_100,_50,_10,_5,_1). '硬貨がn枚あり、'(_n,L) :- findall(_,between(1,_n,_),L). '合計金額がk円のとき、その内訳を求める。'(L,_k,_500,_100,_50,_10,_5,_1) :- append([L1,L2,L3,L4,L5,L6],L), 硬貨の枚数([L1,L2,L3,L4,L5,L6],[_500,_100,_50,_10,_5,_1]), _k is 500 * _500 + 100 * _100 + 50 * _50 + 10 * _10 + 5 * _5 + 1 * _1. 硬貨の枚数([],[]). 硬貨の枚数(L1,L2) :- 硬貨ごとの枚数を数え上げる(L1,L2). 硬貨ごとの枚数を数え上げる([L|R1],[_枚数|R2]) :- length(L,_枚数), 硬貨の枚数(R1,R2). % 以下のサイトは # 出典::プログラミングのお題スレ Part5 # 与えられた文字列を三等分にして出力しなさい # きれいに三等分できない場合は四等分にしなさい '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '与えられた文字列を三等分にして出力しなさい。'(_文字列),!. '与えられた文字列を三等分にして出力しなさい。きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- 'きれいに三等分できない場合は四等分にしなさい。'(_文字列). '与えられた文字列を三等分にして出力しなさい。'(_文字列) :- sub_atom(_文字列,N,N,N,S1,S2,S3,_,_,_), writef('%t,%t,%t\n',[S1,S2,S3]). 'きれいに三等分できない場合は四等分にしなさい。'(_文字列) :- '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3), 'さらにS2を二等分して'(S2,S2_1,S2_2), 全体が四等分されたら出力する(S1,S2_1,S2_2,S3). '文字数が1:2:1になるように分割する'(_文字列,S1,S2,S3) :- sub_atom(_文字列,N,M,N,S1,S2,S3,_,_,_), M is N * 2. 'さらにS2を二等分して'(S2,S2_1,S2_2) :- sub_atom(S2,N_1,N_1,0,S2_1,S2_2,_,_,_,_). 全体が四等分されたら出力する(S1,S2_1,S2_2,S3) :- writef('%t,%t,%t,%t\n',[S1,S2_1,S2_2,S3]). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3). sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 'Aがアトムの場合、Aを三つの文字列に分解してそれぞれの文字ならびを得る'(A,S,L,R,S1,S2,S3) :- atom(A), 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3), 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL). 'Aを三つの文字列に分解する'(A,S,L,R,S1,S2,S3) :- 'S1を得る'(A,S,S1), 'S2を得る'(A,S,L,S2), 'S3を得る'(A,S,L,R,S3). 'S1を得る'(A,S,S1) :- sub_atom(A,0,S,_,S1). 'S2を得る'(A,S,L,S2) :- sub_atom(A,S,L,_,S2). 'S3を得る'(A,S,L,R,S3) :- N is S + L, sub_atom(A,N,R,0,S3). 三つの文字列の文字ならびを得る(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 'Aが変数の場合、三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- var(A), 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係と文字ならびとその要素数の関係を確かめる(A,S,L,R,S1,S2,S3,HL,XL,TL) :- 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL), 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R), 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL). 三つの文字列と文字ならびの関係(S1,S2,S3,HL,XL,TL) :- atom_chars(S1,HL), atom_chars(S2,XL), atom_chars(S3,TL). 三つの文字ならびとその要素数の関係(HL,XL,TL,S,L,R) :- length(HL,S), length(XL,L), length(TL,R). 'Aを定数化できたら、sub_atom/10が実行できる'(A,S,L,R,S1,S2,S3,HL,XL,TL) :- atomic_list_concat([S1,S2,S3],A), sub_atom(A,S,L,R,S1,S2,S3,HL,XL,TL). % 以下のサイトは # 出典:: プログラミングのお題スレ Part5 # お題:自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。 # # 例1:14,17,50,25,29,85,89,145,190,730,730,... # 例2:59,106,217,352,160,217,352,160,... # # この操作によるループ(上記の例では[730],[160,217,352])を好きなだけ求めよ。 '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,[],L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- ループが発生したら終了する(L1,L,_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(N,L1,L,_ループ) :- '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和), '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返すという操作を繰り返す。'(_Nの各桁のk乗の和,[_Nの各桁のk乗の和|L1],L,_ループ). ループが発生したら終了する(L1,L,_ループ) :- L1 = [N1|R], append(L0,[N1|_],R), reverse(L1,L), reverse([N1|L0],_ループ). '自然数Nが与えられたら、Nの各桁のk乗の和(ただしkはNの桁数)を返す'(N,_Nの各桁のk乗の和) :- 各桁の数ならびを得る(N,_数ならび), length(Chars,_k), findsum(_nの各桁のk乗,( member(_数,_数ならび), _nの各桁のk乗 is _数 ^ _k),_Nの各桁のk乗の和). 各桁の数ならびを得る(N,_数ならび) :- number_chars(N,Chars), findall(_数,( member(A,Chars), number_chars(_数,[A])),_数ならび). % 以下のサイトは # # append/1 は append/4-n をabolishした後に定義する。 # ただし、_nはappend/1の引数の要素数。 # # ?- append([[1,2],[3,4],[a],[b,c,d],X]). # X = [1,2,3,4,a,b,c,d]. # # ?- append([X,[3,4],[a],Y],[1,2,3,4,a,b,c,d]]). # X = [1,2], # Y = [b,c,d]. # append(LL) :- length(LL,_n), abolish_append_n(_n), append_n_の定義(_n), P =.. [append|LL], call(P). abolish_append_n(_n) :- between(4,_n,M), abolish(append/M), _n = M. append_n_の定義(3) :- !. append_n_の定義(_n) :- succ(_n_1,_n), append_n_の定義(_n_1), append_n_の第一節定義(_n_1), append_n_の第二節定義(_n). append_n_の第一節定義(_n_1) :- findall(_,between(1,_n_1,_),L1), P_1 =.. [append,[]|L1], P_1_1 =.. [append|L1], assertz((P_1 :- P_1_1)). append_n_の第二節定義(_n) :- findall(_,between(1,_n,_),_本体引数ならび), append_n_の第二節頭部引数(_本体引数ならび,_頭部引数ならび), _頭部 =.. [append|_頭部引数ならび], _本体 =.. [append|_本体引数ならび], assertz((_頭部 :- _本体)). append_n_の第二節頭部引数([V|R1],[[U|V]|R2]) :- append_n_の第二節頭部引数(R1,U,R2). append_n_の第二節頭部引数([V],U,[[U|V]]) :- !. append_n_の第二節頭部引数([V|R1],U,[V|R2]) :- append_n_の第二節頭部引数(R1,U,R2). % 以下のサイトは # 出題::プログラミングのお題スレ Part5#459 # お題:ふたつの自然数を連結してひとつの自然数にする。 # たとえば123と56なら123456になる。 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数,_二つ目の自然数,_連結された自然数) :- number_chars(_二つ目の自然数,_二つ目の自然数ならび), length(_二つ目の自然数ならび,_二つ目の自然数の桁), _連結された自然数 is _一つ目の自然数 * 10 ^ _二つ目の自然数の桁 + _二つ目の自然数. % 以下のサイトは # 出題::プログラミングのお題スレ Part5#459 # お題:ふたつの自然数を連結してひとつの自然数にする。 # たとえば123と56なら123456になる。 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数,_二つ目の自然数,_連結された自然数) :- number_chars(_一つ目の自然数,_一つ目の自然数ならび), number_chars(_二つ目の自然数,_二つ目の自然数ならび), append(_一つ目の自然数ならび,_二つ目の自然数ならび,_連結された自然数ならび), number_chars(_連結された自然数,_連結された自然数ならび). % 以下のサイトは # 出題::プログラミングのお題スレ Part5#459 # お題:ふたつの自然数を連結してひとつの自然数にする。 # たとえば123と56なら123456になる。 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数,_二つ目の自然数,_連結された自然数) :- 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数,_二つ目の自然数,_二つ目の自然数,_連結された自然数). 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数_1,0,_二つ目の自然数,_連結された自然数) :- _連結された自然数 is _一つ目の自然数_1 + _二つ目の自然数,!. 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数_1,_二つ目の自然数_1,_二つ目の自然数,_連結された自然数) :- _一つ目の自然数_2 is _一つ目の自然数_1 * 10, _二つ目の自然数_2 is _二つ目の自然数_1 // 10, 'ふたつの自然数を連結してひとつの自然数にする。'(_一つ目の自然数_2,_二つ目の自然数_2,_二つ目の自然数,_連結された自然数). % 以下のサイトは # 文字aを10回出力するコードを書きなさい # # 但し以下の文字の使用を禁止する # [0-9<*+] 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字aを十回出力する :- forall(文字(_文字),write(_文字)). % 以下のサイトは # 最大の利益 # 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([]. % 以下のサイトは # 最大の利益 # 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 とする) の最大値を求めてください。' :- 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび), 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益), 最大の為替差の利益を表示する(_最大の為替差の利益). 時刻tに於ける価格ならびを得る(_時刻tに於ける価格ならび) :- 時系列数を得る(_時系列数), findall(_価格,( between(1,_時系列数,_t), 価格を得る(_価格)), _時刻tに於ける価格ならび). 最大の為替差の利益(_時刻tに於ける価格ならび,_最大の為替差の利益) :- findmax(_時刻tの投資に対する最大価格差,( append(_,[_時刻tの価格|_その後価格ならび],_時刻tに於ける価格ならび), 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差)), _最大の為替差の利益). 時刻tの投資に対する最大価格差(_時刻tの価格,_その後の価格ならび,_時刻tの投資に対する最大価格差) :- findmax(_時刻tの価格との価格差,( member(_その後の時系列での価格,_その後の価格ならび), _時刻tの価格との価格差 is _その後の時系列での価格 - _時刻tの価格), _時刻tの投資に対する最大価格差). 時系列数を得る(_時系列数) :- 整数を得る(_時系列数). 価格を得る(_価格) :- 整数を得る(_価格). 最大の為替差の利益を表示する(_最大の為替差の利益) :- writef('%t\n',[_最大の為替差の利益]). % 以下のサイトは ハイカード(_手札,_数字_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']). % 以下のサイトは 日曜起点カレンダー(_年,_月) :- 一日の曜日(_年,_月,_一日の曜日), 月末日の曜日(_年,_月,_月末日,_), 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). 一日の曜日(1970,1,木曜). 一日の曜日(1970,2,日曜). 一日の曜日(1970,3,日曜). 一日の曜日(1970,4,水曜). 一日の曜日(1970,5,金曜). 一日の曜日(1970,6,月曜). 一日の曜日(1970,7,水曜). 一日の曜日(1970,8,土曜). 一日の曜日(1970,9,火曜). 一日の曜日(1970,10,木曜). 一日の曜日(1970,11,日曜). 一日の曜日(1970,12,火曜). 一日の曜日(1971,1,金曜). 一日の曜日(1971,2,月曜). 一日の曜日(1971,3,月曜). 一日の曜日(1971,4,木曜). 一日の曜日(1971,5,土曜). 一日の曜日(1971,6,火曜). 一日の曜日(1971,7,木曜). 一日の曜日(1971,8,日曜). 一日の曜日(1971,9,水曜). 一日の曜日(1971,10,金曜). 一日の曜日(1971,11,月曜). 一日の曜日(1971,12,水曜). 一日の曜日(1972,1,土曜). 一日の曜日(1972,2,火曜). 一日の曜日(1972,3,水曜). 一日の曜日(1972,4,土曜). 一日の曜日(1972,5,月曜). 一日の曜日(1972,6,木曜). 一日の曜日(1972,7,土曜). 一日の曜日(1972,8,火曜). 一日の曜日(1972,9,金曜). 一日の曜日(1972,10,日曜). 一日の曜日(1972,11,水曜). 一日の曜日(1972,12,金曜). 一日の曜日(1973,1,月曜). 一日の曜日(1973,2,木曜). 一日の曜日(1973,3,木曜). 一日の曜日(1973,4,日曜). 一日の曜日(1973,5,火曜). 一日の曜日(1973,6,金曜). 一日の曜日(1973,7,日曜). 一日の曜日(1973,8,水曜). 一日の曜日(1973,9,土曜). 一日の曜日(1973,10,月曜). 一日の曜日(1973,11,木曜). 一日の曜日(1973,12,土曜). 一日の曜日(1974,1,火曜). 一日の曜日(1974,2,金曜). 一日の曜日(1974,3,金曜). 一日の曜日(1974,4,月曜). 一日の曜日(1974,5,水曜). 一日の曜日(1974,6,土曜). 一日の曜日(1974,7,月曜). 一日の曜日(1974,8,木曜). 一日の曜日(1974,9,日曜). 一日の曜日(1974,10,火曜). 一日の曜日(1974,11,金曜). 一日の曜日(1974,12,日曜). 一日の曜日(1975,1,水曜). 一日の曜日(1975,2,土曜). 一日の曜日(1975,3,土曜). 一日の曜日(1975,4,火曜). 一日の曜日(1975,5,木曜). 一日の曜日(1975,6,日曜). 一日の曜日(1975,7,火曜). 一日の曜日(1975,8,金曜). 一日の曜日(1975,9,月曜). 一日の曜日(1975,10,水曜). 一日の曜日(1975,11,土曜). 一日の曜日(1975,12,月曜). 一日の曜日(1976,1,木曜). 一日の曜日(1976,2,日曜). 一日の曜日(1976,3,月曜). 一日の曜日(1976,4,木曜). 一日の曜日(1976,5,土曜). 一日の曜日(1976,6,火曜). 一日の曜日(1976,7,木曜). 一日の曜日(1976,8,日曜). 一日の曜日(1976,9,水曜). 一日の曜日(1976,10,金曜). 一日の曜日(1976,11,月曜). 一日の曜日(1976,12,水曜). 一日の曜日(1977,1,土曜). 一日の曜日(1977,2,火曜). 一日の曜日(1977,3,火曜). 一日の曜日(1977,4,金曜). 一日の曜日(1977,5,日曜). 一日の曜日(1977,6,水曜). 一日の曜日(1977,7,金曜). 一日の曜日(1977,8,月曜). 一日の曜日(1977,9,木曜). 一日の曜日(1977,10,土曜). 一日の曜日(1977,11,火曜). 一日の曜日(1977,12,木曜). 一日の曜日(1978,1,日曜). 一日の曜日(1978,2,水曜). 一日の曜日(1978,3,水曜). 一日の曜日(1978,4,土曜). 一日の曜日(1978,5,月曜). 一日の曜日(1978,6,木曜). 一日の曜日(1978,7,土曜). 一日の曜日(1978,8,火曜). 一日の曜日(1978,9,金曜). 一日の曜日(1978,10,日曜). 一日の曜日(1978,11,水曜). 一日の曜日(1978,12,金曜). 一日の曜日(1979,1,月曜). 一日の曜日(1979,2,木曜). 一日の曜日(1979,3,木曜). 一日の曜日(1979,4,日曜). 一日の曜日(1979,5,火曜). 一日の曜日(1979,6,金曜). 一日の曜日(1979,7,日曜). 一日の曜日(1979,8,水曜). 一日の曜日(1979,9,土曜). 一日の曜日(1979,10,月曜). 一日の曜日(1979,11,木曜). 一日の曜日(1979,12,土曜). 一日の曜日(1980,1,火曜). 一日の曜日(1980,2,金曜). 一日の曜日(1980,3,土曜). 一日の曜日(1980,4,火曜). 一日の曜日(1980,5,木曜). 一日の曜日(1980,6,日曜). 一日の曜日(1980,7,火曜). 一日の曜日(1980,8,金曜). 一日の曜日(1980,9,月曜). 一日の曜日(1980,10,水曜). 一日の曜日(1980,11,土曜). 一日の曜日(1980,12,月曜). 一日の曜日(1981,1,木曜). 一日の曜日(1981,2,日曜). 一日の曜日(1981,3,日曜). 一日の曜日(1981,4,水曜). 一日の曜日(1981,5,金曜). 一日の曜日(1981,6,月曜). 一日の曜日(1981,7,水曜). 一日の曜日(1981,8,土曜). 一日の曜日(1981,9,火曜). 一日の曜日(1981,10,木曜). 一日の曜日(1981,11,日曜). 一日の曜日(1981,12,火曜). 一日の曜日(1982,1,金曜). 一日の曜日(1982,2,月曜). 一日の曜日(1982,3,月曜). 一日の曜日(1982,4,木曜). 一日の曜日(1982,5,土曜). 一日の曜日(1982,6,火曜). 一日の曜日(1982,7,木曜). 一日の曜日(1982,8,日曜). 一日の曜日(1982,9,水曜). 一日の曜日(1982,10,金曜). 一日の曜日(1982,11,月曜). 一日の曜日(1982,12,水曜). 一日の曜日(1983,1,土曜). 一日の曜日(1983,2,火曜). 一日の曜日(1983,3,火曜). 一日の曜日(1983,4,金曜). 一日の曜日(1983,5,日曜). 一日の曜日(1983,6,水曜). 一日の曜日(1983,7,金曜). 一日の曜日(1983,8,月曜). 一日の曜日(1983,9,木曜). 一日の曜日(1983,10,土曜). 一日の曜日(1983,11,火曜). 一日の曜日(1983,12,木曜). 一日の曜日(1984,1,日曜). 一日の曜日(1984,2,水曜). 一日の曜日(1984,3,木曜). 一日の曜日(1984,4,日曜). 一日の曜日(1984,5,火曜). 一日の曜日(1984,6,金曜). 一日の曜日(1984,7,日曜). 一日の曜日(1984,8,水曜). 一日の曜日(1984,9,土曜). 一日の曜日(1984,10,月曜). 一日の曜日(1984,11,木曜). 一日の曜日(1984,12,土曜). 一日の曜日(1985,1,火曜). 一日の曜日(1985,2,金曜). 一日の曜日(1985,3,金曜). 一日の曜日(1985,4,月曜). 一日の曜日(1985,5,水曜). 一日の曜日(1985,6,土曜). 一日の曜日(1985,7,月曜). 一日の曜日(1985,8,木曜). 一日の曜日(1985,9,日曜). 一日の曜日(1985,10,火曜). 一日の曜日(1985,11,金曜). 一日の曜日(1985,12,日曜). 一日の曜日(1986,1,水曜). 一日の曜日(1986,2,土曜). 一日の曜日(1986,3,土曜). 一日の曜日(1986,4,火曜). 一日の曜日(1986,5,木曜). 一日の曜日(1986,6,日曜). 一日の曜日(1986,7,火曜). 一日の曜日(1986,8,金曜). 一日の曜日(1986,9,月曜). 一日の曜日(1986,10,水曜). 一日の曜日(1986,11,土曜). 一日の曜日(1986,12,月曜). 一日の曜日(1987,1,木曜). 一日の曜日(1987,2,日曜). 一日の曜日(1987,3,日曜). 一日の曜日(1987,4,水曜). 一日の曜日(1987,5,金曜). 一日の曜日(1987,6,月曜). 一日の曜日(1987,7,水曜). 一日の曜日(1987,8,土曜). 一日の曜日(1987,9,火曜). 一日の曜日(1987,10,木曜). 一日の曜日(1987,11,日曜). 一日の曜日(1987,12,火曜). 一日の曜日(1988,1,金曜). 一日の曜日(1988,2,月曜). 一日の曜日(1988,3,火曜). 一日の曜日(1988,4,金曜). 一日の曜日(1988,5,日曜). 一日の曜日(1988,6,水曜). 一日の曜日(1988,7,金曜). 一日の曜日(1988,8,月曜). 一日の曜日(1988,9,木曜). 一日の曜日(1988,10,土曜). 一日の曜日(1988,11,火曜). 一日の曜日(1988,12,木曜). 一日の曜日(1989,1,日曜). 一日の曜日(1989,2,水曜). 一日の曜日(1989,3,水曜). 一日の曜日(1989,4,土曜). 一日の曜日(1989,5,月曜). 一日の曜日(1989,6,木曜). 一日の曜日(1989,7,土曜). 一日の曜日(1989,8,火曜). 一日の曜日(1989,9,金曜). 一日の曜日(1989,10,日曜). 一日の曜日(1989,11,水曜). 一日の曜日(1989,12,金曜). 一日の曜日(1990,1,月曜). 一日の曜日(1990,2,木曜). 一日の曜日(1990,3,木曜). 一日の曜日(1990,4,日曜). 一日の曜日(1990,5,火曜). 一日の曜日(1990,6,金曜). 一日の曜日(1990,7,日曜). 一日の曜日(1990,8,水曜). 一日の曜日(1990,9,土曜). 一日の曜日(1990,10,月曜). 一日の曜日(1990,11,木曜). 一日の曜日(1990,12,土曜). 一日の曜日(1991,1,火曜). 一日の曜日(1991,2,金曜). 一日の曜日(1991,3,金曜). 一日の曜日(1991,4,月曜). 一日の曜日(1991,5,水曜). 一日の曜日(1991,6,土曜). 一日の曜日(1991,7,月曜). 一日の曜日(1991,8,木曜). 一日の曜日(1991,9,日曜). 一日の曜日(1991,10,火曜). 一日の曜日(1991,11,金曜). 一日の曜日(1991,12,日曜). 一日の曜日(1992,1,水曜). 一日の曜日(1992,2,土曜). 一日の曜日(1992,3,日曜). 一日の曜日(1992,4,水曜). 一日の曜日(1992,5,金曜). 一日の曜日(1992,6,月曜). 一日の曜日(1992,7,水曜). 一日の曜日(1992,8,土曜). 一日の曜日(1992,9,火曜). 一日の曜日(1992,10,木曜). 一日の曜日(1992,11,日曜). 一日の曜日(1992,12,火曜). 一日の曜日(1993,1,金曜). 一日の曜日(1993,2,月曜). 一日の曜日(1993,3,月曜). 一日の曜日(1993,4,木曜). 一日の曜日(1993,5,土曜). 一日の曜日(1993,6,火曜). 一日の曜日(1993,7,木曜). 一日の曜日(1993,8,日曜). 一日の曜日(1993,9,水曜). 一日の曜日(1993,10,金曜). 一日の曜日(1993,11,月曜). 一日の曜日(1993,12,水曜). 一日の曜日(1994,1,土曜). 一日の曜日(1994,2,火曜). 一日の曜日(1994,3,火曜). 一日の曜日(1994,4,金曜). 一日の曜日(1994,5,日曜). 一日の曜日(1994,6,水曜). 一日の曜日(1994,7,金曜). 一日の曜日(1994,8,月曜). 一日の曜日(1994,9,木曜). 一日の曜日(1994,10,土曜). 一日の曜日(1994,11,火曜). 一日の曜日(1994,12,木曜). 一日の曜日(1995,1,日曜). 一日の曜日(1995,2,水曜). 一日の曜日(1995,3,水曜). 一日の曜日(1995,4,土曜). 一日の曜日(1995,5,月曜). 一日の曜日(1995,6,木曜). 一日の曜日(1995,7,土曜). 一日の曜日(1995,8,火曜). 一日の曜日(1995,9,金曜). 一日の曜日(1995,10,日曜). 一日の曜日(1995,11,水曜). 一日の曜日(1995,12,金曜). 一日の曜日(1996,1,月曜). 一日の曜日(1996,2,木曜). 一日の曜日(1996,3,金曜). 一日の曜日(1996,4,月曜). 一日の曜日(1996,5,水曜). 一日の曜日(1996,6,土曜). 一日の曜日(1996,7,月曜). 一日の曜日(1996,8,木曜). 一日の曜日(1996,9,日曜). 一日の曜日(1996,10,火曜). 一日の曜日(1996,11,金曜). 一日の曜日(1996,12,日曜). 一日の曜日(1997,1,水曜). 一日の曜日(1997,2,土曜). 一日の曜日(1997,3,土曜). 一日の曜日(1997,4,火曜). 一日の曜日(1997,5,木曜). 一日の曜日(1997,6,日曜). 一日の曜日(1997,7,火曜). 一日の曜日(1997,8,金曜). 一日の曜日(1997,9,月曜). 一日の曜日(1997,10,水曜). 一日の曜日(1997,11,土曜). 一日の曜日(1997,12,月曜). 一日の曜日(1998,1,木曜). 一日の曜日(1998,2,日曜). 一日の曜日(1998,3,日曜). 一日の曜日(1998,4,水曜). 一日の曜日(1998,5,金曜). 一日の曜日(1998,6,月曜). 一日の曜日(1998,7,水曜). 一日の曜日(1998,8,土曜). 一日の曜日(1998,9,火曜). 一日の曜日(1998,10,木曜). 一日の曜日(1998,11,日曜). 一日の曜日(1998,12,火曜). 一日の曜日(1999,1,金曜). 一日の曜日(1999,2,月曜). 一日の曜日(1999,3,月曜). 一日の曜日(1999,4,木曜). 一日の曜日(1999,5,土曜). 一日の曜日(1999,6,火曜). 一日の曜日(1999,7,木曜). 一日の曜日(1999,8,日曜). 一日の曜日(1999,9,水曜). 一日の曜日(1999,10,金曜). 一日の曜日(1999,11,月曜). 一日の曜日(1999,12,水曜). 一日の曜日(2000,1,土曜). 一日の曜日(2000,2,火曜). 一日の曜日(2000,3,水曜). 一日の曜日(2000,4,土曜). 一日の曜日(2000,5,月曜). 一日の曜日(2000,6,木曜). 一日の曜日(2000,7,土曜). 一日の曜日(2000,8,火曜). 一日の曜日(2000,9,金曜). 一日の曜日(2000,10,日曜). 一日の曜日(2000,11,水曜). 一日の曜日(2000,12,金曜). 一日の曜日(2001,1,月曜). 一日の曜日(2001,2,木曜). 一日の曜日(2001,3,木曜). 一日の曜日(2001,4,日曜). 一日の曜日(2001,5,火曜). 一日の曜日(2001,6,金曜). 一日の曜日(2001,7,日曜). 一日の曜日(2001,8,水曜). 一日の曜日(2001,9,土曜). 一日の曜日(2001,10,月曜). 一日の曜日(2001,11,木曜). 一日の曜日(2001,12,土曜). 一日の曜日(2002,1,火曜). 一日の曜日(2002,2,金曜). 一日の曜日(2002,3,金曜). 一日の曜日(2002,4,月曜). 一日の曜日(2002,5,水曜). 一日の曜日(2002,6,土曜). 一日の曜日(2002,7,月曜). 一日の曜日(2002,8,木曜). 一日の曜日(2002,9,日曜). 一日の曜日(2002,10,火曜). 一日の曜日(2002,11,金曜). 一日の曜日(2002,12,日曜). 一日の曜日(2003,1,水曜). 一日の曜日(2003,2,土曜). 一日の曜日(2003,3,土曜). 一日の曜日(2003,4,火曜). 一日の曜日(2003,5,木曜). 一日の曜日(2003,6,日曜). 一日の曜日(2003,7,火曜). 一日の曜日(2003,8,金曜). 一日の曜日(2003,9,月曜). 一日の曜日(2003,10,水曜). 一日の曜日(2003,11,土曜). 一日の曜日(2003,12,月曜). 一日の曜日(2004,1,木曜). 一日の曜日(2004,2,日曜). 一日の曜日(2004,3,月曜). 一日の曜日(2004,4,木曜). 一日の曜日(2004,5,土曜). 一日の曜日(2004,6,火曜). 一日の曜日(2004,7,木曜). 一日の曜日(2004,8,日曜). 一日の曜日(2004,9,水曜). 一日の曜日(2004,10,金曜). 一日の曜日(2004,11,月曜). 一日の曜日(2004,12,水曜). 一日の曜日(2005,1,土曜). 一日の曜日(2005,2,火曜). 一日の曜日(2005,3,火曜). 一日の曜日(2005,4,金曜). 一日の曜日(2005,5,日曜). 一日の曜日(2005,6,水曜). 一日の曜日(2005,7,金曜). 一日の曜日(2005,8,月曜). 一日の曜日(2005,9,木曜). 一日の曜日(2005,10,土曜). 一日の曜日(2005,11,火曜). 一日の曜日(2005,12,木曜). 一日の曜日(2006,1,日曜). 一日の曜日(2006,2,水曜). 一日の曜日(2006,3,水曜). 一日の曜日(2006,4,土曜). 一日の曜日(2006,5,月曜). 一日の曜日(2006,6,木曜). 一日の曜日(2006,7,土曜). 一日の曜日(2006,8,火曜). 一日の曜日(2006,9,金曜). 一日の曜日(2006,10,日曜). 一日の曜日(2006,11,水曜). 一日の曜日(2006,12,金曜). 一日の曜日(2007,1,月曜). 一日の曜日(2007,2,木曜). 一日の曜日(2007,3,木曜). 一日の曜日(2007,4,日曜). 一日の曜日(2007,5,火曜). 一日の曜日(2007,6,金曜). 一日の曜日(2007,7,日曜). 一日の曜日(2007,8,水曜). 一日の曜日(2007,9,土曜). 一日の曜日(2007,10,月曜). 一日の曜日(2007,11,木曜). 一日の曜日(2007,12,土曜). 一日の曜日(2008,1,火曜). 一日の曜日(2008,2,金曜). 一日の曜日(2008,3,土曜). 一日の曜日(2008,4,火曜). 一日の曜日(2008,5,木曜). 一日の曜日(2008,6,日曜). 一日の曜日(2008,7,火曜). 一日の曜日(2008,8,金曜). 一日の曜日(2008,9,月曜). 一日の曜日(2008,10,水曜). 一日の曜日(2008,11,土曜). 一日の曜日(2008,12,月曜). 一日の曜日(2009,1,木曜). 一日の曜日(2009,2,日曜). 一日の曜日(2009,3,日曜). 一日の曜日(2009,4,水曜). 一日の曜日(2009,5,金曜). 一日の曜日(2009,6,月曜). 一日の曜日(2009,7,水曜). 一日の曜日(2009,8,土曜). 一日の曜日(2009,9,火曜). 一日の曜日(2009,10,木曜). 一日の曜日(2009,11,日曜). 一日の曜日(2009,12,火曜). 一日の曜日(2010,1,金曜). 一日の曜日(2010,2,月曜). 一日の曜日(2010,3,月曜). 一日の曜日(2010,4,木曜). 一日の曜日(2010,5,土曜). 一日の曜日(2010,6,火曜). 一日の曜日(2010,7,木曜). 一日の曜日(2010,8,日曜). 一日の曜日(2010,9,水曜). 一日の曜日(2010,10,金曜). 一日の曜日(2010,11,月曜). 一日の曜日(2010,12,水曜). 一日の曜日(2011,1,土曜). 一日の曜日(2011,2,火曜). 一日の曜日(2011,3,火曜). 一日の曜日(2011,4,金曜). 一日の曜日(2011,5,日曜). 一日の曜日(2011,6,水曜). 一日の曜日(2011,7,金曜). 一日の曜日(2011,8,月曜). 一日の曜日(2011,9,木曜). 一日の曜日(2011,10,土曜). 一日の曜日(2011,11,火曜). 一日の曜日(2011,12,木曜). 一日の曜日(2012,1,日曜). 一日の曜日(2012,2,水曜). 一日の曜日(2012,3,木曜). 一日の曜日(2012,4,日曜). 一日の曜日(2012,5,火曜). 一日の曜日(2012,6,金曜). 一日の曜日(2012,7,日曜). 一日の曜日(2012,8,水曜). 一日の曜日(2012,9,土曜). 一日の曜日(2012,10,月曜). 一日の曜日(2012,11,木曜). 一日の曜日(2012,12,土曜). 一日の曜日(2013,1,火曜). 一日の曜日(2013,2,金曜). 一日の曜日(2013,3,金曜). 一日の曜日(2013,4,月曜). 一日の曜日(2013,5,水曜). 一日の曜日(2013,6,土曜). 一日の曜日(2013,7,月曜). 一日の曜日(2013,8,木曜). 一日の曜日(2013,9,日曜). 一日の曜日(2013,10,火曜). 一日の曜日(2013,11,金曜). 一日の曜日(2013,12,日曜). 一日の曜日(2014,1,水曜). 一日の曜日(2014,2,土曜). 一日の曜日(2014,3,土曜). 一日の曜日(2014,4,火曜). 一日の曜日(2014,5,木曜). 一日の曜日(2014,6,日曜). 一日の曜日(2014,7,火曜). 一日の曜日(2014,8,金曜). 一日の曜日(2014,9,月曜). 一日の曜日(2014,10,水曜). 一日の曜日(2014,11,土曜). 一日の曜日(2014,12,月曜). 一日の曜日(2015,1,木曜). 一日の曜日(2015,2,日曜). 一日の曜日(2015,3,日曜). 一日の曜日(2015,4,水曜). 一日の曜日(2015,5,金曜). 一日の曜日(2015,6,月曜). 一日の曜日(2015,7,水曜). 一日の曜日(2015,8,土曜). 一日の曜日(2015,9,火曜). 一日の曜日(2015,10,木曜). 一日の曜日(2015,11,日曜). 一日の曜日(2015,12,火曜). 一日の曜日(2016,1,金曜). 一日の曜日(2016,2,月曜). 一日の曜日(2016,3,火曜). 一日の曜日(2016,4,金曜). 一日の曜日(2016,5,日曜). 一日の曜日(2016,6,水曜). 一日の曜日(2016,7,金曜). 一日の曜日(2016,8,月曜). 一日の曜日(2016,9,木曜). 一日の曜日(2016,10,土曜). 一日の曜日(2016,11,火曜). 一日の曜日(2016,12,木曜). 一日の曜日(2017,1,日曜). 一日の曜日(2017,2,水曜). 一日の曜日(2017,3,水曜). 一日の曜日(2017,4,土曜). 一日の曜日(2017,5,月曜). 一日の曜日(2017,6,木曜). 一日の曜日(2017,7,土曜). 一日の曜日(2017,8,火曜). 一日の曜日(2017,9,金曜). 一日の曜日(2017,10,日曜). 一日の曜日(2017,11,水曜). 一日の曜日(2017,12,金曜). 一日の曜日(2018,1,月曜). 一日の曜日(2018,2,木曜). 一日の曜日(2018,3,木曜). 一日の曜日(2018,4,日曜). 一日の曜日(2018,5,火曜). 一日の曜日(2018,6,金曜). 一日の曜日(2018,7,日曜). 一日の曜日(2018,8,水曜). 一日の曜日(2018,9,土曜). 一日の曜日(2018,10,月曜). 一日の曜日(2018,11,木曜). 一日の曜日(2018,12,土曜). 一日の曜日(2019,1,火曜). 一日の曜日(2019,2,金曜). 一日の曜日(2019,3,金曜). 一日の曜日(2019,4,月曜). 一日の曜日(2019,5,水曜). 一日の曜日(2019,6,土曜). 一日の曜日(2019,7,月曜). 一日の曜日(2019,8,木曜). 一日の曜日(2019,9,日曜). 一日の曜日(2019,10,火曜). 一日の曜日(2019,11,金曜). 一日の曜日(2019,12,日曜). 一日の曜日(2020,1,水曜). 一日の曜日(2020,2,土曜). 一日の曜日(2020,3,日曜). 一日の曜日(2020,4,水曜). 一日の曜日(2020,5,金曜). 一日の曜日(2020,6,月曜). 一日の曜日(2020,7,水曜). 一日の曜日(2020,8,土曜). 一日の曜日(2020,9,火曜). 一日の曜日(2020,10,木曜). 一日の曜日(2020,11,日曜). 一日の曜日(2020,12,火曜). 月末日の曜日(1970,1,31,土曜). 月末日の曜日(1970,2,28,土曜). 月末日の曜日(1970,3,31,火曜). 月末日の曜日(1970,4,30,木曜). 月末日の曜日(1970,5,31,日曜). 月末日の曜日(1970,6,30,火曜). 月末日の曜日(1970,7,31,金曜). 月末日の曜日(1970,8,31,月曜). 月末日の曜日(1970,9,30,水曜). 月末日の曜日(1970,10,31,土曜). 月末日の曜日(1970,11,30,月曜). 月末日の曜日(1970,12,31,木曜). 月末日の曜日(1971,1,31,日曜). 月末日の曜日(1971,2,28,日曜). 月末日の曜日(1971,3,31,水曜). 月末日の曜日(1971,4,30,金曜). 月末日の曜日(1971,5,31,月曜). 月末日の曜日(1971,6,30,水曜). 月末日の曜日(1971,7,31,土曜). 月末日の曜日(1971,8,31,火曜). 月末日の曜日(1971,9,30,木曜). 月末日の曜日(1971,10,31,日曜). 月末日の曜日(1971,11,30,火曜). 月末日の曜日(1971,12,31,金曜). 月末日の曜日(1972,1,31,月曜). 月末日の曜日(1972,2,29,火曜). 月末日の曜日(1972,3,31,金曜). 月末日の曜日(1972,4,30,日曜). 月末日の曜日(1972,5,31,水曜). 月末日の曜日(1972,6,30,金曜). 月末日の曜日(1972,7,31,月曜). 月末日の曜日(1972,8,31,木曜). 月末日の曜日(1972,9,30,土曜). 月末日の曜日(1972,10,31,火曜). 月末日の曜日(1972,11,30,木曜). 月末日の曜日(1972,12,31,日曜). 月末日の曜日(1973,1,31,水曜). 月末日の曜日(1973,2,28,水曜). 月末日の曜日(1973,3,31,土曜). 月末日の曜日(1973,4,30,月曜). 月末日の曜日(1973,5,31,木曜). 月末日の曜日(1973,6,30,土曜). 月末日の曜日(1973,7,31,火曜). 月末日の曜日(1973,8,31,金曜). 月末日の曜日(1973,9,30,日曜). 月末日の曜日(1973,10,31,水曜). 月末日の曜日(1973,11,30,金曜). 月末日の曜日(1973,12,31,月曜). 月末日の曜日(1974,1,31,木曜). 月末日の曜日(1974,2,28,木曜). 月末日の曜日(1974,3,31,日曜). 月末日の曜日(1974,4,30,火曜). 月末日の曜日(1974,5,31,金曜). 月末日の曜日(1974,6,30,日曜). 月末日の曜日(1974,7,31,水曜). 月末日の曜日(1974,8,31,土曜). 月末日の曜日(1974,9,30,月曜). 月末日の曜日(1974,10,31,木曜). 月末日の曜日(1974,11,30,土曜). 月末日の曜日(1974,12,31,火曜). 月末日の曜日(1975,1,31,金曜). 月末日の曜日(1975,2,28,金曜). 月末日の曜日(1975,3,31,月曜). 月末日の曜日(1975,4,30,水曜). 月末日の曜日(1975,5,31,土曜). 月末日の曜日(1975,6,30,月曜). 月末日の曜日(1975,7,31,木曜). 月末日の曜日(1975,8,31,日曜). 月末日の曜日(1975,9,30,火曜). 月末日の曜日(1975,10,31,金曜). 月末日の曜日(1975,11,30,日曜). 月末日の曜日(1975,12,31,水曜). 月末日の曜日(1976,1,31,土曜). 月末日の曜日(1976,2,29,日曜). 月末日の曜日(1976,3,31,水曜). 月末日の曜日(1976,4,30,金曜). 月末日の曜日(1976,5,31,月曜). 月末日の曜日(1976,6,30,水曜). 月末日の曜日(1976,7,31,土曜). 月末日の曜日(1976,8,31,火曜). 月末日の曜日(1976,9,30,木曜). 月末日の曜日(1976,10,31,日曜). 月末日の曜日(1976,11,30,火曜). 月末日の曜日(1976,12,31,金曜). 月末日の曜日(1977,1,31,月曜). 月末日の曜日(1977,2,28,月曜). 月末日の曜日(1977,3,31,木曜). 月末日の曜日(1977,4,30,土曜). 月末日の曜日(1977,5,31,火曜). 月末日の曜日(1977,6,30,木曜). 月末日の曜日(1977,7,31,日曜). 月末日の曜日(1977,8,31,水曜). 月末日の曜日(1977,9,30,金曜). 月末日の曜日(1977,10,31,月曜). 月末日の曜日(1977,11,30,水曜). 月末日の曜日(1977,12,31,土曜). 月末日の曜日(1978,1,31,火曜). 月末日の曜日(1978,2,28,火曜). 月末日の曜日(1978,3,31,金曜). 月末日の曜日(1978,4,30,日曜). 月末日の曜日(1978,5,31,水曜). 月末日の曜日(1978,6,30,金曜). 月末日の曜日(1978,7,31,月曜). 月末日の曜日(1978,8,31,木曜). 月末日の曜日(1978,9,30,土曜). 月末日の曜日(1978,10,31,火曜). 月末日の曜日(1978,11,30,木曜). 月末日の曜日(1978,12,31,日曜). 月末日の曜日(1979,1,31,水曜). 月末日の曜日(1979,2,28,水曜). 月末日の曜日(1979,3,31,土曜). 月末日の曜日(1979,4,30,月曜). 月末日の曜日(1979,5,31,木曜). 月末日の曜日(1979,6,30,土曜). 月末日の曜日(1979,7,31,火曜). 月末日の曜日(1979,8,31,金曜). 月末日の曜日(1979,9,30,日曜). 月末日の曜日(1979,10,31,水曜). 月末日の曜日(1979,11,30,金曜). 月末日の曜日(1979,12,31,月曜). 月末日の曜日(1980,1,31,木曜). 月末日の曜日(1980,2,29,金曜). 月末日の曜日(1980,3,31,月曜). 月末日の曜日(1980,4,30,水曜). 月末日の曜日(1980,5,31,土曜). 月末日の曜日(1980,6,30,月曜). 月末日の曜日(1980,7,31,木曜). 月末日の曜日(1980,8,31,日曜). 月末日の曜日(1980,9,30,火曜). 月末日の曜日(1980,10,31,金曜). 月末日の曜日(1980,11,30,日曜). 月末日の曜日(1980,12,31,水曜). 月末日の曜日(1981,1,31,土曜). 月末日の曜日(1981,2,28,土曜). 月末日の曜日(1981,3,31,火曜). 月末日の曜日(1981,4,30,木曜). 月末日の曜日(1981,5,31,日曜). 月末日の曜日(1981,6,30,火曜). 月末日の曜日(1981,7,31,金曜). 月末日の曜日(1981,8,31,月曜). 月末日の曜日(1981,9,30,水曜). 月末日の曜日(1981,10,31,土曜). 月末日の曜日(1981,11,30,月曜). 月末日の曜日(1981,12,31,木曜). 月末日の曜日(1982,1,31,日曜). 月末日の曜日(1982,2,28,日曜). 月末日の曜日(1982,3,31,水曜). 月末日の曜日(1982,4,30,金曜). 月末日の曜日(1982,5,31,月曜). 月末日の曜日(1982,6,30,水曜). 月末日の曜日(1982,7,31,土曜). 月末日の曜日(1982,8,31,火曜). 月末日の曜日(1982,9,30,木曜). 月末日の曜日(1982,10,31,日曜). 月末日の曜日(1982,11,30,火曜). 月末日の曜日(1982,12,31,金曜). 月末日の曜日(1983,1,31,月曜). 月末日の曜日(1983,2,28,月曜). 月末日の曜日(1983,3,31,木曜). 月末日の曜日(1983,4,30,土曜). 月末日の曜日(1983,5,31,火曜). 月末日の曜日(1983,6,30,木曜). 月末日の曜日(1983,7,31,日曜). 月末日の曜日(1983,8,31,水曜). 月末日の曜日(1983,9,30,金曜). 月末日の曜日(1983,10,31,月曜). 月末日の曜日(1983,11,30,水曜). 月末日の曜日(1983,12,31,土曜). 月末日の曜日(1984,1,31,火曜). 月末日の曜日(1984,2,29,水曜). 月末日の曜日(1984,3,31,土曜). 月末日の曜日(1984,4,30,月曜). 月末日の曜日(1984,5,31,木曜). 月末日の曜日(1984,6,30,土曜). 月末日の曜日(1984,7,31,火曜). 月末日の曜日(1984,8,31,金曜). 月末日の曜日(1984,9,30,日曜). 月末日の曜日(1984,10,31,水曜). 月末日の曜日(1984,11,30,金曜). 月末日の曜日(1984,12,31,月曜). 月末日の曜日(1985,1,31,木曜). 月末日の曜日(1985,2,28,木曜). 月末日の曜日(1985,3,31,日曜). 月末日の曜日(1985,4,30,火曜). 月末日の曜日(1985,5,31,金曜). 月末日の曜日(1985,6,30,日曜). 月末日の曜日(1985,7,31,水曜). 月末日の曜日(1985,8,31,土曜). 月末日の曜日(1985,9,30,月曜). 月末日の曜日(1985,10,31,木曜). 月末日の曜日(1985,11,30,土曜). 月末日の曜日(1985,12,31,火曜). 月末日の曜日(1986,1,31,金曜). 月末日の曜日(1986,2,28,金曜). 月末日の曜日(1986,3,31,月曜). 月末日の曜日(1986,4,30,水曜). 月末日の曜日(1986,5,31,土曜). 月末日の曜日(1986,6,30,月曜). 月末日の曜日(1986,7,31,木曜). 月末日の曜日(1986,8,31,日曜). 月末日の曜日(1986,9,30,火曜). 月末日の曜日(1986,10,31,金曜). 月末日の曜日(1986,11,30,日曜). 月末日の曜日(1986,12,31,水曜). 月末日の曜日(1987,1,31,土曜). 月末日の曜日(1987,2,28,土曜). 月末日の曜日(1987,3,31,火曜). 月末日の曜日(1987,4,30,木曜). 月末日の曜日(1987,5,31,日曜). 月末日の曜日(1987,6,30,火曜). 月末日の曜日(1987,7,31,金曜). 月末日の曜日(1987,8,31,月曜). 月末日の曜日(1987,9,30,水曜). 月末日の曜日(1987,10,31,土曜). 月末日の曜日(1987,11,30,月曜). 月末日の曜日(1987,12,31,木曜). 月末日の曜日(1988,1,31,日曜). 月末日の曜日(1988,2,29,月曜). 月末日の曜日(1988,3,31,木曜). 月末日の曜日(1988,4,30,土曜). 月末日の曜日(1988,5,31,火曜). 月末日の曜日(1988,6,30,木曜). 月末日の曜日(1988,7,31,日曜). 月末日の曜日(1988,8,31,水曜). 月末日の曜日(1988,9,30,金曜). 月末日の曜日(1988,10,31,月曜). 月末日の曜日(1988,11,30,水曜). 月末日の曜日(1988,12,31,土曜). 月末日の曜日(1989,1,31,火曜). 月末日の曜日(1989,2,28,火曜). 月末日の曜日(1989,3,31,金曜). 月末日の曜日(1989,4,30,日曜). 月末日の曜日(1989,5,31,水曜). 月末日の曜日(1989,6,30,金曜). 月末日の曜日(1989,7,31,月曜). 月末日の曜日(1989,8,31,木曜). 月末日の曜日(1989,9,30,土曜). 月末日の曜日(1989,10,31,火曜). 月末日の曜日(1989,11,30,木曜). 月末日の曜日(1989,12,31,日曜). 月末日の曜日(1990,1,31,水曜). 月末日の曜日(1990,2,28,水曜). 月末日の曜日(1990,3,31,土曜). 月末日の曜日(1990,4,30,月曜). 月末日の曜日(1990,5,31,木曜). 月末日の曜日(1990,6,30,土曜). 月末日の曜日(1990,7,31,火曜). 月末日の曜日(1990,8,31,金曜). 月末日の曜日(1990,9,30,日曜). 月末日の曜日(1990,10,31,水曜). 月末日の曜日(1990,11,30,金曜). 月末日の曜日(1990,12,31,月曜). 月末日の曜日(1991,1,31,木曜). 月末日の曜日(1991,2,28,木曜). 月末日の曜日(1991,3,31,日曜). 月末日の曜日(1991,4,30,火曜). 月末日の曜日(1991,5,31,金曜). 月末日の曜日(1991,6,30,日曜). 月末日の曜日(1991,7,31,水曜). 月末日の曜日(1991,8,31,土曜). 月末日の曜日(1991,9,30,月曜). 月末日の曜日(1991,10,31,木曜). 月末日の曜日(1991,11,30,土曜). 月末日の曜日(1991,12,31,火曜). 月末日の曜日(1992,1,31,金曜). 月末日の曜日(1992,2,29,土曜). 月末日の曜日(1992,3,31,火曜). 月末日の曜日(1992,4,30,木曜). 月末日の曜日(1992,5,31,日曜). 月末日の曜日(1992,6,30,火曜). 月末日の曜日(1992,7,31,金曜). 月末日の曜日(1992,8,31,月曜). 月末日の曜日(1992,9,30,水曜). 月末日の曜日(1992,10,31,土曜). 月末日の曜日(1992,11,30,月曜). 月末日の曜日(1992,12,31,木曜). 月末日の曜日(1993,1,31,日曜). 月末日の曜日(1993,2,28,日曜). 月末日の曜日(1993,3,31,水曜). 月末日の曜日(1993,4,30,金曜). 月末日の曜日(1993,5,31,月曜). 月末日の曜日(1993,6,30,水曜). 月末日の曜日(1993,7,31,土曜). 月末日の曜日(1993,8,31,火曜). 月末日の曜日(1993,9,30,木曜). 月末日の曜日(1993,10,31,日曜). 月末日の曜日(1993,11,30,火曜). 月末日の曜日(1993,12,31,金曜). 月末日の曜日(1994,1,31,月曜). 月末日の曜日(1994,2,28,月曜). 月末日の曜日(1994,3,31,木曜). 月末日の曜日(1994,4,30,土曜). 月末日の曜日(1994,5,31,火曜). 月末日の曜日(1994,6,30,木曜). 月末日の曜日(1994,7,31,日曜). 月末日の曜日(1994,8,31,水曜). 月末日の曜日(1994,9,30,金曜). 月末日の曜日(1994,10,31,月曜). 月末日の曜日(1994,11,30,水曜). 月末日の曜日(1994,12,31,土曜). 月末日の曜日(1995,1,31,火曜). 月末日の曜日(1995,2,28,火曜). 月末日の曜日(1995,3,31,金曜). 月末日の曜日(1995,4,30,日曜). 月末日の曜日(1995,5,31,水曜). 月末日の曜日(1995,6,30,金曜). 月末日の曜日(1995,7,31,月曜). 月末日の曜日(1995,8,31,木曜). 月末日の曜日(1995,9,30,土曜). 月末日の曜日(1995,10,31,火曜). 月末日の曜日(1995,11,30,木曜). 月末日の曜日(1995,12,31,日曜). 月末日の曜日(1996,1,31,水曜). 月末日の曜日(1996,2,29,木曜). 月末日の曜日(1996,3,31,日曜). 月末日の曜日(1996,4,30,火曜). 月末日の曜日(1996,5,31,金曜). 月末日の曜日(1996,6,30,日曜). 月末日の曜日(1996,7,31,水曜). 月末日の曜日(1996,8,31,土曜). 月末日の曜日(1996,9,30,月曜). 月末日の曜日(1996,10,31,木曜). 月末日の曜日(1996,11,30,土曜). 月末日の曜日(1996,12,31,火曜). 月末日の曜日(1997,1,31,金曜). 月末日の曜日(1997,2,28,金曜). 月末日の曜日(1997,3,31,月曜). 月末日の曜日(1997,4,30,水曜). 月末日の曜日(1997,5,31,土曜). 月末日の曜日(1997,6,30,月曜). 月末日の曜日(1997,7,31,木曜). 月末日の曜日(1997,8,31,日曜). 月末日の曜日(1997,9,30,火曜). 月末日の曜日(1997,10,31,金曜). 月末日の曜日(1997,11,30,日曜). 月末日の曜日(1997,12,31,水曜). 月末日の曜日(1998,1,31,土曜). 月末日の曜日(1998,2,28,土曜). 月末日の曜日(1998,3,31,火曜). 月末日の曜日(1998,4,30,木曜). 月末日の曜日(1998,5,31,日曜). 月末日の曜日(1998,6,30,火曜). 月末日の曜日(1998,7,31,金曜). 月末日の曜日(1998,8,31,月曜). 月末日の曜日(1998,9,30,水曜). 月末日の曜日(1998,10,31,土曜). 月末日の曜日(1998,11,30,月曜). 月末日の曜日(1998,12,31,木曜). 月末日の曜日(1999,1,31,日曜). 月末日の曜日(1999,2,28,日曜). 月末日の曜日(1999,3,31,水曜). 月末日の曜日(1999,4,30,金曜). 月末日の曜日(1999,5,31,月曜). 月末日の曜日(1999,6,30,水曜). 月末日の曜日(1999,7,31,土曜). 月末日の曜日(1999,8,31,火曜). 月末日の曜日(1999,9,30,木曜). 月末日の曜日(1999,10,31,日曜). 月末日の曜日(1999,11,30,火曜). 月末日の曜日(1999,12,31,金曜). 月末日の曜日(2000,1,31,月曜). 月末日の曜日(2000,2,29,火曜). 月末日の曜日(2000,3,31,金曜). 月末日の曜日(2000,4,30,日曜). 月末日の曜日(2000,5,31,水曜). 月末日の曜日(2000,6,30,金曜). 月末日の曜日(2000,7,31,月曜). 月末日の曜日(2000,8,31,木曜). 月末日の曜日(2000,9,30,土曜). 月末日の曜日(2000,10,31,火曜). 月末日の曜日(2000,11,30,木曜). 月末日の曜日(2000,12,31,日曜). 月末日の曜日(2001,1,31,水曜). 月末日の曜日(2001,2,28,水曜). 月末日の曜日(2001,3,31,土曜). 月末日の曜日(2001,4,30,月曜). 月末日の曜日(2001,5,31,木曜). 月末日の曜日(2001,6,30,土曜). 月末日の曜日(2001,7,31,火曜). 月末日の曜日(2001,8,31,金曜). 月末日の曜日(2001,9,30,日曜). 月末日の曜日(2001,10,31,水曜). 月末日の曜日(2001,11,30,金曜). 月末日の曜日(2001,12,31,月曜). 月末日の曜日(2002,1,31,木曜). 月末日の曜日(2002,2,28,木曜). 月末日の曜日(2002,3,31,日曜). 月末日の曜日(2002,4,30,火曜). 月末日の曜日(2002,5,31,金曜). 月末日の曜日(2002,6,30,日曜). 月末日の曜日(2002,7,31,水曜). 月末日の曜日(2002,8,31,土曜). 月末日の曜日(2002,9,30,月曜). 月末日の曜日(2002,10,31,木曜). 月末日の曜日(2002,11,30,土曜). 月末日の曜日(2002,12,31,火曜). 月末日の曜日(2003,1,31,金曜). 月末日の曜日(2003,2,28,金曜). 月末日の曜日(2003,3,31,月曜). 月末日の曜日(2003,4,30,水曜). 月末日の曜日(2003,5,31,土曜). 月末日の曜日(2003,6,30,月曜). 月末日の曜日(2003,7,31,木曜). 月末日の曜日(2003,8,31,日曜). 月末日の曜日(2003,9,30,火曜). 月末日の曜日(2003,10,31,金曜). 月末日の曜日(2003,11,30,日曜). 月末日の曜日(2003,12,31,水曜). 月末日の曜日(2004,1,31,土曜). 月末日の曜日(2004,2,29,日曜). 月末日の曜日(2004,3,31,水曜). 月末日の曜日(2004,4,30,金曜). 月末日の曜日(2004,5,31,月曜). 月末日の曜日(2004,6,30,水曜). 月末日の曜日(2004,7,31,土曜). 月末日の曜日(2004,8,31,火曜). 月末日の曜日(2004,9,30,木曜). 月末日の曜日(2004,10,31,日曜). 月末日の曜日(2004,11,30,火曜). 月末日の曜日(2004,12,31,金曜). 月末日の曜日(2005,1,31,月曜). 月末日の曜日(2005,2,28,月曜). 月末日の曜日(2005,3,31,木曜). 月末日の曜日(2005,4,30,土曜). 月末日の曜日(2005,5,31,火曜). 月末日の曜日(2005,6,30,木曜). 月末日の曜日(2005,7,31,日曜). 月末日の曜日(2005,8,31,水曜). 月末日の曜日(2005,9,30,金曜). 月末日の曜日(2005,10,31,月曜). 月末日の曜日(2005,11,30,水曜). 月末日の曜日(2005,12,31,土曜). 月末日の曜日(2006,1,31,火曜). 月末日の曜日(2006,2,28,火曜). 月末日の曜日(2006,3,31,金曜). 月末日の曜日(2006,4,30,日曜). 月末日の曜日(2006,5,31,水曜). 月末日の曜日(2006,6,30,金曜). 月末日の曜日(2006,7,31,月曜). 月末日の曜日(2006,8,31,木曜). 月末日の曜日(2006,9,30,土曜). 月末日の曜日(2006,10,31,火曜). 月末日の曜日(2006,11,30,木曜). 月末日の曜日(2006,12,31,日曜). 月末日の曜日(2007,1,31,水曜). 月末日の曜日(2007,2,28,水曜). 月末日の曜日(2007,3,31,土曜). 月末日の曜日(2007,4,30,月曜). 月末日の曜日(2007,5,31,木曜). 月末日の曜日(2007,6,30,土曜). 月末日の曜日(2007,7,31,火曜). 月末日の曜日(2007,8,31,金曜). 月末日の曜日(2007,9,30,日曜). 月末日の曜日(2007,10,31,水曜). 月末日の曜日(2007,11,30,金曜). 月末日の曜日(2007,12,31,月曜). 月末日の曜日(2008,1,31,木曜). 月末日の曜日(2008,2,29,金曜). 月末日の曜日(2008,3,31,月曜). 月末日の曜日(2008,4,30,水曜). 月末日の曜日(2008,5,31,土曜). 月末日の曜日(2008,6,30,月曜). 月末日の曜日(2008,7,31,木曜). 月末日の曜日(2008,8,31,日曜). 月末日の曜日(2008,9,30,火曜). 月末日の曜日(2008,10,31,金曜). 月末日の曜日(2008,11,30,日曜). 月末日の曜日(2008,12,31,水曜). 月末日の曜日(2009,1,31,土曜). 月末日の曜日(2009,2,28,土曜). 月末日の曜日(2009,3,31,火曜). 月末日の曜日(2009,4,30,木曜). 月末日の曜日(2009,5,31,日曜). 月末日の曜日(2009,6,30,火曜). 月末日の曜日(2009,7,31,金曜). 月末日の曜日(2009,8,31,月曜). 月末日の曜日(2009,9,30,水曜). 月末日の曜日(2009,10,31,土曜). 月末日の曜日(2009,11,30,月曜). 月末日の曜日(2009,12,31,木曜). 月末日の曜日(2010,1,31,日曜). 月末日の曜日(2010,2,28,日曜). 月末日の曜日(2010,3,31,水曜). 月末日の曜日(2010,4,30,金曜). 月末日の曜日(2010,5,31,月曜). 月末日の曜日(2010,6,30,水曜). 月末日の曜日(2010,7,31,土曜). 月末日の曜日(2010,8,31,火曜). 月末日の曜日(2010,9,30,木曜). 月末日の曜日(2010,10,31,日曜). 月末日の曜日(2010,11,30,火曜). 月末日の曜日(2010,12,31,金曜). 月末日の曜日(2011,1,31,月曜). 月末日の曜日(2011,2,28,月曜). 月末日の曜日(2011,3,31,木曜). 月末日の曜日(2011,4,30,土曜). 月末日の曜日(2011,5,31,火曜). 月末日の曜日(2011,6,30,木曜). 月末日の曜日(2011,7,31,日曜). 月末日の曜日(2011,8,31,水曜). 月末日の曜日(2011,9,30,金曜). 月末日の曜日(2011,10,31,月曜). 月末日の曜日(2011,11,30,水曜). 月末日の曜日(2011,12,31,土曜). 月末日の曜日(2012,1,31,火曜). 月末日の曜日(2012,2,29,水曜). 月末日の曜日(2012,3,31,土曜). 月末日の曜日(2012,4,30,月曜). 月末日の曜日(2012,5,31,木曜). 月末日の曜日(2012,6,30,土曜). 月末日の曜日(2012,7,31,火曜). 月末日の曜日(2012,8,31,金曜). 月末日の曜日(2012,9,30,日曜). 月末日の曜日(2012,10,31,水曜). 月末日の曜日(2012,11,30,金曜). 月末日の曜日(2012,12,31,月曜). 月末日の曜日(2013,1,31,木曜). 月末日の曜日(2013,2,28,木曜). 月末日の曜日(2013,3,31,日曜). 月末日の曜日(2013,4,30,火曜). 月末日の曜日(2013,5,31,金曜). 月末日の曜日(2013,6,30,日曜). 月末日の曜日(2013,7,31,水曜). 月末日の曜日(2013,8,31,土曜). 月末日の曜日(2013,9,30,月曜). 月末日の曜日(2013,10,31,木曜). 月末日の曜日(2013,11,30,土曜). 月末日の曜日(2013,12,31,火曜). 月末日の曜日(2014,1,31,金曜). 月末日の曜日(2014,2,28,金曜). 月末日の曜日(2014,3,31,月曜). 月末日の曜日(2014,4,30,水曜). 月末日の曜日(2014,5,31,土曜). 月末日の曜日(2014,6,30,月曜). 月末日の曜日(2014,7,31,木曜). 月末日の曜日(2014,8,31,日曜). 月末日の曜日(2014,9,30,火曜). 月末日の曜日(2014,10,31,金曜). 月末日の曜日(2014,11,30,日曜). 月末日の曜日(2014,12,31,水曜). 月末日の曜日(2015,1,31,土曜). 月末日の曜日(2015,2,28,土曜). 月末日の曜日(2015,3,31,火曜). 月末日の曜日(2015,4,30,木曜). 月末日の曜日(2015,5,31,日曜). 月末日の曜日(2015,6,30,火曜). 月末日の曜日(2015,7,31,金曜). 月末日の曜日(2015,8,31,月曜). 月末日の曜日(2015,9,30,水曜). 月末日の曜日(2015,10,31,土曜). 月末日の曜日(2015,11,30,月曜). 月末日の曜日(2015,12,31,木曜). 月末日の曜日(2016,1,31,日曜). 月末日の曜日(2016,2,29,月曜). 月末日の曜日(2016,3,31,木曜). 月末日の曜日(2016,4,30,土曜). 月末日の曜日(2016,5,31,火曜). 月末日の曜日(2016,6,30,木曜). 月末日の曜日(2016,7,31,日曜). 月末日の曜日(2016,8,31,水曜). 月末日の曜日(2016,9,30,金曜). 月末日の曜日(2016,10,31,月曜). 月末日の曜日(2016,11,30,水曜). 月末日の曜日(2016,12,31,土曜). 月末日の曜日(2017,1,31,火曜). 月末日の曜日(2017,2,28,火曜). 月末日の曜日(2017,3,31,金曜). 月末日の曜日(2017,4,30,日曜). 月末日の曜日(2017,5,31,水曜). 月末日の曜日(2017,6,30,金曜). 月末日の曜日(2017,7,31,月曜). 月末日の曜日(2017,8,31,木曜). 月末日の曜日(2017,9,30,土曜). 月末日の曜日(2017,10,31,火曜). 月末日の曜日(2017,11,30,木曜). 月末日の曜日(2017,12,31,日曜). 月末日の曜日(2018,1,31,水曜). 月末日の曜日(2018,2,28,水曜). 月末日の曜日(2018,3,31,土曜). 月末日の曜日(2018,4,30,月曜). 月末日の曜日(2018,5,31,木曜). 月末日の曜日(2018,6,30,土曜). 月末日の曜日(2018,7,31,火曜). 月末日の曜日(2018,8,31,金曜). 月末日の曜日(2018,9,30,日曜). 月末日の曜日(2018,10,31,水曜). 月末日の曜日(2018,11,30,金曜). 月末日の曜日(2018,12,31,月曜). 月末日の曜日(2019,1,31,木曜). 月末日の曜日(2019,2,28,木曜). 月末日の曜日(2019,3,31,日曜). 月末日の曜日(2019,4,30,火曜). 月末日の曜日(2019,5,31,金曜). 月末日の曜日(2019,6,30,日曜). 月末日の曜日(2019,7,31,水曜). 月末日の曜日(2019,8,31,土曜). 月末日の曜日(2019,9,30,月曜). 月末日の曜日(2019,10,31,木曜). 月末日の曜日(2019,11,30,土曜). 月末日の曜日(2019,12,31,火曜). 月末日の曜日(2020,1,31,金曜). 月末日の曜日(2020,2,29,土曜). 月末日の曜日(2020,3,31,火曜). 月末日の曜日(2020,4,30,木曜). 月末日の曜日(2020,5,31,日曜). 月末日の曜日(2020,6,30,火曜). 月末日の曜日(2020,7,31,金曜). 月末日の曜日(2020,8,31,月曜). 月末日の曜日(2020,9,30,水曜). 月末日の曜日(2020,10,31,土曜). 月末日の曜日(2020,11,30,月曜). 月末日の曜日(2020,12,31,木曜). % 以下のサイトは % % 年、月が与えられた時、日曜日から始まるカレンダーを表示する。 % 日曜起点カレンダー(_年,_月) :- 月末日(_年,_月,_月末日), 'Zellerの公式を用いて曜日を表す値と曜日を得る'(_年,_月,1,_曜日を表す値,_曜日), 日曜起点カレンダー(_曜日,_月末日,_カレンダー), カレンダー表示(_カレンダー). 日曜起点カレンダー(_一日の曜日,_月末日,_カレンダー) :- findall(_日,between(1,_月末日,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形([],[]) :- !. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). '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の公式'(_年,_月,_日,_曜日を表す値) :- _曜日を表す値 is (_年 + truncate(_年 / 4) - truncate(_年 / 100) + truncate(_年 / 400) + truncate((13 * _月 + 8) / 5) + _日) mod 7. '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,!,fail. うるう年(_年) :- 0 is _年 mod 4. カレンダー表示([]). カレンダー表示([_週|R]) :- カレンダー週表示(_週), カレンダー表示(R). カレンダー週表示([]) :- write('\n'). カレンダー週表示([A|R]) :- 表示項(A,_表示項), writef('%3R',[_表示項]), カレンダー週表示(R). 表示項(' ',' ') :- !. 表示項(N,N). % 以下のサイトは 日曜起点カレンダー(_一日の曜日,_末日整数,_カレンダー) :- findall(_日,between(1,_末日整数,_日),_日付ならび), 第一週の整形(_一日の曜日,_日付ならび,_第一週,_第二週以後), 最終週の整形(_第二週以後,_最終週を整形された第二週以後), _カレンダー = [_第一週|_最終週を整形された第二週以後]. 第一週の整形(日曜,[_1,_2,_3,_4,_5,_6,_7|R],[_1,_2,_3,_4,_5,_6,_7],R). 第一週の整形(月曜,[_1,_2,_3,_4,_5,_6|R],[_,_1,_2,_3,_4,_5,_6],R). 第一週の整形(火曜,[_1,_2,_3,_4,_5|R],[_,_,_1,_2,_3,_4,_5],R). 第一週の整形(水曜,[_1,_2,_3,_4|R],[_,_,_,_1,_2,_3,_4],R). 第一週の整形(木曜,[_1,_2,_3|R],[_,_,_,_,_1,_2,_3],R). 第一週の整形(金曜,[_1,_2|R],[_,_,_,_,_,_1,_2],R). 第一週の整形(土曜,[_1|R],[_,_,_,_,_,_,_1],R). 最終週の整形([_1,_2,_3,_4,_5,_6,_7|R1],[[_1,_2,_3,_4,_5,_6,_7]|R2]) :- 最終週の整形(R1,R2),!. 最終週の整形(L1,[L2]) :- length(L2,7), append(L1,_,L2). % 以下のサイトは # # 2×2行列の固有値 # '2×2行列の固有値'([[A,B],[C,D]],_固有値) :- _固有値 is ((A+D)+sqrt((A+D)*(A+D)-4*(A*D-B*C))) / 2. '2×2行列の固有値'([[A,B],[C,D]],_固有値) :- _固有値 is ((A+D)-sqrt((A+D)*(A+D)-4*(A*D-B*C))) / 2. '2×2対称行列の固有値'([[A,B],[B,A]],_固有値) :- _固有値 is A+B. '2×2対称行列の固有値'([[A,B],[B,A]],_固有値) :- _固有値 is A-B. % 以下のサイトは # 出典: プログラミングのお題スレ 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). % 以下のサイトは ならびの右回転([],[]) :- !. ならびの右回転([A|R1],[E|R2]) :- ならびの右回転(R1,A,E,R2). ならびの右回転([E],A,E,[A]) :- !. ならびの右回転([B|R1],A,E,[B|R2]) :- ならびの右回転(R1,A,E,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの右回転([],[]) :- !. ならびの右回転([A|R],_右回転したならび) :- append(R,[A],_右回転したならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 文字列の右回転 % 文字列の右回転(_文字列,_右回転した文字列) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), atomic_list_concat([_残り文字列,_文字],_右回転した文字列). % 以下のサイトは 変数を含むならびの変数を埋める([],[]) :- !. 変数を含むならびの変数を埋める([_要素|_埋める要素ならび],[_要素|_変数を含むならび]) :- 変数を含むならびの変数を順に埋める(_埋める要素ならび,_変数を含むならび). 変数を含むならびの変数を順に埋める(_埋める要素ならび,[_|_変数を含むならび]) :- 変数を含むならびの変数を順に埋める(_埋める要素ならび,_変数を含むならび). % 以下のサイトは ならびの右ローテイト([],[]) :- !. ならびの右ローテイト([A|R1],[E|R2]) :- ならびの右ローテイト(R1,A,E,R2). ならびの右ローテイト([E],A,E,[A]) :- !. ならびの右ローテイト([B|R1],A,E,[B|R2]) :- ならびの右ローテイト(R1,A,E,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ならびの右ローテイト([],[]) :- !. ならびの右ローテイト([A|R],_右ローテイトしたならび) :- append(R,[A],_右ローテイトしたならび). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 文字列の右ローテイト % 文字列の右ローテイト(_文字列,_右ローテイトした文字列) :- sub_atom(_文字列,0,1,_残り文字数,_文字), sub_atom(_文字列,1,_残り文字数,0,_残り文字列), atomic_list_concat([_残り文字列,_文字],_右ローテイトした文字列). % 以下のサイトは # 出題場所 :: 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/178 # お題 # "この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" # の□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。 # # 元ネタ:https://www.facebook.com/NewtonScience/photos/a.314504251971427.78296.285001398255046/716155815139600/ # # '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させるコードを書け。'(_正しい文章) :- '1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4), '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章), 正しい文章である(_正しい文章,_n1,_n2,_n3,_n4). '1が□個,2が□個,3が□個,1から3以外の数字が□個'(_n1,_n2,_n3,_n4,_1,_2,_3,_4) :- '1が□個'(_n1,_1), '2が□個'(_n2,_2), '3が□個'(_n3,_3), '1から3以外の数字が□個ある'(_n4,_4). '1が□個'(_n1,_1) :- between(0,9,_n1), number_chars(_n1,[_1]). '2が□個'(_n2,_2) :- between(0,9,_n2), number_chars(_n2,[_2]). '3が□個'(_n3,_3) :- between(0,9,_n3), number_chars(_n3,[_3]). '1から3以外の数字が□個ある'(_n4,_4) :- between(0,9,_n4), number_chars(_n4,[_4]). '"この文字列には1が□個,2が□個,3が□個,1から3以外の数字が□個ある。" という文章がある。□をそれぞれ適切な数字に置き換え、正しい文章として完成させる'(_1,_2,_3,_4,_正しい文章) :- swritef(_正しい文章,'この文字列には1が%t個,2が%t個,3が%t個,1から3以外の数字が%t個ある。',[_1,_2,_3,_4]). 正しい文章である(_正しい文章,_n1,_n2,_n3,_n4) :- '1の度数は'(_正しい文章,_n1), '2の度数は'(_正しい文章,_n2), '3の度数は'(_正しい文章,_n3), '1から3以外の数字の度数'(_正しい文章,_n4). '1の度数は'(_正しい文章,_n1) :- 度数(sub_atom(_正しい文章,_,1,_,'1'),_n1). '2の度数は'(_正しい文章,_n2) :- 度数(sub_atom(_正しい文章,_,1,_,'2'),_n2). '3の度数は'(_正しい文章,_n3) :- 度数(sub_atom(_正しい文章,_,1,_,'3'),_n3). '1から3以外の数字の度数'(_正しい文章,_n4) :- 度数((sub_atom(_正しい文章,_,1,_,A),member(A,['4','5','6','7','8','9','0'])),_n4). 度数(_目標,_度数) :- findall(1,_目標,L), length(L,_度数). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/134 # お題 # 配列を逆順にする関数(メソッド)はもちろん、ループ文(式)、イテレーター、 # GOTO文(式)、再帰、継続、マクロ、既存メソッド再定義を使わずに # サイズ50の配列の内容を逆順にするコードを(可能であれば25ステップ以内で)書け。 # # '配列を逆順にする関数(メソッド)はもちろん、ループ文(式)、イテレーター、 GOTO文(式)、再帰、継続、マクロ、既存メソッド再定義を使わずに サイズ50の配列の内容を逆順にするコードを(可能であれば25ステップ以内で)書け。'( [_1,_2,_3,_4,_5,_6,_7,_8,_9,_10, _11,_12,_13,_14,_15,_16,_17,_18,_19,_20, _21,_22,_23,_24,_25,_26,_27,_28,_29,_30, _31,_32,_33,_34,_35,_36,_37,_38,_39,_40, _41,_42,_43,_44,_45,_46,_47,_48,_49,_50], [_50,_49,_48,_47,_46,_45,_44,_43,_42,_41, _40,_39,_38,_37,_36,_35,_34,_33,_32,_31, _30,_29,_28,_27,_26,_25,_24,_23,_22,_21, _20,_19,_18,_17,_16,_15,_14,_13,_12,_11, _10,_9,_8,_7,_6,_5,_4,_3,_2,_1]). % 以下のサイトは # 出題場所 :: 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([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは % ?- append(L1,[E|L2],[1,2,3]). % L1 = [], E = 1, L2 = [2,3]; % L1 = [1], E = 2, L2 = [3]; % L1 = [1,2], E = 3, L2 = []. % % append/3の定義 % % append([],L,L). % append([U|L1],L2,[U|L3]) :- % append(L1,L2,L3). % % append/3 を 'リストを注目要素、その前リスト、後リストに分割する'/4 に変形。 % 'リストを注目要素、その前リスト、後リストに分割する'([_注目要素|R],[],_注目要素,R). 'リストを注目要素、その前リスト、後リストに分割する'([U|R],[U|L1],_注目要素,L2) :- 'リストを注目要素、その前リスト、後リストに分割する'( R , L1 ,_注目要素,L2). ?- 'リストを注目要素、その前リスト、後リストに分割する'([1,2,3],_前リスト,_注目要素,_後リスト). _前リスト = [], _注目要素 = 1, _後リスト = [2,3]; _前リスト = [1], _注目要素 = 2, _後リスト = [3]; _前リスト = [1,2],_注目要素 = 3, _後リスト = []. % 以下のサイトは '3年H組の最も高い身長'(_3年H組の生徒ならび,_3年H組の最も高い身長) :- '3年H組の身長と残りの生徒の身長ならび'(_3年H組の生徒ならび,_3年H組の最も高い身長,_残りの生徒の身長ならび). '3年H組の最も高い身長と残りの生徒の身長ならび'([_最も高い身長|_残りの生徒の身長],_最も高い身長,_残りの生徒の身長), 残り生徒ならびの全てが最も高い身長に等しいか小さい(_最も高い身長,_残りの生徒の身長). '3年H組の最も高い身長と残りの生徒の身長ならび'([_身長|R1],_最も高い身長,[_身長|_残り身長ならび]) :- '3年H組の最も高い身長と残りの生徒の身長ならび'(R1,_最も高い身長,_残り身長ならび). 残り生徒ならびの全てが最も高い身長に等しいか小さい(_最も高い身長,_残り身長ならび) :- forall(残り身長ならびから身長を取り出す(_残り身長ならび,_身長),_身長 @=< _最も高い身長). 残り身長ならびから身長を取り出す([_身長|_],_身長). 残り身長ならびから身長を取り出す([_|R],_身長) :- 残り身長ならびから身長を取り出す(R,_身長). % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'([_最も高い身長_1],_最も高い身長_1). '3年H組で最も高い身長'([_生徒の身長|R],_最も高い身長) :- '3年H組で最も高い身長'(R,_最も高い身長_2), 高い方の身長は(_生徒の身長,_最も高い身長_2,_最も高い身長). 高い方の身長は(_身長_1,_身長_2,_身長_2) :- _身長_1 @=< _身長_2. 高い方の身長は(_身長_1,_身長_2,_身長_1) :- _身長_1 @> _身長_2. % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'(_3年H組の身長ならび,_3年H組で最も高い身長) :- '3年H組で最も高い身長は'(_3年H組で最も高い身長,_3年H組の身長ならび,_残り身長ならび), '_残り身長ならびの要素は全て_3年H組で最も高い身長に等しいか小さい'(_残り身長ならび,_3年H組で最も高い身長). '3年H組の最も高い身長は'(A,[A|R],R). '3年H組の最も高い身長は'(A,[B|R1],[B|R2]) :- '3年H組の最も高い身長は'(A,R1,R2). '_残り身長ならびの要素は全て_3年H組で最も高い身長に等しいか小さい'(_残り身長ならび,_3年H組で最も高い身長) :- forall('3年H組の生徒の身長'(_生徒の身長,_残り身長ならび),_生徒の身長 @=< _3年H組で最も高い身長). '3年H組の生徒の身長'(_生徒の身長,[_生徒の身長|_]). '3年H組の生徒の身長'(_生徒の身長,[_|_残り生徒の身長]) :- '3年H組の生徒の身長'(_生徒の身長,_残り生徒の身長). % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'(_3年H組の身長ならび,_3年H組で最も高い身長) :- select(_3年H組で最も高い身長,_3年H組の身長ならび,_残り身長ならび), forall(member(_生徒の身長,_残り身長ならび),_生徒の身長 @=< _3年H組で最も高い身長). % この select/3, forall/2, member/2 を具象化させることはかなり難しい。 % 例えば、ここで具象化とは、'3年H組・・・' に述語名を置き直すこと。 % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'(_3年H組の身長ならび,_3年H組で最も高い身長) :- _3年H組の身長ならび = [_最も高いの身長_1|_残り生徒の身長ならび], '3年H組で最も高い身長'(_残り生徒の身長ならび,_最も高い身長_1,_3年H組で最も高い身長). '3年H組で最も高い身長'([],_3年H組で最も高い身長,_3年H組で最も高い身長). '3年H組で最も高い身長'([_生徒の身長|R],_最も高い身長_1,_3年H組で最も高い身長) :- _生徒の身長 @< _最も高い身長_1, '3年H組で最も高い身長'(R,_最も高い身長_1,_3年H組で最も高い身長). '3年H組で最も高い身長'([_生徒の身長|R],_最も高い身長_1,_3年H組で最も高い身長) :- _生徒の身長 @>= _最も高い身長_1, '3年H組で最も高い身長'(R,_生徒の身長,_3年H組で最も高い身長). % 以下のサイトは # プログラミングのお題スレ Part5 #27 # # nこの角砂糖でできる直方体は何種類あるか? # 'nこの角砂糖でできる直方体は何種類あるか?'(_n,_何種類) :- 'nこの角砂糖でできる直方体は'(_n,_直方体ならび), length(_直方体ならび,_何種類). 'nこの角砂糖でできる直方体は'(_n,_直方体ならび) :- findall(M,between(1,_n,M),L), findall([_辺1,_辺2,_辺3],( 直方体(L,_n,_辺1,_辺2,_辺3)),_直方体ならび). 直方体(L,_n,_辺1,_辺2,_辺3) :- '_辺1,_辺2,_辺3を選択'(L,_辺1,_辺2,_辺3), '_辺1,_辺2,_辺3は昇順'(_辺1,_辺2,_辺3), _n is _辺1 * _辺2 + _辺3. '_辺1,_辺2,_辺3を選択'(L,_辺1,_辺2,_辺3) :- select(_辺1,L,R1), select(_辺2,L,R2), select(_辺3,L,R3). '_辺1,_辺2,_辺3は昇順'(_辺1,_辺2,_辺3) :- _辺1 =< _辺2, _辺2 =< _辺3. % 以下のサイトは # 出題場所 :: 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',[_表示]). % 以下のサイトは # 出題場所 :: 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を出力しろ それ以外は数字を出力しろ'(_数字) :- '5で割り切れる場合は何も出力するな'(_数字),!. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '4と6で割り切れる場合はFizzBuzzを出力しろ(出力ごとに改行も入れろ)'(_数字),!. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '4で割り切れる場合はFizzを出力しろ(出力ごとに改行も入れろ)'(_数字),!. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- '6で割り切れる場合はBuzzを出力しろ(出力ごとに改行も入れろ)'(_数字),!. '5で割り切れる場合は何も出力するな 出力ごとに改行も入れろ 4と6で割り切れる場合はFizzBuzzを出力しろ 4で割り切れる場合はFizzを出力しろ 6で割り切れる場合はBuzzを出力しろ それ以外は数字を出力しろ'(_数字) :- 'それ以外は数字を出力しろ(出力ごとに改行も入れろ)'(_数字)