このディレクトリの索引

% 以下のサイトは # # ?- 'split'(',abc,def,gh,,',[','],L),atomic_list_concat(L,X). # L = [abc,def,gh], # X = abcdefgh. # # ?- 'sPLIT'(',abc,def,gh,,',[','],L),atomic_list_concat(L,X). # L = [',',abc,',',def,',',gh,',',','], # X = ',abc,def,gh,,'. # # ?- 'SPLIT'(',abc,def,gh,,',[','],L),atomic_list_concat(L,X). # L = ['',',',abc,',',def,',',gh,',','',',',''], # X = ',abc,def,gh,,'. # split(_文字列,_区切り記号ならび,L) :- split_2(0,_文字列,_区切り記号ならび,L),!. sPLIT(_文字列,_区切り記号ならび,L) :- split_2(1,_文字列,_区切り記号ならび,L),!. 'SPLIT'(_文字列,_区切り記号ならび,L) :- split_2(2,_文字列,_区切り記号ならび,L),!. split_2(N,_文字列,_区切り記号ならび,L) :- 文字列に区切り記号は存在しない(N,_文字列,_区切り記号,_区切り記号ならび,L),!. split_2(N,_文字列,_区切り記号ならび,L) :- 副文字列(_文字列,_前文字列,_区切り記号,_後文字列), member(_区切り記号,_区切り記号ならび), 'split_3'(N,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,L). 文字列に区切り記号は存在しない(N,_文字列,_区切り記号,_区切り記号ならび,L) :- 文字列に区切り記号は存在しない(_文字列,_区切り記号ならび), 末尾に区切り記号が来た場合を配慮すると(N,_文字列,_区切り記号,_区切り記号ならび,L). 文字列に区切り記号は存在しない(_文字列,_区切り記号ならび) :- forall(副文字列(_文字列,_前文字列,_区切り記号,_後文字列),\+(member(_区切り記号,_区切り記号ならび))). 末尾に区切り記号が来た場合を配慮すると(0,'',_区切り記号,_区切り記号ならび,[]) :- !. 末尾に区切り記号が来た場合を配慮すると(1,'',_区切り記号,_区切り記号ならび,[]) :- !. 末尾に区切り記号が来た場合を配慮すると(_,_文字列,_区切り記号,_区切り記号ならび,[_文字列]). 'split_3'(0,_区切り記号ならび,'',_区切り記号,_後文字列,L) :- 'split'(_後文字列,_区切り記号ならび,L),!. 'split_3'(0,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列|R]) :- 'split'(_後文字列,_区切り記号ならび,R). 'split_3'(1,_区切り記号ならび,'',_区切り記号,_後文字列,[_区切り記号|R]) :- 'sPLIT'(_後文字列,_区切り記号ならび,R),!. 'split_3'(1,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列,_区切り記号|R]) :- 'sPLIT'(_後文字列,_区切り記号ならび,R). 'split_3'(2,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列,_区切り記号|R]) :- 'SPLIT'(_後文字列,_区切り記号ならび,R). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは '先頭がa、末尾がzの文字列'(_文字列) :- atom_concat(a,_,_文字列), atom_concat(_,z,_文字列). % 以下のサイトは # 出典 :: # [1] 授業単元:プログラミング1 # [2] 問題文(含コード&リンク): # 学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)。 # なお,データは,学籍番号順に入力されるわけではない。 # このとき,試験の点数の上位11人の学籍番号と試験の点数を,点数が高い順に出力するプログラムを書け。 # ただし,同じ点数の学生がいた場合は,最初に入力されたデータを優先するものとする。 # 結果は,学籍番号と点数を1つ以上のスペースで区切り,1行に一人ずつ出力せよ。 :- dynamic(成績データ/2). 成績上位11名 :- '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)', 上位11名の選別(_上位11名の成績ならび), 上位11名を表示する(_上位11名の成績ならび). '成績データを得る。学籍番号と試験の点数のペアーを入力するものとする(「0 0」を入力すると終了し,データ数は100以下である)' :- write('学籍番号と試験の点数のペアーを入力してください。(「0 0」を入力すると終了する) : '), length(Ln,100), 行入力(_行), 成績データを得る(Ln,_行). 成績データを得る(_,'0 0') :- !. 成績データを得る([],_). 成績データを得る([_|Ln],_行) :- '行の空白を区切り文字列として学籍番号と点数を取り出して成績データを定義して行く。点数は数に変換する。'(Ln,_行). '行の空白を区切り文字列として学籍番号と点数を取り出して成績データを定義して行く。点数は数に変換する。'(Ln,_行) :- '行の空白を区切り文字列として学籍番号と点数を取り出して行く。'(_行,_学籍番号,_点数), 成績データを定義する(_学籍番号,_点数), 行入力(_次の行), 成績データを得る(Ln,_次の行). '行の空白を区切り文字列として学籍番号と点数を取り出して行く。'(_行,_学籍番号,_点数) :- split(_行,[' '],[_学籍番号,_点数文字列]), 点数は文字列を数に変換する(_点数文字列,_点数). 点数は文字列を数に変換する(_点数文字列,_点数) :- read_term_from_atom(_点数文字列,_点数,[]). 成績データを定義する(_学籍番号,_点数) :- assertz(成績データ(_学籍番号,_点数)). 上位11名の選別(_上位11名の成績ならび) :- 成績データから降順点数ならびを得る(_降順点数ならび), 上位11名を取り出す(_降順点数ならび,_上位11名の成績ならび). 成績データから降順点数ならびを得る(_降順点数ならび) :- setof(_点数,[_学籍番号,_点数] ^ 成績データ(_学籍番号,_点数),_点数ならび), 降順に整列する(_点数ならび,_降順点数ならび). 降順に整列する(_点数ならび,_降順点数ならび) :- sort(_点数ならび,_昇順点数ならび), reverse(_昇順点数ならび,_降順点数ならび). 上位11名を取り出す(_降順点数ならび,_上位11名の成績ならび) :- findnsols(11,[_学籍番号,_点数],降順点数順に学籍番号と点数を取り出す(_降順点数ならび,_学籍番号,_点数),_上位11名の成績ならび),!. 降順点数順に学籍番号と点数を取り出す(_降順点数ならび,_学籍番号,_点数) :- member(_点数,_降順点数ならび), 成績データ(_学籍番号,_点数). 上位11名を表示する(_上位11名の成績ならび) :- forall(member([_学籍番号,_点数],_上位11名の成績ならび),writef('%w \t%w\n',[_学籍番号,_点数])). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). split(_文字列,_区切り文字列ならび,L) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび), split(_前文字列,_区切り文字列ならび,_後文字列,L),!. split(_文字列,_,[_文字列]). split('',_区切り文字列ならび,_後文字列,L) :- split(_後文字列,_区切り文字列ならび,L),!. split(_前文字列,_区切り文字列ならび,_後文字列,[_前文字列|R]) :- split(_後文字列,_区切り文字列ならび,R). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 133代目 #210 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10290.txt # # 名前と点数のデータを持っているリスト構造をソートさせたいのです。 # # (名前) (点数) # 骨川スネ夫 50 # 野比のび太 0 # 出木杉英才 100 # 剛田たけし 20 # 源静香    80 # # のようなデータを予め持っているとして、名前でソートしたい時はあいうえお順に、 # 点数でソートしたい時は0から順に並び替え、画面に出力させたいのですが、 # そもそもあいうえお順でソートさせる方法が分からず、 # 名前と点数を同時に動かす方法も思いつかず、提出期限間近になってしまいました。 # どうかお願いします。 # # //漢字でソートは無理だから漢字名とは別に表示させずにひらがなで名前のデータを入れておくのでしょうか? 点数(骨川スネ夫,50). 点数(野比のび太,0). 点数(出木杉英才,100). 点数(剛田たけし,20). 点数(源静香,80). '名前と点数のデータを持っているリスト構造をソートさせたいのです。 (名前) (点数) 骨川スネ夫 50 野比のび太 0 出木杉英才 100 剛田たけし 20 源静香     80 のようなデータを予め持っているとして、名前でソートしたい時はあいうえお順に、 点数でソートしたい時は0から順に並び替え、画面に出力させたい'(_点数で整列された_名前_点数ならび) :- findall([_名前,点数],点数(_名前,_点数),_名前_点数ならび), '「漢字文字列・点数」を「かな読み・点数」で整列する'(_名前_点数ならび,_点数で整列された_名前_点数ならび). '「漢字文字列・点数」を「かな読み・点数」で整列する'(_漢字文字列_点数ならび,_整列された漢字文字列ならび) :- 'かな読みに変換しながらデータ番号を付加して、さらに整列する。'(1,_漢字文字列_点数ならび,LL2), '付加されたデータ番号により整列された漢字文字列・点数ならびを得る'(LL2,_漢字文字列_点数ならび,_整列された漢字文字列ならび). 'かな読みに変換しながらデータ番号を付加して、さらに整列する。'(N,_漢字文字列_点数ならび,LL2) :- かな読みに変換しながらデータ番号を付加して(N,_漢字文字列_点数ならび,LL1), さらに整列する(LL1,LL2). かな読みに変換しながらデータ番号を付加して(_,[],[]) :- !. かな読みに変換しながらデータ番号を付加して(N,_漢字文字列_点数ならび,_かなに変換された文字列_点数ならび) :- 全ての漢字文字列をかな読みに変換しながらデータ番号を付加して行く(N,_漢字文字列_点数ならび,_かなに変換された文字列_点数ならび). さらに整列する(LL1,LL2) :- sort(LL1,LL2). 全ての漢字文字列をかな読みに変換しながらデータ番号を付加して行く(N,[[_漢字文字列,_点数]|R1],[[_かなに変換された文字列,_点数,N]|R2]) :- 漢字文字列を可能な限りかな読み文字列に変換する(_漢字文字列,_かなに変換された文字列), succ(N,N2), かな読みに変換しながらデータ番号を付加して(N2,R1,R2). '付加されたデータ番号により整列された漢字文字列・点数ならびを得る'([],_,[]) :- !. '付加されたデータ番号により整列された漢字文字列・点数ならびを得る'([[_,_,N]|R1],_漢字文字列_点数ならび,[L|R2]) :- nth1(N,_漢字文字列_点数ならび,L), '付加されたデータ番号により整列された漢字文字列・点数ならびを得る'(R1,_漢字文字列_点数ならび,R2). 漢字文字列を可能な限りかな読み文字列に変換する(_漢字文字列,_かなに変換された文字列) :- 漢字文字列をかな読みならびに変換する(_漢字文字列,_かな読みならび), atomic_list_concat(_かな読みならび,_かなに変換された文字列). 漢字文字列をかな読みならびに変換する(_漢字文字列,_かな読みならび) :- 先頭からかな読みに変換して行く(_漢字文字列,_かな読みならび),!. 漢字文字列をかな読みならびに変換する(_,[]). 先頭からかな読みに変換して行く(_漢字文字列,[_かな読み|R2]) :- atom_concat(A,B,_漢字文字列), かな読み(A,_かな読み), 漢字文字列をかな読みならびに変換する(B,R2). かな読み(骨川,ほねかわ). かな読み(スネ夫,すねお). かな読み(野比,のび). かな読み(のび太,のびた). かな読み(出木杉,できすぎ). かな読み(英才,ひでたけ). かな読み(剛田,ごうだ). かな読み(たけし,たけし). かな読み(源,みなもと). かな読み(静香,しずか). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #335 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9935.txt # 問題文 # # 以下のプログラムを作成せよ。 # プログラムを実行すると、「文字列を入力してください」と表示されるので、文字列 # strを入力する。次に「どの文字を削除しますか?」と表示されるので、削除したい文字 # cを入力する。すると文字列strから文字cを削除した文字列を表示し、「削除した # 文字は?文字です」と出力する。 'プログラムを実行すると、「文字列を入力してください」と表示されるので、文字列strを入力する。次に「どの文字を削除しますか?」と表示されるので、削除したい文字cを入力する。すると文字列strから文字cを削除した文字列を表示し、「削除した文字は?文字です」と出力する。' :- '「文字列を入力してください」と表示されるので、文字列strを入力する。'(_str), '次に「どの文字を削除しますか?」と表示されるので、削除したい文字cを入力する。'(_c), 'すると文字列strから文字cを削除した文字列を表示し、「削除した文字は?文字です」と出力する。'(_str,_c). '「文字列を入力してください」と表示されるので、文字列strを入力する。'(_str) :- write('文字列を入力してください : '), 行入力(_str). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). '次に「どの文字を削除しますか?」と表示されるので、削除したい文字cを入力する。'(_c) :- write('どの文字を削除しますか? : '), get_char(_c). 'すると文字列strから文字cを削除した文字列を表示し、「削除した文字は?文字です」と出力する。'(_str,_c) :- 'すると文字列strから文字cを削除した文字列を表示し、'(_str,_c,_削除した文字数), '「削除した文字は?文字です」と出力する。'(_削除した文字数). 'すると文字列strから文字cを削除した文字列を表示し、'(_str,_c,_削除した文字数) :- 文字列strから文字cを削除した文字列を([],_str,_c,_文字列strから文字cを削除した文字列,_削除した文字数), writef('削除した文字列は %w\n',[_文字列strから文字cを削除した文字列]). 文字列strから文字cを削除した文字列を(Ln,_str,_c,_文字列strから文字cを削除した文字列,_削除した文字数) :- '_文字列strから_cを一つ削除する'(_str,_c,_残り文字列), 文字列strから文字cを削除した文字列を([_|Ln],_残り文字列,_c,_文字列strから文字cを削除した文字列,_削除した文字数). 文字列strから文字cを削除した文字列を(Ln,_文字列strから文字cを削除した文字列,_,_文字列strから文字cを削除した文字列,_削除した文字数) :- length(Ln,_削除した文字数). '_文字列strから_cを一つ削除する'(_str,_c,_残り文字列) :- 副文字列(_str,_前文字列,_c,_後文字列), atom_concat(_前文字列,_後文字列,_残り文字列),!. '「削除した文字は?文字です」と出力する。'(_削除した文字数) :- writef('削除した文字は %w 文字です\n',[_削除した文字数]). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出題場所 http://toro.2ch.net/test/read.cgi/tech/1363769640/325 # xyz を含まないものにマッチする正規表現 # # [regexp 60]より # # |fmcat =(retofm <<<'(x+y+z+a)*xyz(x+y+z+a)*'|fmcment) =(retofm <<<'xyz')|fmdeterm|fmmin|fmtore|perl -pe 'y/+/|/; s/a/[^xyz]/g' # |として、 # |([^xyz]|y|z)*x(z([^xyz]|y|z)*x|[^xyz]([^xyz]|y|z)*x|x|yx|y[^xyz]([^xyz]|y|z)*x|yy([^xyz]|y|z)*x)*yz # # 遷移図は # # x # <-----------+ # [^x] | x | # <----+ <----+ | # | | | | | # \/ x \/ y | z # 0 ----> 1 ----> 2 ----> 3(DEAD) # | | | # | [^xy] | | # <----------+ | # | [^xz] | # <--------------------- # # 「xyz を含まない文字列」の答は、 # # ([^x]|x(y?x)*([^xy]|y[^xz]))*(x(y?x)*x?)? # # (x(y?x)*x?)? の部分はこの場合に限り (x|y)* で代用できるかな # 後、つるかめ算の様に「勘」で書いたのが # # [^x]*(x+(y|y[^xz][^x]*|[^xy][^x]*))* # # ですがちょっと自信無し # 'xyz にマッチする'(_文字列,_前文字列,xyz,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(xyz,_後文字列,_残り文字列). % http://nojiriko.asia/prolog/prolog/seikihyogen11_325.htmlとの比較のためのプログラムです % 以下のサイトは 非決定性文字列置換(_文字列,_置換対象文字列,_,_文字列) :- 置換対象文字列が見つからなかったら文字列をそのまま返し停止する(_文字列,_置換対象文字列). 非決定性文字列置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- '置換対象文字列が見つかったら、順に一旦停止しながら置換して行く。'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列). 置換対象文字列が見つからなかったら文字列をそのまま返し停止する(_文字列,_置換対象文字列) :- \+(sub_atom(_文字列,_,_,_,_置換対象文字列)). '置換対象文字列が見つかったら、順に一旦停止しながら置換して行く。'(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換対象文字列が見つかったら(_文字列,_前文字列,_置換対象文字列,_後文字列), 順に一旦停止しながら置換して行く(_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列). 置換対象文字列が見つかったら(_文字列,_前文字列,_置換対象文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_置換対象文字列,_後文字列),!. 順に一旦停止しながら置換して行く(_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列) :- atomic_list_concat([_前文字列,_置換文字列,_後文字列],_置換された文字列). 順に一旦停止しながら置換して行く(_置換対象文字列,_置換文字列,_前文字列,_後文字列,_置換された文字列) :- '置換対象文字列が見つかったら、順に一旦停止しながら置換して行く。'(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), atomic_list_concat([_前文字列,_置換文字列,_置換された文字列_2],_置換された文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: ★★Java質問・相談スレッド138★★ #326 # 文字列を10文字幅にして、足りない部分は先頭に'0'を付けるにはどうすればいいですか? # 例えば "deadbeef"を入力すると"00deadbeef"と返還する処理を書きたいです。 # String.format("%010s", "deadbeef"); # とやってもダメでした # # '文字列を10文字幅にして、足りない部分は先頭に''0''を付けることで埋める'(_文字列,_10文字にした文字列) :- 文字列が10文字以上の時は先頭から10文字を切り取る(_文字列,_10文字にした文字列). '文字列を10文字幅にして、足りない部分は先頭に''0''を付けることで埋める'(_文字列,_先頭に0を付加した文字列) :- '文字列が10文字未満の時には足りない部分は先頭に''0''を付けることで埋める'(_文字列,_先頭に0を付加した文字列). 文字列が10文字以上の時は先頭から10文字を切り取る(_文字列,_10文字にした文字列) :- sub_atom(_文字列,0,10,_,_10文字にした文字列). '文字列が10文字未満の時には足りない部分は先頭に''0''を付けることで埋める'(_文字列,_先頭に0を付加した文字列) :- 文字列が10文字未満の時には(_文字列,_10文字に足りない文字数), 足りない部分の0文字列(_文字列,_10文字に足りない文字数,_足りない部分の0文字列), atom_concat(_足りない部分の0文字列,_文字列,_先頭に0を付加した文字列). 文字列が10文字未満の時には(_文字列,_10文字に足りない文字数) :- atom_length(_文字列,_文字数), _文字数 < 10, _10文字に足りない文字数 is 10 - _文字数. 足りない部分の0文字列(_文字列,_10文字に足りない文字数,_足りない部分の0文字列) :- n文字幅の0文字列(_10文字に足りない文字数,_足りない部分の0文字列). n文字幅の0文字列(_n,_n文字幅の0文字列) :- once((findnsols(_n,'0',repeat,L),atom_chars(_n文字幅の0文字列,L))). % 以下のサイトは # 出典 :: 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 いずれかの文字の繰り返し'(_文字列,[_適合文字列|R]) :- '適合文字列をきりだす。その前文字列の最後の文字はabcdefgのいずれかでもなく、その後文字列の最初の文字もabcdefgのいずれかでもない'(_文字列,_適合文字列,_後文字列), '文字列は1回以上の abcdefg いずれかの文字の繰り返し'(_後文字列,R),!. '文字列は1回以上の abcdefg いずれかの文字の繰り返し'(_,[]). '適合文字列をきりだす。その前文字列の最後の文字はabcdefgのいずれかでもなく、その後文字列の最初の文字もabcdefgのいずれかでもない'(_文字列,_適合文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_適合文字列,_後文字列), 適合文字列はabcdefgのいずれかからなる(_適合文字列), 前文字列の最後の文字はabcdefgのいずれでもない(_前文字列), 後文字列の先頭文字はabcdefgのいずれでもない(_後文字列),!. 適合文字列はabcdefgのいずれかからなる('') :- !,fail. 適合文字列はabcdefgのいずれかからなる(_適合文字列) :- forall(sub_atom(_適合文字列,_,1,_,_適合文字),sub_atom(abcdefg,_,1,_,_適合文字)). 前文字列の最後の文字はabcdefgのいずれでもない(_前文字列) :- \+((sub_atom(_前文字列,_,1,0,_文字),sub_atom(abcdefg,_,1,_,_文字))). 後文字列の先頭文字はabcdefgのいずれでもない(_後文字列) :- \+((sub_atom(_後文字列,0,1,_,_文字),sub_atom(abcdefg,_,1,_,_文字))). 'ただし ccd+cc を含まない'([],[]) :- !. 'ただし ccd+cc を含まない'([_文字列|R1],_求める文字列ならび) :- '文字列から ccd+cc を除外する'(_文字列,_部分文字列ならび), 'ただし ccd+cc を含まない'(R1,R2), append(_部分文字列ならび,R2,_求める文字列ならび),!. 'ただし ccd+cc を含まない'([_文字列|R1],[_文字列|R2]) :- 'ただし ccd+cc を含まない'(R1,R2). '文字列から ccd+cc を除外する'('',[]) :- !. '文字列から ccd+cc を除外する'(_文字列,[_前文字列|R]) :- 副文字列(_文字列,_前文字列,_除外文字列,_後文字列), atom_concat(ccd,_,_除外文字列), atom_concat(_,cc,_除外文字列), '文字列から ccd+cc を除外する'(_後文字列,R),!. '文字列から ccd+cc を除外する'(_文字列,[_文字列]). 副文字列(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_適合文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #758 # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # カエサル暗号(A〜Z)の暗号文を入力して平文を含んだリストを出力しなさい。 # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9972.txt# アルファベットを('ABCDEFGHIJKLMNOPQRSTUVWXYZ'). カエサル暗号(_ずらし,_平文,_カエサル暗号文) :- アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット), カエサル暗号変換(_平文,_アルファベット,_ずれたアルファベット,_カエサル暗号文). カエサル復号(_ずらし,_カエサル暗号文,_平文) :- アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット), カエサル暗号変換(_カエサル暗号文,_ずれたアルファベット,_アルファベット,_平文). アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット) :- アルファベットを(_アルファベット), ずらす(_ずらし,_アルファベット,_ずれたアルファベット). ずらす(_ずらし,_アルファベット,_ずれたアルファベット) :- sub_atom(_アルファベット,0,_ずらし,R,_前半部分), sub_atom(_アルファベット,_ずらし,R,0,_後半部分), atom_concat(_後半部分,_前半部分,_ずれたアルファベット). カエサル暗号変換('',_,_,'') :- !. カエサル暗号変換(_文字列,_アルファベット,_ずれたアルファベット,_変換された文字列) :- 先頭文字から順にカエサル変換をして行く(_文字列,_アルファベット,_ずれたアルファベット,_変換された文字列). 先頭文字から順にカエサル変換をして行く(_文字列,_アルファベット,_ずれたアルファベット,_変換された文字列) :- 変換された先頭文字と残り文字列(_文字列,_アルファベット,_ずれたアルファベット,_変換された先頭文字,_残り文字列), カエサル暗号変換(_残り文字列,_アルファベット,_ずれたアルファベット,_変換された文字列_2), atom_concat(_変換された先頭文字,_変換された文字列_2,_変換された文字列). 変換された先頭文字と残り文字列(_文字列,_アルファベット,_ずれたアルファベット,_変換された先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,R,_先頭文字), sub_atom(_文字列,1,R,0,_残り文字列), 文字変換(_先頭文字,_アルファベット,_ずれたアルファベット,_変換された先頭文字). 文字変換(_文字,_アルファベット,_ずれたアルファベット,_変換された文字) :- sub_atom(_アルファベット,S,1,_,_文字), sub_atom(_ずれたアルファベット,S,1,_,_変換された文字). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #758 # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # カエサル暗号(A〜Z)の暗号文を入力して平文を含んだリストを出力しなさい。 # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9972.txt# アルファベットを('ABCDEFGHIJKLMNOPQRSTUVWXYZ'). カエサル暗号(_ずらし,_平文,_カエサル暗号文) :- アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット), カエサル暗号変換(_平文,_アルファベット,_ずれたアルファベット,_カエサル暗号文). カエサル復号(_ずらし,_カエサル暗号文,_平文) :- アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット), カエサル暗号変換(_カエサル暗号文,_ずれたアルファベット,_アルファベット,_平文). アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット) :- アルファベットを(_アルファベット), ずらす(_ずらし,_アルファベット,_ずれたアルファベット). ずらす(_ずらし,_アルファベット,_ずれたアルファベット) :- sub_atom(_アルファベット,0,_ずらし,R,_前半部分), sub_atom(_アルファベット,_ずらし,R,0,_後半部分), atom_concat(_後半部分,_前半部分,_ずれたアルファベット). カエサル暗号変換(_元の文,_アルファベット,_ずれたアルファベット,_変換された文) :- findall(_変換された文字,( カエサル文字変換(_元の文,_アルファベット,_ずれたアルファベット,_変換された文字)),_変換された文字ならび), atom_chars(_変換された文,_変換された文字ならび). カエサル文字変換(_元の文,_アルファベット,_ずれたアルファベット,_変換された文字) :- sub_atom(_元の文,_,1,_,_文字), 文字変換(_文字,_アルファベット,_ずれたアルファベット,_変換された文字). 文字変換(_文字,_アルファベット,_ずれたアルファベット,_変換された文字) :- sub_atom(_アルファベット,S,1,_,_文字), sub_atom(_ずれたアルファベット,S,1,_,_変換された文字). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #758 # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク): # カエサル暗号(A〜Z)の暗号文を入力して平文を含んだリストを出力しなさい。 # # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9972.txt# アルファベットを('ABCDEFGHIJKLMNOPQRSTUVWXYZ'). カエサル暗号(_ずらし,_平文,_カエサル暗号文) :- アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット), カエサル暗号変換(_平文,_アルファベット,_ずれたアルファベット,_カエサル暗号文). カエサル復号(_ずらし,_カエサル暗号文,_平文) :- アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット), カエサル暗号変換(_カエサル暗号文,_ずれたアルファベット,_アルファベット,_平文). アルファベットをずらす(_ずらし,_アルファベット,_ずれたアルファベット) :- アルファベットを(_アルファベット), ずらす(_ずらし,_アルファベット,_ずれたアルファベット). ずらす(_ずらし,_アルファベット,_ずれたアルファベット) :- sub_atom(_アルファベット,0,_ずらし,R,_前半部分), sub_atom(_アルファベット,_ずらし,R,0,_後半部分), atom_concat(_後半部分,_前半部分,_ずれたアルファベット). カエサル暗号変換(_元の文,_アルファベット,_ずれたアルファベット,_変換された文) :- findall(_変換された文字,( カエサル文字変換(_元の文,_アルファベット,_ずれたアルファベット,_変換された文字)),_変換された文字ならび), atom_chars(_変換された文,_変換された文字ならび). カエサル文字変換(_元の文,_アルファベット,_ずれたアルファベット,_変換された文字) :- sub_atom(_元の文,_,1,_,_文字), 文字変換(_文字,_アルファベット,_ずれたアルファベット,_変換された文字). 文字変換(_文字,_アルファベット,_ずれたアルファベット,_変換された文字) :- sub_atom(_アルファベット,S,1,_,_文字), sub_atom(_ずれたアルファベット,S,1,_,_変換された文字). % 以下のサイトは 文字列中に部分文字列が2回以上出現する(_文字列,_部分文字列) :- setof(_部分文字列,_部分文字列 ^ 文字列中に部分文字列が2回以上出現するかどうか調べる(_文字列,_部分文字列),_部分文字列ならび), member(_部分文字列,_部分文字列ならび). 文字列中に部分文字列が2回以上出現するかどうか調べる(_文字列,_部分文字列) :- 副文字列(_文字列,_前文字列,_部分文字列,_後文字列), 部分文字列は後文字列の中に存在する(_部分文字列,_後文字列). 部分文字列は後文字列の中に存在する(_部分文字列,_後文字列) :- sub_atom(_後文字列,_,_,_,_部分文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは 文字列の先頭から初出のabcに続く2文字(_文字列,_初出のabcに続く2文字) :- 文字列の先頭から初出のabcに続く(_文字列,_前文字列にabcを含まないabcに続く_後文字列), '2文字'(_前文字列にabcを含まないabcに続く_後文字列,_初出のabcに続く2文字). 文字列の先頭から初出のabcに続く(_文字列,_前文字列にabcを含まないabcに続く_後文字列) :- '_前文字列にabcを含まないabcに続く'(_文字列,_前文字列にabcを含まないabcに続く_後文字列). '_前文字列にabcを含まないabcに続く'(_文字列,_前文字列にabcを含まないabcに続く_後文字列) :- 副文字列(_文字列,_前文字列,abc,_前文字列にabcを含まないabcに続く_後文字列), '_前文字列にabcを含まない'(_前文字列). '_前文字列にabcを含まない'(_前文字列) :- \+(sub_atom(_前文字列,_,_,_,abc)). '2文字'(_後文字列,_初出のabcに続く2文字) :- sub_atom(_後文字列,0,2,_,_初出のabcに続く2文字). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは 文字列の先頭から初出のabcに続く2文字(_文字列,_初出のabcに続く2文字) :- 文字列の先頭から初出のabcに続く(_文字列,_前文字列にabcを含まないabcに続く_後文字列), '2文字'(_前文字列にabcを含まないabcに続く_後文字列,_初出のabcに続く2文字). 文字列の先頭から初出のabcに続く(_文字列,_前文字列にabcを含まないabcに続く_後文字列) :- '_前文字列にabcを含まないabcに続く'(_文字列,_前文字列にabcを含まないabcに続く_後文字列). '_前文字列にabcを含まないabcに続く'(_文字列,_前文字列にabcを含まないabcに続く_後文字列) :- 副文字列(_文字列,_前文字列,abc,_前文字列にabcを含まないabcに続く_後文字列), '_前文字列にabcを含まない'(_前文字列). '_前文字列にabcを含まない'(_前文字列) :- \+(sub_atom(_前文字列,_,_,_,abc)). '2文字'(_後文字列,_初出のabcに続く2文字) :- sub_atom(_後文字列,0,2,_,_初出のabcに続く2文字). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは 文字列の先頭から初出のabcに続く2文字(_文字列,_初出のabcに続く2文字) :- 文字列の先頭から初出のabcに続く(_文字列,_後文字列), '2文字'(_後文字列,_初出のabcに続く2文字). 文字列の先頭から初出のabcに続く(_文字列,_後文字列) :- 副文字列(_文字列,_前文字列,abc,_後文字列), \+(sub_atom(_前文字列,_,_,_,abc)). '2文字'(_後文字列,_初出のabcに続く2文字) :- sub_atom(_後文字列,0,2,_,_初出のabcに続く2文字). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは '_副文字列は_文字列中の最初の_Aから最後の_Bまで。_A,_Bを含んで。'(_文字列,_A,_B,_副文字列) :- '_文字列中の最初の_Aから'(_文字列,_A,_副文字列_1), '最後の_Bまで'(_副文字列_1,_B,_副文字列). '_文字列中の最初の_Aから'(_文字列,_A,_副文字列_1) :- '最初の_A'(_文字列,_A,_後文字列), から(_A,_後文字列,_副文字列_1). '最初の_A'(_文字列,_A,_後文字列) :- 副文字列(_文字列,_前文字列,_A,_後文字列), \+(sub_atom(_前文字列,_,_,_,_A)). から(_A,_後文字列,_副文字列_1) :- atom_concat(_A,_後文字列,_副文字列_1). '最後の_Bまで'(_副文字列_1,_B,_副文字列) :- '最後の_B'(_副文字列_1,_前文字列,_B), まで(_前文字列,_B,_副文字列). '最後の_B'(_副文字列_1,_前文字列,_B) :- 副文字列(_副文字列_1,_前文字列,_B,_後文字列), \+(sub_atom(_後文字列,_,_,_,_B)). まで(_前文字列,_B,_副文字列) :- atom_concat(_前文字列,_B,_副文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: 正規表現 Part8 #814 # Javaでaaaa1.txt と bbbb2_2.txtというファイル名が有り、 # aaaaと1、bbbb2_と2を抽出したい # どう書いたらいい? # 'aaaa1.txt と bbbb2_2.txtというファイル名が有り、aaaaと1、bbbb2_と2を抽出したい'(_文字列,_実ファイル名,_数値指標) :- 'ファイル名から実ファイル名と指標を抽出する'(_文字列,_実ファイル名,_数値指標). 'ファイル名から実ファイル名と指標を抽出する'(_文字列,_実ファイル名,_数値指標) :- 'ファイル名は名前部分とサフィックスに分かれる。サフィクスはないこともある。名前部分はアンダースコアに数値指標が付加される(ただし実ファイル名は末尾のアンダースコアを含めたものとする)ことと、アンダースコアなしに数値指標が最後に来ることがある。数値指標はないこともある。'(_文字列,_実ファイル名,_数値指標). 'ファイル名は名前部分とサフィックスに分かれる。サフィクスはないこともある。名前部分はアンダースコアに数値指標が付加される(ただし実ファイル名は末尾のアンダースコアを含めたものとする)ことと、アンダースコアなしに数値指標が最後に来ることがある。数値指標はないこともある。'(_文字列,_実ファイル名,_数値指標) :- 'ファイル名は名前部分とサフィックスに分かれる。サフィクスはないこともある。'(_文字列,_名前部分,_サフィックス), '名前部分はアンダースコアに数値指標が付加される(ただし実ファイル名は末尾のアンダースコアを含めたものとする)ことと、アンダースコアなしに数値指標が最後に来ることがある。'(_名前部分,_実ファイル名,_数値指標). 'ファイル名は名前部分とサフィックスに分かれる。サフィクスはないこともある。'(_文字列,_名前部分,_サフィックス) :- 'ファイル名は名前部分とサフィックスに分かれる。'(_文字列,_名前部分,_サフィックス). 'ファイル名は名前部分とサフィックスに分かれる。サフィクスはないこともある。'(_文字列,_名前部分,_サフィックス) :- 'サフィクスはないこともある。'(_文字列,_名前部分,_サフィックス). 'ファイル名は名前部分とサフィックスに分かれる。'(_文字列,_名前部分,_サフィックス) :- 副文字列(_文字列,_名前部分,'.',_サフィックス), サフィックスの中にピリオドは含まない(_サフィックス). サフィックスの中にピリオドは含まない(_サフィックス) :- \+(sub_atom(_サフィックス,_,1,_,'.')). 'サフィクスはないこともある。'(_名前部分,_名前部分,'') :- \+(sub_atom(_名前部分,_,1,_,'.')). '名前部分はアンダースコアに数値指標が付加される(ただし実ファイル名は末尾のアンダースコアを含めたものとする)ことと、アンダースコアなしに数値指標が最後に来ることがある。'(_名前部分,_実ファイル名,_数値指標) :- '名前部分はアンダースコアに数値指標が付加される(ただし実ファイル名は末尾のアンダースコアを含めたものとする)ことと、'(_名前部分,_実ファイル名,_数値指標). '名前部分はアンダースコアに数値指標が付加される(ただし実ファイル名は末尾のアンダースコアを含めたものとする)ことと、アンダースコアなしに数値指標が最後に来ることがある。'(_名前部分,_実ファイル名,_数値指標) :- 'アンダースコアなしに数値指標が最後に来ることがある。'(_名前部分,_実ファイル名,_数値指標). '名前部分はアンダースコアに数値指標が付加される(ただし実ファイル名は末尾のアンダースコアを含めたものとする)ことと、'(_名前部分,_実ファイル名,_数値指標) :- 名前部分はアンダースコアに数値指標が付加される(_名前部分,_末尾のアンダースコアを除いた実ファイル名,_数値指標), ただし実ファイル名は末尾のアンダースコアを含めたものとする(_末尾のアンダースコアを除いた実ファイル名,_実ファイル名). 名前部分はアンダースコアに数値指標が付加される(_名前部分,_末尾のアンダースコアを除いた実ファイル名,_数値指標) :- 副文字列(_名前部分,_末尾のアンダースコアを除いた実ファイル名,'_',_数値指標文字列), 数値指標(_数値指標文字列,_数値指標). 数値指標(_数値指標文字列,_数値指標) :- forall(sub_atom(_数値指標文字列,_,1,_,_数字),数字(_数字)), atom_number(_数値指標文字列,_数値指標). ただし実ファイル名は末尾のアンダースコアを含めたものとする(_末尾のアンダースコアを除いた実ファイル名,_実ファイル名) :- atom_concat(_末尾のアンダースコアを除いた実ファイル名,'_',_実ファイル名). 'アンダースコアなしに数値指標が最後に来ることがある。'(_名前部分,_実ファイル名,_数値指標) :- 'アンダースコアなしに'(_名前部分), '数値指標が最後に来ることがある。'(_名前部分,_実ファイル名,_数値指標). 'アンダースコアなしに'(_名前部分) :- \+('名前部分はアンダースコアに数値指標が付加される(ただし実ファイル名は末尾のアンダースコアを含めたものとする)ことと、'(_名前部分,_実ファイル名,_数値指標)). '数値指標が最後に来ることがある。'(_名前部分,_実ファイル名,_数値指標) :- 末尾に続く数値文字列を切り取る(_名前部分,_実ファイル名,_数値指標文字列), atom_number(_数値指標文字列,_数値指標). 末尾に続く数値文字列を切り取る(_名前部分,_実ファイル名,_数値指標文字列) :- atom_concat(_実ファイル名,_数値指標文字列,_名前部分), '_実ファイル名の末尾文字は数字ではない'(_実ファイル名). '_実ファイル名の末尾文字は数字ではない'(_実ファイル名) :- \+('_実ファイル名の末尾文字は数字'(_実ファイル名)). '_実ファイル名の末尾文字は数字'(_実ファイル名) :- '_実ファイル名の末尾文字は'(_実ファイル名,_実ファイル名の末尾文字), 数字(_実ファイル名の末尾文字). '_実ファイル名の末尾文字は'(_実ファイル名,_実ファイル名の末尾文字) :- sub_atom(_実ファイル名,_,1,0,_実ファイル名の末尾文字). 数字(_実ファイル名の末尾文字) :- member(_実ファイル名の末尾文字,['0','1','2','3','4','5','6','7','8','9']). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは n年後の干支(_n年後,_干支,_n年後の干支) :- '干支を干,支に'(_干支,_干,_支), n年後の干支(_n年後,_干,_支,_n年後の干,_n年後の支), '干,支を干支に'(_n年後の干,_n年後の支,_n年後の干支). n年後の干支(_n年後,_干,_支,_n年後の干,_n年後の支) :- findnsols(_n年後,[_翌年の干,_翌年の支],( 翌年の干支(_干,_支,_翌年の干,_翌年の支)),LL), last(LL,[_n年後の干,_n年後の支]),!. 翌年の干支(_干支,_翌年の干支) :- '干支を干,支に'(_干支,_干,_支), 翌年の干支(_干,_支,_翌年の干,_翌年の支), '干,支を_干支に'(_翌年の干,_翌年の支,_翌年の干支). 翌年の干支(_干,_支,_翌年の干,_翌年の支) :- 十干巡回(_干,_翌年の干_1), 十二支巡回(_支,_翌年の支_1), 翌年の干支_1(_翌年の干_1,_翌年の支_1,_翌年の干,_翌年の支). 翌年の干支_1(_翌年の干,_翌年の支,_翌年の干,_翌年の支). 翌年の干支_1(_翌年の干_1,_翌年の支_1,_翌年の干,_翌年の支) :- 翌年の干支(_翌年の干_1,_翌年の支_1,_翌年の干,_翌年の支). n年前の干支(_n年前,_干支,_n年前の干支) :- '干支を干,支に'(_干支,_干,_支), n年前の干支(_n年前,_干,_支,_n年前の干,_n年前の支), '干,支を干支に'(_n年前の干,_n年前の支,_n年前の干支). n年前の干支(_n年前,_干,_支,_n年前の干,_n年前の支) :- findnsols(_n年前,[_前年の干,_前年の支],( 前年の干支(_干,_支,_前年の干,_前年の支)),LL), last(LL,[_n年前の干,_n年前の支]),!. 前年の干支(_干支,_前年の干支) :- 干支(_干支,_干,_支), 前年の干支(_干,_支,_前年の干,_前年の支), atom_concat(_前年の干,_前年の支,_前年の干支). 前年の干支(_干,_支,_前年の干,_前年の支) :- 十干巡回(_前年の干_1,_干), 十二支巡回(_前年の支_1,_支), 前年の干支_1(_前年の干_1,_前年の支_1,_前年の干,_前年の支). 前年の干支_1(_前年の干,_前年の支,_前年の干,_前年の支). 前年の干支_1(_前年の干_1,_前年の支_1,_前年の干,_前年の支) :- 前年の干支(_前年の干_1,_前年の支_1,_前年の干,_前年の支). '干支を干,支に'(_干支,_干,_支) :- atom_chars(_干支,[_干,_支]). '干,支を干支に'(_干,_支,_干支) :- atomic_list_concat([_干,_支],_干支). 十干巡回(甲,乙). 十干巡回(乙,丙). 十干巡回(丙,丁). 十干巡回(丁,戊). 十干巡回(戊,己). 十干巡回(己,庚). 十干巡回(庚,辛). 十干巡回(辛,壬). 十干巡回(壬,癸). 十干巡回(癸,甲). 十二支巡回(子,丑). 十二支巡回(丑,寅). 十二支巡回(寅,卯). 十二支巡回(卯,辰). 十二支巡回(辰,巳). 十二支巡回(巳,午). 十二支巡回(午,未). 十二支巡回(未,申). 十二支巡回(申,酉). 十二支巡回(酉,戌). 十二支巡回(戌,亥). 十二支巡回(亥,子). % 以下のサイトは # 出典 :: あたらしいこくご 一 東京書籍38-39頁 'ぶん を つくろう'(_ぶん) :- 'どうぶつ の あと に 「が」を つけて そのあと に どうさ を つければ よい。'(_ぶん). 'どうぶつ の あと に 「が」を つけて そのあと に どうさ を つければ よい。'(_ぶん) :- 'どうぶつ の あと に 「が」を つけて'(_どうぶつのあとにがをつけて), 'そのあと に どうさ を つければ よい。'(_どうぶつのあとにがをつけて,_ぶん). 'どうぶつ の あと に 「が」を つけて'(_どうぶつのあとにがをつけて) :- どうぶつ(_どうぶつ), atom_concat(_どうぶつ,が,_どうぶつのあとにがをつけて). 'そのあと に どうさ を つければ よい。'(_どうぶつのあとにがをつけて,_ぶん) :- どうさ(_どうさ), atomic_list_concat([_どうぶつのあとにがをつけて,_どうさ,'。'],_ぶん). どうさ(はしる). どうさ(にげる). どうさ(とぶ). どうさ(さす). どうさ(なく). どうさ(わらう). どうさ(ける). どうさ(さえずる). どうさ(ねる). どうぶつ(うま). どうぶつ(いぬ). どうぶつ(はち). どうぶつ(くま). どうぶつ(りす). どうぶつ(かえる). どうぶつ(とり). どうぶつ(うさぎ). % 以下のサイトは # 出典 :: あたらしいこくご 一 東京書籍38-39頁 ぶんをつくろう(_ぶん) :- 'どうぶつのあとに「が」をつけてそのあとにどうさをつければよい。'(_ぶん). 'どうぶつのあとに「が」をつけてそのあとにどうさをつければよい。'(_ぶん) :- 'どうぶつのあとに「が」をつけて'(_どうぶつのあとにがをつけて), 'そのあとにどうさをつければよい。'(_どうぶつのあとにがをつけて,_ぶん). 'どうぶつのあとに「が」をつけて'(_どうぶつのあとにがをつけて) :- どうぶつ(_どうぶつ), atom_concat(_どうぶつ,が,_どうぶつのあとにがをつけて). 'そのあとにどうさをつければよい。'(_どうぶつのあとにがをつけて,_ぶん) :- どうさ(_どうさ), atomic_list_concat([_どうぶつのあとにがをつけて,_どうさ,'。'],_ぶん). どうさ(はしる). どうさ(にげる). どうさ(とぶ). どうさ(さす). どうさ(なく). どうさ(わらう). どうさ(ける). どうさ(さえずる). どうさ(ねる). どうぶつ(うま). どうぶつ(いぬ). どうぶつ(はち). どうぶつ(くま). どうぶつ(りす). どうぶつ(かえる). どうぶつ(とり). どうぶつ(うさぎ). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_適合文字列,_後文字列), '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列). '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列) :- '先頭文字も末尾文字もギャップ("-")ではない'(_適合文字列), 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列). '先頭文字も末尾文字もギャップ("-")ではない'(_適合文字列) :- '先頭文字がギャップ("-")ではない'(_適合文字列), '末尾文字がギャップ("-")ではない'(_適合文字列). '先頭文字がギャップ("-")ではない'(_適合文字列) :- \+(sub_atom(_適合文字列,0,1,_,'-')). '末尾文字がギャップ("-")ではない'(_適合文字列) :- \+(sub_atom(_適合文字列,_,1,0,'-')). 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列) :- 'ギャップ("-")を取り除いた文字ならび'(_適合文字列,_ギャップではない文字ならび), 文字ならびを結合したものはCGUUという文字列になる(_ギャップではない文字ならび). 'ギャップ("-")を取り除いた文字ならび'(_適合文字列,_ギャップではない文字ならび) :- findall(_ギャップではない文字, 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字),_ギャップではない文字ならび). 文字ならびを結合したものはCGUUという文字列になる(_ギャップではない文字ならび) :- atomic_list_concat(_ギャップではない文字ならび,'CGUU'). 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字) :- sub_atom(_適合文字列,_,1,_,_ギャップではない文字), \+(_ギャップではない文字 = '-'). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは '乱数によってズンかドコを表示して、その表示した文字列にズンズンズンズンドコという副文字列が現れたらキ・ヨ・シ!を表示して終了します。' :- 'ズンズンズンズンドコキ・ヨ・シ!'. 'ズンズンズンズンドコキ・ヨ・シ!' :- 'ズンズンズンズンドコキ・ヨ・シ!'(''),!. 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- 'ズンズンズンズンドコが現れたらキ・ヨ・シ!を表示して終了する'(_文字列). 'ズンズンズンズンドコキ・ヨ・シ!'(_文字列) :- ズンズンズンズンドコが現れるまでズンかドコを付加して行く(_文字列). 'ズンズンズンズンドコが現れたらキ・ヨ・シ!を表示して終了する'(_文字列) :- ズンズンズンズンドコが現れたら(_文字列), 'キ・ヨ・シ!を表示して終了する'. ズンズンズンズンドコが現れたら(_文字列) :- 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(_文字列,_ズンかドコ,_ズンかドコを付加された文字列). % 以下のサイトは # 出典 :: 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, 行入力(_行). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 行入力終了条件('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])). split(_文字列,_区切り記号ならび,L) :- split_2(0,_文字列,_区切り記号ならび,L),!. sPLIT(_文字列,_区切り記号ならび,L) :- split_2(1,_文字列,_区切り記号ならび,L),!. 'SPLIT'(_文字列,_区切り記号ならび,L) :- split_2(2,_文字列,_区切り記号ならび,L),!. split_2(N,_文字列,_区切り記号ならび,L) :- 文字列に区切り記号は存在しない(N,_文字列,_区切り記号,_区切り記号ならび,L),!. split_2(N,_文字列,_区切り記号ならび,L) :- 副文字列(_文字列,_前文字列,_区切り記号,_後文字列), member(_区切り記号,_区切り記号ならび), 'split_3'(N,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,L). 文字列に区切り記号は存在しない(N,_文字列,_区切り記号,_区切り記号ならび,L) :- 文字列に区切り記号は存在しない(_文字列,_区切り記号ならび), 末尾に区切り記号が来た場合を配慮すると(N,_文字列,_区切り記号,_区切り記号ならび,L). 文字列に区切り記号は存在しない(_文字列,_区切り記号ならび) :- forall(副文字列(_文字列,_前文字列,_区切り記号,_後文字列),\+(member(_区切り記号,_区切り記号ならび))). 末尾に区切り記号が来た場合を配慮すると(0,'',_区切り記号,_区切り記号ならび,[]) :- !. 末尾に区切り記号が来た場合を配慮すると(1,'',_区切り記号,_区切り記号ならび,[]) :- !. 末尾に区切り記号が来た場合を配慮すると(_,_文字列,_区切り記号,_区切り記号ならび,[_文字列]). 'split_3'(0,_区切り記号ならび,'',_区切り記号,_後文字列,L) :- 'split'(_後文字列,_区切り記号ならび,L),!. 'split_3'(0,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列|R]) :- 'split'(_後文字列,_区切り記号ならび,R). 'split_3'(1,_区切り記号ならび,'',_区切り記号,_後文字列,[_区切り記号|R]) :- 'sPLIT'(_後文字列,_区切り記号ならび,R),!. 'split_3'(1,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列,_区切り記号|R]) :- 'sPLIT'(_後文字列,_区切り記号ならび,R). 'split_3'(2,_区切り記号ならび,_前文字列,_区切り記号,_後文字列,[_前文字列,_区切り記号|R]) :- 'SPLIT'(_後文字列,_区切り記号ならび,R). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 非決定性の置換('',_文字列,_置換対象文字列,_置換文字列,_置換された文字列). 非決定性の置換(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 新たな置換された文字列を作りだす(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_新たな置換された文字列), 非決定性の置換_1(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). 新たな置換された文字列を作りだす(_既に置換された文字列,_文字列,_置換対象文字列,_置換文字列,_前文字列,_後文字列,_新たな置換された文字列) :- 副文字列(_文字列,_前文字列,_置換対象文字列,_後文字列),!, atomic_list_concat([_既に置換された文字列,_前文字列,_置換文字列],_新たな置換された文字列). 非決定性の置換_1(_新たな置換された文字列,_後文字列,_,_,_置換された文字列) :- atomic_list_concat([_新たな置換された文字列,_後文字列],_置換された文字列). 非決定性の置換_1(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 非決定性の置換(_新たな置換された文字列,_後文字列,_置換対象文字列,_置換文字列,_置換された文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_文字列,_前文字列,_残り文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: 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(_文字,_文字コード). % 以下のサイトは # 出典 :: 正規表現 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(_前文字列,_後文字列,_削除された文字列). % 以下のサイトは # 出典 :: 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,_,_連番). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 152代目 #111 # # [1] 授業単元: プログラミング演習(発展課題) # [2] # 下の配列から"CGUU"をギャップ("-")を含んでいても検出できる正規表現を作成せよ。 # # CCAGCUCCC-G---U--UGGG # '文字列から"CGUU"をギャップ("-")を含んでいても検出する'(_文字列,_前文字列,_適合文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_適合文字列,_後文字列), '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列). '"CGUU"をギャップ("-")を含んでいても検出する'(_適合文字列) :- '先頭文字も末尾文字もギャップ("-")ではない'(_適合文字列), 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列). '先頭文字も末尾文字もギャップ("-")ではない'(_適合文字列) :- '先頭文字がギャップ("-")ではない'(_適合文字列), '末尾文字がギャップ("-")ではない'(_適合文字列). '先頭文字がギャップ("-")ではない'(_適合文字列) :- \+(sub_atom(_適合文字列,0,1,_,'-')). '末尾文字がギャップ("-")ではない'(_適合文字列) :- \+(sub_atom(_適合文字列,_,1,0,'-')). 'ギャップ("-")を取り除くとCGUUという文字列になる'(_適合文字列) :- 'ギャップ("-")を取り除いた文字ならび'(_適合文字列,_ギャップではない文字ならび), 文字ならびを結合したものはCGUUという文字列になる(_ギャップではない文字ならび). 'ギャップ("-")を取り除いた文字ならび'(_適合文字列,_ギャップではない文字ならび) :- findall(_ギャップではない文字, 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字),_ギャップではない文字ならび). 文字ならびを結合したものはCGUUという文字列になる(_ギャップではない文字ならび) :- atomic_list_concat(_ギャップではない文字ならび,'CGUU'). 'ギャップ("-")ではない文字'(_適合文字列,_ギャップではない文字) :- sub_atom(_適合文字列,_,1,_,_ギャップではない文字), \+(_ギャップではない文字 = '-'). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは 整数から文字列(_桁,_整数,_文字列) :- 整数から文字列を生成する(_桁,_整数,'',_文字列). 整数から文字列を生成する(_桁,_整数,_ここまで成長した文字列,_文字列) :- '_整数が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,_末尾桁を除いた整数,_先頭に数字が付加された文字列,_文字列). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # 横書文書を縦書文書に変形する(_横書文書,_縦書文書) :- 横書文書を縦書文書に変形する(_横書文書,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 _式. % 以下のサイトは # 出典 :: 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)). % 以下のサイトは % [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(_点数の定義文,['=',',',';'],[_|_点数ならび]). % 以下のサイトは 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数),!. 標準入力から整数を得る(_催促文言,_検査述語,_整数) :- 標準入力から整数を得る(_催促文言,_検査述語,_整数). 催促文言を表示して標準入力から整数を得て検査述語を実行する(_催促文言,_検査述語,_整数) :- 催促文言を表示して標準入力から整数を得て(_催促文言,_整数), 検査述語を実行する(_検査述語). 催促文言を表示して標準入力から整数を得て(_催促文言,_整数) :- 催促文言を表示して(_催促文言), 標準入力から整数を得る(_整数). 催促文言を表示して(_催促文言) :- 催促文言の編集(_催促文言,_編集された催促文言), writef('%tを入力してください : ',[_編集された催促文言]). 催促文言の編集(表示しない,'') :- !. 催促文言の編集(_催促文言,_編集された催促文言) :- atom_concat(_催促文言,'を入力して下さい : ',_編集された催促文言). 検査述語を実行する(_検査述語) :- _検査述語. 標準入力から整数を得る(_整数) :- 標準入力から文字列を得る(_文字列), 整数入力検査(_文字列,_整数),!. 標準入力から整数を得る(_整数) :- 標準入力から整数を得る(_整数). 整数入力検査(_文字列,_整数) :- 入力文字列から整数が得られる(_文字列,_整数),!. 整数入力検査(_文字列,_) :- 入力文字列から整数が得られない(_文字列,_). 入力文字列から整数が得られる(_文字列,_整数) :- atom_number(_文字列,_整数), integer(_整数). 入力文字列から整数が得られない(_文字列,_) :- writef('入力された文字列 %t からは整数が得られません。再入力をお願いします: \n',[_文字列]), fail. 標準入力から文字列を得る(_文字列) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_文字列,_文字コードならび). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/754 # お題:与えられた文字列を正方形にして出力 # 縦横の字数が等しければ正方形とします # 字数が足りない場合は'*'で埋めること # 余る場合は余計な文字を捨ててかまいません # ただし与えられた字数により近い正方形にすること # 例:http://jump.2ch.net/?ideone.com/mA41q6 # 1, 2=1x1 # 3, 4, 5, 6=2x2 # 7, 8, 9, 10, 11, 12=3x3 # 13, 14, 15, 16=4x4 # 最終行が*だけにならないようにすること。 # '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません ただし与えられた字数により近い正方形にすること 例:http://jump.2ch.net/?ideone.com/mA41q6 1, 2=1x1 3, 4, 5, 6=2x2 7, 8, 9, 10, 11, 12=3x3 13, 14, 15, 16=4x4 最終行が*だけにならないようにすること。'(_与えられた文字列,_正方形の文字列) :- 縦横の字数(_与えられた文字列,_縦横の字数), '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は'*'で埋めること 余る場合は余計な文字を捨ててかまいません'(_与えられた文字列,_縦横の字数,_正方形の文字列). 縦横の字数(_文字列ならび,_縦横の字数) :- sub_atom(_与えられた文字列,0,_文字列の長さ,1,_与えられた文字列), _縦横の字数_1 is floor(sqrt(_文字列の長さ)), _縦横の字数_2 is ceiling(sqrt(_文字列の長さ)), 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数). 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_1) :- abs(_縦横の字数_1 ^ 2 - _文字列の長さ) =< abs(_縦横の字数_2 ^ 2 - _文字列の長さ),!. 縦横の字数の選択(_文字列の長さ,_縦横の字数_1,_縦横の字数_2,_縦横の字数_2). '与えられた文字列を正方形にして出力 縦横の字数が等しければ正方形とします 字数が足りない場合は * で埋めること 余る場合は余計な文字を捨ててかまいません'(_文字列,_縦横の字数,_正方形の文字列) :- findall(_行,( sub_atom(_文字列,_変位,_縦横の字数,_残り文字数,_行), 0 is _変位 mod _縦横の字数, (_行=_行_1;_残り文字数 < _縦横の字数,'字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行),!,fail)), _正方形の文字列). '字数が足りない場合は * で埋めること'(_文字列,_縦横の字数,_残り文字数,_行) :- atom_length(_文字列,_文字数), _星の時数 is _縦横の字数 - _残り文字数, 星文字列(_星の字数,_星文字列), sub_atom(_文字列,_,_残り文字数,0,_副文字列), atom_concat(_副文字列,_星文字列,_行). 星文字列(_字数,_星文字列) :- findall(*,between(1,_字数,_),_星ならび), atomic_list_concat(_星ならび,_星文字列). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/741 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成すること # 英文の回文判定 # 回文とは、どちらから読んでも # 同じ並びになる文章。 # 1つの英文字列(100文字以内)が入力されるので、 # 回文であれば、GOODと表示 # 回文でなければ、NGと表示 # *大文字小文字を区別しない # *「?!,. 」を無視する # # 実行例) # apple 入力 # NG 出力 # Borrow or rob? 入力 # GOOD 出力 # Kodak ad? OK! 入力 # GOOD 出力 # What time is it? 入力 # NG 出力 # Was it a bar or a bat I saw? 入力 # GOOD 出力 # '英文の回文判定 回文とは、どちらから読んでも 同じ並びになる文章。 1つの英文字列(100文字以内)が入力されるので、 回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する' :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列). '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- get_line(_文字列), atom_length(_文字列,_文字列の長さ), _文字列の長さ =< 100,!. '1つの英文字列(100文字以内)が入力されるので、'(_文字列) :- '1つの英文字列(100文字以内)が入力されるので、'(_文字列). '回文であれば、GOODと表示 回文でなければ、NGと表示 *大文字小文字を区別しない *「?!,. 」を無視する'(_文字列) :- '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列,_回文判定文字列), '回文であれば、GOODと表示 回文でなければ、NGと表示'(_回文判定文字列). '*大文字小文字を区別しない *「?!,. 」を無視する'('',''). '*大文字小文字を区別しない *「?!,. 」を無視する'(_文字列_1,_文字列) :- 最初の文字と残り文字列(_文字列_1,_文字,_残り文字列), '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2), '*大文字小文字を区別しない *「?!,. 」を無視する'(_残り文字列,_文字列_2), atom_concat(_文字_2,_文字列_2,_文字列). '大文字を小文字に変換し、「?!,. 」を無視する'(_文字,_文字_2) :- '大文字を小文字に変換し'(_文字,_文字_1), '*「?!,. 」を無視する'(_文字_1,_文字_2). 大文字を小文字に変換(_文字,_小文字) :- 英大文字英小文字(_文字,_小文字),!. 大文字を小文字に変換(_文字,_文字). 英大文字英小文字('A',a). 英大文字英小文字('B',b). 英大文字英小文字('C',c). 英大文字英小文字('D',d). 英大文字英小文字('E',e). 英大文字英小文字('F',f). 英大文字英小文字('G',g). 英大文字英小文字('H',h). 英大文字英小文字('I',i). 英大文字英小文字('J',j). 英大文字英小文字('K',k). 英大文字英小文字('L',l). 英大文字英小文字('M',m). 英大文字英小文字('N',n). 英大文字英小文字('O',o). 英大文字英小文字('P',p). 英大文字英小文字('Q',q). 英大文字英小文字('R',r). 英大文字英小文字('S',s). 英大文字英小文字('T',t). 英大文字英小文字('U',u). 英大文字英小文字('V',v). 英大文字英小文字('W',w). 英大文字英小文字('X',x). 英大文字英小文字('Y',y). 英大文字英小文字('Z',z). '*「?!,. 」を無視する'(_文字,'') :- member(_文字,['?','!','.',' ']),!. '*「?!,. 」を無視する'(_文字,_文字). '回文であれば、GOODと表示 回文でなければ、NGと表示'(_文字列) :- '回文であれば、'(_文字列), 'GOODと表示'. '回文であれば、GOODと表示 回文でなければ、NGと表示'(_) :- '回文でなければ、'(_文字列), 'NGと表示'. '回文であれば、'(_文字列) :- forall((sub_atom(_文字列,S,1,R,_文字),S =< R),sub_atom(_文字列,R,1,S,_文字)). '回文でなければ、'(_文字列) :- \+('回文であれば、'(_文字列)). 'GOODと表示' :- write('Good\n'). 'NGと表示' :- write('NG\n'). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #393 # 文字列A(2≦N≦100000)が与えられる # どうしていするかな # うしていするかなど # していするかなどう # ていするかなどうし # いするかなどうして # するかなどうしてい # るかなどうしていす # かなどうしていする # などうしていするか 例('どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'). '文字列A(2≦N≦100000)が与えられる どうしていするかな うしていするかなど していするかなどう ていするかなどうし いするかなどうして するかなどうしてい るかなどうしていす かなどうしていする などうしていするか'(_文字列,_一文字づつ回転した文字列ならび) :- '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる', '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび). '文字列A(2≦N≦100000)が与えられる。全文を回転して、例と一致するか調べる。 一致した場合の題意は 「文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)」 であると考えられる' :- 例(_回転する例文), '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(どうしていするかな,_一文字づつ回転した文字列ならび), atomic_list_concat(_一文字づつ回転した文字列ならび,'\n',_回転する例文). '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_一文字づつ回転した文字列ならび) :- findall(_一文字づつ回転して文字列,( 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R), ただし最終行は元に戻らない(R)), _一文字づつ回転した文字列ならび). 文字列を一文字づつ回転する(_文字列,_一文字づつ回転した文字列,R) :- sub_atom(_文字列,0,N,R,_副文字列_1), sub_atom(_文字列,N,R,0,_副文字列_2), atom_concat(_副文字列_2,_副文字列_1,_一文字づつ回転した文字列). ただし最終行は元に戻らない(R) :- \+(R = 0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '文字列A(2≦N≦100000)が与えられる。文字列を一文字づつ回転する。(ただし最終行は元に戻らない)'(_文字列,_文字列長,_回転する例文) :- atom_concat(_文字列,_文字列,_連結した文字列), findall(_副文字列,( sub_atom(_連結した文字列,_,_文字列長,_残り文字数,_副文字列), \+(_残り文字数 = 0)), _位置文字づつ回転した文字列ならび), atomic_list_concat(_位置文字づつ回転した文字列ならび,'\n',_回転する例文). % 以下のサイトは # S(1≦S≦10) # L(100≦L≦100) # 標準入力から以下の形式で与えられる # S L # # 例を参考にoとxを配置せよ # # 例 # 3 2 # oooxxx # oooxxx # oooxxx # xxxooo # xxxooo # xxxooo # # 2 3 # ooxxoo # ooxxoo # xxooxx # xxooxx # ooxxoo # ooxxoo # # 1 1 # o # # 2 1 # oo # '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(S,L), 行パターンABを得る(S,L,A,B), findall(AorB,( between(1,L,N), 'AorB'(N,A,B,AorB)), X), 出力する(X). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). 'AorB'(N,A,_,A) :- 1 is N mod 2. 'AorB'(N,_,B,B) :- 0 is N mod 2. 行パターンABを得る(S,L,A,B) :- 合計L行(L,白,黒,S,L,A), 合計L行(L,黒,白,S,L,B). 合計L行(0,_,_,_,_,[]) :- !. 合計L行(L_2,_文字_1,_文字_2,S,L,[_行文字列|R]) :- 行文字列(_文字_1,_文字_2,S,L,_行文字列), succ(L_1,L_2), 合計L行(L_1,_文字_1,_文字_2,S,L,R). 行文字列(_,_,_,0,'') :- !. 行文字列(_文字_1,_文字_2,S,L,_文字列) :- 連続文字列(_文字_1,S,_連続文字列), succ(L_1,L), 行文字列(_文字_2,_文字_1,S,L_1,_連続文字列_1), atom_concat(_連続文字列,_連続文字列_1,_文字列). 連続文字列(_文字,S,_連続文字列) :- findall(_文字,between(1,S,_),L), atom_chars(_連続文字列,L). % 以下のサイトは # # append/4からappend/nまでを一気に定義してしまう、 'append/4から/nの定義'/1 。 # append/nの定義、 'append/nの定義'/1 。 # 'append/4からappend/nの定義'(_n) :- between(4,_n,M), 'abolish_append/n'(M), 'append/nの定義'(M), _n = M. 'append/nの定義'(_n) :- 'L2からLnまで'(_n,_L2_Ln), 'L2からLn_1まで'(_n,_L2_Ln_1), 'L1からLnまで'(_n,_L1_Ln), 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln). 'append/nの定義'(_n,_L2_Ln,_L2_Ln_1,_L1_Ln) :- 'append/nの第一節の定義'(_n,_L2_Ln), 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln). 'append/nの第一節の定義'(_n,_L2_Ln) :- format(atom(S1),'append([],~w) :-~n append(~p).~n',[_L2_Ln,_L2_Ln]), read_term_from_atom(S1,Clause_1,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_1). 'append/nの第二節の定義'(_n,_L2_Ln_1,_L1_Ln) :- format(atom(S2),'append([U|L1],~w,[U|L~p]) :-~n append(~w).\n',[_L2_Ln_1,_n,_L1_Ln]), read_term_from_atom(S2,Clause_2,[variables(_変数ならび),variable_names(_変数名ならび)]), assertz(Clause_2). 'L2からLnまで'(_n,_L2_Ln) :- findall(A,( between(2,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln). 'L2からLn_1まで'(_n,_L2_Ln_1) :- _m is _n - 1, findall(A,( between(2,_m,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L2_Ln_1). 'L1からLnまで'(_n,_L1_Ln) :- findall(A,( between(1,_n,M), atom_concat('L',M,A)), L), atomic_list_concat(L,',',_L1_Ln). 'abolish_append/n'(_n) :- abolish(append,_n). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #526 # [1] 授業単元: プログラミング? # [2] 問題文(含コード&リンク): テキストファイルの読みこみ、行頭文字が小文字の場合 # http://pastebin.com/RKHNpMwy # 大文字に置き換え、変換してファイル出力 # [3] 環境: Xcode 5.1.1 #  [3.1] OS: OSX 10.9 #  [3.2] コンパイラ名とバージョン: gcc49 #  [3.3] 言語: C++ # [4] 期限: 無期限 # [5] その他の制限: # よろしくお願いします。 'テキストファイルの読みこみ、行頭文字が小文字の場合大文字に置き換え、変換してファイル出力'(_ファイル) :- see(_ファイル), 'テキストファイルの読みこみ、'(_行), '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_行), seen. 'テキストファイルの読みこみ、'(_行) :- get_line(_行). '行頭文字が小文字の場合大文字に置き換え、変換して出力'(end_of_file) :- !. '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_行) :- '行頭文字が小文字の場合大文字に置き換え、'(_行,_行_2), writef('%t\n',[_行_2]), 'テキストファイルの読みこみ、'(_次の行), '行頭文字が小文字の場合大文字に置き換え、変換して出力'(_次の行). '行頭文字が小文字の場合大文字に置き換え、'(_行,_行_2) :- 行頭文字が小文字の場合(_行), '大文字に置き換え、'(_行,_行_2),!. '行頭文字が小文字の場合大文字に置き換え、'(_行,_行). 行頭文字が小文字の場合(_行) :- sub_atom(_行,0,1,_,A), A @>= 'a', A @=< 'z'. '大文字に置き換え、'(_行,_行_2) :- sub_atom(_行,0,1,R,_小文字), 小文字大文字(_小文字,_大文字), sub_atom(_行,_,R,0,_残り文字列), atom_concat(_大文字,_残り文字列,_行_2). 小文字大文字(a,'A'). 小文字大文字(b,'B'). 小文字大文字(c,'C'). 小文字大文字(d,'D'). 小文字大文字(e,'E'). 小文字大文字(f,'F'). 小文字大文字(g,'G'). 小文字大文字(h,'H'). 小文字大文字(i,'I'). 小文字大文字(j,'J'). 小文字大文字(k,'K'). 小文字大文字(l,'L'). 小文字大文字(m,'M'). 小文字大文字(n,'N'). 小文字大文字(o,'O'). 小文字大文字(p,'P'). 小文字大文字(q,'Q'). 小文字大文字(r,'R'). 小文字大文字(s,'S'). 小文字大文字(t,'T'). 小文字大文字(u,'U'). 小文字大文字(v,'V'). 小文字大文字(w,'W'). 小文字大文字(x,'X'). 小文字大文字(y,'Y'). 小文字大文字(z,'Z'). % 以下のサイトは # 出題: プログラミングのお題スレ Part3 #902 # # お題:文字列sにあるn個の文字からなる集合を # 要素とする集合をつくる # # 例1:以下n=2 # "today"-> {to td ta ty od oa oy da dy ay} # "book" -> {bo bk ok} # "ababab" -> {ab} # "ab" -> {ab} # "aa" -> {} # "a" -> {} # "" -> {} # # 例2:以下n=3 # "today"-> {tod toa toy oda ody day dat ayt ayo} # "book" -> {boo bok okb} # "abc" -> {abc} # "ababab" ->{} # "ab" -> {} # "a" -> {} # "" -> {} 文字列にあるn個の文字からなる集合を要素とする集合をつくる(_文字列,_n,_文字列集合要素) :- 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列), 文字列組合せ(_重複を取り除いた文字列,_n,_文字列集合要素). 文字列の重複文字を取り除く(_文字列,_重複を取り除いた文字列) :- findall(_文字,( 既に採用されていない文字(_文字列,_文字)), _重複を取り除いた文字ならび), atom_chars(_重複を取り除いた文字列,_重複を取り除いた文字ならび). 既に採用されていない文字(_文字列,_文字) :- sub_atom(_文字列,S,1,_,_文字), sub_atom(_文字列,0,S,_,_前文字列), \+(sub_atom(_前文字列,_,1,_,_文字)). 文字列組合せ(_文字列,1,_文字) :- sub_atom(_文字列,_,1,_,_文字). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列), 文字列組合せ(_残り文字列,M,_残り文字列_2), atom_concat(_先頭文字,_残り文字列_2,_文字列). 文字列組合せ(_文字列_1,N,_文字列) :- 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列), 文字列組合せ(_残り文字列,N,_文字列). 先頭文字と残り文字列(_文字列,N,M,_先頭文字,_残り文字列) :- N > 1, M is N - 1, sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,1,_,0,_残り文字列). 先頭文字を除く残り文字列(_文字列,1,_,0,_残り文字列) :- N > 1, sub_atom(_文字列,1,_,0,_残り文字列). % 以下のサイトは # 出典: Regular Expression(正規表現) Part12 #524 # # よろしくお願いします。 # # ●Regular Expressionの使用環境 # javascript # # ●検索か置換か? # 置換 # # ●説明 # {{ と }} で囲まれた文字を削除したい # 改行あり # # ●対象データ # {{ABCA # BCAA}} # CABA # {{ABCA}} # # ●希望する結果 # CABA '●検索か置換か? 置換 ●説明 {{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列). '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- '{{を切り出し、前文字列と後文字列に分解する'(_文字列,_前文字列,_後文字列), '}} まで文字列を削除したい 改行あり'(_後文字列,_二重括弧を削除した後文字列), atom_concat(_前文字列,_二重括弧を削除された後文字列,_二重括弧を削除された文字列),!. '{{ と }} で囲まれた文字を削除したい 改行あり'(_文字列,_文字列). '}} まで文字列を削除したい 改行あり'(_文字列,_二重括弧を削除した文字列) :- sub_atom(_文字列,S,2,R,'}}'), sub_atom(_文字列,_,R,0,_後文字列), '{{ と }} で囲まれた文字を削除したい 改行あり'(_残り文字列,_二重括弧を削除した後文字列),!. '}} まで文字列を削除したい 改行あり'(_文字列,_文字列). '{{を切り出し、前文字列と後文字列に分解する'(_文字列,_前文字列,_後文字列) :- sub_atom(_文字列,S,2,R,'{{'), sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #877 # # お題:長さが3文字以上の文字列が与えられたとき、2文字の組合せを求める。 # 例 # today -> to td ta ty od oa oy da dy ay # '長さが3文字以上の文字列が与えられたとき、2文字の組合せを求める。'(_文字列,_文字組合せ) :- sub_atom(_文字列,0,1,_,_文字_1), sub_atom(_文字列,1,_,0,_文字列_2), '長さが3文字以上の文字列が与えられたとき、2文字の組合せ'(_文字列_2,_文字_1,_文字組合せ). '長さが3文字以上の文字列が与えられたとき、2文字の組合せ'(_文字列_2,_文字_1,_文字組合せ) :- sub_atom(_文字列_2,_,1,_,_文字_2), atom_concat(_文字_1,_文字_2,_文字組合せ). '長さが3文字以上の文字列が与えられたとき、2文字の組合せ'(_文字列_2,_,_文字組合せ) :- '長さが3文字以上の文字列が与えられたとき、2文字の組合せを求める。'(_文字列_2,_文字組合せ). % 以下のサイトは # # 鎮 静 剤 #               マリー・ローランサン #                   堀口大學 訳 # # # 退屈な女より もっと哀れなのは 悲しい女です。 # # 悲しい女より もっと哀れなのは 不幸な女です。 # # 不幸な女より もっと哀れなのは 病気の女です。 # # 病気の女より もっと哀れなのは 捨てられた女です。 # # 捨てられた女より もっと哀れなのは よるべない女です。 # # よるべない女より もっと哀れなのは 追われた女です。 # # 追われた女より もっと哀れなのは 死んだ女です。 # # 死んだ女より もっと哀れなのは 忘れられた女です。 # # :-op(500,xfx,もっと哀れなのは). 鎮静剤(_どんな女,_もっと哀れなのは) :- atom_concat(_どんな女,より,_どんな女より), _どんな女より もっと哀れなのは _こんな女です, sub_atom(_こんな女です,0,_,2,_こんな女), 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは). 鎮静剤(_どんな女,_こんな女,_もっと哀れなのは) :- atomic_list_concat([_どんな女,より,' もっと哀れなのは ',_こんな女,'です。'],_もっと哀れなのは). 鎮静剤(_,_こんな女,_もっと哀れなのは) :- 鎮静剤(_こんな女,_もっと哀れなのは). よるべない女より もっと哀れなのは 追われた女です. 退屈な女より もっと哀れなのは 悲しい女です. 忘れられた女より もっと哀れなのは 退屈な女です. 追われた女より もっと哀れなのは 死んだ女です. 不幸な女より もっと哀れなのは 病気の女です. 捨てられた女より もっと哀れなのは よるべない女です. 病気の女より もっと哀れなのは 捨てられた女です. 悲しい女より もっと哀れなのは 不幸な女です. 死んだ女より もっと哀れなのは 忘れられた女です. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ?- 鎮静剤(退屈な女,_節). _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' ; _節 = 'よるべない女より もっと哀れなのは 追われた女です。' ; _節 = '追われた女より もっと哀れなのは 死んだ女です。' ; _節 = '死んだ女より もっと哀れなのは 忘れられた女です。' ; _節 = '忘れられた女より もっと哀れなのは 退屈な女です。' ; _節 = '退屈な女より もっと哀れなのは 悲しい女です。' ; _節 = '悲しい女より もっと哀れなのは 不幸な女です。' ; _節 = '不幸な女より もっと哀れなのは 病気の女です。' ; _節 = '病気の女より もっと哀れなのは 捨てられた女です。' ; _節 = '捨てられた女より もっと哀れなのは よるべない女です。' . ?- % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #729 # # お題:○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。 # # 列者臨 # 在皆兵 # 前陣闘 # 勝ち(列者臨). 勝ち(在皆兵). 勝ち(前陣闘). 勝ち(列在前). 勝ち(者皆陣). 勝ち(臨兵闘). 勝ち(列皆闘). 勝ち(臨皆前). '○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。' :- すべて('○×ゲームで○が勝つ局面までの手順を深さ優先探索で探し出して'(_手順),出力(_手順)). '○×ゲームで○が勝つ局面までの手順を深さ優先探索で探し出して'(_手順) :- 交互着手(臨兵闘者皆陣列在前,○,×,[],[],_勝ち,_手順). 交互着手(_,_,_手番,_,_手番の着手点ならび,_手番,[]) :- 勝ちになっている(_手番の着手点ならび),!. 交互着手(_着手可能点文字列,_手番,_次の手番,_手番の着手点ならび,_次の手番の着手点ならび,_勝ち,[_着手|_着手ならび]) :- 選択(_着手可能点文字列,_着手,_残り着手可能点文字列), 交互着手(_残り着手可能点文字列,_次の手番,_手番,_次の手番の着手点ならび,[_着手|_手番の着手点ならび],_勝ち,_着手ならび). 選択(_着手可能点文字列,_着手,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,_開始位置,1,_残り文字数,_着手), 着手以外の文字列を残り着手可能点文字列とする(_着手可能点文字列,_開始位置,_残り文字数,_残り着手可能点文字列). 着手以外の文字列を残り着手可能点文字列とする(_着手可能点文字列,_前文字列長,_後文字列長,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,0,_前文字列長,_,_前文字列), 副文字列(_着手可能点文字列,_,_後文字列長,0,_後文字列), 二つの文字列の結合(_前文字列,_後文字列,_残り着手可能点文字列). 勝ちになっている(_着手ならび) :- 勝ち(_文字列), 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび). 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび) :- すべて(副文字列(_文字列,_,1,_,_文字),含まれる(_文字,_着手ならび)). 出力(_手順) :- 文字列ならびを結合して出力し改行する(_手順). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列) :- sub_atom(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列). 文字列ならびを結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 二つの文字列の結合(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 含まれる(_要素,_ならび) :- member(_要素,_ならび). すべて(P,Q) :- forall(P,Q). 文字列ならびを結合して出力し改行する(_文字列ならび) :- atomic_list_concat(_文字列ならび,_結合した文字列), writef('%t\n',[_結合した文字列]). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #729 # # お題:○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。 # # 列者臨 # 在皆兵 # 前陣闘 # 勝ち(列者臨). 勝ち(在皆兵). 勝ち(前陣闘). 勝ち(列在前). 勝ち(者皆陣). 勝ち(臨兵闘). 勝ち(列皆闘). 勝ち(臨皆前). '○×ゲーム'(_勝ち,_着手ならび) :- 交互着手(臨兵闘者皆陣列在前,○,×,[],[],_勝ち,_着手ならび). 交互着手(_,_,_手番,_,_手番の着手点ならび,_手番,[]) :- 勝ち(_手番の着手点ならび),!. 交互着手(_着手可能点文字列,_手番,_次の手番,_手番の着手点ならび,_次の手番の着手点ならび,_勝ち,[_着手|_着手ならび]) :- 選択(_着手可能点文字列,_着手,_残り着手可能点文字列), 交互着手(_残り着手可能点文字列,_次の手番,_手番,_次の手番の着手点ならび,[_着手|_手番の着手点ならび],_勝ち,_着手ならび). 選択(_着手可能点文字列,_着手,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,_開始位置,1,_残り文字数,_着手), 着手以外の文字列を残り着手可能点とする(_着手可能点文字列,_開始位置,_残り文字数,_残り着手可能点文字列). 着手以外の文字列を残り着手可能点文字列とする(_着手可能点文字列,_前文字列長,_後文字列長,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,0,_前文字列長,_,_前文字列), 副文字列(_着手可能点文字列,_,_後文字列長,0,_後文字列), 二つの文字列の結合(_前文字列,_後文字列,_残り着手可能点文字列). 勝ち(_着手ならび) :- 勝ち(_文字列), 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび). 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび) :- 全ての第一引数の実行に対して第二引数の実行が必ず成立する(副文字列(_文字列,_,1,_,文字),含まれる(_文字,_着手ならび)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列) :- sub_atom(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列). 二つの文字列の結合(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 含まれる(_要素,_ならび) :- member(_要素,_ならび). 全ての第一引数の実行に対して第二引数の実行が必ず成立する(_第一引数,_第二引数) :- forall(_第一引数,_第二引数). % 以下のサイトは # 出典 :: プログラミングのお題スレ3 #623 # お題:1のビットが3個ある二進表記文字列が与えられたとき、次に大きい # 1のビットが3個ある二進表記文字列を求める。 # 例 # 111 -> 1011 # 1110 -> 10011 # 101100 -> 110001 '1のビットが3個ある二進表記文字列が与えられたとき、次に大きい1のビットが3個ある二進表記文字列を求める。'(_1のビットが3個ある二進表記文字列,_次に大きい1のビットが3個ある二進表記文字列) :- 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_探索した数字ならび), '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(_探索した数字ならび,_次に大きい1のビットが3個ある二進表記文字列),!. 先頭に0を付加した二進表記文字列で探索する(_1のビットが3個ある二進表記文字列,_生成された数字ならび) :- atom_concat('0',_1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字列), atom_chars(_先頭に0を付加した1のビットが3個ある二進表記文字列,_先頭に0を付加した1のビットが3個ある二進表記文字ならび), 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび), _生成された数字ならび @> _先頭に0を付加した1のビットが3個ある二進表記文字ならび. 順列で数字ならびを生成する(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_生成された数字ならび) :- length(_先頭に0を付加した1のビットが3個ある二進表記文字ならび,_要素数), '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび), 順列(_最後の3要素だけ数字1それより前は数字0のならび,_要素数,_生成された数字ならび). '最後の3要素だけが数字1、それより前は数字0のならび'(_要素数,_最後の3要素だけ数字1それより前は数字0のならび) :- length(_最後の3要素だけ数字1それより前は数字0のならび,_要素数), append(_全ての要素が数字0のならび,['1','1','1'],_最後の3要素だけ数字1それより前は数字0のならび), 全ての要素が数字0のならび(_全ての要素が数字0のならび). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['0'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(L,_次に大きい1のビットが3個ある二進表記文字列). '先頭が数字0の場合はそれを削除してから、数字1の場合はそのまま文字列に変換する'(['1'|L],_次に大きい1のビットが3個ある二進表記文字列) :- atomic_list_concat(['1'|L],_次に大きい1のビットが3個ある二進表記文字列). 全ての要素が数字0のならび([]). 全ての要素が数字0のならび(['0'|_全ての要素が数字0のならび]) :- 全ての要素が数字0のならび(_全ての要素が数字0のならび). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(1,[],_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L,L) :- _数値 > 100,!. '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値,L1,L) :- 出現順に挿入整列する(_数値,L1,L2), _数値_2 is _数値 + 1, '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_数値_2,L2,L). 出現順に挿入整列する(_数値,L1,L2) :- atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置), 挿入整列する(_開始位置,_数値,L1,L2). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 挿入整列する(_開始位置,_数値,[],[[_開始位置,_数値]]). 挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R],[[_開始位置,_数値],[_開始位置_1,_数値_1]|R]) :- _開始位置 =< _開始位置_1,!. 挿入整列する(_開始位置,_数値,[[_開始位置_1,_数値_1]|R1],[[_開始位置_1,_数値_1]|R2]) :- 挿入整列する(_開始位置,_数値,R1,R2). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/435 # お題:1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は # 元のデータの順に)表示する。 '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)表示する。' :- '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), チャンパーノウン定数に出現(_数値定数,_開始位置)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). チャンパーノウン定数に出現(_数値定数,_開始位置) :- チャンパーノウン定数の生成(1,'0.1',_チャンパーノウン定数), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数),!. チャンパーノウン定数の生成(_数値,_チャンパーノウン定数,_チャンパーノウン定数). チャンパーノウン定数の生成(_数値_1,_チャンパーノウン定数_1,_チャンパーノウン定数) :- _数値_2 is _数値_1 + 1, atom_number(_数値定数,_数値_2), atom_concat(_チャンパーノウン定数_1,_数値定数,_チャンパーノウン定数_2), チャンパーノウン定数の生成(_数値_2,_チャンパーノウン定数_2,_チャンパーノウン定数). 表示する(_整列した_開始位置_数値ならび) :- forall(member([_,_数値],_整列した_開始位置_数値ならび),writef('%t\n',[_数値])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357191974/198 # # お題:チャンパーノウン定数を表示せよ。 # 表示された文字列中に"991"を一つだけ含むこと。 'お題:チャンパーノウン定数を表示せよ。 表示された文字列中に"991"を一つだけ含むこと。' :- 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(1,'0.'). 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- count(sub_atom(A,_,3,_,'991'),2),!,fail. 'チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N,A) :- atom_number(B,N), atom_concat(A,B,C), '表示された文字列中に"991"を一つだけ含むこと。'(N,C). '表示された文字列中に"991"を一つだけ含むこと。'(N,_チャンパーノウン定数) :- '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数), writef('%t\n',[_チャンパーノウン定数]). '表示された文字列中に"991"を一つだけ含むこと。'(N,C) :- N_2 is N + 1, チャンパーノウン定数を表示せよ。表示された文字列中に"991"を一つだけ含むこと。'(N_2,C,_チャンパーノウン定数). '文字列中に"991"を一つだけ含むこと。'(_チャンパーノウン定数) :- count(sub_atom(_チャンパーノウン定数,_,3,_,'991'),1). count(P,N) :- findall(1,P,L), length(L,Count). % 以下のサイトは '1点交叉'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2) :- '1点交叉は,単純交叉とよばれる最も単純な交叉規則である。1点交叉では,親1,親2の文字列上で交叉点"|"をランダムに1箇所選び,交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2). '1点交叉は,単純交叉とよばれる最も単純な交叉規則である。1点交叉では,親1,親2の文字列上で交叉点"|"をランダムに1箇所選び,交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点をランダムに1箇所選び、'(_親1,_親2,_交叉点), '交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_交叉点,_1点交叉後の親1,_1点交叉後の親2). '交叉点をランダムに1箇所選び、'(_親1,_親2,_交叉点) :- length(_親1,_長さ1), length(_親2,_長さ2), '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点). '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点) :- _長さ1 =< _長さ2, _交叉点 is random(_長さ1),!. '交叉点をランダムに1箇所選び、'(_親1,_長さ1,_親2,_長さ2,_交叉点) :- _交叉点 is random(_長さ2). '交叉点の右側の2つの親の部分文字列をそっくりそのまま交換して,子1,子2を生成する。'(_親1,_親2,_交叉点,_1点交叉後の親1,_1点交叉後の親2) :- '交叉点の右側の2つの親の部分文字列を'(_親1,_親2,_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列), 'そっくりそのまま交換して,子1,子2を生成する。'(_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列,_1点交叉後の親1,_1点交叉後の親2). '交叉点の右側の2つの親の部分文字列を'(_親1,_親2,_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列) :- sub_atom(_親1,0,_交叉点,_残り長さ1,_親1の前半文字列), sub_atom(_親1,_交叉点,_残り長さ1,0,_親1の後半文字列), sub_atom(_親2,0,_交叉点,_残り長さ2,_親2の前半文字列), sub_atom(_親2,_交叉点,_残り長さ2,0,_親2の後半文字列). 'そっくりそのまま交換して,子1,子2を生成する。'(_親1の前半文字列,_親1の後半文字列,_親2の前半文字列,_親2の後半文字列,_1点交叉後の親1,_1点交叉後の親2) :- atom_concat(_親1の前半文字列,_親2の後半文字列,_1点交叉後の親1), atom_concat(_親2の前半文字列,_親1の後半文字列,_1点交叉後の親2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 165代目 #32 # 総当りをする関数を作成して下さい # # VC++2010 # Windows Vista Home SP2 # # 例 # 第1引数 総当りの初めの文字 # 第2引数 総当りの最後の文字 # 第3引数 総当りする桁数 # func('a', 'z', 3); # とした時の動作は # aaa〜zzz、aa〜zz、a〜z # の全てを出力するようにしたいです # # よろしくお願いします # # 総当り(_総当りの初めの文字,_総当りの最後の文字,_総当りする桁数,_総当り) :- 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび), 総当り(_総当りする桁数,_文字ならび,_総当り). 総当り(1,_文字ならび,_文字ならび). 総当り(_桁数,_文字ならび,_総当り) :- _桁数 > 1, _桁数_1 is _桁数 - 1, 総当り(_桁数_1,_文字ならび,_総当り_2), 総当り_2(_文字ならび,_総当り_2,_総当り). 総当り_2(_文字ならび,_総当り_2,_総当り) :- findall(_文字列,( member(_文字_1,_文字ならび), member(_文字列_2,_総当り_2), atom_concat(_文字_1,_文字列_2,_文字列)), _総当り_1), append(_総当り_1,_総当り_2,_総当り). 文字ならびを確定する(_総当りの初めの文字,_総当りの最後の文字,_文字ならび) :- char_code(_総当りの初めの文字,_総当りの初めの文字コード), char_code(_総当りの最後の文字,_総当りの最後の文字コード), findall(_文字,( between(_総当りの初めの文字コード,_総当りの最後の文字コード,_文字コード), char_code(_文字,_文字コード)), _文字ならび). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1364700745/961 # # 【質問テンプレ】 # [1] 授業単元:c言語 # [2] 問題文(含コード&リンク):右に示すように1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。 # 右に示されている図 # 整数の入力してください:25 # 1234567890123456789012345 # '1234567890を繰り返し表示するプログラムを作成せよ。なお、表示する数字は読み込まれた整数値の個数とする。' :- 整数を得る(整数,true,_個数), length(Ln,_個数), '1234567890を繰り返し表示する'(Ln,'1234567890'). '1234567890を繰り返し表示する'([],_). '1234567890を繰り返し表示する'([_|Ln],_文字列) :- 文字列の回転(_文字列,_先頭文字,_回転した文字列), write(_先頭文字), '1234567890を繰り返し表示する'(Ln,_回転した文字列). 文字列の回転(_文字列,_先頭文字,_回転した文字列) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,1,_,0,_二文字目以降文字列), atom_concat(_二文字目以降文字列,_先頭文字,_回転した文字列), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1367772345/105 # # 103じゃないけど、yieldを使ってジェネレータが書ける こんな感じで # # def product(xss): # if xss: # for x in xss[0]: # for y in product(xss[1:]): # yield x + y # else: # yield '' # # print(','.join(product(['abc', 'xy', '12']))) #=> ax1,ax2,ay1,ay2,bx1,bx2,by1,by2,cx1,cx2,cy1,cy2 # # 106 :デフォルトの名無しさん :sage :2013/05/07(火) 07:27:40.99 # 普通の3重ループじゃ駄目なの? # # 107 :デフォルトの名無しさん :sage :2013/05/07(火) 07:30:37.41 # # # >>106 # ループ数は引数のリストの長さで決まるから、 # 再帰を使った方が書きやすいよ # # 108 :デフォルトの名無しさん :sage :2013/05/07(火) 07:58:37.14 # >>106 # n重ループ # # 109 :デフォルトの名無しさん :sage :2013/05/07(火) 08:27:20.88 # やっぱpythonのjoinはちょっと気持ち悪いな # List.joinでいいじゃんと思ってしまう # 設計思想的にこうなんだろうけど # # 110 :デフォルトの名無しさん :sage :2013/05/07(火) 08:54:06.01 # List.joinでは手続き的すぎて古臭いって思想か # ジェネレータもそれかな # ただの軽量スレッドでは面白くないからジェネレータなのだ # # 111 :デフォルトの名無しさん :sage :2013/05/07(火) 10:25:49.03 # ジェネレータで書けるものを再帰で再現するとスタックの無駄遣いで # 再帰の方が非効率だと思う # # > % Prologでジェネレータ書いてみる。やはり再帰でしか書けない。 product([_文字列],_一文字) :-     sub_atom(_文字列,_,1,_,_一文字). product([_文字列|R1],_生成文字列) :-     sub_atom(_文字列,_,1,_,_一文字),     product(R1,_生成文字列_2),     atom_concat(_一文字,_生成文字列_2,_生成文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1367772345/105 # # 103じゃないけど、yieldを使ってジェネレータが書ける こんな感じで # # def product(xss): # if xss: # for x in xss[0]: # for y in product(xss[1:]): # yield x + y # else: # yield '' # # print(','.join(product(['abc', 'xy', '12']))) #=> ax1,ax2,ay1,ay2,bx1,bx2,by1,by2,cx1,cx2,cy1,cy2 # # 106 :デフォルトの名無しさん :sage :2013/05/07(火) 07:27:40.99 # 普通の3重ループじゃ駄目なの? # # 107 :デフォルトの名無しさん :sage :2013/05/07(火) 07:30:37.41 # # # >>106 # ループ数は引数のリストの長さで決まるから、 # 再帰を使った方が書きやすいよ # # 108 :デフォルトの名無しさん :sage :2013/05/07(火) 07:58:37.14 # >>106 # n重ループ # # 109 :デフォルトの名無しさん :sage :2013/05/07(火) 08:27:20.88 # やっぱpythonのjoinはちょっと気持ち悪いな # List.joinでいいじゃんと思ってしまう # 設計思想的にこうなんだろうけど # # 110 :デフォルトの名無しさん :sage :2013/05/07(火) 08:54:06.01 # List.joinでは手続き的すぎて古臭いって思想か # ジェネレータもそれかな # ただの軽量スレッドでは面白くないからジェネレータなのだ # # 111 :デフォルトの名無しさん :sage :2013/05/07(火) 10:25:49.03 # ジェネレータで書けるものを再帰で再現するとスタックの無駄遣いで # 再帰の方が非効率だと思う # # # yield from 使ってみたくて使ったけど不要だった # # def product(xss): # return (x + y for x in xss[0] for y in product(xss[1:])) if xss else [''] % Prologでジェネレータ書いてみる。やはり再帰でしか書けない。 'def product(xss): if xss: for x in xss[0]: for y in product(xss[1:]): yield x + y else: yield '''' '(_文字列ならび,_生成文字列) :- 'Prologでジェネレータを書いてみる'(_文字列ならび,_生成文字列). 'def product(xss): return (x + y for x in xss[0] for y in product(xss[1:])) if xss else ['''']'(_文字列ならび,_生成文字列) :- 'Prologでジェネレータを書いてみる'(_文字列ならび,_生成文字列). 'Prologでジェネレータ書いてみる'([_文字列],_一文字) :- sub_atom(_文字列,_,1,_,_一文字). 'Prologでジェネレータ書いてみる'([_文字列|R1],_生成文字列) :- sub_atom(_文字列,_,1,_,_一文字), 'Prologでジェネレータ書いてみる'(R1,_生成文字列_2), atom_concat(_一文字,_生成文字列_2,_生成文字列). % % 'def product(xss): % if xss: % for x in xss[0]: % for y in product(xss[1:]): % yield x + y % else: % yield '''' '([abc,xy,'12'],X). % % X = ax1; % X = ax2; % X = ay1; % X = ay2; % X = bx1; % X = bx2; % X = by1; % X = by2; % X = cx1; % X = cx2; % X = cy1; % X = cy2; % no % % ?- 'Prologでジェネレータ書いてみる'([abc,xy,'12'],X). % % X = ax1; % X = ax2; % X = ay1; % X = ay2; % X = bx1; % X = bx2; % X = by1; % X = by2; % X = cx1; % X = cx2; % X = cy1; % X = cy2; % no % % ?- % 以下のサイトは # 出典 :: #717 # [1] 授業単元: C演習 # [2] 問題文(含コード&リンク): # (問題文)http://imgur.com/bAeG1 # (途中まで書いたコード)://codepad.org/nwwt2hgU # (使用するテキストファイル、結果含む) # http://s2.muryo-de.mydns.jp/~c_cpp_homework/cgi-bin/joyful/joyful.cgi? のNo.396 # :- dynamic(転置索引/2). テキストのダウンロード(_サイトのファイル名,_出力ファイル名) :- atomic_list_concat(['w3m -dump ',_サイトのファイル名],S), popen(S,Chars), open(_出力ファイル名,write,Outstream), ファイルに書き込む(Outstream,Chars), close(Outstream). ファイルに書き込む(Outstream,[]). ファイルに書き込む(Outstream,[C|R]) :- put_char(Outstream,C), ファイルに書き込む(Outstream,R). 転置索引を作る(_ファイル名) :- open(_ファイル名,read,Instream), ストリームから転置索引を作る(Instream,0), close(Instream). ストリームから転置索引を作る(Instream,_) :- at_end_of_stream(Instream),!. ストリームから転置索引を作る(Instream,N) :- get_line(Instream,Line), N_2 is N + 1, 語彙を転置索引に登録する(Line,N), ストリームから転置索引を作る(Instream,N_2). 語彙を転置索引に登録する(Line,N) :- split(Line,[' ',',','.',':','(',')'],L), member(_語彙,L), \+(転置索引(_語彙,N)), assertz(転置索引(_語彙,N)), fail. 語彙を転置索引に登録する(_,_). popen(Command,Chars) :- open(pipe(Command),read,Instream), get_char(Instream,Char), popen(Instream,Char,Chars), close(Instream),!. popen(Instream,end_of_file,[]) :- !. popen(Instream,Char,[Char|R]) :- get_char(Instream,Char2), popen(Instream,Char2,R). shs(Command,X) :- popen(Command,L), shs_3(L,X). shs_3(L,[S|R]) :- append(L0,['\n'|R1],L), atom_chars(S,L0), shs_3(R1,R). shs_3([],[]) :- !. shs_3(L,[S]) :- atom_chars(S,L). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R). 区切り文字残し項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切り文字残しに区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 区切り文字残し項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切り文字残しに区切って行く(_文字列,_区切り文字列ならび,[_前文字列,_区切り文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 区切り文字残し項目区切り(_後文字列,_区切り文字列ならび,R). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/542 # # 引数にchar 型の配列を2つとし,2つの # 配列に代入された文字列をスペースをはさ # んでつなげた配列を戻り値とする関数を作 # 成せよ. # # # これ誰か教えてー。 # # '引数にchar 型の配列を2つとし,2つの配列に代入された文字列をスペースをはさんでつなげた配列を戻り値とする関数を作成せよ.'(_文字列1,_文字列2,_文字列) :- atom_concat(_文字列1,_文字列2,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/496 # # [1] C言語プログラミング2 # [2] 問題1・入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 # 問題2・また、文字列1、文字列2を入力し、それぞれから一文字ずつ交互に読み取った結果を文字列として出力するプログラムを作成せよ。 # 条件1・500文字前後の文字列を扱えるようにせよ。 # 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) # 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 # 問題1・例 # 文字列・abcdefghijklm # ↓ # 文字列1・acegikm # 文字列2・bdfhjl # # 問題2・例 # 文字列1・acegikm # 文字列2・bdfhjl # ↓ # 文字列・abcdefghijklm # '入力した文字列から文字を一文字ずつ交互に読み取り、文字列1、文字列2として結果を出力するプログラムを作成せよ。 条件1・500文字前後の文字列を扱えるようにせよ。 条件2・問題1の文字列が奇数の場合は文字列1の側に奇数で余った一文字を入れること。(問題2の文字列1が一文字多い場合読み取りを忘れないように) 条件3・扱う文字列は半角英数記号のみとする。全角文字は考慮しなくてよい。 問題1・例 文字列・abcdefghijklm ↓ 文字列1・acegikm 文字列2・bdfhjl' :- '入力した文字列から'(_入力した文字列), '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_入力した文字列,_文字列1,_文字列2), 結果を出力する(_入力した文字列,_文字列1,_文字列_2). 入力した文字列から(_入力した文字列) :- write('文字列を入力してください : '), get_line(_入力した文字列). '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'('','',''). '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_文字列,_文字列1,_文字列2) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_文字列3), '文字を一文字ずつ交互に読み取り、文字列1、文字列2として'(_文字列3,_文字列2,_文字列4), atom_concat(_文字,_文字列4,_文字列1). get_line(_文字列) :- read_line_to_codes(user_input,Codes), atom_codes(_文字列,Codes). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/386 # # 二つの2×3型行列を # A=1.1 -2.2 0.9 #  -0.2  2.7 0.3 # # B= 1.8 0.5 1.3 # -0.4 0.6 -0.3 # と定義する。 # # これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して # 2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 # 配列とし、関数内の演算を行うこと # # 上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 # 形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは # なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で # 演算を行うこと。 # # # だれかこのプログラムおしえてくださいm(_ _)m # # '行列A、Bを用いて、積C≡ABt を算出し、2×2型の表形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのではなく、Bより作成すること。'(A,B,C) :- 転置(B,Bt), 行列の掛算_1(A,Bt,C), '2×2型の表形式で出力せよ'(C). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2) . 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 行列の掛算_1([],_,[]) :- !. 行列の掛算_1([A|R1],L,[S1|R3]) :- 行列の掛算_2(A,L,S1), 行列の掛算_1(R1,L,R3). 行列の掛算_2(_,[],[]) :- !. 行列の掛算_2(A,[B|R2],[C|R3]) :- 行列の掛算_3(A,B,C), 行列の掛算_2(A,R2,R3). 行列の掛算_3([],[],0) :- !. 行列の掛算_3([A|R1],[B|R2],S) :- 分数を含む掛算(A,B,S1), 行列の掛算_3(R1,R2,S2), 分数を含む加算(S1,S2,S),!. 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(0,_,0) :- !. 約分の二(0.0,_,0) :- !. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). '2×2型の表形式で出力せよ'(LL) :- 'M×Nの表形式で出力する'(2,2,LL). 'M×Nの表形式で出力する'(M,N,LL) :- 'N列カンマ区切り行表示形式'(N,_行表示形式), nth1(_nth1,LL,L), writef(_行表示形式,L), _nth1 = M. 'N列カンマ区切り行表示形式'(N,_行表示形式) :- findall('%t',between(1,N,_),PL), atomic_list_concat(PL,',',S1), atom_concat(S1,'\n',_行表示形式). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/386 # # 二つの2×3型行列を # A=1.1 -2.2 0.9 #  -0.2  2.7 0.3 # # B= 1.8 0.5 1.3 # -0.4 0.6 -0.3 # と定義する。 # # これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して # 2×3型の表形式で出力するプログラムを作成せよ。ただし、行列CとDは固定長 # 配列とし、関数内の演算を行うこと # # 上記の問題と同じように行列A、Bを用いて、積C≡ABt を算出し、2×2型の表 # 形式で出力せよ。ただし、Bの転置行列、Btはプログラム中に直接記述するのでは # なく、Bより作成すること。また、Cはnew演算子によりメモリを確保し、関数内で # 演算を行うこと。 # # # だれかこのプログラムおしえてくださいm(_ _)m # # '二つの2×3型行列を A=1.1 -2.2 0.9  -0.2  2.7 0.3 B= 1.8 0.5 1.3 -0.4 0.6 -0.3 と定義する。 これらの二つの行列の宣言、初期化し、C≡A+B C≡A-Bを算出して 2×3型の表形式で出力する' :- これらの二つの行列の宣言(A,B), 'C≡A+B C≡A-Bを算出して'(A,B,C), '2×3型の表形式で出力する'(C), '2×3型の表形式で出力する'(D). これらの二つの行列の宣言(A,B) :- A = [[1.1,-2.2,0.9],[-0.2,2.7,0.3]], B = [[1.8,0.5,1.3],[-0.4,0.6,-0.3]]. 'C≡A+B C≡A-Bを算出して'(A,B,C) :- 行列の和(A,B,C), 行列の差(A,B,D). 行列の和([],[],[]). 行列の和([L1|R1],[L2|R2],[L3|R3]) :- 行の和(L1,L2,L3), 行列の和(R1,R2,R3). 行の和([],[],[]). 行の和([A|R1],[B|R2],[C|R3]) :- 分数を含む加算(A,B,C), 行の和(R1,R2,R3). 行列の差([],[],[]). 行列の差([L1|R1],[L2|R2],[L3|R3]) :- 行の差(L1,L2,L3), 行列の差(R1,R2,R3). 行の差([],[],[]). 行の差([A|R1],[B|R2],[C|R3]) :- B_1 is B * (-1). 分数を含む加算(A,B_1,C), 行の差(R1,R2,R3). 分数を含む加算(A1 / A2,B1 / B2,C) :- S1 is A1 * B2 + A2 * B1, S2 is A2 * B2, 約分(S1 / S2,C),!. 分数を含む加算(A1 / A2,B,C) :- S1 is A1 + A2 * B, 約分(S1 / A2,C),!. 分数を含む加算(A,B1 / B2,C) :- S1 is B1 + B2 * A, 約分(S1 / B2,C),!. 分数を含む加算(A,B,C) :- C is A + B. 約分(B / A,X) :- 最大公約数(B,A,C), _分子 is B // C, _分母 is A // C, 約分の二(_分子,_分母,X),!. 約分の二(0,_,0) :- !. 約分の二(0.0,_,0) :- !. 約分の二(_分子,1,_分子) :- !. 約分の二(_分子,1.0,_分子) :- !. 約分の二(_分子,_分母,_分子 / _分母). 最大公約数(M,N,X) :- 最大公約数をユークリッドの互除法で求める(M,N,X),!. 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X). '2×3型の表形式で出力する'(LL) :- 'M×Nの表形式で出力する'(2,3,LL). 'M×Nの表形式で出力する'(M,N,LL) :- 'N列カンマ区切り行表示形式'(N,_行表示形式), nth1(_nth1,LL,L), writef(_行表示形式,L), _nth1 = M. 'N列カンマ区切り行表示形式'(N,_行表示形式) :- findall('%t',between(1,N,_),PL), atomic_list_concat(PL,',',S1), atom_concat(S1,'\n',_行表示形式). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 160代目 #603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 このtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), 'ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'(LL). 'ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'(LL) :- open('書き換え.txt',write,_出力), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(_出力,LL), close(_出力). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(_出力,[]) :- !. ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(_出力,[[_|L]|R) :- 左から順に番号を振った上で要素が0のものを削除し出力する(_出力,L), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し出力する(_出力,R). 左から順に番号を振った上で要素が0のものを削除し出力する(_出力,L) :- 要素が0のものを削除し全要素出力する(_出力,L), 改行する(_出力). 要素が0のものを削除し全要素出力する(_出力,L) :- forall(nth1(_nth1,L,N),要素が0のものを削除し出力する(_出力,_nth,N)). 改行する(_出力) :- write('\n'). 要素が0のものを削除し出力する(_出力,_,0) :- !. 要素が0のものを削除し出力する(_出力,_nth1,N) :- 出力する(_出力,_nth1,N). 出力する(_出力,_nth1,N) :- swritef(A,'%w:%w ',[_nth1,N]), write(_出力,A). get_split_lines(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび). ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- open(_ファイル,read,_入力), '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび). '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび) :- findall(_項目区切り行,( at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行)),_項目区切り行ならび). at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行) :- at_end_of_streamになるまで行入力(_入力,_行), 数値変換項目区切り(_行,_区切り文字列ならび,_項目区切り行). at_end_of_streamになるまで行入力(_入力,_行) :- at_end_of_stream(_入力),!,close(_入力),fail. at_end_of_streamになるまで行入力(_入力,_行) :- 一行ずつ入力を続ける(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- 行入力(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- at_end_of_streamになるまで行入力(_入力,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 160代目 #603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 このtxtファイルを読み取って ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し左から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), open('書き換え.txt',write,_出力), ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し表示する(_出力,LL), close(_出力). ファイル名を削除し左から順に番号を振った上で要素が0のものを削除し表示する(_出力,LL) :- ファイル名を削除し左から順に番号を振った上で(LL,Nth,N,_残り行要素,_残り項目要素), 要素が0のものを削除し表示する(_出力,Nth,N), '_残り行要素が[]になったら終了する。_残り項目要素が[]の時は改行を入れる'(_出力). '_残り行要素が[]になったら終了する。_残り項目要素が[]の時は改行を入れる'(_出力,_残り行要素,_残り項目要素) :- _残り項目要素 = [], write(_出力,'\n'), _残り行要素 = []. ファイル名を削除し左から順に番号を振った上で(LL,Nth,N,_残り行要素,_残り項目要素) :- append(_,[[_|L]|_残り行要素],LL), append(L0,[N|_残り項目要素],L), length([_|L0],Nth). 要素が0のものを削除し表示する(_出力,Nth,0) :- !. 要素が0のものを削除し表示する(_出力,Nth,A) :- writef(_出力,'%t:%t ',[Nth,A]). get_split_lines(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび). ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- open(_ファイル,read,_入力), '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび). '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび) :- findall(_項目区切り行,( at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行)),_項目区切り行ならび). at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行) :- at_end_of_streamになるまで行入力(_入力,_行), 数値変換項目区切り(_行,_区切り文字列ならび,_項目区切り行). at_end_of_streamになるまで行入力(_入力,_行) :- at_end_of_stream(_入力),!,close(_入力),fail. at_end_of_streamになるまで行入力(_入力,_行) :- 一行ずつ入力を続ける(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- 行入力(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- at_end_of_streamになるまで行入力(_入力,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 160代目 #603 # [1]C/C++プログラミング実習  # [2]問題 http://ime.nu/codepad.org/IbHwR87p # [3]visual studio 2010 # [4]11月12日 10時 # [5]ファイルを読み取って書き換えてtxtファイルに出力するというものですが #   私には難しすぎてわかません。どなたか助けてくれれば幸いです。 # # /* # あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 # # 例 # caltech10/accordion-0001.jpg 1 0 2 0 1 0... # caltech10/accordion-0002.jpg 1 2 7 0 0 3... # caltech10/accordion-0003.jpg 0 0 2 199 0 3... # caltech10/accordion-0004.jpg 0 0 0 0 5 1... # ・ # ・ # このtxtファイルを読み取って # ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え # txtファイルに出力するプログラムを作れ。 # # 実行例 # 1:1 3:2 5:1… # 1:1 2:2 3:7 6:3… # 3:2 4:199 6:3.... # 5:5 … # # 必ず 番号:数値?番号:数値?番号:数値?… # という形にすること # # */ # 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。 このtxtファイルを読み取って ファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換え txtファイルに出力する' :- 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する'. 'あるtxtファイルにファイル名とランダムな数字で書かれた多数の数列がある。このtxtファイルを読み取ってファイル名を削除し右から順に番号を振った上で要素が0のものを削除し書き換えtxtファイルに出力する' :- get_split_lines('あるファイル.txt',[' '],LL), ファイル名を削除し(LL,LL1), 右から順に番号を振った上で(LL1,LL2), 要素が0のものを削除し書き換え(LL2,LL3), 書き換えtxtファイルに出力する(LL3). ファイル名を削除し([],[]). ファイル名を削除し([[_|L1]|R1],[L1|R2]) :- ファイル名を削除し(R1,R2). 右から順に番号を振った上で([],[]). 右から順に番号を振った上で([L1|R1],[L2|R2]) :- findall(N-A,( append(_,[A|R],L1), length([_|R],N)),L2), 右から順に番号を振った上で(R1,R2). 要素が0のものを削除し書き換え([],[]). 要素が0のものを削除し書き換え([N-0|R1],R2) :- 要素が0のものを削除し書き換え(R1,R2). 要素が0のものを削除し書き換え([N:A|R1],[N-A|R2]) :- \+(A = 0), 要素が0のものを削除し書き換え(R1,R2). 書き換えtxtファイルに出力する(LL3) :- open('書き換え.txt',write,Outstream), append(_,[L|R],LL3), 行要素を出力する(Ountstream,L), R = [], close(Outstream). 行要素を出力する(Outstream,[]) :- writef(Outstream,'\n'). 行要素を出力する(Outstream,[N:A|R]) :- writef(Outstream,'%t:%t ',[N,A]), 行要素を出力する(Outstream,R). get_split_lines(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび). ファイルの各行を項目区切りしてならびとする(_ファイル,_区切り文字列ならび,_項目区切り行ならび) :- open(_ファイル,read,_入力), '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび). '_入力の各行を項目区切りしてならびとする'(_入力,_区切り文字列ならび,_項目区切り行ならび) :- findall(_項目区切り行,( at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行)),_項目区切り行ならび). at_end_of_streamになるまで得られる行を項目区切りする(_入力,_区切り文字列ならび,_項目区切り行) :- at_end_of_streamになるまで行入力(_入力,_行), 数値変換項目区切り(_行,_区切り文字列ならび,_項目区切り行). at_end_of_streamになるまで行入力(_入力,_行) :- at_end_of_stream(_入力),!,close(_入力),fail. at_end_of_streamになるまで行入力(_入力,_行) :- 一行ずつ入力を続ける(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- 行入力(_入力,_行). 一行ずつ入力を続ける(_入力,_行) :- at_end_of_streamになるまで行入力(_入力,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # [1]プログラム演習 # [2] # 一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 # ただし、以下での単語とは空白以外の文字からなる列のこととする。 # 1,s中の単語は同じ順番で t に現われる # 2,t中では単語は一つの空白に区切られる # 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である # 例えば文字の列 # _This___is__a____good___program___ # を入力すると # ______This_is_a_good_program______ # が出力される。ここで、_は空白を表すものとする。 # [3]C言語 # [4]12/7 # [5]for,while,if文 ポインター 文字列 1,2次配列 関数の書き方 '一定の文字からなる列sを読み込み、以下の条件を満たす同じ個数の文字からなる列tを出力するプログラムを作りなさい。 ただし、以下での単語とは空白以外の文字からなる列のこととする。 1,s中の単語は同じ順番で t に現われる 2,t中では単語は一つの空白に区切られる 3,t中に最初の単語の最初の文字から最後の単語の文字までは列全体のちゅうおうに位置し、前後は空白である' :- '一定の文字からなる列sを読み込み、上記条件を満たす同じ個数の文字からなる列tを出力する'. '一定の文字からなる列sを読み込み、上記条件を満たす同じ個数の文字からなる列tを出力する' :- '一定の文字からなる列sを読み込み'(_s), tの語彙部を確定する(_s,_sの文字列長,_tの語彙部), tの語彙部の前後の文字列を確定する(_tの語彙部,_sの文字列長,_前の空白列,_後の空白列), tを出力する(_前の空白列,_空白を挟んだ連結した語彙,_後の空白列). tの語彙部を確定する(_s,_tの語彙部) :- atom_chars(_s,L_1), length(L_1,_sの文字列長), split(_s,[' '],_語彙ならび),  atomic_list_concat(_語彙ならび,' ',_tの語彙部). tの語彙部の前後の文字列を確定する(_tの語彙部,_sの文字列長,_前の空白列,_後の空白列) :- atom_length(_tの語彙部,_tの語彙部の長さ), _前後の空白合計 is _sの文字列長さ - _tの語彙部の長さ, length(_空白ならび,_前後の空白合計), all(_空白ならび,' '), 空白を割り振る(_空白ならび,_前の空白列,_後の空白列). 空白を割り振る(L,S,S) :- append(L1,L1,L), atomic_list_concat(L1,S),!. 空白を割り振る(L,S1,S2) :- append([_|L1],L1,L), atomic_list_concat(L1,S2), atom_concat(' ',S2,S1). tを出力する(_前の空白列,_空白を挟んだ連結した語彙,_後の空白列) :- atomic_list_concat([_前の空白列,_空白を挟んだ連結した語彙,_後の空白列],_t), writef('%t\n',[_t]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/323 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 西暦年数を与えて、その年の干支を求めるプログラムを作成せよ。 # 干支は、十干と十二支とをそろぞれサイクリックに変えながら組み合わせることによって60(10と12の最小公倍数)通りが得られる。 # 例:1989年は己巳。 # 基準年(1896). 基準年の干(丙). 基準年の支(申). '西暦年数を与えて、その年の干支を求める'(_西暦年,_干支) :- 基準年の干支を得る(_基準年,_基準年の干,_基準年の支), _何年後 is _西暦年 - _基準年, 干支(0,_何年後,_基準年の干,_基準年の支,_干支). 基準年の干支を得る(_基準年,_基準年の干,_基準年の支) :- 基準年(_基準年), 基準年の干(_基準年の干), 基準年の支(_基準年の支). 干支(_何年後,_何年後,_干,_支,_干支) :- atom_concat(_干,_支,_干支),!. 干支(_n年後_1,_何年後,_干_1,_支_1,_干支) :- 前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2), 干支(_n年後_2,_何年後,_干_2,_支_2,_干支). 前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :- _n年後_1 < 0, 前年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2). 前年または翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :- _n年後_1 >= 0, 翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2). 前年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :- _n年後_2 is _n年後_1 - 1, 十干巡回(_干_2,_干_1), 十二支巡回(_支_2,_支_1). 翌年の干支を得る(_n年後_1,_干_1,_支_1,_n年後_2,_干_2,_支_2) :- _n年後_2 is _n年後_1 + 1, 十干巡回(_干_1,_干_2), 十二支巡回(_支_1,_支_2). 十干巡回(甲,乙). 十干巡回(乙,丙). 十干巡回(丙,丁). 十干巡回(丁,戊). 十干巡回(戊,己). 十干巡回(己,庚). 十干巡回(庚,辛). 十干巡回(辛,壬). 十干巡回(壬,癸). 十干巡回(癸,甲). 十二支巡回(子,丑). 十二支巡回(丑,寅). 十二支巡回(寅,卯). 十二支巡回(卯,辰). 十二支巡回(辰,巳). 十二支巡回(巳,午). 十二支巡回(午,未). 十二支巡回(未,申). 十二支巡回(申,酉). 十二支巡回(酉,戌). 十二支巡回(戌,亥). 十二支巡回(亥,子). % 以下のサイトは # 出典 :: 正規表現 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桁の場合、0をつける。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桁],_置換されたファイル名). '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_削除開始文字,_削除終了の次の文字,_削除された文字列) :- '削除開始文字と終了の次の文字で指定された範囲を削除する'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列),!. '特定の文字(例では#)から特定の文字(例では-)の前までを削除したい'(_文字列,_,_,_文字列). '削除開始文字と終了の次の文字で指定された範囲を削除する'(_文字列,_削除開始文字,_削除終了の次の文字,_削除された文字列) :- '削除開始文字と終了の次の文字で指定された範囲を'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列), 削除する(_前文字列,_後文字列,_削除された文字列). '削除開始文字と終了の次の文字で指定された範囲を'(_文字列,_削除開始文字,_削除終了の次の文字,_前文字列,_後文字列) :- 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/1342966104/937 # # [1] 授業単元:マルチメディア実習 # [2] 問題文(含コード&リンク): # # 1. # 0x01, 0x02, 0x03, ・・・, 0x09, 0x0a, 0x0b, 0x0c の12バイトの内容を持つバイナリファイルを”ex1.bin”というファイル名で作成するCプログラムを書け. # 2.ex1.bin の内容を1バイトずつ読み出して,画面にprintfするCプログラムを書け # 3.ex1.bin をファイル先頭から int が3つ順に記録されたバイナリファイルと見なして読み出し,その3つのintの値を画面にprintfするCプログラムを書け.なぜそのような整数値になったか説明せよ. # 'ex1.bin の内容を1バイトずつ読み出して,画面に表示する' :- open('ex1.bin',read,Instream,[type(binary)]), 'ex1.bin の内容を1バイトずつ読み出して,画面に表示する'(Instream), close(Instream),!. 'ex1.bin の内容を1バイトずつ読み出して,画面に表示する'(Instream) :- at_end_of_stream(Instream), write('\n'),!. 'ex1.bin の内容を1バイトずつ読み出して,画面に表示する'(Instream) :- '1バイトずつ読み出して,画面に表示する'(Instream), 'ex1.binの内容を1バイトずつ読み出して,画面に表示する'(Instream). '1バイトずつ読み出して,画面に表示する'(Instream) :- get_byte(Instream,Code), byte_16進数文字列(Code,_16進表示文字列), writef('%x',[_16進表文字列]). byte_16進数文字列(N,_16進文字列) :- N_1 is N // 16, M is N mod 16, '0から15までの整数を1文字の16進数文字列に変換'(N_1,_16進文字列_1), '0から15までの整数を1文字の16進数文字列に変換'(M,_16進文字列_2), atom_concat(_16進文字列_1,_16進文字列_2,_16進文字列). '0から15までの整数を1文字の16進数文字列に変換'(N,_16進文字列) :- N =< 9, atom_number(_16進文字列,N),!. '0から15までの整数を1文字の16進数文字列に変換'(10,'a'). '0から15までの整数を1文字の16進数文字列に変換'(11,'b'). '0から15までの整数を1文字の16進数文字列に変換'(12,'c'). '0から15までの整数を1文字の16進数文字列に変換'(13,'d'). '0から15までの整数を1文字の16進数文字列に変換'(14,'e'). '0から15までの整数を1文字の16進数文字列に変換'(15,'f'). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 159代目 #463 # 休み中の課題なのですが、わからないので教えて頂きたいです。 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/vb7pZ # # 飲食店の6月分の帳簿データbook-6.datがテキストで書かれてあり、中身を見てみると #  左端から、日付 支出(1)/収入(0) 商品名 単価 数量 #  20120601 1 meat 125 10000 #  20120602 1 rice 2000 10 #  20120603 0 uriage 500 100 #  20120603 1 beer 140 24 # となっているものとする。  ただし、支出は1、収入は0とする。 # このようなデータを読み取って残高を計算するプログラムを作りたい。以下のプログラムをコンパイルが通り、 # 目的の動作をするように直接書き込んで補いなさい。(どこを補うべきかも考えること) # ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、 # 入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。 '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って残高を計算する。ただし、商品名は空白を含まない文字列とし、繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_残高表,_残高) :- '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(_全行区切りならび), '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金), 繰越金を付加して残高を計算する(_全行区切りならび,_繰越金,_残高表,_残高). '飲食店の6月分の帳簿データbook-6.datからテキストデータを読み取って'(_全行区切りならび) :- 全行区切り入力('book-6.dat',[' ',','],_全行区切りならび). '繰り越し金はキーボードから入力し、変数kurikoshikinに代入するが、入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金) :- 整数を得る(繰越金,_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金),!. '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金) :- writef('入力された繰越金 %t で間違いありませんか?\n間違いがなければ改行\n間違っていたら 正しい繰越金を入力してください : ',[_繰越金候補]), 行入力(_行), 間違いがあるならば何度でも入力しなおす(_行,_繰越金候補,_繰越金),!. 間違いがあるならば何度でも入力しなおす('',_繰越金,_繰越金) :- !. 間違いがあるならば何度でも入力しなおす(_行,_,_繰越金) :- 間違いがある, read_term_from_atom(_行,_繰越金候補,[variable_names(_variable_names),varables(_variables)]), integer(_繰越金候補), '入力後、その金額に間違いがないか確認するものとし、間違いがあるならば何度でも入力しなおすことができるものとする。'(_繰越金候補,_繰越金). 間違いがある. 繰越金を付加して残高を計算する(_全行区切りならび,_繰越金,[[_日付,0,繰越金,0,0,_繰越金]|_残高表],_残高) :- _全行区切りならび = [[_日付|_]|_], 残高を計算する(_全行区切りならび,_繰越金,_残高表,_残高). 残高を計算する([],_残高,[],_残高). 残高を計算する([[_日付,_支出または収入区分,_商品名,_単価,_数量]|R1],_残高_1,[[_日付,_支出または収入区分,_商品名,_単価,_数量,_残高_2]|R2],_残高) :- 支出または収入区分に従って行の計算(_残高_1,_支出または収入区分,_単価,_数量,_残高_2), 残高を計算する(R1,_残高_2,R2,_残高). 支出または収入区分に従って行の計算(_残高_1,1,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 - _単価 * _数量. 支出または収入区分に従って行の計算(_残高_1,0,_単価,_数量,_残高_2) :- _残高_2 is _残高_1 + _単価 * _数量. 全行区切り入力(_ファイル,_区切り文字列ならび,_全行区切りならび) :- 全行入力(_ファイル,_行ならび), findall(_区切り行,( member(_行,_行ならび), 区切り(_行,_区切り文字列ならび,_区切り行)),_全行区切りならび) . 全行入力(_ファイル,_行ならび) :- open(_ファイル,read,_入力), 行入力(_入力,_行), 行入力ならび(_入力,_行ならび), close(_入力). 行入力ならび(_入力,[]) :- at_end_of_stream(_入力),!. 行入力ならび(_入力,[_行|R]) :- 行入力(_入力,_行), 行入力ならび(_入力,R). 行区切り入力(_区切り文字列ならび,_語彙ならび) :- 行入力(_行), 区切り(_行,_区切り文字列ならび,_語彙ならび). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). 行入力(Instream,_行) :- read_line_to_codes(Instream,Codes), atom_codes(_行,Codes). 区切り('',_,[]) :- !. 区切り(_文字列,_区切り文字列ならび,[_前文字列|R]) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 区切り(_後文字列,_区切り文字列ならび,R),!. 区切り(_文字列,_区切り文字ならび,[_文字列]) :- \+(member(_文字列,_区切り文字ならび)),!. 区切り(_,_,[]). 副文字列(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_適合文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 158代目 #978 # [1] 授業単元:C言語演習 # [2] 問題文: # ../test/read.cgi/tech/1339338438/976のプログラムを修正して、メッセージ転送時間の平均値を計算するaverage関数を追加し、main関数側で平均メッセージ転送時間も出力するようにせよ。 # '実験データは、あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を出力する'(_実験データファイル) :- 実験データは(_実験データファイル,_実験データ行ならび), 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび). 実験データは(_実験データファイル,_実験データ行ならび) :- open(_実験データファイル,read,_入力), 実験データを読み取る(_入力,_実験データ行ならび), close(_入力). 実験データを読み取る(_入力,[]) :- at_end_of_stream(_入力),!. 実験データを読み取る(_入力,_実験データ行ならび) :- 実験データを読み取って行く(_入力,_実験データ行ならび). 実験データを読み取って行く(_入力,[_実験データ行|_実験データ行ならび]) :- 行入力(_入力,_実験データ行), 実験データを読み取る(_入力,_実験データ行ならび). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージ毎の転送時間を出力する'(_実験データ行ならび) :- 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を'(_実験データ行ならび,_転送時間の平均値), 出力する(_転送時間の平均値). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。メッセージの転送時間の平均値を'(_実験データ行ならび,_転送時間の平均値) :- findavg(_メッセージの転送時間,( 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。'(_実験データ行ならび,_メッセージの転送時間)),_転送時間の平均値). findavg(A,_副目標,_平均値) :- '_副目標の解を集めた時の_解の数と_合計'(A,_副目標,_解の数,_合計), _平均値 is _合計 / _解の数. '_副目標の解を集めた時の_解の数と_合計'(A,_副目標,_解の数,_合計) :- '_副目標の解を集めた時の'(A,_副目標,L), '_解の数と合計'(L,_解の数,_合計). '_副目標の解を集めた時の'(A,_副目標,L) :- findall(A,_副目標,L). '_解の数と合計'(L,_解の数,_合計) :- length(L,_解の数), sum_list(L,_合計). 'あるコンピュータAのメッセージ発生時刻と、そのメッセージが宛先コンピュータBに到着した時刻である。'(_実験データ行ならび,_メッセージの転送時間) :- member(_行文字列,_実験データ行ならび), メッセージ毎の転送時間(_行文字列,_メッセージの転送時間). メッセージ毎の転送時間(_行文字列,_メッセージの転送時間) :- 数値変換項目区切り(_行文字列,[' '],[_メッセージ番号,_メッセージの発生時刻,_メッセージの到達時刻]), _メッセージの転送時間 is _メッセージの到達時刻 - _メッセージの発生時刻. 出力する(_転送時間の平均値) :- writef('転送時間の平均値は %t 秒です\n',[_転送時間の平均値]). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは ?- 'a##'. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/938 # # [1] 授業単元: コンピュータプログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ideone.com/qvNtf # 2 # [問2] 国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから入力した後、それを表示したい。これについて、次の手順でkadai7-2.cを作成しなさい。 # 1)次の構造体を利用する。 # # struct SEISEKI { # char name[50]; # int kokugo; # int sugaku; # }; <ーセミコロンを忘れないように(慣れた人でも良く間違う) # # 2) 次の配列を用意する。 # struct SEISEKI score[3]; # # 3) main関数で上記score[3]に次のようにデータをキーボード入力するようにする。 # scanf("%s %d %d %s %d %d %s %d %d", 一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....); # 注意:上記「一人目の氏名」とは、score[0].nameのことです。またscanfの使いかたとして文字列には&は要りませんが、int型やdouble型の変数の場合には頭に&を付けないといけません。 # ex. 入力例: # yamauchi 60 70 yamada 80 90 tougou 70 80 # # 4)次の関数を定義する。 # void print_score(struct SEISEKI a); # この関数は次のように成績を出力するものとする。 # printf(" name: %s\n kokugo: %d\n sugaku: %d\n", ........); # 表示例: # name: yamauchi # kokugo: 60 # sugaku: 70 # # 5) void print_score()を使って3人分の成績を列挙する。 '国語と数学の2科目のテストの成績を処理するプログラムを作る。成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後、それを表示する' :- '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績), それを表示する([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績]). '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績) :- write('一行に 氏名,国語の成績,数学の成績,の形式で三人分入力してください\n'), 項目ならび([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績]), 入力検査([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績],正常終了),!. '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績) :- '成績を3人分キーボードから一人目の氏名, 一人目の国語の成績, 一人目の数学の成績, 二人目の氏名, 二人目の国語の成績,....のように一行で入力した後'(_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績). 入力検査([_一人目の氏名,_一人目の国語の成績,_一人目の数学の成績,_二人目の氏名,_二人目の国語の成績,_二人目の数学の成績,_三人目の氏名,_三人目の国語の成績,_三人目の数学の成績],_診断) :- 整数項目入力検査([_一人目の国語の成績,_一人目の数学の成績,_二人目の国語の成績,_二人目の数学の成績,_三人目の国語の成績,_三人目の数学の成績],[_一人目の国語の成績,_一人目の数学の成績,_二人目の国語の成績,_二人目の数学の成績,_三人目の国語の成績,_三人目の数学の成績],_診断),!. 整数項目入力検査([],[],異常終了) :- !,fail. 整数項目入力検査([],[],正常終了) :- !. 整数項目入力検査([_科目名|R1],[_成績|R2],_診断) :- integer(_成績), 整数項目入力検査(R1,R2,_診断),!. 整数項目入力検査([_科目名|R1],[_成績|R2],異常終了) :- writef('%tが正しく入力されませんでした。\n',[_科目名]), 整数項目入力検査(R1,R2,異常終了). それを表示する([]). それを表示する([_氏名,_数学成績,_国語成績|R]) :- writef('氏名 : %t\n 数学成績: %t\n 国語成績: %t\n',[[_氏名,_数学成績,_国語成績]), それを表示する(R). 項目ならび(_項目ならび) :- 行入力(_行), split(_行,[' '],_文字列ならび), 項目ならび(_文字列ならび,_項目ならび). 行入力(_行) :- read_line_to_codes(current_input,Codes), atom_codes(_行,Codes). split(_文字列,_区切り文字ならび,[_前文字列|R]) :- 副文字列(_文字列,_前文字列,_区切り文字,_後文字列), member(_区切り文字,_区切り文字ならび), split(_後文字列,_区切り文字ならび,R),!. split(_文字列,_,[_文字列]). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 項目ならび(_文字列ならび,_項目ならび) :- findall(_項目,( member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目)),_項目ならび). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/405 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # malloc と realloc を用いて、繰り返し入力された文字列を連結していく。 # 文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示しなさい。 # 表示した後、free をする。 # '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する' :- 入力された文字列(_入力された文字列), '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_入力された文字列,''). '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_入力された文字列,_これまで連結された文字列) :- '文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_入力された文字列,_これまで入力された文字列),!. '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_入力された文字列,_これまで連結された文字列) :- atom_concat(_入力された文字列,_これまで連結された文字列,_連結された文字列), 入力された文字列(_新たに入力された文字列), '繰り返し入力された文字列を連結していく。文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(_新たに入力された文字列,_連結された文字列). '文字列 quit が入力されたとき繰り返しを終了してできあがった文字列を表示する'(quit,_これまで入力された文字列) :- writef('%t\n',[_これまで入力された文字列]). 入力された文字列(_入力された文字列) :- write('文字列 ? '), get_line(_入力された文字列). % 以下のサイトは no. # Hey guys, I'm trying to write a predicate in prolog that can merge two lists into one list. For example I have # [4,3,3] and [1,2,3]. # I want to be able to have [14,23,33]. # I know how to get [1,4,2,3,3,3] but I really want [14,23,33]. '第二引数のリスト要素を10の桁、第一引数のリスト要素を1の桁として二つのリストを併合する'([],[],[]) :- !. '第二引数のリスト要素を10の桁、第一引数のリスト要素を1の桁として二つのリストを併合する'(L,[],L) :- !. '第二引数のリスト要素を10の桁、第一引数のリスト要素を1の桁として二つのリストを併合する'([],[M2|R2],[M3|R3]) :- M3 is M2 * 10, '第二引数のリスト要素を10の桁、第一引数のリスト要素を1の桁として二つのリストを併合する'([],R2,R3). '第二引数のリスト要素を10の桁、第一引数のリスト要素を1の桁として二つのリストを併合する'([M1|R1],[M2|R2],[M3|R3]) :- M3 is M2 * 10 + M1, '第二引数のリスト要素を10の桁、第一引数のリスト要素を1の桁として二つのリストを併合する'(R1,R2,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '第二引数のリスト要素、第一引数のリスト要素を結合しながら併合する'([],[],[]) :- !. '第二引数のリスト要素、第一引数のリスト要素を結合しながら併合する'(L,[],L) :- !. '第二引数のリスト要素、第一引数のリスト要素を結合しながら併合する'([],L,L) :- !. '第二引数のリスト要素、第一引数のリスト要素を結合しながら併合する'([A|R1],[B|R2],[C|R3]) :- atom_concat(A,B,C), '第二引数のリスト要素、第一引数のリスト要素を結合しながら併合する'(R1,R2,R3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% merge_two_list_with_calculation([],[],[]) :- !. merge_two_list_with_calculation(L,[],L) :- !. merge_two_list_with_calculation([],[M2|R2],[M3|R3]) :- M3 is M2 * 10, merge_two_list_with_calculation([],R2,R3). merge_two_list_with_calculation([M1|R1],[M2|R2],[M3|R3]) :- M3 is M2 * 10 + M1, merge_two_list_with_calculation(R1,R2,R3). % 以下のサイトは # 出典 :: 正規表現 Part9 #729 # 超初心者質問で申し訳ないのですが、 # # javascriptで、 # ABC|DEF|GHI|JKL 等を検索した時に一致した文字列全てを得る方法はありますか? # 更にできればABCとGHIがマッチした場合に、0,2の値が取れれば嬉しいです。 # # 検索した時に一致(0,'ABC'). 検索した時に一致(1,'DEF'). 検索した時に一致(2,'GHI'). 検索した時に一致(3,'JKL'). 'ABC|DEF|GHI|JKL 等を検索した時に一致した文字列全てを得る方法はありますか? 更にできればABCとGHIがマッチした場合に、0,2の値が取れれば嬉しいです。'(_文字列ならび,_文字列,_検索値ならび) :- 文字列ならびから文字列を取り出してその全ての検索値を得る(_文字列ならび,_文字列,_検索値ならび), _検索値ならび = [_|_]. 文字列ならびから文字列を取り出してその全ての検索値を得る(_文字列ならび,_文字列,_検索値ならび) :- member(_文字列,_文字列ならび), 検索した時に一致した値を全て取り出す(_文字列,_検索値ならび). 検索した時に一致した値を全て取り出す(_文字列,_検索値ならび) :- findall(_検索値,( 検索した時に一致した文字列(_文字列,_検索値)),_検索値ならび). 検索した時に一致した文字列(_文字列,_検索値) :- 副文字列(_文字列,_,_適合文字列,_), 検索した時に一致(_検索値,_適合文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1322562648/703 # # [1] 授業単元:C言語 # [2] 問題文:入力したxとyを交互に読み取り、zに出力するプログラムを作成せよ # 例 # x=いはほとりる # y=ろにへちぬを # z=いろはにほへとちりぬるを # '入力したxとyを交互に読み取り、zに出力する'(_z) :- write('xを入力して下さい : '), get_line(_x), write('yを入力して下さい : '), get_line(_y), 'xとyを交互に読み取り、zに出力する'(_x,_y,_z). 'xとyを交互に読み取り、zに出力する'(_x,_y,_z) :- 'xとyを交互に読み取り'(_x,_y,A,B,_x_2,_y_2), 'xとyを交互に読み取り、zに出力する'(_x_2,_y_2,_z_2), concat_atom([A,B,_z_2],_z). 'xとyを交互に読み取り、zに出力する'(_x,_y,_z) :- atom_concat(_x,_y,_z). 'xとyを交互に読み取り'(_x,_y,A,B,_x_2,_y_2) :- sub_atom(_x,0,1,R1,A), sub_atom(_y,0,1,R2,B), sub_atom(_x,1,R1,0,_x_2), sub_atom(_y,1,R2,0,_y_2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/620 # # 【 課題 】(源列を入力すると16進数が表示されるプログラム #       (例)I have a dream と入力するとI have a dreamが16進数で出力される。 #       16進数を入力すると文字列が表示されるプログラム(,竜侫弌璽献腑) # 【 形態 】Javaアプリケーション(main()で開始) # 【 GUI  】SWT # 【 期限 】12/20 まで # 【 Ver  】1.6.0_24 # 【 補足 】プログラム中でどのような操作がされているか #       コメントをつけてくださると嬉しいです。 # よろしくお願いします。 # # '文字列を入力すると16進数が表示される' :- write('文字列を入力して下さい : '), get_line(_文字列), '文字列を16進数表記ならびに変換する'(_文字列,_16進数表記ならび), 表示される(_16進数表記ならび). '文字列を16進数表記ならびに変換する'(_文字列,_16進数表記ならび) :- atom_codes(_文字列,Codes), 文字コードを16進数に変換(Codes,_16進数表記ならび), 文字コードを16進数に変換([],_16進数表記ならび,_16進数表記ならび). 文字コードを16進数に変換([Code|R1],R2,_16進数表記ならび) :- Code < 256, 文字コードを16進文字表記に変換(Code,_16進数文字表記), 文字コードを16進数に変換([Code|R1],[_16進数文字表記|R2],_16進数表記ならび). 文字コードを16進数に変換([Code|R1],R2,_16進数表記ならび) :- Code >= 256, Code1 is Code // 256, Code2 is Code mod 256, 文字コードを16進数に変換([Code1,Code2|R1],R2,_16進数表記ならび). 文字コードを16進文字表記に変換(Code,_16進数文字表記) :- Code1 is Code // 16, Code2 is Code mod 16, '10進数16進文字表記'(Code1,CodeA), '10進数16進文字表記'(Code2,CodeB), atom_concat(CodeA,CodeB,_16進数文字表記). '10進数16進文字表記'(0,'0'). '10進数16進文字表記'(1,'1'). '10進数16進文字表記'(2,'2'). '10進数16進文字表記'(3,'3'). '10進数16進文字表記'(4,'4'). '10進数16進文字表記'(5,'5'). '10進数16進文字表記'(6,'6'). '10進数16進文字表記'(7,'7'). '10進数16進文字表記'(8,'8'). '10進数16進文字表記'(9,'9'). '10進数16進文字表記'(10,'A'). '10進数16進文字表記'(11,'B'). '10進数16進文字表記'(12,'C'). '10進数16進文字表記'(13,'D'). '10進数16進文字表記'(14,'E'). '10進数16進文字表記'(15,'F'). 表示される(_16進数表記ならび) :- concat_atom(_16進数表記ならび,_表示文字列), writef('%t\n',[_表示文字列]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1322562648/161 # # [1] 授業単元:C言語プログラミング # [2] 問題文 # ポインタの利用方法として,配列を使わない文字列処理を習得する.課題3を配列を使わずに「メモリの動的確保」及び「ポインタ演算」により処理する. # 課題3 # 配列の値を前後に移動させる際に押し出された要素(文字)は反対側に入るようにします. # 例. ABCDE に 手続き(1)(=1つ前に詰める)を適用すると #   BCDEA となる. # 文字型の配列に値を格納しなくてはなりませんが「配列の初期化」のテクニックを # 使って,プログラム中で行う(つまりキーボードから打ち込まない). # また,配列のサイズ(つまり要素数)は5個とする. ( 例."ABCDE" の5文字を # 処理対象とする等) # 条件 # プログラム中で配列を用いてはいけません.配列の宣言の代わりに,必ずにある「メモリの動的割り当て」の手法を使って malloc関数で必要なメモリを確保する方法で実装すること. # 変化したことが分かるようにprintf関数で確認できるようにすること # 文字列の先頭文字を切り取り残り文字列の末尾に結合した文字列を作る(_文字列,_対象となった文字,_結合された文字列) :- sub_atom(_文字列,0,1,R,_対象となった文字), sub_atom(_文字列,1,R,_,_残りの文字列), atom_concat(_残りの文字列,_対象となった文字,_結合された文字列). 文字列の末尾文字を切り取り先頭に結合した文字列を作る(_文字列,_対象となった文字,_結合された文字列) :- sub_atom(_文字列,S,1,0,_対象となった文字), sub_atom(_文字列,0,S,1,_末尾を切り取られた文字列), atom_concat(_対象となった文字,_末尾を切り取られた文字列,_結合された文字列). 文字列の先頭からN文字を切り取り残り文字列の末尾に結合した文字列を作る(_文字列,N,_対象となった文字列,_結合された文字列) :- sub_atom(_文字列,0,N,R,_対象となった文字列), sub_atom(_文字列,N,R,0,_残りの文字列), atom_concat(_残りの文字列,_対象となった文字,_結合された文字列). 文字列の末尾からN文字を切り取り先頭に結合した文字列を作る(_文字列,_対象となった文字,_結合された文字列) :- sub_atom(_文字列,S,N,0,_対象となった文字), sub_atom(_文字列,0,S,N,_末尾を切り取られた文字列), atom_concat(_対象となった文字,_末尾を切り取られた文字列,_結合された文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/860 # # [1] 授業単元: C言語とアルゴリズム # [2] 問題文(含コード&リンク): # 文字列st が回文(前から読んでも後ろから読んでも # 同じ)であれば1 を,そうでなければ0 を返す関数 # int isPalindrome(const char st[]) # を作成せよ.以下の実行例のように,関数の動作を確認 # できるmain 関数も作成すること. # <実行例> # ./5-4 # 文字列を入力してください:AKASAKA # その文字列は回文です。 # # % ./5-4 # 文字列を入力してください:tomato # その文字列は回文ではありません。 # 回文述語の動作確認 :- write('文字列を入力して下さい : '), get_line(_文字列), 回文(_文字列,_診断), 回文診断(_診断). 回文(_文字列,1) :- atom_chars(Chars), reverse(Chars,Chars),!. 回文(_文字列,0). 回文診断(1) :- write('文字列は回文です。\n'). 回文診断(0) :- write('文字列は回文ではありません。\n'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 回文(_文字列) :- 回文(_文字列,1). 回文('',1). 回文(_文字列,_診断) :- 文字列の先頭と末尾から一文字取り出す(_文字列,A,_中間部分文字列,A), 回文(_中間部分文字列,_診断). 文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_中間部分文字列,_末尾) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字). '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,1,_中間部分文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 文字列の先頭と末尾から一文字取り出す(_文字列,_先頭,_末尾) :- sub_atom(_文字列,0,1,_,_先頭文字), sub_atom(_文字列,_,1,0,_末尾文字). '文字列の先頭と末尾からN文字取り出した中間部分'(_文字列,_N文字,_中間部分文字列) :- sub_atom(_文字列,_N文字,_,_N文字,_中間部分文字列). 文字列の先頭から一文字取り出す(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,R,_文字), sub_atom(_文字列,1,R,0,_残り文字列). 文字列の先頭からN文字取り出す(_文字列,_N文字,_先頭からの文字列,_残り文字列) :- sub_atom(_文字列,0,_N文字,R,_先頭からの文字列), sub_atom(_文字列,_N文字,R,0,_残り文字列). 文字列の末尾から一文字取り出す(_文字列,_末尾文字,_残り前方文字列) :- sub_atom(_文字列,R,1,0,_末尾文字), sub_atom(_文字列,0,R,1,_残り前方文字列). 文字列の末尾部分N文字取り出す(_文字列,_N文字,_末尾部分文字列,_残り前方文字列) :- sub_atom(_文字列,R,_N文字,0,_末尾部分文字列), sub_atom(_文字列,0,R,_N文字,_残り前方文字列). 文字列の末尾から逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列,_残り前方文字列) :- 文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列), sub_atom(_文字列,0,R,_N文字,_残り前方文字列). 文字列の末尾部分を逆順にN文字取り出す(_文字列,_N文字,_末尾からの逆順文字列) :- 文字列の末尾部分を逆順にN文字取り出す(_文字列,0,_N文字,_末尾からの逆順文字列). 文字列の末尾部分を逆順にN文字取り出す(_文字列,N,N,'') :- !. 文字列の末尾部分を逆順にN文字取り出す(_文字列,M,_N文字,_末尾からの逆順文字列) :- sub_atom(_文字列,_,1,M,_文字), M_2 is M + 1, 文字列の末尾部分を逆順にN文字取り出す(_文字列,M_2,_N文字,_末尾からの逆順文字列_2), atom_concat(_末尾からの逆順文字列_2,_文字,_末尾からの逆順文字列). % % sub_atom/5はPrologの中でも極めてスーパーな組込述語である。この述語を % 使っての文字列操作について、いくつか述語定義をしてみた。 % % 以下のサイトは # # 非決定性の置換述語を使って、全てを置換した文字列だけを取り出せ。 # 全てを置換した文字列だけを取り出す(_文字列,_置換対象文字列,_置換文字列,_全てを置換した文字列) :- findall(_置換された文字列,( 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列)),_置換された文字列ならび), append(_,[_全てを置換した文字列],_置換された文字列ならび),!. 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1), 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列). 非決定性の置換(_,_,_,_,_置換された文字列,_置換された文字列). 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列) :- 非決定性の置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), atom_concat(_置換された部分までの文字列,_置換された文字列_2,_置換された文字列). 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- 副文字列(_文字列,_前文字列,_置換対象文字列,_後文字列), 置換された文字列(_前文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列),!. 置換された文字列(_前文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- atom_concat(_前文字列,_置換文字列,_置換された部分までの文字列), atom_concat(_置換された部分までの文字列,_後文字列,_置換された文字列). 副文字列(_文字列,_前文字列,_置換対象文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_置換対象文字列,_後文字列,_残り文字列). % 以下のサイトは # # 非決定性の置換述語の雛形を作れ。 # 非決定性の置換(_文字列,_置換対象文字列,_置換文字列,_置換された文字列) :- 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1), 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列). 非決定性の置換(_,_,_,_,_置換された文字列,_置換された文字列). 非決定性の置換(_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列_1,_置換された文字列) :- 非決定性の置換(_後文字列,_置換対象文字列,_置換文字列,_置換された文字列_2), atom_concat(_置換された部分までの文字列,_置換された文字列_2,_置換された文字列). 置換(_文字列,_置換対象文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- 副文字列(_文字列,_前文字列,_置換対象文字列,_後文字列), 置換された文字列(_前文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列),!. 副文字列(_文字列,_前文字列,_置換対象文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_置換対象文字列,_後文字列,_残り文字列). 置換された文字列(_前文字列,_置換文字列,_置換された部分までの文字列,_後文字列,_置換された文字列) :- atom_concat(_前文字列,_置換文字列,_置換された部分までの文字列), atom_concat(_置換された部分までの文字列,_後文字列,_置換された文字列),!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 151代目 #36 # [1] 授業単元:構造体の配列利用 # [2] 問題文(含コード&リンク): # #include <stdio.h> # /* 配列arrayの要素数 */ # #define ELENUM(array) (sizeof(array) / sizeof((array)[0])) # #define SIZE_DATA (10) /* データ数 */ # # struct Address_data{ # char name[81]; # char phone[20]; # int age; # }; # # int main(void) # { # struct Address_data data[SIZE_DATA], *p = data; # printf("Input end = Ctrl + D\n"); # /* 配列初期化(入力プロンプトより前に置くべき?) */ # for (p = data; p - data < ELENUM(data); p++) { # p->age = -1; # } # /* 入力処理 */ # for (p = data; p - data < ELENUM(data); p++) { # printf("[%d]name phone age = ", p - data); # if (scanf("%s %s %d", p->name, p->phone, &p->age) != 3) { # break; # } # } # putchar('\n'); # /* 表示 */ # for (p = data; p->age >= 0; p++) { # printf("%s\t(%d)\t[%s]\n", p->name, p->age, p->phone); # } # return 0; # } # 表示を行う際に、年齢順に表示するようにしたい。 # 配列の並び替えを行なって表示するようにプログラムを拡張しなさい # データ数(10). 入力処理(L) :- データ数(_データ数), length(L,_データ数), findall([_名前,_年齢,_電話番号],( append(_,[_|_],L), '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号)),L). '名前・年齢・電話番号の入力'(_名前,_年齢,_電話番号) :- 催促後に行入力('名前・年齢・電話番号をカンマ区切りで入力してください ',_行), 項目区切り_行,[',',' '],[_名前,_年齢,_電話番号]). 催促後に行入力(_催促,_行) :- write(_催促), 行入力(_行). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). 年齢順にデータを表示(LL) :- 年齢をキーとする(LL,LL2), sort(LL2,LL3), キーを外す(LL3,LL4), データを表示(LL4). 年齢をキーとする(LL1,LL2) :- findall([_年齢|L], member([_名前,_年齢,_電話番号],LL1),_先頭に年齢付加されたLL). 年齢キーを外す(LL1,LL2) :- findall(L,member([_|L],LL1),LL2). データを表示(L) :- forall(member([_名前,_年齢,_電話番号],LL), writef('%w,%w,%w\n',[_名前,_年齢,_電話番号])). sort([],[]) :- !. sort([A|R1],L) :- partition(A,R1,L1,L2), sort(L1,L11), sort(L2,L22), append(L11,[A|L22],L). partition(_,[],[],[]) :- !. partition(A,[B|R1],[B|R2],R3) :- B @< A, partition(A,R1,R2,R3),!. partition(A,[B|R1],R2,[B|R3]) :- B @>= A, partition(A,R1,R2,R3),!. 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/627 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # キーボードから入力した文字列を逆順に出力するプログラムを作成したい。 # 次の2通りの方法でそれぞれプログラム中の空欄を埋め完成させよ。 # (1) 配列を使う (ポインタは使ってはならない) # (2) ポインタを使う (配列を使ってはならない) # # #include<stdio.h> # int main( void ) { # char str[256], *p ; # int i ; # scanf("%s", str) ; # p = str ; # [この部分を記述せよ] # return 0 ; # 'キーボードから入力した文字列を逆順に出力する' :- get_line(Line), atom_chars(Line,Chars), reverse(Chars,_逆順の文字ならび), atom_chars(_逆順文字列,_逆順の文字ならび), writef('%t\n',[_逆順文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'キーボードから入力した文字列を逆順に出力する' :- 文字を改行まで読み込む('',_逆順文字列), writef('%t\n',[_逆順文字列]). 文字を改行まで読み込む(_文字列1,_文字列) :- get_char(_文字), \+(_文字='\n'), atom_concat(_文字,_文字列1,_文字列2), 文字を改行まで読み込む(_文字列2,_文字列),!. 文字を改行まで読み込む(_文字列,_文字列). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'キーボードから入力した文字列を逆順に出力する' :- 文字を改行まで読み込む([],_逆順文字ならび), atom_chars(_逆順文字列,_逆順文字ならび), writef('%t\n',[_逆順文字列]). 文字を改行まで読み込む(_文字列ならび1,_文字ならび) :- get_char(_文字), \+(_文字='\n'), 文字を改行まで読み込む([_文字|_文字列ならび1],_文字ならび),!. 文字を改行まで読み込む(_文字ならび,_文字ならび). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 148代目 #436 # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 今回は、単方向リストを用いて電話帳のプログラムを作ってもらいます。 # 実装するのは、入力、削除、表示、終了、load、saveです # 1.入力は、名前、電話番号を入力する。(可能ならばソートを行う) # 2.saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する) # 3.loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする # 4.ヒント(mallocの意味を調べること) # :- dynamic(電話帳/1). :- abolish(電話帳/1). 単方向リストを用いた電話帳(入力,_更新前電話帳,_更新後電話帳) :- '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳). 単方向リストを用いた電話帳(save,_ファイル名,_電話帳) :- 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳). 単方向リストを用いた電話帳(load,_ファイル名,_電話帳) :- 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳). '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳) :- '名前、電話番号を入力する'(_名前,_電話番号), 電話帳述語を更新する(_名前,_電話番号,_更新前電話帳,_更新後電話帳). '名前、電話番号を入力する'(_名前,_電話番号) :- 名前を入力する(_名前). 電話番号を入力する(_電話番号). 名前を入力する(_名前) :- 行入力(_名前). 電話番号を入力する(_電話番号) :- 行入力(_行), 電話番号入力診断(_行,_電話番号),!. 電話番号を入力する(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(_行,_電話番号) :- 構成文字は数字かハイフンだけ(_行),!. 電話番号入力診断(_行,_電話番号) :- 数字かハイフン以外の構成文字を選別する(_行,_電話番号にふさわしくない文字ならび), writef('入力された %w には電話番号としてふさわしくない文字 %w が含まれています。再入力をお願いします。\n',[_行,_電話番号に相応しくない文字ならび]). 数字かハイフン以外の構成文字を選別する(_行,_電話番号にふさわしくない文字ならび) :- atom_chars(_行,_文字ならび), 数字かハイフン以外の構成文字を選別する(_文字ならび,[],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([],L,L) :- !. 数字かハイフン以外の構成文字を選別する(L1,L2,_電話番号にふさわしくない文字ならび) :- 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび). 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフン以外の文字を持つもので既出文字ではないものは第二引数に集める(L1,L2_電話番号にふさわしくない文字ならび). 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび). :- 数字かハイフンであるかそれ以外の文字であっても既出のものは無視する(L1,L2,_電話番号にふさわしくない文字ならび). 数字かハイフン('-') :- !. 数字かハイフン(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 数字かハイフン以外の文字を持つもので既出文字ではないものは第二引数に集める([_文字|R1],L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフン以外の文字を持つもので既出文字ではない(_文字,L2), 数字かハイフン以外の構成文字を選別する(R1,[_文字|L2],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の文字を持つもので既出文字ではない(_文字,L) :- 数字かハイフン以外の文字を持つもので(_文字), 既出文字ではない(_文字,L). 数字かハイフン以外の文字を持つもので(_文字) :- \+(数字かハイフン(_文字)). 既出文字ではない(_文字,L) :- \+(既出文字(_文字,L)). 既出文字(_文字,L) :- member(_文字,L). 数字かハイフンであるかそれ以外の文字であっても既出のものは無視する([_文字|R1],L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L2), 数字かハイフン以外の構成文字を選別する(R1,L2,_電話番号にふさわしくない文字ならび). 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L) :- 数字かハイフン(_文字),!. 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L) :- member(_文字,L). 電話帳述語を更新する(_名前,_電話番号,_更新前電話帳,_更新後電話帳) :- retract(電話帳(_更新前電話帳)), ソートされた状態を保って入力する(_名前,_電話番号,_更新前電話帳,_更新後電話帳), assertz(電話帳(_更新後電話帳)). ソートされた状態を保って入力する(_名前,_電話番号,[],[[_名前,_電話番号]]) :- !. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R],[[_名前,_電話番号],[_名前1,_電話番号1]|R]) :- _名前 @=< _名前1,!. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R1],[[_名前1,_電話番号1]|R2]) :- _名前 @> _名前1, ソートされた状態を保って入力する(_名前,_電話番号,R1,R2). 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳) :- 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名), 単方向リストを用いた電話帳をsaveする(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳をsaveする(_サフィックス付きファイル名,_電話帳) :- 電話帳(_電話帳), 単方向リストを用いた電話帳をファイルに書き出す(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳をファイルに書き出す(_サフィックス付きファイル名,_電話帳) :- tell(_サフィックス付きファイル名), writef('%t.\n',[_電話帳]), told. 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳) :- 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名), 単方向リストを用いた電話帳として読み込む(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳として読み込む(_サフィックス付きファイル名,_電話帳) :- 電話帳を読み込み(_サフィックス付きファイル名,_電話帳), 電話帳を述語として定義する(_電話帳). 電話帳を読み込み(_サフィックス付きファイル名,_電話帳) :- see(_サフィックス付きファイル名), read(_電話帳), seen. 電話帳を述語として定義する(_電話帳) :- abolish(電話帳/2), assertz(電話帳(_電話帳)), 'ファイル名にはサフィックスとして.txtが付く'(_サフィックス付きファイル名,_サフィックス付きファイル名) :- sub_atom(_サフィックス付きファイル名,_,4,0,'.txt'),!. 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名) :- atom_concat(_ファイル名,'.txt',_サフィックス付きファイル名). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 148代目 #436 # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 今回は、単方向リストを用いて電話帳のプログラムを作ってもらいます。 # 実装するのは、入力、削除、表示、終了、load、saveです # 1.入力は、名前、電話番号を入力する。(可能ならばソートを行う) # 2.saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する) # 3.loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする # 4.ヒント(mallocの意味を調べること) # :- dynamic(電話帳/1). :- abolish(電話帳/1). 単方向リストを用いた電話帳(入力,_更新前電話帳,_更新後電話帳) :- '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳). 単方向リストを用いた電話帳(save,_ファイル名,_電話帳) :- 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳). 単方向リストを用いた電話帳(load,_ファイル名,_電話帳) :- 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳). '入力は、名前、電話番号を入力する。(可能ならばソートを行う)'(_更新前電話帳,_更新後電話帳) :- '名前、電話番号を入力する'(_名前,_電話番号), 電話帳述語を更新する(_名前,_電話番号,_更新前電話帳,_更新後電話帳). '名前、電話番号を入力する'(_名前,_電話番号) :- 名前を入力する(_名前). 電話番号を入力する(_電話番号). 名前を入力する(_名前) :- 行入力(_名前). 電話番号を入力する(_電話番号) :- 行入力(_行), 電話番号入力診断(_行,_電話番号),!. 電話番号を入力する(_電話番号) :- 電話番号を入力する(_電話番号). 電話番号入力診断(_行,_電話番号) :- 構成文字は数字かハイフンだけ(_行),!. 電話番号入力診断(_行,_電話番号) :- 数字かハイフン以外の構成文字を選別する(_行,_電話番号にふさわしくない文字ならび), writef('入力された %w には電話番号としてふさわしくない文字 %w が含まれています。再入力をお願いします。\n',[_行,_電話番号に相応しくない文字ならび]). 数字かハイフン以外の構成文字を選別する(_行,_電話番号にふさわしくない文字ならび) :- atom_chars(_行,_文字ならび), 数字かハイフン以外の構成文字を選別する(_文字ならび,[],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の構成文字を選別する([],L,L) :- !. 数字かハイフン以外の構成文字を選別する(L1,L2,_電話番号にふさわしくない文字ならび) :- 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび). 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフン以外の文字を持つもので既出文字ではないものは第二引数に集める(L1,L2_電話番号にふさわしくない文字ならび). 数字でなくハイフンでもない未出の文字を集める(L1,L2,_電話番号にふさわしくない文字ならび). :- 数字かハイフンであるかそれ以外の文字であっても既出のものは無視する(L1,L2,_電話番号にふさわしくない文字ならび). 数字かハイフン('-') :- !. 数字かハイフン(_文字) :- member(_文字,['0','1','2','3','4','5','6','7','8','9']). 数字かハイフン以外の文字を持つもので既出文字ではないものは第二引数に集める([_文字|R1],L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフン以外の文字を持つもので既出文字ではない(_文字,L2), 数字かハイフン以外の構成文字を選別する(R1,[_文字|L2],_電話番号にふさわしくない文字ならび). 数字かハイフン以外の文字を持つもので既出文字ではない(_文字,L) :- 数字かハイフン以外の文字を持つもので(_文字), 既出文字ではない(_文字,L). 数字かハイフン以外の文字を持つもので(_文字) :- \+(数字かハイフン(_文字)). 既出文字ではない(_文字,L) :- \+(既出文字(_文字,L)). 既出文字(_文字,L) :- member(_文字,L). 数字かハイフンであるかそれ以外の文字であっても既出のものは無視する([_文字|R1],L2,_電話番号にふさわしくない文字ならび) :- 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L2), 数字かハイフン以外の構成文字を選別する(R1,L2,_電話番号にふさわしくない文字ならび). 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L) :- 数字かハイフン(_文字),!. 数字かハイフンであるかそれ以外の文字であっても既出のものは(_文字,L) :- member(_文字,L). 電話帳述語を更新する(_名前,_電話番号,_更新前電話帳,_更新後電話帳) :- retract(電話帳(_更新前電話帳)), ソートされた状態を保って入力する(_名前,_電話番号,_更新前電話帳,_更新後電話帳), assertz(電話帳(_更新後電話帳)). ソートされた状態を保って入力する(_名前,_電話番号,[],[[_名前,_電話番号]]) :- !. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R],[[_名前,_電話番号],[_名前1,_電話番号1]|R]) :- _名前 @=< _名前1,!. ソートされた状態を保って入力する(_名前,_電話番号,[[_名前1,_電話番号1]|R1],[[_名前1,_電話番号1]|R2]) :- _名前 @> _名前1, ソートされた状態を保って入力する(_名前,_電話番号,R1,R2). 'saveは終了時にsaveを行うかどうか判断してから終了を行う(txtで保存する)'(_ファイル名,_電話帳) :- 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名), 単方向リストを用いた電話帳をsaveする(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳をsaveする(_サフィックス付きファイル名,_電話帳) :- 電話帳(_電話帳), 単方向リストを用いた電話帳をファイルに書き出す(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳をファイルに書き出す(_サフィックス付きファイル名,_電話帳) :- tell(_サフィックス付きファイル名), writef('%t.\n',[_電話帳]), told. 'loadで読み込んだtxtファイルに再び、入力、削除、表示を行えるようにする'(_ファイル名,_電話帳) :- 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名), 単方向リストを用いた電話帳として読み込む(_サフィックス付きファイル名,_電話帳). 単方向リストを用いた電話帳として読み込む(_サフィックス付きファイル名,_電話帳) :- 電話帳を読み込み(_サフィックス付きファイル名,_電話帳), 電話帳を述語として定義する(_電話帳). 電話帳を読み込み(_サフィックス付きファイル名,_電話帳) :- see(_サフィックス付きファイル名), read(_電話帳), seen. 電話帳を述語として定義する(_電話帳) :- abolish(電話帳/2), assertz(電話帳(_電話帳)), 'ファイル名にはサフィックスとして.txtが付く'(_サフィックス付きファイル名,_サフィックス付きファイル名) :- sub_atom(_サフィックス付きファイル名,_,4,0,'.txt'),!. 'ファイル名にはサフィックスとして.txtが付く'(_ファイル名,_サフィックス付きファイル名) :- atom_concat(_ファイル名,'.txt',_サフィックス付きファイル名). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). % 以下のサイトは # 出典 :: 正規表現 Part8 #72 # 長い文字列から文字列を抽出したいんだけど、どうすれば簡単ですか? # 122ch345673ch89 # この文字列から2chと3chの間の文字だけを取得したいです # # '長い文字列から文字列を抽出したいんだけど、どうすれば簡単ですか? 122ch345673ch89 この文字列から2chと3chの間の文字だけを取得したいです'(_2chと3chの間の副文字列) :- 長い文字列から_文字列_1と_文字列_2の間の副文字列を取得する('122ch345673ch89','2ch','3ch',_2chと3chの間の副文字列). 長い文字列から_文字列_1と_文字列_2の間の副文字列を取得する(_長い文字列,_文字列_1,_文字列_2,_文字列_1と_文字列_2の間の副文字列) :- sub_atom(_長い文字列,_,_,_,_副文字列), 副文字列(_副文字列,_文字列_1,_文字列_1と_文字列_2の間の副文字列,_文字列_2). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: 正規表現 Part8 #31 # 正規表現でとあるスレの、特定のURLを含まないレスをあぼーんにしたいと考えています # 特定のURLは"mt=8"と"hibari"が含まれたURLです # [^(mt=8)(hibari)] # と試しましたが駄目でした。どのようにすればよいのでしょうか? # # '正規表現でとあるスレの、特定のURLの要素を含まないレスをあぼーんにしたい'(_レス) :- 'URLを切り出す'(_レス,_前文字列,URL,_後文字列), アボーンしたい(URL),!. 'URLを切り出す'(_レス,_前文字列,URL,_後文字列) :- atom_concat(_前文字列,_残り文字列,_レス), atom_concat(URL,_後文字列,_残り文字列). アボーンしたい(URL) :- プロトコルを除いたURL(URL,_プロトコルを除いたURL), 特定のURLの要素を含まない(_プロトコルを除いたURL). 特定のURLの要素を含まない(_プロトコルを除いたURL) :- \+(特定のURLの要素を含む(_プロトコルを除いたURL)). プロトコルを除いたURL(URL,_プロトコルを除いたURL) :- 副文字列(URL,_,_プロトコル,_プロトコルを除いたURL), member(_プロトコル,['http','HTTP','ftp','FTP','mailto']). 特定のURLの要素を含む(_プロトコルを除いたURL) :- 項目区切り(_プロトコルを除いたURL,[' ','&','?','/','://','/'],_要素ならび), 特定のURLの要素は要素ならびに必ず含まれる(_要素ならび). 特定のURLの要素は要素ならびに必ず含まれる(_要素ならび) :- forall(特定のURLの要素(_特定のURLの要素),member(_特定のURLの要素,_要素ならび)). 特定のURLの要素('mt=8'). 特定のURLの要素(hanabi). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/php/1168450843/613 # # MySQLダンプ内の # # /*------------------ここから--------------------*/ # DROP TABLE IF EXISTS `table100`; # /*!40101 SET @saved_cs_client = @@character_set_client */; # /*!40101 SET character_set_client = utf8 */; # CREATE TABLE `table100` ( # `code1` varchar(5) default NULL, # `zip1` varchar(7) default NULL, # `address1` varchar(250) default NULL, # `address2` varchar(250) default NULL, # `div_1` varchar(1) default NULL, # `div_2` varchar(1) default NULL, # `import_date` timestamp NULL default NULL, # `rec_key1` int(10) unsigned NOT NULL auto_increment, # PRIMARY KEY (`rec_key1`) # ) ENGINE=InnoDB AUTO_INCREMENT=121471 DEFAULT CHARSET=eucjpms; # /*!40101 SET character_set_client = @saved_cs_client */; # /*------------------ここまで--------------------*/ # # `table100` → `TABLE100` # `code1` → `CODE1` # など逆クォートで囲まれた小文字→大文字変換を一括で行いたいです。。 # できればlinux コマンドライン、perl などでお願いします。。 # '逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_文字列,_変換した文字列) :- sub_atom(_文字列,St,Len,_,S1,S2,S3,L1,['`'|R2],['`'|R3]), \+(append(_,['`'|_],R2)), concat_atom(R2,S22), to_upper(S22,_大文字化した文字列), concat_atom(S1,'`',_大文字化した文字列,'`'],_変換した文字列1), concat_atom(R3,_残り文字列), '逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_残り文字列,_変換した文字列2), atom_concat(_変換した文字列1,_変換した文字列2,_変換した文字列),!. '逆クォートで囲まれた小文字-大文字変換を一括で行いたい'(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 145代目 #185 # [1] 授業単元: プログラミング言語 # [2] 問題文(含コード&リンク): ランレングス圧縮をするプログラムを作成せよ。 #                5MBあるテキストファイルを圧縮してください。アルファベット小・大文字しかない。改行はない。 #                このプログラムをできるだけ簡単に作成せよ。 #                例:もしAAABBBCCCでしたらA3B3C3というふうに作成。 # ランレングス圧縮をする(_ファイル,_ランレングス圧縮された文字列) :- ファイルから文字列を得る(_ファイル,_文字列), findall(X,連長の文字と文字数を順に得る(_文字列,X),L), atomic_list_concat(L,_ランレングス圧縮された文字列). ファイルから文字列を得る(_ファイル,_文字列) :- read_file_to_codes(_ファイル,_文字コードならび,[]), atom_codes(_文字列,_文字コードならび). 連長の文字と文字数を順に得る(_文字列,X) :- 連長(_文字列,_文字,_文字数), member(X,[_文字,_文字数]). 連長(_文字列,_同一文字,N) :- '同一文字からなる副文字列とその前文字列、後文字列を得る'(_文字列,_前文字列,_副文字列,_後文字列,_同一文字), atom_length(_副文字列,N). '同一文字からなる副文字列とその前文字列、後文字列を得る'(_文字列,_前文字列,_副文字列,_後文字列,_同一文字) :- 副文字列(_文字列,_前文字列,_副文字列,_後文字列), 同一文字文字列(_副文字列,_同一文字), '前文字列の最後の文字は同一文字ではないし、後文字列の最初の文字も同一文字ではない'(_同一文字,_前文字列,_後文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 同一文字文字列(_文字列,_同一文字) :- sub_atom(_文字列,0,1,_,_同一文字), forall(sub_atom(_文字列,_,1,_,_文字),_文字 = _同一文字). '前文字列の最後の文字は同一文字ではないし、後文字列の最初の文字も同一文字ではない'(_同一文字,_前文字列,_後文字列) :- '前文字列の最後の文字は同一文字ではないし、'(_同一文字,_前文字列), '後文字列の最初の文字も同一文字ではない'(_同一文字,_後文字列). '前文字列の最後の文字は同一文字ではないし、'(_同一文字,_前文字列) :- \+(sub_atom(_前文字列,_,1,0,_同一文字)). '後文字列の最初の文字も同一文字ではない'(_同一文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_同一文字)). % 以下のサイトは # 出典 :: ★★ Java の宿題ここで答えます Part 69 ★★ #721 # 【課題】Studentというクラスを宣言するプログラムを作成せよ。インスタンス変数には、氏名、生年月日、学籍番号を記録せよ。 # ただし、学籍番号は入学年度を表す二桁の整数、学部を表す一桁の整数、残り四桁の整数を組み合わせた七桁の整数で表現されるものとする。 # インスタンスメソッドとしては、以下のものは必須とする。 # 名字を返すメソッド、名前を返すメソッド、誕生年を和暦で返すメソッド、誕生年を西暦で返すメソッド、入学年度を返すメソッド # 【形態】1. Javaアプリケーション # 【期限】1月11日 # 【ver】linux # 【補足】あまり難しくしないでください。 # データベース構造(学生,1,氏名). データベース構造(学生,2,誕生日). データベース構造(学生,3,学籍番号). 名字を返す(_学籍番号,_名字) :- 学生(_氏名,_誕生日,_学籍番号), 数値変換項目区切り(_氏名,[' ',',','-','_'],[_名字,_]). 名前を返す(_学籍番号,_名前) :- 学生(_氏名,_誕生日,_学籍番号), 数値変換項目区切り(_氏名,[' ',',','-','_'],[_,_名前]). 誕生年を和暦で返す(_学籍番号,_誕生年の和暦) :- 誕生年を西暦で返す(_学籍番号,_誕生年の西暦), 和暦西暦変換(_誕生年の和暦,_誕生年の西暦). 誕生年を西暦で返す(_学籍番号,_誕生年の西暦) :- 学生(_氏名,_誕生日の西暦,_学籍番号), _誕生年の西暦 is _誕生日の西暦 // 10000. 入学年度を返す(_学籍番号,_入学年度) :- _入学年度 is _学籍番号 // 10000. すべてが数字(_文字ならび) :- forall(member(_文字,_文字ならび),数字(_文字)). 数字('0'). 数字('1'). 数字('2'). 数字('3'). 数字('4'). 数字('5'). 数字('6'). 数字('6'). 数字('8'). 数字('9'). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. 和暦西暦変換(_和暦,_西暦) :- 西暦が整数の時は西暦から和暦を得る(_和暦,_西暦). 和暦西暦変換(_和暦,_西暦) :- 和暦が文字列の時は和暦から西暦を得る(_西暦,_和暦). 西暦が整数の時は西暦から和暦を得る(_西暦,_和暦) :- 西暦が整数の時は(_西暦), 西暦から和暦を得る(_西暦,_和暦). 西暦が整数の時は(_西暦) :- integer(_西暦). 西暦から和暦を得る(_和暦,_西暦) :- 西暦から年間と年を得る(_西暦,_年間,_年), 和暦年文字列(_年間,_年,_和暦). 西暦から年間と年を得る(_西暦,_年間,_年) :- 年間(_年間,_元年,_最終年), between(_元年,_最終年,_西暦), _年 is _西暦 - _元年 + 1. 和暦が文字列の時は和暦から西暦を得る(_和暦,_西暦) :- 和暦が文字列の時は(_和暦), 和暦の年と元年の西暦を抽出(_和暦,_年間,_年,_元年), _西暦 is _元年 + _年 - 1. 和暦が文字列の時は(_和暦) :- atom(_和暦). 和暦の年と元年の西暦を抽出(_和暦,_年間,_年,_元年) :- sub_atom(_和暦,_,_,_,_年間,S2,年,L1,L2,L3), 年間(_年間,_元年,_最終年), 漢数字アラビア数字対応(L2,_年). 和暦年文字列(_年間,_年,_和暦年) :- _年 =< 10, nth1(_年,[元,二,三,四,五,六,七,八,九,十],A), concat_atom([_年間,A,年],_和暦年),!. 和暦年文字列(_年間,_年,_和暦年) :- _年 >= 11, Div is _年 // 10, Mod is (_年 mod 10) + 1, nth1(Div,['',二,三,四,五,六,七,八,九],A), nth1(Mod,['',一,二,三,四,五,六,七,八,九],B), concat_atom([_年間,A,十,B,年],_和暦年),!. 漢数字アラビア数字対応('',0). 漢数字アラビア数字対応(元,1). 漢数字アラビア数字対応(一,1). 漢数字アラビア数字対応(二,2). 漢数字アラビア数字対応(三,3). 漢数字アラビア数字対応(四,4). 漢数字アラビア数字対応(五,5). 漢数字アラビア数字対応(六,6). 漢数字アラビア数字対応(七,7). 漢数字アラビア数字対応(八,8). 漢数字アラビア数字対応(九,9). 漢数字アラビア数字対応([A,十,B],N) :- 漢数字アラビア数字対応(A,N1), 漢数字アラビア数字対応(B,N2), N is N1 * 10 + N2,!. 漢数字アラビア数字対応([A,十],N) :- 漢数字アラビア数字対応(A,N1), N is N1 * 10,!. 漢数字アラビア数字対応([十,B],N) :- 漢数字アラビア数字対応(B,N2), N is 10 + N2,!. 漢数字アラビア数字対応([十],10) :- !. 漢数字アラビア数字対応([A],N) :- 漢数字アラビア数字対応(A,N). 年間(安政,1854,1860). 年間(万延,1860,1861). 年間(文久,1861,1864). 年間(元治,1864,1865). 年間(慶応,1865,1868). 年間(明治,1868,1912). 年間(大正,1912,1926). 年間(昭和,1926,1989). 年間(平成,1989,2017). % 以下のサイトは 和暦西暦変換(_和暦,_西暦) :- 西暦が整数の時は西暦から和暦を得る(_西暦,_和暦),!. 和暦西暦変換(_和暦,_西暦) :- 和暦が文字列の時は和暦から西暦を得る(_和暦,_西暦),!. 西暦が整数の時は西暦から和暦を得る(_西暦,_和暦) :- 西暦が整数の時は(_西暦), 西暦から和暦を得る(_西暦,_和暦). 西暦が整数の時は(_西暦) :- integer(_西暦). 西暦から和暦を得る(_西暦,_和暦) :- 西暦から年間と年を得る(_西暦,_年間,_年), 和暦年文字列(_年間,_年,_和暦). 西暦から年間と年を得る(_西暦,_年間,_年) :- 年間(_年間,_元年,_最終年), between(_元年,_最終年,_西暦), _年 is _西暦 - _元年 + 1. 和暦が文字列の時は和暦から西暦を得る(_和暦,_西暦) :- 和暦が文字列の時は(_和暦), 和暦の年と元年の西暦を抽出(_和暦,_年間,_年,_元年), _西暦 is _元年 + _年 - 1. 和暦が文字列の時は(_和暦) :- atom(_和暦). 和暦の年と元年の西暦を抽出(_和暦,_年間,_年,_元年) :- 副文字列(_和暦,_年間,_和暦年,年), 年間(_年間,_元年,_最終年), 和暦年を数値年に変換(_和暦年,_年). 和暦年を数値年に変換(_和暦年,_年) :- atom_chars(_和暦年,L), 漢数字アラビア数字対応(L,_年). 和暦年文字列(_年間,_年,_和暦年) :- 年が10以下の場合は整数の年を和数字に変換して和暦年を構成する(_年間,_年,_和暦年). 和暦年文字列(_年間,_年,_和暦年) :- 年が11以上の場合は年の十の位と一の位から上位桁文字と下位桁文字を得て和暦年を構成する(_年間,_年,_和暦年). 年が10以下の場合は整数の年を和数字に変換して和暦年を構成する(_年間,_年,_和暦年) :- 年が10以下の場合は(_年), 整数の年を和数字に変換して和暦年を構成する(_年間,_年,_和暦年). 年が10以下の場合は(_年) :- _年 =< 10. 整数の年を和数字に変換して和暦年を構成する(_年間,_年,_和暦年) :- 整数の年を和数字に変換して(_年,_和数字), 和暦年を構成する(_年間,_和数字,_和暦年). 整数の年を和数字に変換して(_年,_和数字) :- nth1(_年,[元,二,三,四,五,六,七,八,九,十],_和数字). 年が11以上の場合は年の十の位と一の位から上位桁文字と下位桁文字を得て和暦年を構成する(_年間,_年,_和暦年) :- 年が11以上の場合は(_年), 年の十の位と一の位から上位桁文字と下位桁文字を得て(_年,_上位桁文字,_下位桁文字), 和暦年を構成する(_年間,_上位桁文字,_下位桁文字,_和暦年). 年が11以上の場合は(_年) :- _年 >= 11. 年の十の位と一の位から上位桁文字と下位桁文字を得て(_年,_上位桁文字,_下位桁文字) :- 年の十の位と一の位から(_年,_十の位,_一の位), 上位桁文字と下位桁文字を得て(_十の位,_一の位,_上位桁文字,_下位桁文字). 年の十の位と一の位から(_年,_十の位,_一の位) :- _十の位 is _年 // 10, _一の位 is (_年 mod 10) + 1. 上位桁文字と下位桁文字を得て(_十の位,_一の位,_上位桁文字,_下位桁文字) :- nth1(_十の位,['',二,三,四,五,六,七,八,九],_上位桁文字), nth1(_一の位,['',一,二,三,四,五,六,七,八,九],_下位桁文字). 和暦年を構成する(_年間,_和数字,_和暦年) :- atomic_list_concat([_年間,_和数字,年],_和暦年). 和暦年を構成する(_年間,_上位桁文字,_下位桁文字,_和暦年) :- atomic_list_concat([_年間,_上位桁文字,十,_下位桁文字,年],_和暦年). 漢数字アラビア数字対応('',0). 漢数字アラビア数字対応(元,1). 漢数字アラビア数字対応(一,1). 漢数字アラビア数字対応(二,2). 漢数字アラビア数字対応(三,3). 漢数字アラビア数字対応(四,4). 漢数字アラビア数字対応(五,5). 漢数字アラビア数字対応(六,6). 漢数字アラビア数字対応(七,7). 漢数字アラビア数字対応(八,8). 漢数字アラビア数字対応(九,9). 漢数字アラビア数字対応([A,十,B],N) :- 漢数字アラビア数字対応(A,N1),漢数字アラビア数字対応(B,N2),N is N1 * 10 + N2,!. 漢数字アラビア数字対応([A,十],N) :- 漢数字アラビア数字対応(A,N1),N is N1 * 10,!. 漢数字アラビア数字対応([十,B],N) :- 漢数字アラビア数字対応(B,N2),N is 10 + N2,!. 漢数字アラビア数字対応([十],10) :- !. 漢数字アラビア数字対応([A],N) :- 漢数字アラビア数字対応(A,N). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 年間(大化,645,650). 年間(白雉,650,654). 年間(朱鳥,686,687). 年間(大宝,701,704). 年間(慶雲,704,708). 年間(和銅,708,715). 年間(霊亀,715,717). 年間(養老,717,724). 年間(神亀,724,729). 年間(天平,729,749). 年間(天平感宝,749,749). 年間(天平勝宝,749,757). 年間(天平宝字,757,765). 年間(天平神護,765,767). 年間(神護景雲,767,770). 年間(宝亀,770,780). 年間(天応,781,782). 年間(延暦,782,806). 年間(大同,806,810). 年間(弘仁,810,824). 年間(天長,824,834). 年間(承和,834,848). 年間(嘉祥,848,851). 年間(仁寿,851,854). 年間(斉衡,854,857). 年間(天安,857,859). 年間(貞観,859,877). 年間(元慶,877,885). 年間(仁和,885,889). 年間(寛平,889,898). 年間(昌泰,898,901). 年間(延喜,901,923). 年間(延長,923,931). 年間(承平,931,938). 年間(天慶,938,947). 年間(天暦,947,957). 年間(天徳,957,961). 年間(応和,961,964). 年間(康保,964,968). 年間(安和,968,970). 年間(天禄,970,973). 年間(天延,973,976). 年間(貞元,976,978). 年間(天元,978,983). 年間(永観,983,985). 年間(寛和,985,987). 年間(永延,987,989). 年間(永祚,989,990). 年間(正暦,990,995). 年間(長徳,995,999). 年間(長保,999,1004). 年間(寛弘,1004,1012). 年間(長和,1012,1017). 年間(寛仁,1017,1021). 年間(治安,1021,1024). 年間(万寿,1024,1028). 年間(長元,1028,1037). 年間(長暦,1037,1040). 年間(長久,1040,1044). 年間(寛徳,1044,1046). 年間(永承,1046,1053). 年間(天喜,1053,1058). 年間(康平,1058,1065). 年間(治暦,1065,1069). 年間(延久,1069,1074). 年間(承保,1074,1077). 年間(承暦,1077,1081). 年間(永保,1081,1084). 年間(応徳,1084,1087). 年間(寛治,1087,1094). 年間(嘉保,1094,1096). 年間(永長,1096,1097). 年間(承徳,1097,1099). 年間(康和,1099,1104). 年間(長治,1104,1106). 年間(嘉承,1106,1108). 年間(天仁,1108,1110). 年間(天永,1110,1113). 年間(永久,1113,1118). 年間(元永,1118,1120). 年間(保安,1120,1124). 年間(天治,1124,1126). 年間(大治,1126,1131). 年間(天承,1131,1132). 年間(長承,1132,1135). 年間(保延,1135,1141). 年間(永治,1141,1142). 年間(康治,1142,1144). 年間(天養,1144,1145). 年間(久安,1145,1151). 年間(仁平,1151,1154). 年間(久寿,1154,1156). 年間(保元,1156,1159). 年間(平治,1159,1160). 年間(永暦,1160,1161). 年間(応保,1161,1163). 年間(長寛,1163,1165). 年間(永万,1165,1166). 年間(仁安,1166,1169). 年間(嘉応,1169,1171). 年間(承安,1171,1175). 年間(安元,1175,1177). 年間(治承,1177,1181). 年間(養和,1181,1182). 年間(寿永,1182,1185). 年間(文治,1185,1190). 年間(建久,1190,1199). 年間(正治,1199,1201). 年間(建仁,1201,1204). 年間(元久,1204,1206). 年間(建永,1206,1207). 年間(承元,1207,1211). 年間(建暦,1211,1213). 年間(建保,1213,1219). 年間(承久,1219,1222). 年間(貞応,1222,1224). 年間(元仁,1224,1225). 年間(嘉祿,1225,1227). 年間(安貞,1227,1229). 年間(寛喜,1229,1232). 年間(貞永,1232,1233). 年間(天福,1233,1234). 年間(文暦,1234,1235). 年間(嘉禎,1235,1238). 年間(暦仁,1238,1239). 年間(延応,1239,1240). 年間(仁治,1240,1243). 年間(寛元,1243,1247). 年間(宝治,1247,1249). 年間(建長,1249,1256). 年間(康元,1256,1257). 年間(正嘉,1257,1259). 年間(正元,1259,1260). 年間(文応,1260,1261). 年間(弘長,1261,1264). 年間(文永,1264,1275). 年間(建治,1275,1278). 年間(弘安,1278,1288). 年間(正応,1288,1293). 年間(永仁,1293,1299). 年間(正安,1299,1302). 年間(乾元,1302,1303). 年間(嘉元,1303,1306). 年間(徳治,1306,1308). 年間(延慶,1308,1311). 年間(応長,1311,1312). 年間(正和,1312,1317). 年間(文保,1317,1319). 年間(元応,1319,1321). 年間(元亨,1321,1324). 年間(正中,1324,1326). 年間(嘉暦,1326,1329). 年間(元徳,1329,1331). 年間(元弘,1331,1332). 年間(正慶,1332,1334). 年間(建武,1334,1338). 年間(暦応,1338,1342). 年間(康永,1342,1345). 年間(貞和,1345,1350). 年間(観応,1350,1352). 年間(文和,1352,1356). 年間(延文,1356,1361). 年間(康安,1361,1362). 年間(貞治,1362,1368). 年間(応安,1368,1375). 年間(永和,1375,1379). 年間(康暦,1379,1381). 年間(永徳,1381,1384). 年間(至徳,1384,1387). 年間(嘉慶,1387,1389). 年間(康応,1389,1390). 年間(明徳,1390,1394). 年間(応永,1394,1428). 年間(正長,1428,1429). 年間(永享,1429,1441). 年間(嘉吉,1441,1444). 年間(文安,1444,1449). 年間(宝徳,1449,1452). 年間(享徳,1452,1455). 年間(康正,1455,1457). 年間(長祿,1457,1460). 年間(寛正,1460,1466). 年間(文正,1466,1467). 年間(応仁,1467,1469). 年間(文明,1469,1487). 年間(長享,1487,1489). 年間(延徳,1489,1492). 年間(明応,1492,1501). 年間(文龜,1501,1504). 年間(永正,1504,1521). 年間(大永,1521,1528). 年間(享祿,1528,1532). 年間(天文,1532,1555). 年間(弘治,1555,1558). 年間(永祿,1558,1563). 年間(永禄,1564,1570). 年間(元龜,1570,1573). 年間(天正,1573,1592). 年間(文禄,1592,1596). 年間(慶長,1596,1615). 年間(元和,1615,1624). 年間(寛永,1624,1644). 年間(正保,1644,1648). 年間(慶安,1648,1652). 年間(承応,1652,1655). 年間(明暦,1655,1658). 年間(万治,1658,1661). 年間(寛文,1661,1673). 年間(延宝,1673,1681). 年間(天和,1681,1684). 年間(貞享,1684,1688). 年間(元禄,1688,1704). 年間(宝永,1704,1711). 年間(正徳,1711,1716). 年間(享保,1716,1736). 年間(元文,1736,1741). 年間(寛保,1741,1744). 年間(延享,1744,1748). 年間(寛延,1748,1751). 年間(宝暦,1751,1764). 年間(明和,1764,1772). 年間(安永,1772,1781). 年間(天明,1781,1789). 年間(寛政,1789,1801). 年間(享和,1801,1804). 年間(文化,1804,1818). 年間(文政,1818,1830). 年間(天保,1830,1844). 年間(弘化,1844,1848). 年間(嘉永,1848,1854). 年間(安政,1854,1860). 年間(万延,1860,1861). 年間(文久,1861,1864). 年間(元治,1864,1865). 年間(慶応,1865,1868). 年間(明治,1868,1912). 年間(大正,1912,1926). 年間(昭和,1926,1989). 年間(平成,1989,2017). % 以下のサイトは # 出典 :: 正規表現道場 #494 # 文字xが離散して10個以上であるか(連続している部分は数えない) '文字列の中に文字xが離散して10個以上であるか(連続している部分は数えない)'(_文字列) :- findnsols(10,_,'文字列の中に指定文字または連続した指定文字が離散して存在している。'(x,_文字列,_),L),!, length(L,10). '文字列の中に指定文字または連続した指定文字が離散して存在している。'(_指定文字,_文字列,_副文字列) :- '文字列の中に指定文字または連続した指定文字が離散して存在している。'(_指定文字,_文字列,_前文字列,_副文字列,_後文字列), '前文字列の末尾文字は指定文字ではないし、後文字列の先頭文字も指定文字ではない。'(_指定文字,_前文字列,_後文字列). '文字列の中に指定文字または連続した指定文字が離散して存在している。'(_指定文字,_文字列,_前文字列,_副文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_副文字列,_後文字列), '副文字列は空文字列ではなく、指定文字のみから構成される。'(_指定文字,_副文字列). '副文字列は空文字列ではなく、指定文字のみから構成される。'(_指定文字,_副文字列) :- '副文字列は空文字列ではなく、'(_副文字列), '指定文字のみから構成される。'(_指定文字,_副文字列). '副文字列は空文字列ではなく'(_副文字列) :- _副文字列 \== ''. '指定文字のみから構成される。'(_指定文字,_副文字列) :- forall(sub_atom(_副文字列,_,1,_,_文字),_文字 = _指定文字). '前文字列の末尾文字は指定文字ではないし、後文字列の先頭文字も指定文字ではない。'(_指定文字,_前文字列,_後文字列) :- '前文字列の末尾文字は指定文字ではないし、'(_指定文字,_前文字列), '後文字列の先頭文字も指定文字ではない。'(_指定文字,_後文字列). '前文字列の末尾文字は指定文字ではないし、'(_指定文字,_前文字列) :- \+(sub_atom(_前文字列,_,1,0,_指定文字)). '後文字列の先頭文字も指定文字ではない。'(_指定文字,_後文字列) :- \+(sub_atom(_後文字列,0,1,_,_指定文字)). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典 :: 正規表現道場 #494 # 文字xが連続して10個以上である場合にマッチさせるのに 文字xが連続して10個以上である場合にマッチさせる(_文字列,_前文字列,_適合文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_適合文字列,_後文字列), '文字xが連続して10個以上、前文字列の最後の文字はxではなく、後文字列の最初の文字もxではない'(_文字列,_前文字列,_適合文字列,_後文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). '文字xが連続して10個以上、前文字列の最後の文字はxではなく、後文字列の最初の文字もxではない'(_文字列,_前文字列,_適合文字列,_後文字列) :- '文字xが連続して10個以上、'(_適合文字列), '前文字列の最後の文字はxではなく、後文字列の最初の文字もxではない'(_前文字列,_後文字列). '文字xが連続して10個以上、'(_適合文字列) :- 文字xが連続して(_適合文字列), '10個以上'(_適合文字列). 文字xが連続して(_適合文字列) :- forall(sub_atom(_適合文字列,_,1,_,_文字),_文字 = x). '10個以上'(_適合文字列) :- atom_length(_適合文字列,_連続文字列長), _連続文字列長 >= 10. '前文字列の最後の文字はxではなく、後文字列の最初の文字もxではない'(_前文字列,_後文字列) :- '前文字列の最後の文字はxではなく、'(_前文字列), '後文字列の最初の文字もxではない'(_後文字列). '前文字列の最後の文字はxではなく、'(_前文字列) :- \+('前文字列の最後の文字はx'(_前文字列)). '前文字列の最後の文字はx'(_前文字列) :- sub_atom(_前文字列,_,1,0,x). '後文字列の最初の文字もxではない'(_後文字列) :- \+('後文字列の最初の文字もx'(_後文字列)). '後文字列の最初の文字もx'(_後文字列) :- sub_atom(_後文字列,0,1,_,x). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 144代目 #937 # 【質問テンプレ】 # [1] 授業単元:画像処理学 # [2] 問題文(含コード&リンク): #   指定されたエクセルのCSVファイルの中にあるデータを読み込み #   それぞれのデータの各列に列の番号の値を加えて #   別のCSVファイルとして出力せよ. 指定されたエクセルのCSVファイルの中にあるデータを読み込みそれぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(_指定されたCSVファイル,_別のCSVファイル) :- 指定されたエクセルのCSVファイルの中にあるデータを読み込み(_指定されたCSVファイル,LL), それぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(LL,_別のCSVファイル). 指定されたエクセルのCSVファイルの中にあるデータを読み込み(_指定されたCSVファイル,LL) :- findall(L,( repeat, 行入力(_行),(_行=end_of_file,seen,!,fail;数値変換項目区切り(_行,[','],L))),LL). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). それぞれのデータの各列に列の番号の値を加えて別のCSVファイルとして出力せよ(LL,_別のCSVファイル) :- それぞれのデータの各列に列の番号の値を加えて(LL,LL_2), 別のCSVファイルとして出力せよ(LL_2,_別のCSVファイル). それぞれのデータの各列に列の番号の値を加えて(LL,LL_2) :- findall(L2,( データの各列に列の番号の値を加えて(LL,L2)),LL_2). データの各列に列の番号の値を加えて(LL,L2) :- member(L,LL), 列の番号の値を加えて(L,L2). 列の番号の値を加えて(L,L2) :- findall(_列番号を加えられた列の値,( 列の値を取り出し列番号を加える(L,_列番号を加えられた列の値)),L2). 列の値を取り出し列番号を加える(L,_列番号を加えられた列の値) :- nth1(_列番号,L,_列の値), _列番号を加えられた列の値 is _列の値 + _列番号. 別のCSVファイルとして出力せよ(LL,_別のCSVファイル) :- tell(_別のCSVファイル), 'CSVファイルとして出力'(LL), told. 'CSVファイルとして出力'(LL) :- forall(項目区切り行をカンマ区切り文字列に変換して(LL,_カンマ区切り文字列),writef('%w\n',[_カンマ区切り文字列])). 項目区切り行をカンマ区切り文字列に変換して(LL,_カンマ区切り文字列) :- member(L,LL), atomic_list_concat(L,',',_カンマ区切り文字列). 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 正規表現道場 #388 # 質問させてください。 # OSはubuntu8.04で正規表現を勉強し始めの者です。 # # 電話番号と郵便番号が混在しているテキストファイルから郵便番号だけ # 抽出するという条件なんですが、 # # 郵便番号はxxx-xxxx(xは0-9の数字)、電話番号はxx-xxxx-xxxx(xは0-9の数字) # で、grep -E [0-9]\{3\}-[0-9]\{4\} とやっても電話番号も全て抽出されてしまいます。 # どこが間違っているのでしょうか。 # # 電話番号と郵便番号が混在しているテキストファイルから郵便番号だけ抽出する(_文字列,_前文字列,_郵便番号,_後文字列) :- 副文字列(_文字列,_前文字列,_郵便番号,_後文字列), 郵便番号(_郵便番号), '前文字列の最後の文字と後文字列の最初の文字は数字または"-"であってはならない'(_前文字列,_後文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 郵便番号(_郵便番号) :- '"-"を挟んで前3桁と後4桁に分割する'(_郵便番号,_前3桁,_後4桁), '前3桁と後4桁はともにすべて数字から構成される'(_前3桁,_後4桁). '"-"を挟んで前3桁と後4桁に分割する'(_郵便番号,_前3桁,_後4桁) :- 副文字列(_郵便番号,_前3桁,'-',_後4桁), atom_length(_前3桁,3), atom_length(_後4桁,4). '前3桁と後4桁はともにすべて数字から構成される'(_前3桁,_後4桁) :- '前3桁はすべて数字から構成される'(_前3桁), '後4桁はすべて数字から構成される'(_後4桁). '前3桁はすべて数字から構成される'(_前3桁) :- forall(sub_atom(_前3桁,_,1,_,_数字),数字(_数字)). '後4桁はすべて数字から構成される'(_後4桁) :- forall(sub_atom(_後4桁,_,1,_,_数字),数字(_数字)). 数字(_数字) :- member(_数字,['0','1','2','3','4','5','6','7','8','9']). '前文字列の最後の文字と後文字列の最初の文字は数字または"-"であってはならない'(_前文字列,_後文字列) :- '前文字列の最後の文字は数字または"-"であってはならない'(_前文字列), '後文字列の最初の文字は数字または"-"であってはならない'(_後文字列). '前文字列の最後の文字は数字または"-"であってはならない'(_前文字列) :- \+('前文字列の最後の文字は数字か"-"である'(_前文字列)). '後文字列の最初の文字は数字または"-"であってはならない'(_後文字列) :- \+('後文字列の最初の文字は数字か"-"である'(_後文字列)). '前文字列の最後の文字は数字か"-"である'(_前文字列) :- sub_atom(_前文字列,_,1,0,_最後の文字), '数字か"-"である'(_最後の文字). '後文字列の最初の文字は数字か"-"である'(_後文字列) :- sub_atom(_後文字列,0,1,_,_最初の文字), '数字か"-"である'(_最初の文字). '数字か"-"である'(_文字) :- 数字(_数字). '数字か"-"である'('-'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1291471791/933 # # # * # ** # *** # **** # ***** # ****** # ******* # ******** # ********* # ********** # # こんな感じで表示したいんだけど、どうすればいいの? # '*\n**\n***\n****\n*****\n******\n*******\n********\n*********\n********** \n\nこんな感じで表示したいんだけど、どうすればいいの?' :- atom_chars(**********,L), append([*|R0],R,L), concat_atom([*|R0],S), write_formatted('%t\n',[S]), R = []. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '*\n**\n***\n****\n*****\n******\n*******\n********\n*********\n********** \n\nこんな感じで表示したいんだけど、どうすればいいの?' :- 'こんな感じで表示したいんだけど、どうすればいいの?'(''). 'こんな感じで表示したいんだけど、どうすればいいの?'('**********') :- !. 'こんな感じで表示したいんだけど、どうすればいいの?'(_星列) :- atom_concat(_星列,*,_星列の二), write_formatted('%t\n',[_星列の二]), 'こんな感じで表示したいんだけど、どうすればいいの?'(_星列の二). % 以下のサイトは # 出典 :: 正規表現 Part7 #332 # ●環境 # vb.net # # ●したいこと # 3文字以上の繰り返し表現を抽出 # # ●サンプル # 例文1)死にたい死にたい死にたい死にたい死にたい # 結果1)死にたい # # ●したいこと # 2箇所以上出現する3文字以上の文字列 # # 例文2)筋肉バスターと阿修羅バスター # 結果2)バスター # # # ってのを正規表現でやるのは無理でしょうか・・・ # '重複しない3文字以上の繰り返し表現を抽出'(_文字列,_重複しない3文字以上の繰り返し表現ならび) :- setof(_3文字以上の繰り返し表現,( _3文字以上の繰り返し表現 ^ '3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現)),_重複しない3文字以上の繰り返し表現ならび). '3文字以上の繰り返し表現を抽出'(_文字列,_3文字以上の繰り返し表現) :- 副文字列(_文字列,_前文字列,_3文字以上の繰り返し表現,_後文字列), '3文字以上の繰り返し表現を'(_文字列,_3文字以上の繰り返し表現,_後文字列). '3文字以上の繰り返し表現を'(_文字列,_3文字以上の繰り返し表現,_後文字列) :- '3文字以上の'(_3文字以上の繰り返し表現,_文字長), sub_atom(_後文字列,_,_文字長,_,_3文字以上の繰り返し表現). '3文字以上の'(_3文字以上の繰り返し表現,_文字長) :- atom_length(_3文字以上の繰り返し表現,_文字長), _文字長 >= 3. 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1289913298/669 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク):コマンドライン./a.out <オプション> <引数1> <引数2> # について、<オプション>がcatのときは<引数1>の後ろに<引数2>を連結した文字列を返し、 # <オプション>がcmpのときは両引数を比較し、同じ文字列の場合はsameを、異なる場合はdiffを表示するプログラムを作れ。 # program :- 'コマンドライン./a.out <オプション> <引数1> <引数2>について、<オプション>がcatのときは<引数1>の後ろに<引数2>を連結した文字列を返し、<オプション>がcmpのときは両引数を比較し、同じ文字列の場合はsameを、異なる場合はdiffを表示する'. 'コマンドライン./a.out <オプション> <引数1> <引数2>について、<オプション>がcatのときは<引数1>の後ろに<引数2>を連結した文字列を返し、<オプション>がcmpのときは両引数を比較し、同じ文字列の場合はsameを、異なる場合はdiffを表示する' :- user_parameters(L), オプションの取得(L,_オプション), 引数1と引数2を取得(L,_引数1,_引数2), オプションによって機能の選択と実行(_オプション,_引数1,_引数2),!. オプションの取得(L,_オプション) :- append(_,[_ハイフン付きオプション|_],L), sub_atom(_ハイフン付きオプション,0,1,Len,'-'), sub_atom(_ハイフン付きオプション,1,Len,_オプション),!. 引数1と引数2を取得(_ユーザパラメータ,_引数1,_引数2) :- findall(_引数,( append(_,[_引数|_],_ユーザパラメータ), \+(sub_atom(_ハイフン付きオプション,0,1,Len,'-'))),[_引数1,_引数2]). オプションによって機能の選択と実行(cat,_引数1,_引数2) :- atom_concat(_引数1,_引数2,_連結した文字列), write_formatted('%t\n',[_連結した文字列]),!. オプションによって機能の選択と実行(cmp,_引数,_引数) :- write('same\n'),!. オプションによって機能の選択と実行(cmp,_引数1,_引数2) :- \+(_引数1=_引数2), write('diff\n'),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/628 # # [1] 授業単元:基礎プログラミング # [2] 問題文(含コード&リンク) # 問題4 風林火山を、2つのputs関数を使用して表示するプログラムを作成しなさい '風林火山を、2つのputs関数を使用して表示する'(_風林火山前半表示,_風林火山後半表示) :- write('\n'), atom_chars(風林火山,L), findall(S,( append(_,[A|_],L), atom_concat(' ',A,S)), L2), append(L0,L1,L2), \+(L1=[]), \+(L2=[]), concat_atom(L0,'\n',_風林火山前半表示), concat_atom(L1,'\n',_風林火山後半表示), puts(_風林火山前半表示), puts(_風林火山後半表示), write('\n'). puts(S) :- write_formatted('%t\n',[S]). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1286978599/323 # # [1] 授業単元: # [2] 問題文(含コード&リンク): # 西暦年数を与えて、その年の干支を求めるプログラムを作成せよ。 # 干支は、十干と十二支とをそろぞれサイクリックに変えながら組み合わせることによって60(10と12の最小公倍数)通りが得られる。 # 例:1989年は己巳。 # '西暦年数を与えて、その年の干支を求める'(_西暦年数,_干支) :- 基準年(_基準年), 西暦を年ならび表現に変換(_基準年,_基準年ならび表現), 西暦を年ならび表現に変換(_西暦年数,_西暦年ならび表現), '西暦年数を与えて、その年の干支を求める'(_基準年ならび表現,_西暦年ならび表現,_干支). '西暦年数を与えて、その年の干支を求める'(_基準年ならび表現,_西暦年ならび表現,_干支) :- _西暦年ならび表現 @=< _基準年ならび表現, '基準年起点の十干・十二支ならび'(_基準年の十干ならび,_基準年の十二支ならび), 六十干支を遡って生成(_基準年ならび表現,_基準年の十干ならび,_基準年の十二支ならび,_西暦年ならび表現,_干支). '西暦年数を与えて、その年の干支を求める'(_基準年ならび表現,_西暦年ならび表現,_干支) :- _西暦年ならび表現 @> _基準年ならび表現, trace, '基準年起点の十干・十二支ならび'(_基準年の十干ならび,_基準年の十二支ならび), 六十干支の生成(_基準年ならび表現,_基準年の十干ならび,_基準年の十二支ならび,_西暦年ならび表現,_干支). 西暦を年ならび表現に変換(_年,_年ならび表現) :- length(_年ならび表現,_年), all(_年ならび表現,年),!. '基準年起点の十干・十二支ならび'(_基準年の十干ならび,_基準年の十二支ならび) :- 基準年の干(_基準年の干), 基準年の支(_基準年の支), findall(_干,十干(_,_干,_,_),L1), ならびの回転(右方向,L1,_基準年の十干ならび), _基準年の十干ならび = [_基準年の干|_], findall(_支,十二支(_支,_),L3), ならびの回転(右方向,L3,_基準年の十二支ならび), _基準年の十二支ならび = [_基準年の支|_],!. 基準年(2010). 基準年の干(庚). 基準年の支(寅). 六十干支を遡って生成(_西暦年ならび表現,[_十干|R1],[_十二支|R2],_西暦年ならび表現,_六十干支) :- atom_concat(_十干,_十二支,_六十干支). 六十干支を遡って生成([_|_年ならび表現],_十干ならび1,_十二支ならび1,_西暦年ならび表現,_六十干支) :- ならびの回転(右方向,_十干ならび1,_十干ならび2), ならびの回転(右方向,_十二支ならび1,_十二支ならび2),!, 六十干支を遡って生成(_年ならび表現,_十干ならび2,_十二支ならび2,_西暦年ならび表現,_六十干支). 六十干支の生成(_西暦年ならび表現,[_十干|_],[_十二支|_],_西暦年ならび表現,_六十干支) :- concat_atom([_十干,_十二支],_六十干支). 六十干支の生成(_年ならび表現,_十干ならび1,_十二支ならび1,_西暦年ならび表現,_六十干支) :- ならびの回転(左方向,_十干ならび1,_十干ならび2), ならびの回転(左方向,_十二支ならび1,_十二支ならび2), 六十干支の生成([年|_年ならび表現],_十干ならび2,_十二支ならび2,_西暦年ならび表現,_六十干支). 十干(陽,甲,木の兄,きのえ). 十干(陰,乙,木の弟,きのと). 十干(陽,丙,火の兄,ひのえ). 十干(陰,丁,火の弟,ひのと). 十干(陽,戊,土の兄,つちのえ). 十干(陰,己,土の弟,つちのと). 十干(陽,庚,金の兄,かのえ). 十干(陰,辛,金の弟,かのと). 十干(陽,壬,水の兄,みずのえ). 十干(陰,癸,水の弟,みずのと). 十二支(子,ね). 十二支(丑,うし). 十二支(寅,とら). 十二支(卯,う). 十二支(辰,たつ). 十二支(巳,み). 十二支(午,うま). 十二支(未,ひつじ). 十二支(申,さる). 十二支(酉,とり). 十二支(戌,いぬ). 十二支(亥,い). ならびの回転(左方向,[A|R],L) :- append(R,[A],L). ならびの回転(右方向,L1,L) :- append(R,[A],L1), append([A],R,L). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 六十干支の生成(_六十干支ならび) :- findall(_十干,十干(_十干,_),_十干ならび), findall(_十二支,十二支(_十二支,_),_十二支ならび), 六十干支の生成(_十干ならび,_十二支ならび,_六十干支ならび). 六十干支の生成([_十干|R1],[_十二支|R2],_六十干支) :- concat_atom([_十干,_十二支],_六十干支). 六十干支の生成(_十干ならび1,_十二支ならび1,_六十干支) :- ならびの回転(左方向,_十干ならび1,_十干ならび2), ならびの回転(左方向,_十二支ならび1,_十二支ならび2), 六十干支の生成(_十干ならび2,_十二支ならび2,_六十干支). 六十干支を遡って生成([_十干|R1],[_十二支|R2],_六十干支) :- atom_concat(_十干,_十二支,_六十干支). 六十干支を遡って生成(_十干ならび1,_十二支ならび1,_六十干支) :- ならびの回転(右方向,_十干ならび1,_十干ならび2), ならびの回転(右方向,_十二支ならび1,_十二支ならび2),!, 六十干支を遡って生成(_十干ならび2,_十二支ならび2,_六十干支). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/777 # # [1] 授業単元:プログラミング実習 # [2] 問題文(含コード&リンク):0x20から0x7Eまでの文字コード表を出力せよ。 # 以下のようにすること。 # # Hex Dec 文字 # ------------ # 20 32 # 21 33 ! # 22 34 " # 23 35 # #  途中略 # 7D 125 } # 7E 126 ~ # # '0x20から0x7Eまでの文字コード表を出力する' :- write('Hex Dec 文字\n------------\n'), for(32,N,126), '16進数表示に変換'(N,_16進表示), char_code(_文字,N), write_formatted('%t %3d %t\n',[_16進表示,N,_文字]), N = 126. '16進数表示に変換'(N,_16進表示) :- Div is N // 16, Mod is N mod 16, '16進文字'(Div,_16進文字_1), '16進文字'(Mod,_16進文字_2), atom_concat(_16進文字_1,_16進文字_2,_16進表示). '16進文字'(N,_16進文字) :- N >= 0, N =< 9, number_chars(N,[_16進文字]),!. '16進文字'(10,'A'). '16進文字'(11,'B'). '16進文字'(12,'C'). '16進文字'(13,'D'). '16進文字'(14,'E'). '16進文字'(15,'F'). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1284632294/633 # # [1]C言語中級 # [2]指定されたフロー構造に基づき次の仕様のプログラムを作成せよ # 仕様: # ★行とは、先頭か最後の区切り子からその次の区切り子までの区切り子を含まない文字列のこと # ただしその次の区切り子が出現しないまま終端した場合は最後の文字列まで # ★区切り子とは、改行文字(0x0A) 復改文字(0x0D),その組み合わせ(0x0D0x0A,0x0A0x0D)のいずれかと # する(混在することを前提) # ★標準入力から任意の長さの文字列を読み取り各行の空白スペースを除く先頭が0〜9からなる # 文字列(これをキー数列と呼ぶ)でその直後が空白、タブで区切られている場合に限りその行を認識する。 # それ以外の形式の場合は認識せず無視する。キー数列の長さが1024を超える場合も無視対象とする。 # ★認識した行はキー数列を10進数の正整数を表すものとして、その順序(小さい順)に # 整列して出力する # フロー構造 # main関数のみで構成。ライブラリ関数はstdio.hで定義されている関数のみを利用可能とする。 # 当然だが記憶領域はキー数列を記憶する領域の3倍程度しか確保できないことを前提 # [3] FreeBSD上でC言語で記述しgccコンパイラで処理する。 # [4] 10/10迄 # '標準入力から任意の長さの文字列を読み取り各行の空白スペースを除く先頭が0〜9からなる文字列(これをキー数列と呼ぶ)でその直後が空白、タブで区切られている場合に限りその行を認識する。' :- get_chars(Chars), 行と認識(Chars,'',_行ならび), sort(_行ならび,_昇順の行ならび), 文字列部分のみ出力(L2). 行と認識([],_行,[[_10進キー数値,_行]]) :- 行検査(_行,_10進キー数値),!. 行と認識([],_行,[]) :- !. 行と認識(['\r','\n'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\n','\r'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\r'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識(['\n'|R],_行,[[_10進キー数値,_行]|R2]) :- 行検査(_行,_10進キー数値), 行と認識(R,'',R2),!. 行と認識([A|R1],_行1,R2) :- \+(member(A,['\n','r'])), atom_concat(_行1,A,_行2), 行と認識(R1,_行2,R2). 行と認識([A|R1],_行1,R2) :- member(A,['\n','\r']), 行と認識(R1,_行1,R2). 文字列部分のみ出力(L) :- append(_,[[_,_行]|R],L), write_formatted('%t\n',[_行]), R = []. 行検査(_行,N) :- 空白・タブを読み飛ばす(_行,_行1), sub_atom(_行1,Len1,1,Len2,A), Len1 =< 1024, member(A,[' ','\t']), sub_atom(_行1,0,Len1,0,B), 全て数字(0,Len1,B), atom_to_chars(B,Bcodes), encode(Bcodes,N). 空白・タブを読み飛ばす(_行,_行1) :- sub_atom(_行,Len,1,Rlen,A), \+(member(A,[' ','\t'])), Len2 is Len + 1, sub_atom(_行,Len2,Rlen,_行1). 全て数字(Len,Len,_) :- !. 全て数字(M,Len,B) :- sub_atom(B,M,1,_,C), member(C,['0','1','2','3','4','5','6','7','8','9']), M2 is M + 1, 全て数字(M2,Len,B). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/unix/1127388574/83 # # 1 # 12 # 123 # 1234 # 12345 # このプログラミング作成したい。 # for文を使って頼むorz # :- op(600,xfx,が). :- op(700,xf,回現れるまで). 'ある文字がN回現れるまで1からの文字連鎖によって文字列を成長させながら表示する'(A が N 回現れるまで) :- 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,'1',_文字列), write_formatted('%t\n',[_文字列]), fail. 'ある文字がN回現れるまで1からの文字連鎖によって文字列を成長させながら表示する'(_,_). 文字連鎖によって文字列を成長させながら表示する(_ が 0 回現れるまで,_文字列) :- !,fail. 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列,_文字列). 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列1,_文字列1,文字列) :- sub_atom(_文字列1,_,1,1,A), 文字連鎖(A,_次の文字), atom_concat(_文字列1,_次の文字,_付加された文字列), N1 is N - 1, 文字連鎖によって文字列を成長させながら表示する(A が N1 回現れるまで,_付加された文字列,文字列). 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_文字列1,_文字列) :- sub_atom(_文字列1,_,1,1,_最後の文字), 文字連鎖(_最後の文字,_次の文字), atom_concat(_文字列1,_次の文字,_付加された文字列), 文字連鎖によって文字列を成長させながら表示する(A が N 回現れるまで,_付加された文字列,_文字列). 文字連鎖('1','2'). 文字連鎖('2','3'). 文字連鎖('3','4'). 文字連鎖('4','5'). 文字連鎖('5','6'). 文字連鎖('6','7'). 文字連鎖('7','8'). 文字連鎖('8','9'). 文字連鎖('9','0'). 文字連鎖('0','1'). %%%%%%%%%%%%% 12345 数値ととらえれば %%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(600,xfx,が). :- op(700,xf,回現れるまで). 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(_ が 0 回現れるまで,_) :- !. 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M) :- A is (M + 1) mod 10, M10 is M * 10, M2 is M10 + M1, write_formatted('%t',[M2]), N1 is N - 1, 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N1 回現れるまで,M2). 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M) :- M1 is (M + 1) mod 10, M10 is M * 10, M2 is M10 + M1, write_formatted('%t',[M2]), N1 is N - 1, 'ある数値がN回現れるまで1からの数値連鎖によって数値列を成長させながら表示する'(A が N 回現れるまで,M2). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 133代目 #210 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10290.txt # # 名前と点数のデータを持っているリスト構造をソートさせたいのです。 # # (名前) (点数) # 骨川スネ夫 50 # 野比のび太 0 # 出木杉英才 100 # 剛田たけし 20 # 源静香    80 # # のようなデータを予め持っているとして、名前でソートしたい時はあいうえお順に、 # 点数でソートしたい時は0から順に並び替え、画面に出力させたいのですが、 # そもそもあいうえお順でソートさせる方法が分からず、 # 名前と点数を同時に動かす方法も思いつかず、提出期限間近になってしまいました。 # どうかお願いします。 # # //漢字でソートは無理だから漢字名とは別に表示させずにひらがなで名前のデータを入れておくのでしょうか? 点数(骨川スネ夫,50). 点数(野比のび太,0). 点数(出木杉英才,100). 点数(剛田たけし,20). 点数(源静香,80). '名前と点数のデータを持っているリスト構造をソートさせたいのです。 (名前) (点数) 骨川スネ夫 50 野比のび太 0 出木杉英才 100 剛田たけし 20 源静香     80 のようなデータを予め持っているとして、名前でソートしたい時はあいうえお順に、 点数でソートしたい時は0から順に並び替え、画面に出力させたい'(_点数で整列された_名前_点数ならび) :- findall([_名前,点数],点数(_名前,_点数),_名前_点数ならび), '「漢字文字列・点数」を「かな読み・点数」で整列する'(_名前_点数ならび,_点数で整列された_名前_点数ならび). '「漢字文字列・点数」を「かな読み・点数」で整列する'(_漢字文字列_点数ならび,_整列された漢字文字列ならび) :- 'かな読みに変換しながらデータ番号を付加して、さらに整列する。'(1,_漢字文字列_点数ならび,LL2), '付加されたデータ番号により整列された漢字文字列・点数ならびを得る'(LL2,_漢字文字列_点数ならび,_整列された漢字文字列ならび). 'かな読みに変換しながらデータ番号を付加して、さらに整列する。'(N,_漢字文字列_点数ならび,LL2) :- かな読みに変換しながらデータ番号を付加して(N,_漢字文字列_点数ならび,LL1), さらに整列する(LL1,LL2). かな読みに変換しながらデータ番号を付加して(_,[],[]) :- !. かな読みに変換しながらデータ番号を付加して(N,_漢字文字列_点数ならび,_かなに変換された文字列_点数ならび) :- 全ての漢字文字列をかな読みに変換しながらデータ番号を付加して行く(N,_漢字文字列_点数ならび,_かなに変換された文字列_点数ならび). さらに整列する(LL1,LL2) :- sort(LL1,LL2). 全ての漢字文字列をかな読みに変換しながらデータ番号を付加して行く(N,[[_漢字文字列,_点数]|R1],[[_かなに変換された文字列,_点数,N]|R2]) :- 漢字文字列を可能な限りかな読み文字列に変換する(_漢字文字列,_かなに変換された文字列), succ(N,N2), かな読みに変換しながらデータ番号を付加して(N2,R1,R2). '付加されたデータ番号により整列された漢字文字列・点数ならびを得る'([],_,[]) :- !. '付加されたデータ番号により整列された漢字文字列・点数ならびを得る'([[_,_,N]|R1],_漢字文字列_点数ならび,[L|R2]) :- nth1(N,_漢字文字列_点数ならび,L), '付加されたデータ番号により整列された漢字文字列・点数ならびを得る'(R1,_漢字文字列_点数ならび,R2). 漢字文字列を可能な限りかな読み文字列に変換する(_漢字文字列,_かなに変換された文字列) :- 漢字文字列をかな読みならびに変換する(_漢字文字列,_かな読みならび), atomic_list_concat(_かな読みならび,_かなに変換された文字列). 漢字文字列をかな読みならびに変換する(_漢字文字列,_かな読みならび) :- 先頭からかな読みに変換して行く(_漢字文字列,_かな読みならび),!. 漢字文字列をかな読みならびに変換する(_,[]). 先頭からかな読みに変換して行く(_漢字文字列,[_かな読み|R2]) :- atom_concat(A,B,_漢字文字列), かな読み(A,_かな読み), 漢字文字列をかな読みならびに変換する(B,R2). かな読み(骨川,ほねかわ). かな読み(スネ夫,すねお). かな読み(野比,のび). かな読み(のび太,のびた). かな読み(出木杉,できすぎ). かな読み(英才,ひでたけ). かな読み(剛田,ごうだ). かな読み(たけし,たけし). かな読み(源,みなもと). かな読み(静香,しずか). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 136代目 #28 # 猫、以下の話だが↓この結果が # # @ #  @ #   @ #    @ #     @ #    @ #   @ #  @ # @ # # '猫、以下の話' :- '猫、以下の話'('','    '). '猫、以下の話'(A,B) :- '第一引数と第二引数が一致したら折り返す'(A,B),!. '猫、以下の話'(A,B) :- '行きと帰りに同じ行を印字する'(A,B). '第一引数と第二引数が一致したら折り返す'(A,A) :- 一行描画(A). '行きと帰りに同じ行を印字する'(A,B) :- 一行描画(A), atom_concat(' ',A,A2), '猫、以下の話'(A2,B), 一行描画(A). 一行描画(A) :- writef('%w@\n',[A]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 133代目 #6 # # 問題4 # 平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出するプログラムを作成せよ。Aの平方根はsqrt(A)という数学関数で算出される(Aは引数でdouble型)。 # 数学関数を使用する場合、というファイルから情報を得なければならないので、#includeの # 下の行に#includeという命令文を付け加えなければならない(2つのinclude文)。実行結果の例を以下に示す。 # ------------------------------------------------ # x1:0 # y1:0 # x2:1 # y2:1 # この2点間の距離は1.414214です。 '平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出する。そして表示する' :- '平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出する。'(_2点間の距離), 'そして表示する。'(_2点間の距離). '平面上の2点(x1,y1)、(x2,y2)を入力し、それら2点間の距離を算出する。'(_2点間の距離) :- '平面上の2点(x1,y1)、(x2,y2)を入力し、'([x1,y1,x2,y2],[_x1,_y1,_x2,_y2]), 'それら2点間の距離を算出する。'(_x1,_y1,_x2,_y2,_2点間の距離). '平面上の2点(x1,y1)、(x2,y2)を入力し、'([],[]). '平面上の2点(x1,y1)、(x2,y2)を入力し、'(_座標点の要素名ならび,_座標点の要素の値ならび) :- '案内に従い、平面上の2点(x1,y1)、(x2,y2)、則ち4つの座標の要素を入力して行く'(_座標点の要素名ならび,_座標点の要素の値ならび). '案内に従い、平面上の2点(x1,y1)、(x2,y2)、則ち4つの座標の要素を入力して行く'([_座標点の要素名|R1],[_座標点の要素の値|R2]) :- atom_concat(_座標点の要素名,' : ',_案内), 催促付きで数を得る(_案内,_座標点の要素の値), '平面上の2点(x1,y1)、(x2,y2)を入力し、'(R1,R2). 催促付きで数を得る(_催促,_数) :- 催促付き行入力(_催促,_行), 数入力検査(_行,_数),!. 催促付きで数を得る(_催促,_数) :- 催促付きで数を得る(_催促,_数). 催促付き行入力(_催促,_行) :- 催促表示(_催促), 行入力(_行). 催促表示(_催促) :- write(_催促). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). 数入力検査(_行,_数) :- atom_number(_行,_数),!. 数入力検査(_行,_数) :- writef('入力された %w から数を得られませんでした。再入力をお願いします。\n',[_行]),fail. 'それら2点間の距離を算出する。'(_x1,_y1,_x2,_y2,_2点間の距離) :- _2点間の距離 is sqrt((_x2-_x1)^2 + (_y2-_y1)^2). 'そして表示する。'(_2点間の距離) :- writef('この2点間の距離は %w です。\n',[_2点間の距離]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #754 # [1] 授業単元:C # [2] 問題文(含コード&リンク): # 入力されたデータをもとに売上明細を作成して表示する。 # 入力データは商品名と金額で、最大20件とし、^zで終了する。 # 入力されたデータは構造体配列に記録し、 # 入力終了後金額を集計して合計を表示する。 # <構造体メンバ> # 商品名:char型10桁 # 金額:long型 # <実行結果> # ^z # 商品名    金額 # パソコン   248500 # ラジオ     3200 # テレビ    120500 # オーディオ  314000 # レイゾウコ   65800 # クーラー    79000 # 合計    831000 # '入力されたデータをもとに売上明細を作成して表示する。 入力データは商品名と金額で、最大20件とし、\\dで終了する。 入力終了後金額を集計して合計を売上明細として表示する。' :- '入力データは商品名と金額で、最大20件とし、\\dで終了する。'(_入力されたデータ), '金額を集計して合計を売上明細として表示する。'(_入力されたデータ). '入力データは商品名と金額で、最大20件とし、\\dで終了する。'(_入力されたデータ) :- findnsols(20,[_商品名,金額],( at_end_of_stream(current_input),!,fail; 商品名と金額を入力する(_商品名,_金額)),_入力されたデータ),!. 商品名と金額を入力する(_商品名,_金額) :- repeat, 商品名を得る(_商品名), 金額を得る(_金額). 商品名を得る(_商品名) :- 催促後に行入力('商品名 : ',_桁数不問の商品名), '10桁に固定した商品名'(_桁数不問の商品名,_商品名). '10桁に固定した商品名'(_桁数不問の商品名,_商品名) :- 尾部に10桁の空白文字列を付加して(_桁数不問の商品名,_尾部に10桁の空白を付け加えられた商品名), その頭10桁を切り取ることによって尾部に適切な空白桁を付けることができる(_尾部に10桁の空白を付け加えられた商品名,_商品名). 尾部に10桁の空白文字列を付加して(_桁数不問の商品名,_尾部に10桁の空白を付け加えられた商品名) :- atom_concat(_桁数不問の商品名,' ',_尾部に10桁の空白を付け加えられた商品名). その頭10桁を切り取ることによって尾部に適切な空白桁を付けることができる(_尾部に10桁の空白を付け加えられた商品名,_商品名) :- sub_atom(_尾部に10桁の空白を付け加えられた商品名,0,10,_,_商品名). 金額を得る(_金額) :- 整数を得る('金額 : ',true,_金額). 催促後に行入力(_催促,_行) :- write(_催促), 行入力(_行). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_chars(_行,_文字コードならび). 整数を得る(_催促,_評価,_整数) :- 催促後に行入力(_催促,_行), 整数検査(_行,_整数), 整数評価(_評価). 整数検査(_行,_整数) :- atom_number(_行,_整数), integer(_整数). 整数評価(_評価) :- call(_評価). '金額を集計して合計を売上明細として表示する'(_入力されたデータ) :- setof(_商品名,[_商品名,_金額] ^ member([_商品名,_金額],_入力されたデータ),_商品名ならび), '売上明細の見出し表示後、商品名ごとに金額を集計して合計を売上明細として表示する'(_商品名ならび,_入力されたデータ). '売上明細の見出し表示後、商品名ごとに金額を集計して合計を売上明細として表示する'(_商品名ならび,_入力されたデータ) :- '売上明細の見出し表示後、', '商品名ごとに金額を集計して合計を売上明細として表示する'(_商品名ならび,_入力されたデータ). '商品名ごとに金額を集計して合計を売上明細として表示する'(_商品名ならび,_入力されたデータ) :- forall( member(_商品名,_商品名ならび), 商品名の売上金額を集計して一行に表示する(_商品名,_入力されたデータ)). 商品名の売上金額を集計して一行に表示する(_商品名,_入力されたデータ) :- 商品名の売上金額を集計して(_商品名,_入力されたデータ,_金額合計), 一行に表示する(_商品名,_金額合計). 商品名の売上金額を集計して(_商品名,_入力されたデータ,_金額合計) :- findsum(_金額,( member([_商品名,_金額],_入力されたデータ)),_金額合計). '売上明細の見出し表示後、' :- write('商品名    金額\n'). 一行に表示する(_商品名,_金額合計) :- writef('%w\t%w\n',[_商品名,_金額]). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #407 # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # 課題1、文字列、と2つの整数(それぞれ n, m とする)を入力すると # n文字目から m文字 *に変えるプログラムを書け。 # # 実行例 #   文字を入力して下さい # Toshidaigaku # nを入力して下さい # 4 # mを入力して下さい # 2 # 出力は # Tos**daigaku # # 課題2、文字列を入力すると、全ての文字を次の文字コードの文字に # 変えて、結果を表示するプログラムを書け。 # # 実行例 # # 文字を入力して下さい # Toshidaigaku # 出力は # Uptijebjhblv # # '文字列と2つの整数(それぞれ n, m とする)を入力するとn文字目からm文字*に変える'(_文字列,_n,_m,_変換された文字列) :- 副文字列(_文字列,_前文字列,_置換される副文字列,_後文字列), 置換される副文字列を星文字列に置換して変換された文字列を得る(_n,_m,_前文字列,_置換される副文字列,_後文字列,_変換された文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 置換される副文字列を星文字列に置換して変換された文字列を得る(_n,_m,_前文字列,_置換される副文字列,_後文字列,_変換された文字列) :- 'nとmから前文字列、置換される副文字列が決まる'(_n,_m,_前文字列,_置換される副文字列), 星文字列(_m,_星文字列), '前文字列、星文字列、後文字列を結合して変換された文字列を得る'(_前文字列,_星文字列,_後文字列,_変換された文字列). 'nとmから前文字列、置換される副文字列が決まる'(_n,_m,_前文字列,_置換される副文字列) :- 前文字列の文字列長はn字目のnより1小さくなる(_n,_n_1), atom_length(_前文字列,_n_1), atom_length(_置換される副文字列,_m). 前文字列の文字列長はn字目のnより1小さくなる(_n,_n_1) :- succ(_n_1,_n). 星文字列(_m,_星文字列) :- findall(*,between(1,_m,_),_星ならび), atom_chars(_星文字列,_星ならび). '前文字列、星文字列、後文字列を結合して変換された文字列を得る'(_前文字列,_星文字列,_後文字列,_変換された文字列) :- atomic_list_concat([_前文字列,_星文字列,_後文字列],_変換された文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132台目 #365 # 【質問テンプレ】 # [1]授業単元:応用C言語演習 # [2]問題文(含コード&リンク) # 標準入力から1文字以上の英数字と'_'で構成される単語を読み込み、 # それぞれの単語が何回、何行目の何個目の単語に出現したかを単語アルファベット順 # にリストする索引作成プログラム # アルファベット順出力の後出現頻度(出現が多い単語順、同数についてはアルファベ # ット順)順についても同じ書式で出力 # 改行記号とタブ/アルファベット/数字/ '_' /空白しか標準入力されないとして良い。 # 入力行数、単語長、種数、単語辺りの出現回数に制限は無い。 # 単語の前後の区切りは単語を構成しない文字とする。(行末記号を含む) # 書式: 単語 (回数) 位置(行番号が若い順)改行 # 位置: 'L'行番号(1から開始)-行内単語番号(1から開始) # alpha (3回) L32-5 L66-4 L124-1 # beta (2回) L192-1 L276-3 # :- dynamic(単語索引/3). 文から索引の作成(_ファイル,_索引ならび) :- abolish(単語索引/3), ファイルを行ならびに変換する(_ファイル,_行ならび), 単語索引を作成(_行ならび). 単語索引を作成(_行ならび) :- '行ならびの全行に対して項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行ならび). '行ならびの全行に対して項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行ならび) :- forall( '行ならびの全行に対して'(_行ならび,_行目,_行), '項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行目,_行)). '行ならびの全行に対して'(_行ならび,_行目,_行) :- nth1(_行目,_行ならび,_行). '項目を区切って単語を取り出し、[単語,行目,行の中での位置]を引数とする節を単語索引に登録する'(_行目,_行) :- 項目区切り(_行,[' ','\t'],_単語ならび), 単語索引に登録する(_行目,_単語ならび). 単語索引に登録する(_行目,_単語ならび) :- forall( nth1(_位置,_単語ならび,_単語), assertz(単語索引(_単語,_行目,_位置))). 単語索引の全表示 :- forall(単語ごとの(_単語), '単語ごとの[_行,_位置]の明細と出現数を表示する'(_単語)). 単語ごとの(_単語) :- 単語ならびを生成し(_単語ならび), 一つずつ単語を取りだす(_単語). 単語ならびを生成し(_単語ならび) :- setof(_単語,[_単語,_行,_位置] ^ 単語索引(_単語,_行,_位置),_単語ならび). 一つずつ単語を取りだす(_単語) :- member(_単語,_単語ならび). '単語ごとの[_行,_位置]の明細と出現数を表示する'(_単語) :- '単語ごとの[_行,_位置]の明細'(_単語,_行_位置ならび), '[_行,_位置]の明細と出現数を表示する'(_単語,_行_位置_ならび). '単語ごとの[_行,_位置]の明細'(_単語,_行_位置ならび) :- findall([_行,_位置],( 単語索引(_単語,_行,_位置)),_行_位置ならび). '[_行,_位置]の明細と出現数を表示する'(_単語,_行_位置_ならび) :- length(_行_位置ならび,_度数), writef('%w\t%w\t%w\n',[_単語,_行_位置ならび,_度数]). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/Cの宿題片付けます #321 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # # 2つの文字列をS1とS2の配列に読み、S1の文字列の最初からn個目にS2の文字列を挿入する。 # 例えば、文字列が12345とABでn=3の場合、123AB45となる。 # (1) 配列を用いて作る。 # (2)関数とポインターを用いて作る。 # '2つの文字列をS1とS2の配列に読み、S1の文字列の最初からn個目にS2の文字列を挿入'(_n,S1,S2,S) :- succ(_n_1,_n), atom_length(S1_1,_n_1), atom_concat(S1_1,S1_2,S1), atomic_list_concat([S1_1,S2,S1_2],S). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #157 # [1] 授業単元: アルゴリズム&アプリケーション # [2] 問題文(含コード&リンク):売掛表がcsvファイルで作られています。 # 各行の情報は、 # 顧客名,前月繰越高,当月入金高,当月売上高,締め日付 # であり、締め日付で昇順に整列していて、見出し等冗長部分はありません。 # 今回は問題を単純化するため、一人の顧客分しか扱わないことにします。 # さて更新プログラムのバグから、或る月の前月繰越高が # その前月の 前月繰越高-当月入金高+当月売上高 と不整合になってしまいました。 # 不整合になった以降の情報が正しく、 # それ以前の情報の当月入金高、当月売上高、締め日付については誤りがないとして、 # 1) 不整合部分を探し # 2) それ以前のすべての前月繰越高を全体が整合するように書き換えなさい。 # ファイルは一旦別のファイル(例えば/tmp/xxxxxx)に正しいものをつくり、 # その後、元のcsvファイルに書き戻しなさい。 # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 期限はありません # [5] その他の制限: 日付などの持ち方は自由に工夫してよい。 # # 売掛表の遡行修正(_ファイル名) :- 'ファイルから数値変換項目区切り行ならびを得る'(_ファイル名,[','],LL), '不整合が生じた二行とそれ以前のならびを遡り修正した上で更新済みならびを構成する'(LL,_更新済みのLL), 更新済みならびをファイルに書き戻す(_ファイル名,_更新済みのLL). 'ファイルから数値変換項目区切り行ならびを得る'(_ファイル名,[','],LL) :- open(_ファイル名,read,_入力), 数値変換項目区切り行ならび(_入力,[','],LL), close(_入力). 数値変換項目区切り行ならび(_入力,_区切り文字列ならび,LL) :- findall(L,( repeat,(at_end_of_stream(_入力),!,fail;行入力(_入力,_行),数値変換項目区切り(_行,_区切り文字列ならび,L)),LL). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). '不整合が生じた二行とそれ以前のならびを遡り修正した上で更新済みならびを構成する'(LL,_更新済みのLL) :- 不整合が生じた二行を切り出し不整合を修正する(LL,_それ以前のならび,_不整合が生じた二行,_それ以後のならび,_顧客名,_遡り修正額,_修正済みの不整合が生じた二行), 'それ以前のならびの修正'(_顧客名,_遡り修正額,_それ以前のならび,_修正済みのそれ以前のならび), append([_修正済みのそれ以前のならび,_修正済みの不整合が生じた二行,_それ以後のならび],_更新済みのLL). 不整合が生じた二行を切り出し不整合を修正する(LL,_それ以前のならび,_不整合が生じた二行,_それ以後のならび,_顧客名,_遡り修正額,_修正済みの不整合が生じた二行) :- 不整合が生じた二行(LL,_それ以前のならび,_不整合が生じた二行,_それ以後のならび,_顧客名,_遡り修正額), 不整合が生じた二行の修正(_顧客名,_遡り修正額,_不整合が生じた二行,_修正済みの不整合が生じた二行). 不整合が生じた二行(LL,LL1,[[_顧客名,_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]],LL2,_顧客名,_遡り修正額) :- append([LL1,[[_顧客名,_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]],LL2],LL), '前の月の請求額と当月の繰越額が不整合である。遡り修正額が発生する。'(_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1,_前月繰越高,_遡り修正額). '前の月の請求額と当月の繰越額が不整合である。遡り修正額が発生する。'(_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1,_前月繰越高,_遡り修正額) :- '前の月の請求額と当月の繰越額が不整合である。'(_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1,_前月繰越高), '遡り修正額が発生する。'(_前月繰越高,_当月請求高_1,_遡り修正額). '前の月の請求額と当月の繰越額が不整合である。'(_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1,_前月繰越高) :- _当月請求高_1 is _前月繰越高_1 - _当月入金高_1 + _当月売上高_1, _当月請求高_1 \== _前月繰越高. '遡り修正額が発生する。'(_前月繰越高,_当月請求高_1,_遡り修正額) :- _遡り修正額 is _前月繰越高 - _当月請求高_1. '不整合が生じた二行の修正'(_顧客名,_遡り修正額,[[_顧客名,_前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]],[[_顧客名,_修正済みの前月繰越高_1,_当月入金高_1,_当月売上高_1,_締め日付_1],[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付]]) :- _修正済みの前月繰越高_1 is _前月繰越高_1 + _遡り修正額. 'それ以前のならびの修正'(_顧客名,_遡り修正額,_それ以前のならび,_修正済みのそれ以前のならび) :- findall([_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付],( 'それ以前のならびから行を取り出し、指定された顧客名の前月繰越高だけ修正する'(_顧客名,_遡り修正額,_それ以前のならび,[_顧客名,_前月繰越高,_当月入金高,_当月売上高,_締め日付])),_修正済みのそれ以前のならび). 'それ以前のならびから行を取り出し、指定された顧客名の前月繰越高だけ修正する'(_顧客名,_遡り修正額,_それ以前のならび,[_顧客名_1,_前月繰越高,_当月入金高,_当月売上高,_締め日付]) :- 'それ以前のならびから行を取り出し、'(_それ以前のならび,[_顧客名_1,_前月繰越高_1,_当月入金高,_当月売上高,_締め日付]), 指定された顧客名の前月繰越高だけ修正する(_顧客名,顧客名_1,_遡り修正額,_前月繰越高_1,_前月繰越高). 'それ以前のならびから行を取り出し、'(_それ以前のならび,[_顧客名_1,_前月繰越高_1,_当月入金高,_当月売上高,_締め日付]) :- member([_顧客名_1,_前月繰越高_1,_当月入金高,_当月売上高,_締め日付],それ以前のならび). 指定された顧客名の前月繰越高だけ修正する(_顧客名,_顧客名,_遡り修正額,_前月繰越高_1,_前月繰越高) :- _前月繰越高 is _前月繰越高_1 + _遡り修正額,!. 指定された顧客名の前月繰越高だけ修正する(_顧客名,_顧客名_1,_遡り修正額,_前月繰越高,_前月繰越高) :- _顧客名 \== _顧客名_1. 更新済みならびをファイルに書き戻す(_ファイル名,_更新済みのLL) :- tell(_ファイル名), forall(member(L,_更新済みのLL),writef('%w,%w,%w,%w,%w\n',L)), told. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 数値変換項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 数値変換項目区切り('',_,[],[]) :- !. 数値変換項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 数値変換項目区切り(_文字列,_,[],[_文字列_1]) :- 数値に変換可能なものは変換する(_文字列,_文字列_1). '先頭から区切り文字列で区切って行く(可能なものは数値に変換する)'(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列_1|R2]) :- '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 数値に変換可能なものは変換する(_前文字列,_前文字列_1), 数値変換項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る(前文字列は空文字ではない)'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- member(_区切り文字列,_区切り文字列ならび), 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), 前文字列は空文字ではない(_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). 前文字列は空文字ではない(_前文字列) :- _前文字列 \== ''. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1258158172/123 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 文字列GHIJKLMABCDERSTUVWFNOPQXYZに対して入力した文字列の第1文字目と第2文字目の間にある文字列を表示するプログラムを作る。 # 例:入力文字列がCQであったときCDERSTUVWFNOPQを表示する。 文字列('GHIJKLMABCDERSTUVWFNOPQX'). 文字列から入力された第1文字目と第2文字目の間にある文字列を取り出して表示する(_第1文字目,_第2文字目,_表示する副文字列) :- 文字列から(_文字列), 入力された第1文字目と第2文字目の間にある文字列を取り出して表示する(_文字列,_第1文字目,_第2文字目). 文字列から(_文字列) :- 文字列(_文字列). 入力された第1文字目と第2文字目の間にある文字列を取り出して表示する(_文字列,_第1文字目,_第2文字目) :- 副文字列(_文字列,_前文字列,_副文字列,_後文字列), 入力された第1文字目と第2文字目の間にある(_第1文字目,_第2文字目,_前文字列,_後文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 入力された第1文字目と第2文字目の間にある(_第1文字目,_第2文字目,_前文字列,_後文字列) :- sub_atom(_前文字列,_,1,0,_第一文字目), sub_atom(_後文字列,0,1,_,_第二文字目). 表示する(_副文字列) :- writef('%w\n',[_副文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #97 # struct meibo {char name[20];int eigo; int kokugo;} # みたいな構造体でmeibo_t[]にループでどんどんデータを入れて生きたいのですがどうすれば良いですか? # int a= 0; meibo[a]=みたいにするとエラーがでますし、何か[0]にどんどん数字が足されてるような気がします # 名簿を読み込む(_名簿) :- findall([_名前,_英語,_国語],( 行連続入力(_行),(_行=end_of_file,!,fail;項目区切り(_行,[','],[_名前,_英語,_国語]))),_名簿). 行連続入力(_行) :- repeat, 行入力(_行). 行入力(_行) :- read_line_to_codes(current_input,_文字コードならび), atom_codes(_行,_文字コードならび). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 132代目 #68 # [1] 授業単元: ネットワークプログラミング # [2] 問題文(含コード&リンク): #  あなたのマシンのIPアドレスを表示しなさい # あなたのマシンのIPアドレスを表示(_IPアドレス) :- shs(ifconfig,_行ならび), '行ならびからIPアドレスを取りだす'(_行ならび,_IPアドレス). '行ならびからIPアドレスを取りだす'(_行ならび,_IPアドレス) :- member(_行,_行ならび), 'inetアドレス:の直後にIPアドレスはある'(_行,_IPアドレス). 'inetアドレス:の直後にIPアドレスはある'(_行,_IPアドレス) :- 副文字列(_行,_,'inetアドレス:',_後文字列), 副文字列(_後文字列,_IPアドレス,' ',_),!. 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). shs(Command,X) :- popen(Command,L), 'shs:行区切り'(L,X). 'shs:行区切り'([],[]) :- !. 'shs:行区切り'(L1,L2) :- 'shs:行区切りを続ける'(L1,L2). 'shs:行区切りを続ける'(L1,L2) :- 'shs:改行の前方を切り出す'(L1,L2),!. 'shs:行区切りを続ける'(L1,[_行]) :- atom_chars(_行,L1). 'shs:改行の前方を切り出す'(L1,[S|R]) :- append(L0,['\n'|R1],L1), atom_chars(S,L0), 'shs:行区切り'(R1,R),!. popen(Command,Chars) :- open(pipe(Command),read,Instream), 'popen:一文字ずつ読み出す'(Instream,Chars), close(Instream),!. 'popen:一文字ずつ読み出す'(Instream,[]) :- at_end_of_stream(Instream),!. 'popen:一文字ずつ読み出す'(Instream,L) :- 'popen:一文字ずつ読み出して行く'(Instream,L). 'popen:一文字ずつ読み出して行く'(Instream,[Char|R]) :- get_char(Instream,Char), 'popen:一文字ずつ読み出す'(Instream,R). % 以下のサイトは # 出典 :: Python の宿題ここで答えます Part 1 #964 # 1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. # 2. 氏名として"END"が入力されるまで1.を繰り返す. # 3. "END"が入力されたら,ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す. # '1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. 2. 氏名として"END"が入力されるまで1.を繰り返す. 3. "END"が入力されたら,ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.'(_ディクショナリファイル) :- '1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. 2. 氏名として"END"が入力されるまで1.を繰り返す.', '3. ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.'(_ディクショナリファイル). '1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. 2. 氏名として"END"が入力されるまで1.を繰り返す.' :- キーボードから(_行), '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納する.氏名として"END"が入力されるまで.'(_行). キーボードから(_行) :- 行入力(_行). 行入力(_行) :- read_line_to_codes(user_input,_コードならび), atom_codes(_行,_コードならび). '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納する.氏名として"END"が入力されるまで.'(_行) :- sub_atom(_行,0,3,_,'END'),!. '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納する.氏名として"END"が入力されるまで.'(_行) :- '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納して行く.'(_行). '行を氏名と電話番号に分解する.氏名をキー,電話番号を値としてディクショナリに格納して行く.'(_行) :- '行を氏名と電話番号に分解する.'(_行,_氏名,_電話番号), '氏名をキー,電話番号を値としてディクショナリに格納する.'(_氏名,_電話番号), '1. キーボードから氏名と電話番号を読み込み,氏名をキー,電話番号を値としてディクショナリに格納する. 2. 氏名として"END"が入力されるまで1.を繰り返す.'. '行を氏名と電話番号に分解する.'(_行,_氏名,_電話番号) :- 項目区切り(_行,[' ',','],[_氏名,_電話番号]). '氏名をキー,電話番号を値としてディクショナリに格納する.'(_氏名,_電話番号) :- assertz(ディクショナリ(_氏名,_電話番号)). '3. ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.'(_ディクショナリファイル) :- tell(_ディクショナリファイル), 'ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.', told. 'ディクショナリの内容を "氏名\t電話番号\n" の形式でファイルに書き出す.' :- forall( ディクショナリ(_氏名,_電話番号), writef('%t\t%t\n',[_氏名,_電話番号])). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 131代目 #834 # [1] 授業単元: プログラミング実習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10095.txt # 文字列str1の文末に文字列str2を追加するプログラムを書け。 # この機能を実現する関数にstrcatがあるが、この練習ではstrcatを使用するプログラムと、使用するプログラムの2つをそれぞれかけ。 %%%%%%%%%%%%%%%%% strcat(Atom1,Atom2,Atom3) :- atom_concat(Atom1,Atom2,Atom3). %%%%%%%%%%%%%%%%% strcat(Atom1,Atom2,Atom3) :- 'Atom1とAtom2をそれぞれ文字ならびに変換して'(Atom1,Atom2,Chars1,Chars2), 'それを結合してAtom3に戻す'(Chars1,Chars2,Atom3). 'Atom1とAtom2をそれぞれ文字ならびに変換して'(Atom1,Atom2,Chars1,Chars2) :- atom_chars(Atom1,Chars1), atom_chars(Atom2,Chars2). 'それを結合してAtom3に戻す'(Chars1,Chars2,Atom3) :- append(Chars1,Chars2,Chars3), atom_chars(Atom3,Chars3). %%%%%%%%%%%%%%%%% strcat(Atom,'',Atom). strcat(Atom1,Atom2,Atom3) :- 'Atom2が空文字になるまで、Atom2の先頭文字をAtom1の末尾に付け加えて行く'(Atom1,Atom2,Atom3). 'Atom2が空文字になるまで、Atom2の先頭文字をAtom1の末尾に付け加えて行く'(Atom1,Atom2,Atom3) :- 'Atom2を先頭文字とのこり文字列に分解する(Atom2,_先頭文字,_残り文字列), atom_concat(Atom1,_先頭文字,_末尾に一文字追加された文字列), strcat(_末尾に一文字追加された文字列,_残り文字列,Atom3). 'Atom2を先頭文字とのこり文字列に分解する(Atom2,_先頭文字,_残り文字列) :- sub_atom(Atom2,0,1,R,_先頭文字), sub_atom(Atom2,1,R,0,_残り文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 131代目 #825 # [1] 授業単元:プログム基礎 # [2] 問題文(含コード&リンク):1から20までを表示するプログラムを繰り返し処理を用いて作製しよ '1から20までを表示する' :- between(1,N,20), writef('%w\n',[N]), N=20. %%%% '1から20までを表示する' :- forall( between(1,20,N), writef('%w\n',[N])). %%%% '1から20までを表示する' :- nth1(N,_,_), writef('%w\n',[N]), N = 20,!. %%%% '1から20まで'(1). '1から20まで'(2). '1から20まで'(3). '1から20まで'(4). '1から20まで'(5). '1から20まで'(6). '1から20まで'(7). '1から20まで'(8). '1から20まで'(9). '1から20まで'(10). '1から20まで'(11). '1から20まで'(12). '1から20まで'(13). '1から20まで'(14). '1から20まで'(15). '1から20まで'(16). '1から20まで'(17). '1から20まで'(18). '1から20まで'(19). '1から20まで'(20). '1から20までを表示する' :- forall('1から20まで'(N),writef('%w\n',[N])). %%%% '1から20まで'([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]). '1から20までを表示する' :- '1から20まで'(L), forall(member(N,L),writef('%w\n',[N])). %%%% '1から20までを表示する' :- '1から20までを表示する。Nが20を越えたら停止する。'(N). '1から20までを表示する。Nが20を越えたら停止する。'(N) :- 'Nが20を越えたら停止する。'(N). '1から20までを表示する。Nが20を越えたら停止する。'(N) :- '1から20までを表示する'(N). 'Nが20を越えたら停止する'(N) :- N > 20. '1から20までを表示する'(N) :- 'Nが20以下だったら表示する'(N), succ(N,N_2), '1から20までを表示する。Nが20を越えたら停止する。'(N_2). 'Nが20以下だったら表示する'(N) :- N =< 20, writef('%w\n',[N]). %%%% '1から20までを表示する' :- '1から20までを表示する'(1). '1から20までを表示する'(N) :- N > 20,!. '1から20までを表示する'(N) :- writef('%w\n',[N]), succ(N,N_2), '1から20までを表示する'(N_2). %%%% '1から20までを表示する' :- 連続数の表示(1,20). 連続数の表示(N,M) :- N > M,!. 連続数の表示(N,M) :- writef('%w\n',[N]), succ(N,N_2), 連続数の表示(N_2,M). %%%% '1から20までを表示する' :- findall(N,between(1,20,N),_1から20までのならび), atomic_list_concat(_1から20までのならび,'\n',_表示文字列), writef('%w\n',_表示文字列). %%%% '1から20までを表示する' :- member(A,['','1','2']), member(B,['0','1','2','3','4','5','6','7','8','9']), atom_concat(A,B,C), C \== '0', writef('%w\n',[C]), C = '20',!. %%%% '1から20までを表示する' :- member(A,[0,1,2]), member(B,[0,1,2,3,4,5,6,7,8,9]), N is A * 10 + B, N \== 0, writef('%w\n',[N]), N = 20,!. % 以下のサイトは # 出典 :: C/C++の宿題片付けます 131代目 #598 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): 2つの整数値と1つの文字を、例えば「4+2」のように入力し、 # 入力に応じた四則演算を行って結果を出力するプログラムを作成しなさい。 # ただし、中央の文字に四則演算の記号以外の文字が入力された時のことも考慮しなさい。 二項式(_式文字列,N1,_演算子,N2,_答え,_診断) :- '2つの整数値と1つの文字を、例えば「4+2」のように入力し、入力に応じた四則演算を行って結果を出力する。ただし、中央の文字に四則演算の記号以外の文字が入力された時のことも考慮しなさい。'(_式文字列,N1,_演算子,N2,_答え,_診断). '2つの整数値と1つの文字を、例えば「4+2」のように入力し、入力に応じた四則演算を行って結果を出力する。ただし、中央の文字に四則演算の記号以外の文字が入力された時のことも考慮しなさい。'(_式文字列,N1,_演算子,N2,_答え,_診断) :- '式文字列を前文字列、演算子文字列、後文字列に分解する。前文字列と後文字列は数字のみからなり、演算子文字列は数字を含まない。'(_式文字列,_前文字列,_演算子文字列,_後文字列), '前文字列、後文字列を数値に演算子文字列を演算子に変換して、二項式を評価する。'(_前文字列,_演算子文字列,_後文字列,N1,_演算子,N2,_答え,_診断). '式文字列を前文字列、演算子文字列、後文字列に分解する。前文字列と後文字列は数字のみからなり、演算子文字列は数字を含まない。'(_式文字列,_前文字列,_演算子文字列,_後文字列) :- '式文字列を前文字列、演算子文字列、後文字列に分解する。'(_式文字列,_前文字列,_演算子文字列,_後文字列), '前文字列と後文字列は数字のみからなり、演算子文字列は数字を含まない。'(_前文字列,_演算子文字列,_後文字列). '式文字列を前文字列、演算子文字列、後文字列に分解する。'(_式文字列,_前文字列,_演算子文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_式文字列), atom_concat(_演算子文字列,_後文字列,_残り文字列). '前文字列と後文字列は数字のみからなり、演算子文字列は数字を含まない。'(_前文字列,_演算子文字列,_後文字列) :- '前文字列と後文字列は数字のみからなり、'(_前文字列,_後文字列), '演算子文字列は数字を含まない。'(_演算子文字列). '前文字列と後文字列は数字のみからなり、'(_前文字列,_後文字列) :- 前文字列は数字のみからなる(_前文字列), 後文字列は数字のみからなる(_後文字列). 前文字列は数字のみからなる(_前文字列) :- forall(sub_atom(_前文字列,_,1,_,_文字),数字である(_文字)). 後文字列は数字のみからなる(_後文字列) :- forall(sub_atom(_後文字列,_,1,_,_文字),数字である(_文字)). '演算子文字列は数字を含まない。'(_演算子文字列) :- forall(sub_atom(_演算子文字列,_,1,_,_文字),数字ではない(_文字)). '前文字列、後文字列を数値に演算子文字列を演算子に変換して、二項式を評価する。'(_前文字列,_演算子文字列,_後文字列,N1,_演算子,N2,_答え,_診断) :- '前文字列と後文字列を数値に変換してN1、N2とする'(_前文字列,_後文字列,N1,N2), 演算子文字列から空白を取り除き演算子を得る(_演算子文字列,_演算子), 二項式を評価する(N1,_演算子,N2,_答え,_診断). '前文字列と後文字列を数値に変換してN1、N2とする'(_前文字列,_後文字列,N1,N2) :- atom_number(_前文字列,N1), atom_number(_後文字列,N2). 演算子文字列から空白を取り除き演算子を得る(_演算子文字列,_演算子) :- 演算子文字列から空白を取り除き空白のない演算子文字ならびを得る(_演算子文字列,_空白のない演算子文字ならび), atomic_list_concat(_空白のない演算子文字ならび,_演算子). 演算子文字列から空白を取り除き空白のない演算子文字ならびを得る(_演算子文字列,_空白のない演算子文字ならび) :- findall(_空白ではない文字,演算子文字列から空白を取り除き(_演算子文字列,_空白ではない文字),_空白のない演算子文字ならび). 演算子文字列から空白を取り除き(_演算子文字列,_空白ではない文字) :- sub_atom(_演算子文字列,_,1,_,_空白ではない文字), 空白ではない(_空白ではない文字). 空白ではない(_空白ではない文字) :- _空白ではない文字 \== ' '. 二項式を評価する(N1,_演算子,N2,_答え,演算子が四則演算子ではありません) :- 四則演算子ではない(_演算子). 二項式を評価する(N1,_演算子,N2,_答え,正常終了) :- 演算子が四則演算子である場合式を評価する(_演算子,N1,N2,_答え). 演算子が四則演算子である場合式を評価する(_演算子,N1,N2,_答え) :- 四則演算子である(_演算子), 式を評価する(_演算子,N1,N2,_答え). 数字である(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). 数字ではない(A) :- \+(member(A,['0','1','2','3','4','5','6','7','8','9'])). 四則演算子である(A) :- member(A,['+','-','*','/','//']). 四則演算子ではない(_演算子) :- \+(四則演算子である(_演算子)). 式を評価する(_演算子,N1,N2,_答え) :- _式 =..[_演算子,N1,N2], _答え is _式. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/490 # # [1] プログラミング # [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、 # double型の戻値を持つ関数 absmul() を作成した上で、動作の # 確認の出来るプログラムとして作成せよ。という問題と # # 標準入力からの入力に対して、アルファベットを全て空白文字 # に変更して出力するプログラムを作成せよ % absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :- Y is _浮動小数点数_1 * _浮動小数点数_2, 絶対値(Y,_答え). 絶対値(X,X) :- X >= 0.0. 絶対値(Y,X) :- Y < 0.0,X is -1 * Y. test_absmul :- 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2), write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '), get_float(_浮動小数点数_3), absmul(_浮動小数点数_1,_浮動小数点数_2,_答え), test_absmul_診断(_答え,_浮動小数点数_3,_診断), write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_ 浮動小数点数_3,_答え]), write_formatted('ふたつは%t!!\n',[_診断]). 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :- write('浮動小数点数(1) を入れてください : '), get_float(_浮動小数点数_1), write('浮動小数点数(2) を入れてください : '), get_float(_浮動小数点数_2). test_absmul_診断(F,F,一致しています). test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2). %% アルファベット(尾崎). アルファベット(u). 標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :- 'stty raw', get_char(A), アルファベットを全て空白文字に変更してを出力する(A,''), 'stty -raw'. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- アルファベットとして存在する(B), write(' '),!. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- \+(アルファベットとして存在する(A)),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(B), write(' '), アルファベットを全て空白文字に変更してを出力する(A,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(A), write(' '), get_char(C), アルファベットを全て空白文字に変更してを出力する(C,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- atom_concat(A,B,C), get_char(D), アルファベットを全て空白文字に変更してを出力する(D,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/490 # # [1] プログラミング # [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、 # double型の戻値を持つ関数 absmul() を作成した上で、動作の # 確認の出来るプログラムとして作成せよ。という問題と # # 標準入力からの入力に対して、アルファベットを全て空白文字 # に変更して出力するプログラムを作成せよ % absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :- Y is _浮動小数点数_1 * _浮動小数点数_2, 絶対値(Y,_答え). 絶対値(X,X) :- X >= 0.0. 絶対値(Y,X) :- Y < 0.0,X is -1 * Y. test_absmul :- 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2), write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '), get_float(_浮動小数点数_3), absmul(_浮動小数点数_1,_浮動小数点数_2,_答え), test_absmul_診断(_答え,_浮動小数点数_3,_診断), write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_ 浮動小数点数_3,_答え]), write_formatted('ふたつは%t!!\n',[_診断]). 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :- write('浮動小数点数(1) を入れてください : '), get_float(_浮動小数点数_1), write('浮動小数点数(2) を入れてください : '), get_float(_浮動小数点数_2). test_absmul_診断(F,F,一致しています). test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2). %% アルファベット(尾崎). アルファベット(u). 標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :- 'stty raw', get_char(A), アルファベットを全て空白文字に変更してを出力する(A,''), 'stty -raw'. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- アルファベットとして存在する(B), write(' '),!. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- \+(アルファベットとして存在する(A)),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(B), write(' '), アルファベットを全て空白文字に変更してを出力する(A,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(A), write(' '), get_char(C), アルファベットを全て空白文字に変更してを出力する(C,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- atom_concat(A,B,C), get_char(D), アルファベットを全て空白文字に変更してを出力する(D,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/490 # # [1] プログラミング # [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、 # double型の戻値を持つ関数 absmul() を作成した上で、動作の # 確認の出来るプログラムとして作成せよ。という問題と # # 標準入力からの入力に対して、アルファベットを全て空白文字 # に変更して出力するプログラムを作成せよ % absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :- Y is _浮動小数点数_1 * _浮動小数点数_2, 絶対値(Y,_答え). 絶対値(X,X) :- X >= 0.0. 絶対値(Y,X) :- Y < 0.0,X is -1 * Y. test_absmul :- 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2), write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '), get_float(_浮動小数点数_3), absmul(_浮動小数点数_1,_浮動小数点数_2,_答え), test_absmul_診断(_答え,_浮動小数点数_3,_診断), write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_ 浮動小数点数_3,_答え]), write_formatted('ふたつは%t!!\n',[_診断]). 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :- write('浮動小数点数(1) を入れてください : '), get_float(_浮動小数点数_1), write('浮動小数点数(2) を入れてください : '), get_float(_浮動小数点数_2). test_absmul_診断(F,F,一致しています). test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2). %% アルファベット(尾崎). アルファベット(u). 標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :- 'stty raw', get_char(A), アルファベットを全て空白文字に変更してを出力する(A,''), 'stty -raw'. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- アルファベットとして存在する(B), write(' '),!. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- \+(アルファベットとして存在する(A)),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(B), write(' '), アルファベットを全て空白文字に変更してを出力する(A,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(A), write(' '), get_char(C), アルファベットを全て空白文字に変更してを出力する(C,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- atom_concat(A,B,C), get_char(D), アルファベットを全て空白文字に変更してを出力する(D,C). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 131代目 #490 # [1] プログラミング # [2] double型の引数を2つ持ち、2つの引数の積の絶対値を返す、 # double型の戻値を持つ関数 absmul() を作成した上で、動作の # 確認の出来るプログラムとして作成せよ。という問題と # # 標準入力からの入力に対して、アルファベットを全て空白文字 # に変更して出力するプログラムを作成せよ % absmul(_浮動小数点数_1,_浮動小数点数_2,_答え) :- Y is _浮動小数点数_1 * _浮動小数点数_2, 絶対値(Y,_答え). 絶対値(X,X) :- X >= 0.0. 絶対値(Y,X) :- Y < 0.0,X is -1 * Y. test_absmul :- 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2), write('(1)と(2)の積の絶対値としてあなたが考える答えも入れてください : '), get_float(_浮動小数点数_3), absmul(_浮動小数点数_1,_浮動小数点数_2,_答え), test_absmul_診断(_答え,_浮動小数点数_3,_診断), write_formatted('absmulを使った計算では解は%t あなたの答えは%tでした\n',[_ 浮動小数点数_3,_答え]), write_formatted('ふたつは%t!!\n',[_診断]). 二つの浮動小数点数を得ます(_浮動小数点数_1,_浮動小数点数_2) :- write('浮動小数点数(1) を入れてください : '), get_float(_浮動小数点数_1), write('浮動小数点数(2) を入れてください : '), get_float(_浮動小数点数_2). test_absmul_診断(F,F,一致しています). test_absmul_診断(F1,F2,二値は一致しません) :- \+(F1=F2). %% アルファベット(尾崎). アルファベット(u). 標準入力からの入力に対して、アルファベットを全て空白文字に変更してを出力する :- 'stty raw', get_char(A), アルファベットを全て空白文字に変更してを出力する(A,''), 'stty -raw'. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- アルファベットとして存在する(B), write(' '),!. アルファベットを全て空白文字に変更してを出力する(end_of_file,B) :- \+(アルファベットとして存在する(A)),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(B), write(' '), アルファベットを全て空白文字に変更してを出力する(A,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- アルファベットとして存在する(A), write(' '), get_char(C), アルファベットを全て空白文字に変更してを出力する(C,''),!. アルファベットを全て空白文字に変更してを出力する(A,B) :- atom_concat(A,B,C), get_char(D), アルファベットを全て空白文字に変更してを出力する(D,C). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1255709298/442 # # [1] 授業単元: C言語 # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10025.txt # 「スコアー,ステージナンバー,名前」が入っているファイルがあるとする。 # # 降順にソート済みのスコアーデータのファイルから、上位10件を配列に読み込み、 # 新たに11件目のスコアーデータを入力後、スコアーの大きい順に並び替えを行い、 # 上位10件のデータを再度書き込むプログラムを作成せよ # # 999999,6,faegalr # 999976,123,aaaaaa # 999923,23,Steel # 999765,43,tyudayo # 786754,34,tyui # 713146,10,gawehgpoin # 654789,12,abaeuogn # 479136,65,gwerhja # 456789,43,tyu # 454545,45,454545 # 123456,34,ert '降順にソート済みのスコアーデータのファイルから、上位10件を配列に読み込み、 新たに11件目のスコアーデータを入力後、スコアーの大きい順に並び替えを行い、 上位10件のデータを再度書き込むプログラムを作成せよ'(_ファイル) :- 行ならび入力(ファイル,_行ならび), findall(U,(member(A,Lines),split(A,[','],U)),LL1), 降順整列状態を保って挿入する(L,LL1,LL2), forall(member(L,LL2),(atomic_list_concat(L,',',A),writef('%w\n',[A]))). 行ならび入力(_ファイル,_行ならび) :- open(_ファイル,read,_入力), findall(_行,(repeat,(at_end_of_stream(_入力),close(_入力),!,fail; 行入力(_入力,_行))),_行ならび). 一行追加に入力する(LL1,LL2) :- 行入力(_行), 項目区切り(_行,[','],L), 降順整列状態を保って挿入する(L,LL1,LL2). 行入力(_行) :- 行入力(user_input,_行). 行入力(_入力,_行) :- read_line_to_codes(_入力,_コードならび), atom_codes(_行,_コードならび). 項目区切り(_文字列,_区切り文字ならび,[_項|_項目区切りならび]) :- '前文字列,区切り文字列,後文字列を確定し、前文字列は可能ならば数値に変換する'(_区切り文字列ならび,_文字列,_前文字列,_区切り文字列,_項), 項目区切り(_後文字列,_区切り文字列ならび,_項目区切りならび),!. 項目区切り(_文字列,_,[_項]) :- 可能ならば数値に変換(_文字列,_項). '前文字列,区切り文字列,後文字列を確定し、前文字列は可能ならば数値に変換する'(_区切り文字列ならび,_文字列,_前文字列,_区切り文字列,_変換された項) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字名列ならび), 前文字列は可能ならば数値に変換する(_前文字列,_変換された項). 前文字列は可能ならば数値に変換(_前文字列,_数値に変換した前文字列) :- atom_number(_前文字列,_数値に変換した前文字列),!. 前文字列は可能ならば数値に変換(_前文字列,_前文字列). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 降順整列状態を保って挿入する(_挿入要素,L1,L2) :- 挿入点を求め挿入した上で最終要素を切り落とす(_挿入要素,L1,L2),!. 降順整列状態を保って挿入する(_挿入要素,L1,L1). 挿入点を求め挿入した上で最終要素を切り落とす(_挿入要素,L1,L2) :- 挿入点を求め(_挿入要素,L1,_1,_2,_3), 挿入した上で最終要素を切り落とす(_挿入要素,_1,_2,_3,L2). 挿入点を求め(_挿入要素,L1,_1,_2,_3) :- append(_1,[_2|_3],L1), _挿入要素 @>= _2. 挿入した上で最終要素を切り落とす(_挿入要素,_1,_2,_3,L2) :- append(_1,[_挿入要素,_2|_3],L1_1), append(L2,[_],L1_1). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 131代目 #355 # [1] 授業単元:C言語とアルゴリズム # [2] 問題文:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10016.txt # [1] 文字列処理(文字分類関数) # キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、 # その文字列の含まれる小文字、大文字、数字の数をそれぞれカウントするプログラムを作成しなさい。 # ただし、入力する文字数は最大30文字とする。文字分類関数を必ず用いること # # [2] 文字列処理(文字列操作関数、文字変換関数、文字分類関数) # キーボードから姓と名をそれぞれ入力し,それらを文字列操作関数を用いて連結した後 # 小文字と大文字を入れ換えた文字列を表示するプログラムを作成しなさい。ただし、入力する '[1] 文字列処理(文字分類関数)キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、その文字列に含まれる小文字、大文字、数字の数をそれぞれカウントする'(_小文字度数,_大文字度数,_数字度数) :- 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、'(_文字列), 'その文字列に含まれる小文字、大文字、数字の数をそれぞれカウントする'(_文字列,_小文字度数,_大文字度数,_数字度数). 'その文字列に含まれる小文字、大文字、数字の数をそれぞれカウントする'(_文字列,_小文字度数,_大文字度数,_数字度数) :- atom_codes(_30字までの文字列,_コードならび), 文字分類(_コードならび,0,0,0,_小文字度数,_大文字度数,_数字度数). 'キーボードからアルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力し、'(_30字までの文字列) :- write('アルファベット(小文字、大文字)と数字(0-9)が入り交じった文字列を入力してください(最大30文字)\n'), 行入力(user_input,_文字列), '30文字を越えたら切り取る。30文字を越えていなければその文字列。'(_文字列,_30字までの文字列). '30文字を越えたら切り取る。30文字を越えていなければその文字列。'(_文字列,_30字までの文字列) :- '30文字を越えたら切り取る。'(_文字列,_30文字までの文字列). '30文字を越えたら切り取る。30文字を越えていなければその文字列。'(_文字列,_30字までの文字列) :- '30文字を越えていなければその文字列。'(_文字列,_30字までの文字列) . '30文字を越えたら切り取る'(_30字までの文字列,_30字までの文字列) :- 文字列長が30字を越えていない(_30字までの文字列). '30文字を越えたら切り取る。'(_文字列,_30文字までの文字列) :- sub_atom(_文字列,0,30,_,_30字までの文字列). '30文字を越えていなければその文字列。'(_30字までの文字列,_30字までの文字列) :- '30文字を越えていなければ'(_30字までの文字列). '30文字を越えていなければ'(_30字までの文字列) :- \+(sub_atom(_30字までの文字列,0,30,_,_)). 文字分類([],_小文字度数,_大文字度数,_数字度数,_小文字度数,_大文字度数,_数字度数). 文字分類([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数) :- 小文字の度数を上げて文字分類を続ける([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数). 文字分類([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数) :- 大文字の度数を上げて文字分類を続ける([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数). 文字分類([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数) :- 数字の度数を上げて文字分類を続ける([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数). 小文字の度数を上げて文字分類を続ける([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数) :- 小文字の度数を上げて(U,A,A2), 文字分類(R,A2,B,C,_小文字度数,_大文字度数,_数字度数). 小文字の度数を上げて(U,A,A2) :- between(97,122,U), succ(A,A2). 大文字の度数を上げて文字分類を続ける([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数) :- 大文字の度数を上げて(U,B,B2), 文字分類(R,A,B2,C,_小文字度数,_大文字度数,_数字度数). 大文字の度数を上げて(U,B,B2) :- between(65,90,U), succ(B,B2). 数字の度数を上げて文字分類を続ける([U|R],A,B,C,_小文字度数,_大文字度数,_数字度数) :- 数字の度数を上げて(U,C,C2), 文字分類(R,A,B,C2,_小文字度数,_大文字度数,_数字度数). 数字の度数を上げて(U,C,C2) :- between(48,57,U), succ(C,C2). '[2] 文字列処理(文字列操作関数、文字変換関数、文字分類関数) キーボードから姓と名をそれぞれ入力し,それらを文字列操作関数を用いて連結した後 小文字と大文字を入れ換えた文字列を表示する' :- 'キーボードから姓と名をそれぞれ入力し,'(_姓,_名), 'それらを文字列操作関数を用いて連結した後 小文字と大文字を入れ換えた文字列を表示する'(_姓,_名). 'キーボードから姓と名をそれぞれ入力し,'(_姓,_名) :- write('姓名をローマ字で入力してください\n'), キーボードから姓を入力する(_姓), キーボードから姓を入力する(_名). キーボードから姓を入力する(_姓) :- write('姓 ? '), 行入力(user_input,_姓). キーボードから姓を入力する(_名) :- write('名 ? '), 行入力(user_input,_名). 'それらを文字列操作関数を用いて連結した後、小文字と大文字を入れ換えた文字列を表示する'(_姓,_名) :- 'それらを文字列操作関数を用いて連結した後、'(_姓,_名,_姓名), '小文字と大文字を入れ換えた文字列を表示する'(_姓名). 'それらを文字列操作関数を用いて連結した後、'(_姓,_名,_姓名) :- atom_concat(_姓,_名,_姓名). '小文字と大文字を入れ換えた文字列を表示する'(_姓名) :- '小文字と大文字を入れ換えた文字列を'(_姓名,_小文字大文字を入れ換えた姓名), 表示する(_小文字大文字を入れ換えた姓名). '小文字と大文字を入れ換えた文字列を'(_姓名,_小文字大文字を入れ換えた姓名) :- atom_codes(_姓名,_コードならび), 小文字大文字を入れ換える(_コードならび,_小文字大文字を入れ換えたコードならび), atom_codes(_小文字大文字を入れ換えた姓名,_小文字大文字を入れ換えたコードならび). 小文字大文字を入れ換える([],[]). 小文字大文字を入れ換える(L1,L2) :- 小文字大文字を入れ換えて行く(L1,L2). 小文字大文字に入れ換えて行く(L1,L2) :- 小文字は大文字に変換後さらに入れ換えて行く(L1,L2). 小文字大文字に入れ換えて行く(L1,L2) :- 大文字は小文字に変換後さらに入れ換えて行く(L1,L2). 小文字は大文字に変換後さらに入れ換えて行く([A|R1],[B|R2]) :- 小文字は大文字に変換後(A,B), 小文字大文字を入れ換える(R1,R2). 小文字は大文字に変換後(A,B) :- between(97,122,A), B is A - 32. 大文字は小文字に変換後さらに入れ換えて行く([A|R1],[B|R2]) :- 大文字は小文字に変換後(A,B), 小文字大文字を入れ換える(R1,R2). 大文字は小文字に変換後(A,B) :- between(65,90,A), B is A - 32. 表示する(_小文字大文字を入れ換えた姓名) :- writef('大文字と小文字を相互に変換した姓名は %w です\n',[_小文字大文字を入れ換えた姓名]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%% 行入力(_入力,_行) :- read_line_to_codes(_入力,_コードならび), atom_codes(_行,_コードならび). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #974 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # new と deleteを使ったプログラムの作成 #  人数、名前、点数を入力し、横棒グラフを表示するプログラムを作りなさい。 # ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。 # <実行画面> # 人数 : 3 # 1人目の名前 : A # 1人目の点数 : 80 # 2人目の名前 : B # 2人目の点数 : 55 # 3人目の名前 : C # 3人目の点数 : 95 # # 名( 点 )| 50 100 # --------+---------+---------+ # A ( 80)|**************** # B ( 55)|*********** # C ( 95)|******************* # 平均 77|*************** # :- op(800,xfx,人目の名前). :- op(800,xfx,人目の点数). :- dynamic([人目の名前/2,人目の点数/2]). /* 1 人目の名前 'A'. 1 人目の点数 80. 2 人目の名前 'B'. 2 人目の点数 55. 3 人目の名前 'C'. 3 人目の点数 95. */ '人数、名前、点数を入力し、横棒グラフを表示する。ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。' :- '入力する人数を得て、人数分の名前と点数を入力し、述語定義する', '見出し表示後に横棒グラフを表示する。ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。', '合計の横棒グラフを表示する。ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。'. '見出し表示後に横棒グラフを表示する。ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。' :- 見出し表示後に, '横棒グラフを表示する。ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。'. 見出し表示後に :- write(' 名(点)| 50 100\n--------+---------+---------+\n'). '横棒グラフを表示する。ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。' :- forall( 'N人目の名前、点数を得て、点数を星表現に変換する'(N,_名前,_点数,_星表現), '名前,点数,星表現を表示する'(_名前,_点数,_星表現)). '入力する人数を得て、人数分の名前と点数を入力し、述語定義する' :- '入力する人数を得て、'(_人数), '人数分の名前と点数を入力し、述語定義する'(_人数). '入力する人数を得て、'(_人数) :- write('入力する人数をいれてください : '), 整数を得る(_人数). '人数分の名前と点数を入力し、述語定義する'(_人数) :- between(1,_人数,N), '名前と点数を入力し、述語定義する'. '名前と点数を入力し、述語定義する' :- '名前と点数を入力し、'(_名前,_点数). '述語定義する'(_名前,_点数). '名前と点数を入力し、'(_名前,_点数) :- write('名前と点数を空白区切りで入力してください :: '), readln([_名前,_点数]). '述語定義する'(_名前,_点数) :- assertz(N 人目の名前 _名前), assertz(N 人目の点数 _点数), '合計の横棒グラフを表示する。ただし、グラフは5点刻みとし、点数は0点から100点の範囲とする。' :- 平均点を得てそれを星表現とする(_平均点,_星表現), '平均点、星表現の表示'(_平均点,_星表示). 平均点を得てそれを星表現とする(_平均点,_星表現) :- findavg(_点数,_ _人目の点数 _点数,_平均点), 点数を星表現に変換する(_平均点,_星表現). 'N人目の名前、点数を得て、点数を星表現に変換する'(N,_名前,_点数,_星表現) :- 'N人目の名前、点数を得る'(N,_名前,_点数), 点数を星表現に変換する(_点数,_星表現). 'N人目の名前、点数を得る'(N,_名前,_点数) :- N 人目の名前 _名前, N 人目の点数 _点数. 点数を星表現に変換する(_点数,_星表現) :- _星の数 is _点数 // 5, すべて同じ要素のならび(_星の数,_すべてが星のならび,'*'), atomic_list_concat(_すべてが星のならび,_星表現). '名前,点数,星表現を表示する'(_名前,_点数,_星表現) :- '名前を四桁に点数を二桁に固定する'(_名前,_点数,_四桁の名前,_二桁の点数), writef('%w(%w)|%w\n',[_四桁の名前,_二桁の点数,_星表現]). '名前を四桁に点数を二桁に固定する'(_名前,_点数,_四桁の名前,_二桁の点数) :- '名前を四桁に固定する'(_名前,_四桁の名前), '点数を二桁に固定する'(_点数,_二桁の点数). '名前を四桁に固定する'(_名前,_四桁の名前) :- atom_concat(_名前,' ',A), sub_atom(A,0,4,_,_四桁の名前). '点数を二桁に固定する'(_点数,_二桁の点数) :- atomic_list_concat([' ',_点数],A), sub_atom(A,_,2,0,_二桁の点数). '平均点、星表現の表示'(_平均点,_星表示) :- 平均点を二桁に固定する(_平均点,_二桁の平均点), writef('平均(%w)|%w\n',[_二桁の平均点,_星表現])). 平均点を二桁に固定する(_平均点,_二桁の平均点) :- atomic_list_concat([' ',_平均点],A), sub_atom(A,_,2,0,_二桁の平均点). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% すべて同じ要素のならび(_要素数,_すべて同じ要素のならび,_同じ要素) :- length(_すべて同じ要素のならび,_要素数), すべて同じ要素のならび(_すべて同じ要素のならび,_同じ要素). すべて同じ要素のならび([],_). すべて同じ要素のならび([_同じ要素|_すべて同じ要素の残りならび],_同じ要素) :- すべて同じ要素のならび(_すべて同じ要素の残りならび,_同じ要素). findavg(_集約項,_目標,_相加平均) :- findall(_集約項,_目標,_値ならび), sum_list(_値ならび,_合計), 相加平均(_値ならび,_合計,_相加平均). 相加平均(_値ならび,_合計,_相加平均) :- length(_値ならび,_ならびの長さ), _相加平均 is _合計 / _ならびの長さ. 整数を得る(_整数) :- 行入力(_行), atom_number(_整数), integer(_整数). 行入力(_行) : read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #907 # [1] C言語とアルゴリズム # [2] 選択型処理 あるお店では会員制をとっている。会員には一般会員と特別会員があり、 # 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 # 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 # この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 # ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 # [会員種別(1桁) 購入金額] # ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 # 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 # 非会員は「非」と表しなさい。 # # [data03.dat] http://prolog.asia/data/data03.dat # 『実行例』 # 種別  購入金額(円)  支払い金額(円)   # 会     3200        2880    ←一般会員は1割引き # 特     2400        1680    ←特別会員は3割引き # 非     4800        4800    ←非会員は通常割り引かない # 特     6500        4550 # 会     10800 9720 # 特     18200 12740 # 非    21400 20400    ←非会員も購入金額が15000円以上なら1000円引き # 会     890 801 # 会     3900        3510 # 特     6200        4340 # ----------------------------------------- # 合計    78290        65421 ←最後の行に合計を出力すること /* date03.dat 1 3200 2 2400 3 4800 2 6500 1 10800 2 18200 3 21400 1 890 1 3900 2 6200 */ :- op(700,xfx,は). 'あるお店では会員制をとっている。会員には一般会員と特別会員があり、 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。 この店のある日のデータ(data03.dat)が与えられたとき、実行例のような出力が得られるプログラムを作成しなさい。 ただし、data03.datには以下の形式で会員種別と購入金額が記載されているものとする。 [会員種別(1桁) 購入金額] ここで、会員種別は1が一般会員、2が特別会員、3が非会員を表す。 会員種別の判定にはswitch文を用い、一般会員は「会」、特別会員は「特」、 非会員は「非」と表しなさい。' :- 全行を空白区切りしながらならびに取る('data03.dat',_入力データならび), ある日のご購入明細表を出力する(_入力データならび). ある日のご購入明細表を出力する(_入力データならび) :- '会員種別から支払い金額を計算してご購入金額表を作り、ご購入金額表明細を表示する'(_入力データならび,_ご購入金額表), 'ご購入金額表から購入金額計と支払い金額計を計算して10桁右詰めで表示する'(_ご購入金額表). '会員種別から支払い金額を計算してご購入金額表を作り、ご購入金額表明細を表示する'(_入力データならび,_ご購入金額表) :- '入力データならびからご購入金額表を作成する。 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_入力データならび,_ご購入金額表), 'ご購入金額明細を見出し表示後、10桁右詰めで表示する'(_ご購入金額表). '入力データならびからご購入金額表を作成する。 一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_入力データならび,_ご購入金額表) :- findall([_会員略号,_購入金額,_支払い金額],( member([_会員種別番号,_購入金額],_入力データならび), '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額)),_ご購入金額表). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。 非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '一般会員は購入金額の1割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを、特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- '特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額). '一般会員は購入金額の1割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,一般会員,_会員略号), '購入金額の1割引きのサービスを受けられる。'(_購入金額,_支払い金額). '購入金額の1割引きのサービスを受けられる。'(_購入金額,_支払い金額) :- _支払い金額 は 四捨五入(_購入金額 * (1 - 0.1)). '特別会員は3割引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,特別会員,_会員略号), '購入金額の3割引きのサービスが受けられる。'(_購入金額,_支払い金額). '購入金額の3割引きのサービスが受けられる。'(_購入金額,_支払い金額) :- _支払い金額 は 四捨五入(_購入金額 * (1 - 0.3)). '非会員の場合は購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_会員種別番号,_購入金額,_会員略号,_支払い金額) :- 会員種別番号(_会員種別番号,非会員,_会員略号), '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額). '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額) :- '購入金額が15000円以上の場合のみ1000円引き'(_購入金額,_支払い金額),!. '購入金額が15000円以上の場合のみ1000円引きのサービスを受けられる。'(_購入金額,_支払い金額) :- _購入金額 = _支払い金額. '購入金額が15000円以上の場合のみ1000円引き'(_購入金額,_支払い金額) :- _購入金額 >= 15000, _支払い金額 は _購入金額 - 1000. 会員種別番号(_会員種別番号,_会員種別,_会員略号) :- 会員種別番号(_会員種別番号,_会員種別), 会員略号(_会員種別,_会員略号). 会員種別番号(1,一般会員). 会員種別番号(2,特別会員). 会員種別番号(3,非会員). 会員略号(一般会員,会). 会員略号(特別会員,特). 会員略号(非会員,非). 'ご購入金額明細を見出し表示後、10桁右詰めで表示する'(_ご購入金額表) :- write('\n種別\t 購入金額(円)\t支払い金額(円)\n'), ご購入金額表明細を10桁右詰めで表示(_ご購入金額表). ご購入金額表明細を10桁右詰めで表示(_ご購入金額表) :- forall( member([_会員略号,_購入金額,_支払い金額],_ご購入金額表), '購入金額、支払金額を10桁右詰め文字列に変換して表示する'(_会員略号,_購入金額,_支払い金額)). '購入金額、支払金額を10桁右詰め文字列に変換して表示する'(_会員略号,_購入金額,_支払い金額) :- '10桁の右詰めの数値文字列に変換'(_購入金額,_支払い金額,_購入金額表示文字列,_支払い金額表示文字列), writef('%w\t%w\t%w\n',[_会員略号,_購入金額表示文字列,_支払い金額表示文字列]). 'ご購入金額表から購入金額計と支払い金額計を計算して10桁右詰めで表示する'(_ご購入金額表) :- 購入金額計と支払い金額計(_ご購入金額表,_購入金額計,_支払い金額計), '購入金額計、支払金額計を10桁右詰め文字列に変換して表示する'(_購入金額計,_支払い金額計). '購入金額計、支払金額計を10桁右詰め文字列に変換して表示する'(_購入金額計,_支払い金額計) :- '10桁の右詰めの数値文字列に変換'(_購入金額計,_支払い金額計,_購入金額計表示文字列,_支払い金額計表示文字列), writef('-----------------------------------------\n合計\t%w\t%w\n',[_購入金額計表示文字列,_支払い金額計表示文字列]). 購入金額計と支払い金額計(_ご購入金額表,_購入金額計,_支払い金額計) :- 購入金額計(_ご購入金額表,_購入金額計), 支払い金額計(_ご購入金額表,_支払い金額計). 購入金額計(_ご購入金額表,_購入金額計) :- findsum(_購入金額,( member([_,_購入金額,_],_ご購入金額表)),_購入金額計). 支払い金額計(_ご購入金額表,_支払い金額計) :- findsum(_支払い金額,( member([_,_,_支払い金額],_ご購入金額表)),_支払い金額計). 全行を空白区切りしながらならびに取る(_ファイル,_ならび) :- open(_ファイル,read,_入力), findall(_空白区切りされた行,( repeat, (at_end_of_stream(_入力),!,close(_入力),fail; 行入力(_入力,_行), 項目区切り(_行,[' '],_空白区切りされた行))),_ならび). 行入力(_入力,_行) :- read_line_to_codes(_入力,_文字コードならび), atom_codes(_行,_文字コードならび). findsum(_集約対象項,_目標,_合計) :- findall(_集約対象項,_目標,_集約対象項ならび), sum_list(_集約対象項ならび,_合計). _答え は _式 :- 関数定義(_式,_答え),!. _答え は _式 :- _答え is _式.  関数定義(四捨五入(_式),_答え) :- _答え_1 は _式, _答え is floor(_答え_1 + 0.5). '10桁の右詰めの数値文字列に変換'(_数値_1,_数値_2,_10桁の右詰めの数値文字列_1,_10桁の右詰めの数値文字列_2) :- n桁の右詰めの数値文字列に変換(10,_数値_1,_10桁の右詰めの数値文字列_1), n桁の右詰めの数値文字列に変換(10,_数値_2,_10桁の右詰めの数値文字列_2). n桁の右詰めの数値文字列に変換(_n桁,_数値,_n桁の右詰めの数値文字列) :- 数値を数値文字列に変換して先頭にn桁の空白文字列を付加する(_n桁,_数値,_一時的に空白文字列を付加された数値文字列), 末尾のn桁を切り出す(_n桁,_一時的に空白文字列を付加された数値文字列,_n桁の右詰めの数値文字列). 数値を数値文字列に変換して先頭にn桁の空白文字列を付加する(_n桁,_数値,_一時的に空白文字列を付加された数値文字列) :- 数値を数値文字列に変換して(_数値,_実質数値文字列), 先頭にn桁の空白文字列を付加する(_n桁,_実質数値文字列,_一時的に空白文字列を付加された数値文字列). 数値を数値文字列に変換して(_数値,_実質数値文字列) :- atom_number(_実質数値文字列,_数値). 先頭にn桁の空白文字列を付加する(_n桁,_実質数値文字列,_一時的に空白文字列を付加された数値文字列) :- n桁の空白文字列(_n桁,_n桁の空白文字列), atom_concat(_n桁の空白文字列,_実質数値文字列,_一時的に空白文字列を付加された数値文字列). n桁の空白文字列(_n桁,_n桁の空白文字列) :- length(_全ての要素が空白文字のならび,_n桁), 全ての要素が空白文字(_全ての要素が空白文字のならび), atom_chars(_n桁の空白文字列,_全ての要素が空白文字のならび). 全ての要素が空白文字([' ']) :- !. 全ての要素が空白文字([' '|R]) :- 全ての要素が空白文字(R). 末尾のn桁を切り出す(_n桁,_一時的に空白文字列を付加された数値文字列,_n桁の右詰めの数値文字列) :- sub_atom(_一時的に空白文字列を付加された数値文字列,_,_n桁,0,_n桁の右詰めの数値文字列). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび_1), 文字列ならびの中で数値に変換可能なものは変換する(_区切られた文字列ならび_1,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #676 # [1] 授業単元: プログラミング # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9965.txt # 以下のプログラムを作成せよ。 # 三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 # 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした # 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される # このような点数の変換プログラムを考える # 達成条件は # ・ファイルin.txtを開き、変換された点数データをファイルoutput.txtに書き込んでいる。 # ・ファイルからデータを読み込んだ時に、構造体にデータを入力している # ・ファイルout.txt内では、正しく点数が変換されている。 # ・名前は最大でも半角で20文字として。配列nameの外をアクセスしていない。 t741 :- '三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される'. '三科目の試験を行ったが、各科目で平均点がかなり異なってしまった状況を想定する。 科目間でできるだけ均等にするために、各科目の最高得点の人を100点にするように点数を変換することにした 例えば、国語の最高得点が70点の場合、国語の点数は全て100/70倍される' :- 'in.txtを読み、[氏名,A,B,C]の組ならびとする'(L), 三科目それぞれの最高点を得て嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C), findall(S,(member([Name,A2,B2,C2],L),嵩上げ計算(A2,B2,C2,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX),concat_atom([Name,AX,BX,CX],',',S)),L2), put_lines('out.txt',L2). 'in.txtを読み、[氏名,A,B,C]の組ならびとする'(L) :- 行ならびを得る('in.txt',_行ならび), findall([Name2,A1,B1,C1],( member(_行,_行ならび), 項目区切り(Line,[' ',','],[Name1,A1,B1,C1]), 名前の長さ制限(Name1,Name2)),L). 三科目それぞれの最高点を得て嵩上げ率の計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- 三科目それぞれの最高点を得て(L,MaxA,MaxB,MaxC), 嵩上げ率計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C). 三科目それぞれの最高点を得て(L,MaxA,MaxB,MaxC) :- findmax(A,(member([_,A,_,_],L),MaxA), findmax(B,(member([_,_,B,_],L),MaxB), findmax(A,(member([_,_,_,C],L),MaxC). 嵩上げ率計算(MaxA,MaxB,MaxC,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C) :- _嵩上げ率A is 100 / MaxA, _嵩上げ率B is 100 / MaxB, _嵩上げ率C is 100 / MaxC. 嵩上げ計算(A,B,C,_嵩上げ率A,_嵩上げ率B,_嵩上げ率C,AX,BX,CX) :- AX is A * _嵩上げ率A, BX is B * _嵩上げ率B, CX is C * _嵩上げ率C. 名前の長さ制限(Name,NameX) :- atom_code(Name,L), 名前の長さ制限(0,L,LX), atom_codes(NameX,LX). 名前の長さ制限(M,_,[]) :- M > 20,!. 名前の長さ制限(M,[A|R1],[]) :- char_code(A,Code), Code > 255, M > 18,!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code > 255, M < 19, M2 is M + 2, 名前の長さ制限(M2,R1,R2),!. 名前の長さ制限(M,[A|R1],[A|R2]) :- char_code(A,Code), Code < 256, M2 is M + 1, 名前の長さ制限(M2,R1,R2),!. 行ならびを得る(_ファイル,_行ならび) :- see(_ファイル), findall(_行,(repeat,行入力(_行),(_行=end_of_file,!,fail;true)),_行ならび), seen. 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). put_lines(_ファイル,_行ならび) :- tell(_ファイル), forall(member(_行,_行ならび),writef('%w\n',[_行])), told. 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 130代目 #57 # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):10×10マスの碁盤の内から、scanf命令で # 入力した2値をx,y座標として、 # その座標部分を塗りつぶし四角"■"で表示しなさい。 # それ以外は"□"でマス表示するものとします。 # 両者とも0から9までが入力されるものとします(エラー判定不要)。 # 入力時の問い合わせメッセージは自由に表示させて下さい。 '10×10マスの碁盤の内から、 入力した2値をx,y座標として、 その座標部分を塗りつぶし四角"■"で表示しなさい。 それ以外は"□"でマス表示するものとします。 両者とも0から9までが入力されるものとします(エラー判定不要)。'(_着手された盤面) :- '10×10の盤面に□を埋める'(_盤面), 着手(X,Y), 現在の盤面(_盤面,X,Y,_着手された盤面). '10×10マスの碁盤の内から、 入力した2値をx,y座標として、 その座標部分を塗りつぶし四角"■"で表示しなさい。 それ以外は"□"でマス表示するものとします。 両者とも0から9までが入力されるものとします(エラー判定不要)。'(_). '10×10の盤面に□を埋める'(_盤面) :- findall(L,( 'Lに□を埋める'(L)),_盤面). 'Lに□を埋める'(L) :- between(1,10,N), length(10,L), all(L,'□'). 着手(X,Y) :- '行を得て、それからX_0,Y_0を得る'(X_0,Y_0), X is X_0 + 1, Y is Y_0 + 1,!. '行を得て、それからX_0,Y_0を得る'(X_0,Y_0) :- 行入力(_行), 項目区切り(_行,[' ',','],[X_0,Y_0]). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 現在の盤面(_盤面,X,Y,_着手された盤面) :- 行列の置換(Y,X,'■',_盤面,_着手された盤面_1), 現在の盤面(_盤面,X,Y,_着手された盤面_1,_着手された盤面). 現在の盤面(_盤面,X,Y,_着手された盤面,_着手された盤面) :- 盤面表示(_着手された盤面). 現在の盤面(_盤面,X,Y,_着手された盤面_1,_着手された盤面) :- 着手して盤面を更新する(_盤面,X,Y,_着手された盤面_1,_着手された盤面). 着手して盤面を更新する(_盤面,X,Y,_着手された盤面_1,_着手された盤面) :- 着手(X2,Y2), 現在の盤面(_着手された盤面_1,X2,Y2,_着手された盤面). 盤面表示(_盤面) :- reverse(_盤面,_原点位置を左下に修正した盤面), 盤面表示の二(_原点位置を左下に修正した盤面),!. 盤面表示の二([]) :- !. 盤面表示の二(LL) :- 表示升行を順に表示する(LL). 表示升行を順に表示する([L|R]) :- 行表示(L), 盤面表示の二(R). 行表示(L) :- atomic_list_concat(L,_表示升列アトム), writef('%t\n',[_表示升列アトム]). all([],_). all([V|R],V) :- all(R,V). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: #704 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9863.txt # リストを用いた成績処理 # リストを用いて個人データを格納する表を作成 # 処理番号を入力して処理の切り替えを行う # 1.成績一覧表示, 2.個人成績表示, # 3.個人平均点表示,4.科目平均点表示, # 0.終了 # リストに新たにデータを追加する時は学生番号順に並ぶように追加する. # リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする. # # 入力する成績データ(この順番で入れる) # 学番名前英語数学化学物理 # 106 tada 65 80 90 100 # 101 kouda 50 85 70 65 # 103 hanako 70 75 65 80 # 104 akane 60 95 80 75 # 102 tarou 90 80 85 65 # 105 nara 80 70 50 95 初期データの入力(_初期データならび) :- write('初期データを入力してください\n'), 行入力(_行), 初期データの入力(_行,[],_初期データならび),!. 初期データの入力(end_of_file,Ls,Ls) :- !. 初期データの入力(_行,Ls1,Ls2) :- 項目区切り(_行,[' '],L), insert_Ls(L,Ls1,Ls3), 行入力(_行_2), 初期データの入力(_行_2,Ls3,Ls2). insert_Ls(L,[],[L]) :- !. insert_Ls([A|R1],[[B|R2]|R3],[[A|R1],[B|R2]|R3]]) :- A @=< B,!. insert_Ls([A|R1],[[B|R2]|R3],[[B|R2]|R3]]) :- A @> B, insert_Ls([A|R1],R3,R4). 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.' :- 初期データの入力(L), 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.'(L,_機能), _機能 = 終了(_,_). 'リストを用いた成績処理 リストを用いて個人データを格納する表を作成 処理番号を入力して処理の切り替えを行う 1.成績一覧表示, 2.個人成績表示, 3.個人平均点表示,4.科目平均点表示, 0.終了 リストに新たにデータを追加する時は学生番号順に並ぶように追加する. リスト構成する要素(セル)はmalloc関数でヒープ領域から確保するものとする.'(L,_機能) :- repeat, 処理番号を入力して処理の切り替えを行う(L,_機能), call(_機能). 処理番号を入力して処理の切り替えを行う(L,_機能) :- 整数を得る('1. 一覧表示\n2. 個人成績表示\n3. 個人平均点表示\n4. 科目平均点表示\n0. 終了\n',true,_処理番号), 処理番号による機能選択(_処理番号,L,_機能). 処理番号による機能選択(1,L,一覧表示(L,_)). 処理番号による機能選択(2,L,個人成績表示(L,_)). 処理番号による機能選択(3,L,個人平均点表示(L,_)). 処理番号による機能選択(4,L,科目平均点表示(L,_))). 処理番号による機能選択(0,_,終了). 終了(_,_). 一覧表示(L,_) :- forall(member([A,B,C,D,E,F],L), writef('%w,%w,%w,%w,%w,%w\n',[A,B,C,D,E,F])). 個人成績表示(L,[A,B,C,D,E,F]) :- 整数を得る('検索したい学番を入れてください : ',true,A), member([A,B,C,D,E,F],L), writef('%w,%w,%w,%w,%w,%w\n',[A,B,C,D,E,F]),!. 個人平均点表示(L,[Avg]) :- findavg(U,(member([_,_,C,D,E,F],L),U is C+D+E+F),Avg), writef('個人平均点は %wです\n',[Avg]). 科目別平均点表示(L,[AvgC,AvgD,AvgE,AvgF]) :- 四科目の平均点を得る(C,D,E,F,AvgC,AvgD,AvgE,AvgF), writef('英語平均点=%w,数学=%w,化学=%w,物理=%w\n',[AvgC,AvgD,AvgE,AvgF]),!. 四科目の平均点を得る(C,D,E,F,AvgC,AvgD,AvgE,AvgF) :- findavg(C,member([_,_,C,_,_,_],L),AvgC), findavg(D,member([_,_,_,D,_,_],L),AvgD), findavg(E,member([_,_,_,_,E,_],L),AvgE), findavg(F,member([_,_,_,_,_,F],L),AvgF). 整数を得る(_催促,_評価,_整数) :- 催促後に行入力(_催促,_行), 整数入力検査(_行,_整数), 整数入力評価(_評価). 催促後に行入力(_催促,_行) :- write(_催促), 行入力(_行),!. 催促後に行入力(_催促,_行) :- 催促後に行入力(_催促,_行). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 整数入力検査(_行,_整数) :- atom_number(_行,_整数), integer(_整数),!. 整数入力検査(_行,_整数) :- writef('入力された行 %w からは整数が得られません。\n',[_行]), fail. 整数入力評価(_評価) :- call(_評価),!. 整数入力評価(_評価) :- writef('整数評価 %w が偽となりました。\n',[_評価]), fail. 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび). 項目区切り(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_使われている区切り文字ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[],[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_区切り文字列|R1],[_前文字列|R2]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R1,R2). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 129代目 #256 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, # 2行目以降はその数の不定長文字列が空白で区切られているような入力 # ファイルを読み込み,各行を以下に示す構造体の単方向連結リストに # 保存するプログラムを作成せよ.ここでは,attributes が1行分のデータ # を保持する. # struct t_list { # char **attributes; # struct t_list *next; # }; # またにはソースファイルには,生成した単方向連結リストの内容を # 標準出力に出力する関数 print_tlist を含むものとしprint_tlist により各行 # に含まれる文字列を出力するものとする.動作確認には,以下のテキストを用いよ. # なお,入力ファイル名はコマンドライン # 引数で指定するものとし,入力ファイルがオープンできなかった場合の処理も # 含めること.また,プログラム自身を除く引数の数が0個, # もしくは2個以上の場合は,何もせず適切なメッセージを出力して終了するものとする # 入力ファイル:http://www.uploda.tv/v/uptv0033032.txt 'ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, 2行目以降はその数の不定長文字列が空白で区切られているような入力 ファイルを読み込み,各行を以下に示す構造体の単方向連結リストに 保存するプログラムを作成せよ.ここでは,attributes が1行分のデータ を保持する. struct t_list { char **attributes; struct t_list *next; }; またにはソースファイルには,生成した単方向連結リストの内容を 標準出力に出力する関数print_tlistを含むものとしprint_tlistにより各行 に含まれる文字列を出力するものとする.動作確認には,以下のテキストを用いよ. なお,入力ファイル名はコマンドライン 引数で指定するものとし,入力ファイルがオープンできなかった場合の処理も 含めること.また,プログラム自身を除く引数の数が0個, もしくは2個以上の場合は,何もせず適切なメッセージを出力して終了するものとする 入力ファイル:http://www.uploda.tv/v/uptv0033032.txt' :- 入力ファイル名はコマンドライン引数で指定するものとし(ファイル名), 'ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, 2行目以降はその数の不定長文字列が空白で区切られているような入力 ファイルを読み込み,'(_ファイル名,_2行目以降の各行に含まれる文字列の数,_その数の不定長文字列のならび). 'ファイルの1行目に2行目以降の各行に含まれる文字列の数が記述され, 2行目以降はその数の不定長文字列が空白で区切られているような入力 ファイルを読み込み,'(_ファイル名,_2行目以降の各行に含まれる文字列の数,_その数の不定長文字列のならび) :- 行入力(_行_1), atom_number(_行_1,_2行目以降の各行に含まれる文字列の数), 行入力(_行_2), その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行_2,_その数の不定長文字列のならび), catch(open(_ファイル名,write,Output),error(E,I),open_error(_ファイル名,I)), print_tlist(Output,_その数の不定長文字列のならび), close(Output). 入力ファイル名はコマンドライン引数で指定するものとし(ファイル名) :- ユーザパラメータの取得(_ファイル名). 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). ユーザパラメータの取得(_ファイル名) :- current_prolog_flag(argv,_ファイル名),!. ユーザパラメータの取得(_) :- error_tell(Output), write(Output,'パラメータで適切なファイル名が与えられませんでした\n'), errot_told(Output). その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(end_of_file,[]) :- !. その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行,[L|R]) :- 項目区切り(_行,[' '],L), 行入力(_行_2), その数の不定長文字列が空白で区切られているような入力ファイルを読み込み(_行_2,R). open_error(_ファイル名,Info) :- error_tell(Output), write(Output,'出力ファイル%tのオープンに失敗 :: %t\n',[_ファイル名,Info]), error_told(Output), fail. print_tlist(Output,[]) :- !. print_tlist(Output,[A|R]) :- swritef(S,'%w\n',[A]), writef(Output,S), print_tlist(Output,R). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典:: 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,xfy,であり),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,(between(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) 基礎述語の定義 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 年入力処理(_年) :- write('表示したいカレンダーは西暦何年 ? '), 行入力(_行), 年入力処理の二(_行,_年), 年入力検査(_年),!. 年入力処理(_年) :- 年入力処理(_年). 年入力処理の二(_行,_年) :- atom_number(_行,_年), integer(_年),!. 年入力処理の二(_行,_年) :- writef('この入力[ %t ]は整数ではありません\n',[_行]), fail. 年入力検査(_年) :- _年 >= 1583, _年 =< 3999,!. 年入力検査(_年) :- writef('この年を表す整数%tは不正です\n',[_年]), fail. 月入力処理(_月) :- write('月は ? '), 行入力(_行), 月入力処理の二(_行,_月), 月入力検査(_月),!. 月入力処理(_月) :- 月入力処理(_月). 月入力処理の二(_行,_月) :- atom_number(_行,_月), integer(_月),!. 月入力処理の二(_行,_月) :- writef('この入力[ %t ]は整数ではありません\n',[_行]), fail. 月入力検査(_月) :- _月 >= 1, _月 =< 12,!. 月入力検査(_月) :- writef('この月を表す整数%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,' ',_表示行), writef('%w\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). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 128代目 #757 # 【質問テンプレ】 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): 二次元配列を使って以下のファイルを読み込み、 # 同じように表示しなさい。 #  【test.dat】 #   ** ** ** #   ** ** ** #   ** ** ** '二次元配列を使って以下のファイルを読み込み、 同じように表示しなさい。  【test.dat】   ** ** **   ** ** **   ** ** ** '(_ファイル) :- 'ファイルを確保して二次元構造の読み込み'(_ファイル,_二次元構造), '   ** ** **   ** ** **   ** ** ** のように表示する'(_二次元構造). 'ファイルを確保して二次元構造の読み込み'(_ファイル,_二次元構造) :- open(_ファイル,read,_入力), 二次元構造の読み込み(_入力,_二次元構造), close(_入力) 二次元構造の読み込み(_入力,[]) :- at_end_of_stream(_入力),!. 二次元構造の読み込み(_入力,_二次元構造) :- at_end_of_streamを検出するまで二次元構造を読み込んで行く(_入力,_二次元構造). at_end_of_streamを検出するまで二次元構造を読み込んで行く(_入力,[L|_二次元構造]) :- readln(_入力,L), 二次元構造の読み込み(_入力,_二次元構造). '   ** ** **   ** ** **   ** ** ** のように表示する'(_二次元構造) :- forall( 一行の配列表示文字列を(_二次元構造,_表示文字列), 一行表示(_表示文字列)). 一行の配列表示文字列を(_二次元構造,_表示文字列) :- member(L,_二次元構造), 三桁に揃えて行を構成する(L,_表示文字列). 三桁に揃えて行を構成する(L,_表示文字列) :- 表示要素を三桁に揃える(L,L2), atomic_list_concat(L2,' ',_表示文字列). 表示要素を三桁に揃える(L,L2) :- findall(_三桁文字列,( 'Lの要素を三桁に揃える'(L,_三桁文字列)),L2). 'Lの要素を三桁に揃える'(L,_三桁文字列) :- member(N,L), 三桁文字列(N,_三桁文字列). 三桁文字列(N,X) :- '整数を文字列に変換して、その先頭に三桁の空白を付けて、その上でその文字列の下三桁を得る'(N,_三桁文字列). '整数を文字列に変換して、その先頭に三桁の空白を付けて、その上でその文字列の下三桁を得る'(N,_三桁文字列) :- '整数を文字列に変換して、'(N,_文字列), 'その先頭に三桁の空白を付けて、その上でその文字列の下三桁を得る'(_文字列,_三桁文字列). '整数を文字列に変換して、'(N,_文字列) :- atom_number(_文字列,N). 'その先頭に三桁の空白を付けて、その上でその文字列の下三桁を得る'(_文字列,_三桁文字列) :- 'その先頭に三桁の空白を付けて、'(_文字列,_先頭に三桁の空白が付いた文字列), 'その上でその文字列の下三桁を得る'(_先頭に三桁の空白が付いた文字列,_三桁文字列). 'その先頭に三桁の空白を付けて、'(_文字列,_先頭に三桁の空白が付いた文字列) :- atom_concat(' ',_文字列,_先頭に三桁の空白が付いた文字列). 'その上でその文字列の下三桁を得る'(_先頭に三桁の空白が付いた文字列,_三桁文字列) :- sub_atom(先頭に三桁の空白が付いた文字列,_,3,0,_三桁文字列). 表示する(_表示文字列) :- writef('%w\n',[_表示文字列]). % 以下のサイトは # 出典 :: C/C++の宿題片付けます 128代目 #607 # 簡単なデータベース機能を持つプログラムを作成しなさい.対象となるデータは自分で 考えてください. #   (住所録,商品の在庫,図書,ワールドカップの勝敗....) #  以下の要件を示します. # # 1. ファイルからデータを読み込む機能をつけること # 2. データは4つ以上の項目を保持させること. #  (住所録では、「名前」「住所」「郵便番号」「電話番号」等で4項目以上) # 3. 並び替えの機能をつけること.また並び替える項目が指定できること. # 4. 各項目についてデータの検索を行う機能をつけること.また,検索条件を組み合わせることができること. #  (住所録なら,「郵便番号」が 399 で始まって,かつ,「電話番号」が 026 で始まる 等) # 5. データは半角英数字(英語やローマ字)で扱ってよい # 6. データの追加ができること. # 7. データの削除ができること.削除は上記の検索と組み合わせることで,ある条件に合致したデータを削除できること. # 8. 追加・削除した結果をファイルに保存できること. 鍵項目位置(書籍名,prolog関連書籍(_書籍名,_,_,_,_,_,_,_),_書籍名). 鍵項目位置(副書籍名,prolog関連書籍(_,_副書籍名,_,_,_,_,_,_),_副書籍名). 鍵項目位置(著者名,prolog関連書籍(_,_,_著者名,_,_,_,_,_),_著者名). 鍵項目位置(翻訳者名,prolog関連書籍(_,_,_,_翻訳者名,_,_,_,_),_翻訳者名). 鍵項目位置(発行年月日,prolog関連書籍(_,_,_,_,_発行年月日,_,_,_),_発行年月日). 鍵項目位置(出版社名,prolog関連書籍(_,_,_,_,_,_出版社名,_),_出版社名), 鍵項目位置(書籍コード,prolog関連書籍(_,_,_,_,_,_,_書籍コード),_書籍コード). 項目名を指定しての参照(_述語名/_引数の数,_項目名ならび,_値ならび) :- length(L,_引数の数), P =.. [_述語名|L], findall(_項目値,( call(P), member(_項目名,_項目名ならび), 鍵項目位置(_項目名,P,_項目値)),_値ならび). 項目名を指定して節構造ならびの参照(_項目名ならび,_節構造ならび,_値ならび) :- member([_頭部,_本体],_節構造ならび), findall(_項目値,( call(_本体),/* このアサーションを実行するかが大問題 */ member(_項目名,_項目名ならび), 鍵項目位置(_項目名,_頭部,_項目値)),_値ならび). データベースへの登録(_ファイル) :- reconsult(_ファイル). データベースへの追加(_項) :- assertz(_項). データベースからの削除(_項) :- retract(_項). データベースの保存(_述語名/_引数の数,_保存ファイル名) :- tell(_保存ファイル名), listing(_述語名/_引数の数), told. 節定義の並べ替え(_述語名/_引数の数,_鍵項目,上昇順) :- 上昇順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), forall(member([H,B],_上昇順に整列された節構造ならび),assertz((H :- B))). 節定義の並べ替え(_述語名/_引数の数,_鍵項目,下降順) :- 下降順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび), abolish(_述語名/引数の数), forall(member([H,B],_上昇順に整列された節構造ならび),assertz((H :- B))). 上昇順節構造(_述語名/_引数の数,_鍵項目,_上昇順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび,_節構造ならび,_鍵付加き節構造ならび), 上昇順整列(_鍵付加き節構造ならび,_上昇順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_上昇順に整列された鍵付き節構造ならび,_上昇順に整列された節構造ならび),!. 下降順節構造(_述語名/_引数の数,_鍵項目,_下降順に整列された節構造ならび) :- 節構造ならびの取得(_述語名/_引数の数,_節構造ならび), ならびの先頭に鍵項目を付加(_鍵項目ならび,_節構造ならび,_鍵付加き節構造ならび), 下降順整列(_鍵付加き節構造ならび,_下降順に整列された鍵付き節構造ならび), ならびの先頭の鍵項目を除去(_下降順に整列された鍵付き節構造ならび,_下降順に整列された節構造ならび),!. 節構造ならびの取得(_述語名/_引数の数,_節構造ならび) :- length(L,_引数の数), H =.. [_述語名|L], findall([H,B],clause(H,B),_節構造ならび),!. ならびの先頭に鍵項目を付加(_,[],[]) :- !. ならびの先頭に鍵項目を付加(_鍵項目ならび,[[_頭部,_本体]|R1],[_鍵付き節構造|R2]) :- findall(_値,(member(_鍵,_鍵項目ならび),鍵項目位置(_鍵,_頭部,_値)),L), append(L,[_頭部,_本体],_鍵付き節構造), ならびの先頭の鍵項目を除去(_鍵項目ならび,_鍵付き節構造ならび,_節構造ならび) :- length(_鍵項目ならび,_除去する項数), ならびの先頭N個の鍵項目を除去(N,_鍵付き節構造ならび,_節構造ならび). ならびの先頭N個の鍵項目を除去(N,[L1|R1],[L2|R2]) :- append(L0,L2,L1), length(L0,N), ならびの先頭N個の鍵項目を除去(N,R1,R2). 上昇順に整列(L1,L2) :- 整列(上昇,L1,L2). 下降順に整列(L1,L2) :- 整列(下降,L1,L2). 整列(_,[],[]) :- !. 整列(_上昇または下降,[X|Xs],Ys) :- 配分(_上昇または下降,Xs,X,Littles,Gigs), 整列(_上昇または下降,Littles,Ls), 整列(_上昇または下降,Bigs,Bs), append(Ls,[X|Bs],Ys). 配分(_,[],Y,[],[]) :- !. 配分(上昇,[X|Xs],Y,[X|Ls],Bs) :- X @=< Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(上昇,[X|Xs],Y,Ls,[X|Bs]) :- X @> Y,!,配分(上昇,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,[X|Ls],Bs) :- X @>= Y,!,配分(下降,Xs,Y,Ls,Bs). 配分(下降,[X|Xs],Y,Ls,[X|Bs]) :- X @< Y,!,配分(下降,Xs,Y,Ls,Bs). 鍵項目位置定義(述語名,_項目名ならび) :- length(_項目名ならび,Len), between(1,Len,N), list_nth(N,_項目名ならび,_項目名), 変数文字列の生成(Len,N,項目名,_項目変数文字列,_変数文字列), concat_atom(['鍵項目位置(',_項目名,述語名,'(',_変数文字列,')',_項目変数文字列,')'],S), parse_atom(S,1,P,V), assertz_with_names(P,V), N = Len,!. 変数文字列の生成(N,Len,項目名,_項目変数文字列,_変数文字列) :- M is N - 1, length(L1,M), all(L1,'_'), M2 is Len - N, length(L2,M2), all(L2,'_'), atom_concat('_',項目名,_項目変数文字列), append(L1,[_項目変数文字列|L2],L), concat_atom(L,',',_変数文字列). all([],_). all([A|R],V) :- all(R,V). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/538 # # [1] 授業単元:プログラミング演習 # [2] 問題文(含コード&リンク):http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9667.txt # 課題1 スペースの挿入 # # 最大50文字のスペースを含まない文字列をターミナルから読み込み,各文字間にスペースを挿入したものを出力するプログラムを # 作成しなさい. # 課題実行においては以下の点に注意すること. # ・プログラム名は「space」とすること. # ・文字列の先頭と最後にはスペースを入れない. # ・ポインタを用いること. # # 実行結果 # ./space # abc # a b c space(_文字列,_スペースを挿入された文字列) :- atom_chars(_文字列,Chars), concat_atom(Chars,' ',_スペースを挿入された文字列). concat_atom([],_,'') :- !. concat_atom([A],_,A) :- !. concat_atom([A|R],S,X) :- concat_atom(R,S,Y), atom_concat(A,S,B), atom_concat(B,Y,X). 課題2 Inner Product (内積) # Write a program (innpro) to compute an inner product. # First, decide a degree of a vector, next input two vectors of # degree n, A and B, then the inner product is output. # The maximum degree of the vectors is 20. # Remarks. # ・The name of the program must be innpro. # ・The inner product A=(a1,a2, ... ,an) and B=(b1,b2,...,bn) is a1*b1+a2*b2+...+an*bn. # # 実行結果 # ./innpro # Degree: 5 # Data of A: 1 2 3 4 5 # Data of B: 2 3 4 5 6 # Inner Product: 70 innpro([],[],0) :- !. innpro([A|R1],[B|R2],X) :- innpro(R1,R2,Y), X is A * B + Y. % 以下のサイトは # [1] 授業単元:情報処理 # [2] 問題文(含コード&リンク): # 例えば下図に示すように,通行可能なマス目に'0'が, # 障害物があって通行不能なマス目に'+'が記されている盤がある. # 盤の左上をスタート地点,右下をゴール地点として,経路を表示する # プログラムを作りなさい. # 盤の例 # 0 0 + 0 + # + 0 0 0 + # 0 + + 0 0 # 0 0 + 0 0 # + 0 0 0 0 # # 例えばこのようなアルゴリズムが考えられる. # # 1) 現在位置を表示の後、進行方向に対して,右に進めるなら右に, # そうでなければ直進,それもだめなら左に,さらにそれもダメなら後退する. # 2) 1を繰り返してゴールに達したらその旨を表示する. # ただし,マス目の数分だけ移動してもゴールに達しない場合はその時点で終了する. # # 入力形式は、 # # %> ./a.out 00+0+ +000+ 0++00 00+00 +0000 # # とする. '例えば下図に示すように,通行可能なマス目に'0'が, 障害物があって通行不能なマス目に'+'が記されている盤がある. 盤の左上をスタート地点,右下をゴール地点として,経路を表示する プログラムを作りなさい. 盤の例 0 0 + 0 + + 0 0 0 + 0 + + 0 0 0 0 + 0 0 + 0 0 0 0 例えばこのようなアルゴリズムが考えられる. 1) 現在位置を表示の後、進行方向に対して,右に進めるなら右に, そうでなければ直進,それもだめなら左に,さらにそれもダメなら後退する. 2) 1を繰り返してゴールに達したらその旨を表示する. ただし,マス目の数分だけ移動してもゴールに達しない場合はその時点で終了する. 入力形式は、 %> ./a.out 00+0+ +000+ 0++00 00+00 +0000 とする.'(X) :- abolish(経路/2), 経路盤を描く(X). 経路探索((1,1),_終点,[(1,1)],X). 経路盤を描く(X) :- write('盤面を一行で入力しなさい '), 行入力(_行), 経路盤を描く(_行,_終点). 経路探索(_終点,_終点,Log,Log) :- !. 経路探索(A,_終点,Log,X) :- 経路(A,B), \+(member(B,Log)), 経路探索(B,_終点,[B|Log],X),!. 経路探索(A,_終点,Log,X) :- 経路(B,A), \+(member(B,Log)), 経路探索(B,_終点,[B|Log],X),!. 経路盤を描く(_行,(N,M)) :- 項目区切り(_行,[' '],L), findall(L1,(member(A,L),atom_chars(A,L1)),Ls), length(Ls,N), t340_2(1,Ls), 行列の転置(Ls,Ls2), length(Ls2,M), t340_3(1,Ls2),!. t340_2(_,[]) :- !. t340_2(N,[L|R]) :- t340_2_1(N,1,L), N2 is N + 1, t340_2(N2,R). t340_2_1(_,_,[_]) :- !. t340_2_1(N,M,['+'|R]) :- M2 is M + 1, t340_2_1(N,M2,R),!. t340_2_1(N,M,[A,B|R]) :- not(A='+'), not(B='+'), M2 is M + 1, assertz(経路((N,M),(N,M2))), t340_2_1(N,M2,[B|R]),!. t340_2_1(N,M,[A,B|R]) :- not(A='+'), B='+', M2 is M + 1, t340_2_1(N,M2,[B|R]),!. t340_3_1(_,_,[_]) :- !. t340_3_1(N,M,['+'|R]) :- M2 is M + 1, t340_3_1(N,M2,R),!. t340_3_1(N,M,[A,B|R]) :- not(A='+'), not(B='+'), M2 is M + 1, assertz(経路((M,N),(M2,N))), t340_3_1(N,M2,[B|R]),!. t340_3_1(N,M,[A,B|R]) :- not(A='+'), B='+', M2 is M + 1, t340_3_1(N,M2,[B|R]),!. 行入力(_行) :- read_line_to_codes(current_input,_コードならび), atom_codes(_行,_コードならび). 項目区切り(_文字列,_区切り文字列ならび,_区切られた文字列ならび) :- 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,_区切られた文字列ならび),!. 項目区切り(_文字列,_,[_文字列]). 先頭から区切り文字列で区切って行く(_文字列,_区切り文字列ならび,[_前文字列|R]) :- '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列), 項目区切り(_後文字列,_区切り文字列ならび,R). '区切り文字列で前文字列、後文字列に区切る'(_文字列,_区切り文字列ならび,_前文字列,_区切り文字列,_後文字列) :- 副文字列(_文字列,_前文字列,_区切り文字列,_後文字列), member(_区切り文字列,_区切り文字列ならび). 副文字列(_文字列,_前文字列,_副文字列,_後文字列) :- atom_concat(_前文字列,_残り文字列,_文字列), atom_concat(_副文字列,_後文字列,_残り文字列). 文字列ならびの中で数値に変換可能なものは変換する(_文字列ならび,_項目ならび) :- findall(_項目,( 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目)),_項目ならび). 文字列を取り出し数値に変換可能なものは変換する(_文字列ならび,_項目) :- member(_文字列,_文字列ならび), 数値に変換可能なものは変換する(_文字列,_項目). 数値に変換可能なものは変換する(_文字列,_項目) :- atom_number(_文字列,_項目),!. 数値に変換可能なものは変換する(_文字列,_文字列). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/244 # # 〔1〕授業単元:C言語 # 〔2〕問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9601.txt # ・2つの整数型の変数を入れ替える関数 swapを定義して、それを用いて配列中の数字をランダムに入れ替えるプログラムを作りなさい。 # 1から52までの数が順番に入った配列を用意し、十分に入れ替えた結果を表示すること。 # これができた人は、次のように表示を変更しなさい。 # ・ 52個の数字を1〜13、14〜26、27〜39、40〜52の4組に分けて考える # ・ それぞれ1番目から13番目の数字を、A、2、3、4、5、6、7、8、9、T、J、Q、K と表示する(TはTenのT) # 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,2,0,21,22,… # ↓ # A,2,3,4,5,6,7,8,9,T,J,Q,K,A,2,3,4,5,6,7,8,9,T,… # ?これができた人は、次のように表示を変更しなさい。 # ・トランプの4つのスートをアルファベットで表示することにする(スペードは s, ハート #  はh、ダイヤはd、 クラブはc) # ・ 1〜13はスペード(s)、14〜26はハート(h)、27〜39はダイヤ(d)、40〜52はクラブ(c)とする # ・ それぞれの数字をA〜Kとshdcの組合せで表示する # ・ 例:1ならAs(スペードのA)、52ならKc(クラブのK) # As,2s,…..,Ks,Ah,2h,……,Kh,Ad,2d,……,Kd,Ac,2c,…..,Kc swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. t319_2(X) :- findall(U,( between(1,52,N), t319_2_1(N,U)),X). t319_2_1(N,U) :- M is N mod 13, '数字カード・絵カード'(M,U). '数字カード・絵カード'(1,'A') :- !. '数字カード・絵カード'(10,'T') :- !. '数字カード・絵カード'(11,'J') :- !. '数字カード・絵カード'(12,'Q') :- !. '数字カード・絵カード'(0,'K') :- !. '数字カード・絵カード'(N,N). トランプの準備(X) :- findall(U,( between(1,52,N), 一枚のカードを作る(N,U)),_整列したカード), トランプを切る(100,_整列したカード,X). 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), atom_concat(U1,U2,U). カードの種類(0,s). カードの種類(1,h). カードの種類(2,d). カードの種類(3,c). トランプを切る(0,L,L) :- !. トランプを切る(N,L,X) :- M1 is random(52) + 1, M2 is random(52) + 1, swap_nth(M1,M2,L,L1), N2 is N - 1,!, トランプを切る(N2,L1,X). swap_nth(M,N,L1,L2) :- nth1(M,L1,A), nth1(N,L1,B), swap(A,B,L1,L2),!. swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/514 # #[1]授業単元:プログラミング演習1 # #[2]問題文:画面より入力した成績データをファイルに登録する。 # 画面より入力する項目は以下のとおり。 # ・生徒コード、数字6桁、数字であること。 # ・氏名、文字列20文字、1字以上、20字以内 # ・国語(点数)、数字3桁、数字であること、0<=点数<=100 # ・算数(点数)、国語と同じ # ・社会(点数)、国語、算数と同じ # # # 生徒コードに999999が入力されたら終了する。 t206(_登録ファイル) :- 入力情報検査の書き方学習のための情報登録プログラム(_登録ファイル). 入力情報検査の書き方学習のための情報登録プログラム(_登録ファイル) :- open(_登録ファイル,write,Output), repeat, 一人分の生徒情報を得る(_個人データ,_入力検査結果), 個人情報を登録する(Output,_個人データ,_入力検査結果), _入力検査結果 = end_of_file, close(Output),!. 個人情報を登録する(_,_,end_of_file) :- !. 個人情報を登録する(Output,_個人データ,_入力検査結果) :- _個人データ = (_生徒コード,_氏名,_国語,_算数,_社会), write_formatted(Output,'%6d,%20s,%3d,%3d,%3d.\n',[_生徒コード,_氏名,_国語,_算数,_社会]), write_formatted('書き込んだデータ=%6d,%20s,%3d,%3d,%3d.\n',[_生徒コード,_氏名,_国語,_算数,_社会]). 一人分の生徒情報を得る(_個人データ,_入力検査結果) :- repeat, write('生徒コード,氏名,国語点数,算数点数,社会点数をカンマで区切り入力しなさい(最後は.で終わる)\n'), read(_個人データ), 一人分の情報入力検査(_個人データ,_入力検査結果),!. 一人分の情報入力検査(999999,end_of_file) :- !. 一人分の情報入力検査(_個人データ,_入力検査結果) :- 入力項目検査(_個人データ,_入力検査結果), 一人分の情報入力終了検査(_入力検査結果),!. 一人分の情報入力終了検査(end_of_file) :- !. 一人分の情報入力終了検査([]) :- !. 一人分の情報入力終了検査(L) :- 入力エラー理由の表示(L), write_formatted('%t\n',[再入力が必要です]), fail. 入力項目検査((_生徒コード,_氏名,_国語,_算数,_社会),_入力検査結果) :- 生徒コード入力検査(_生徒コード,[],L1), 氏名入力検査(_氏名,L1,L2), 点数科目入力検査(国語,_国語,L2,L3), 点数科目入力検査(算数,_算数,L3,L4), 点数科目入力検査(社会,_社会,L4,_入力検査結果),!. 入力項目入力検査(_入力されたデータ,_入力検査結果) :- _入力検査結果=[[入力項目の形式に誤りがあります,_入力されたデータ]],!. 生徒コード入力検査(_生徒コード,L,L) :- integer(_生徒コード), _生徒コード>=100000,_生徒コード<999999,!. 生徒コード入力検査(_生徒コード,L,[[生徒コードが整数でありません,_生徒コード]|,L) :- not(integer(_生徒コード)),!. 生徒コード入力検査(_生徒コード,L,[end_of_fileの認識用に使ってしまっているコードです,_生徒コード]|L]) :- integer(_生徒コード), _生徒コード=999999,!. 生徒コード入力検査(_生徒コード,L,[生徒コードが小さすぎます,_生徒コード]|L]) :- integer(_生徒コード), _生徒コード<100000,!. 生徒コード入力検査(_生徒コード,L,[生徒コードが大きすぎます,_生徒コード]|L]) :- integer(_生徒コード), _生徒コード>999999,!. 氏名入力検査(_氏名,L,L) :- atom(_氏名), atom_length(_氏名,_氏名の長さ), _氏名の長さ>=1,_氏名の長さ=<20,!. 氏名入力検査(_氏名,L,[[氏名がアトムでありません,_氏名]|L]) :- not(atom(_氏名)),!. 氏名入力検査(_氏名,L,[[氏名が有効な文字ではありません,_氏名]|L]) :- atom(_氏名), atom_length(_氏名,_氏名の長さ), _氏名の長さ<1,!. 氏名入力検査(_氏名,L,[[氏名の文字数が多すぎます,_氏名]|L]) :- atom(_氏名), atom_length(_氏名,_氏名の長さ), _氏名の長さ>20,!. 点数科目入力検査(_科目,_点数,L,L) :- integer(_科目), _点数 >= 0, _点数 =< 100,!. 点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :- not(integer(_科目)), atom_concat(_科目,の点数が整数ではありません,S),!. 点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :- integer(_科目), _科目<0, atom_concat(_科目,の点数が負数です,S),!. 点数科目入力検査(_科目,_点数,L,[[S,_点数]|L]) :- not(integer(_科目)),!, _点数>100, atom_concat(_科目,の点数が100点より大きくなっています,S),!. 入力エラー理由の表示(L) :- reverse(L,L2), member([A,B],L2), write_formatted('%t,%t\n',[A,B]), fail. 入力エラー理由の表示(_). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/481 # # [1] 授業単元:ソフトウェア演習C # [2] 問題文: # 文書ないのすべての単語とその単語の頻度をメンバとして持つ構造体を定義し、 # この構造体へのポインタをノードの値として持つ二分木のノードを定義せよ # # 次に、任意のノードはその左の部分木にはそのノードの単語より辞書順で # 小さい単語のみがあり、その右の部分木にはより大きい単語のみがあるように # 保持される。 # 新たに単語がすでに木にあるかどうかを探すには、ルート(根元)から出発して # そのノードに格納されている単語と新しい単語を比較する。 # 二つが一致したら、それで良い。 # 新しい単語が木の単語より小さいときは、探索は左の子供に対して続けられ、 # そうでなければ右の子供が調べられる。 # 求める方向に子供がないときは、新しい単語は木の中にはないと言うことであり、 # また実際にはその子供のないところがそれを置く場所である。 # このプロセスは再帰的である必要があり、単語の挿入を行うadd_word()関数を # 定義せよ。 # この関数は再帰的に呼ばれて、左または右の部分木に振り分けられる。 # 単語は木の中の単語と一致する(その場合カウント(頻度)がインクリメントされる)か、 # あるいはノードを作成し、木に加えなければならないことを示すヌル・ポインタと # 出会う。 # 新たにノードが生成されると、この関数ではそのノードへのポインタが返され、 # 親ノードに埋め込まれる。 # この関数を利用し、以下のテキストをコマンド実行時の引数として与えられた # ファイルを入力して二分探索木を生成し、単語と頻度のリストを表示する # プログラムを作成せよ。 # # 文章: ファイル名:test.txt # University was founded in April 1998 at Iwate, # which is situated in the northeastern part of Japan. # University consists of four faculties Software and Information Science, # Nursing, Social Welfare, # and policy Studies, and additionally other educational supporut centers. :- dynamic(節/5). 二分木に情報と頻度を保持する :- get_chars('test.txt',Chars), chars_split(Chars,[' ',',','.'],WordList), 木作成(WordList). 情報と頻度を保持した二分木の昇順表示 :- 二分木から値と頻度を取り出す(1,_頻度付きの値ならび), member([_語,_頻度],_頻度付きの値ならび), writef('語彙=%t,頻度=%t\n',[_語,_頻度]), fail; true. 木作成(_ならび) :- abolish(節/5), 節作成(_ならび,1,1,_). 木作成([],_,_,_). 木作成([_値|R],_節,_開始節番号,_次の節番号) :- to_lower(_値,_小文字化した値), 節作成(_小文字化した値,_節,_開始節番号,_受取節番号), 木作成(R,_節,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- not(節(_節,_,_,_,_)), _左 is _受取節番号+1, _右 is _受取節番号+2, _次の節番号 is _受取節番号+3, assertz(節(_節,_左,_右,_値,1)),!. 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), _値 @< _値2, 節作成(_値,_左,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_), _値 @> _値2 , 節作成(_値,_右,_受取節番号,_次の節番号). 節作成(_値,_節,_受取節番号,_次の節番号) :- 節(_節,_左,_右,_値2,_頻度), _値 = _値2 , _頻度2 is _頻度 + 1, retract(節(_節,_左,_右,_値2,_頻度)), assertz(節(_節,_左,_右,_値2,_頻度2)). 二分木から値と頻度を取り出す(_節,_頻度付きの値ならび) :- findall([_値,頻度],二分木から値と頻度を取り出す(_節,_,_値,_,_頻度),_頻度付きの値ならび). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_左,_,_値2,_,_頻度2), 二分木から値と頻度を取り出す(_左,_値2,_値,_頻度2,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- 節(_節,_,_右,_値2,_頻度2), 二分木から値と頻度を取り出す(_右,_,_値,_,_頻度). 二分木から値と頻度を取り出す(_節,_値1,_値,_頻度1,_頻度) :- not(var(_値1)), not(var(_頻度1)), _値1=_値, _頻度1=_頻度. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% get_chars(File,Chars) :- open(File,read,Input), findall(X,(repeat,get_char(Input,X),(X=end_of_file,!,fail;true)),Chars), close(Input). concat_atom([A],Sep,[A]) :- !. concat_atom([A|R],Sep,X) :- concat_atom(R,Sep,Y), atom_concat(A,Sep,Y1), atom_concat(Y1,Y,X). chars_split(L,_区切りならび,[B|R]) :- chars_split_2(L,_区切りならび,A,B,L2), chars_split(L2,_区切りならび,R),!. chars_split(L1,_,[A]) :- atomic_list_concat(L1,A). chars_split_2(L,_区切りならび,A,B,L2) :- append(L1,[A|L2],L), member(A,_区切りならび), atomic_list_concat(L1,B),!. 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1153585095/640 # # 【 課題 】 # 指定したフォルダの中身をフォルダの構成などを含めて完全にバックアップする # ソフトを作成すること。 # 尚、バックアップファイルには以下の機能を持つようにすること。 # ・ 対象ファイルや除外ファイルを指定できるような # 仕組みを持つこと。 # ・ バックアップ経過のログを作成すること。 # ログにはバックアップ処理の実行時間を出力すること。 # また、既にあるフォルダが指定された場合の対処についてもそれぞれ考慮して # 機能の実装を行うこと。 # 作業に余裕のある人は以下の機能を追加すること。 # ・バックアップしたファイルを圧縮する仕組みの追加。 # ・プログラムが常駐する仕組みの追加。 t111(Dir,SaveDir) :- concat_atom(['cp -R ',Dir,' ',SaveDir],S), shs(S,_). /* concat_atom(['ls -l ',Dir],S), shs(S,L), member(A,L), not(sub_atom(A,1,1,_,d)), concat_atom([Dir,/,A],FI), concat_atom([SaveDir,/,A],FO), copy(FI,FO), fail; true. */ shs(S,L) :- system(S,user_input,Input),get_lines(Input,L),close(Input). get_lines(File,Lines) :- get_chars(File,L),chars_lines(L,Lines),!. get_chars(Input,end_of_file,[]) :- !. get_chars(Input,X,[X|R]) :- get_char(Input,Y),get_chars(Input,Y,R) . get_chars(Input,L) :- get_char(Input,X),get_chars(Input,X,L),!. chars_lines([],[],[]) :- !. chars_lines(['\r'],[],[]) :- !. chars_lines(['\r',A|R],[],[A|R]) :- \+(A = '\n'),!. chars_lines(['\r','\n'|R],[],R) :- !. chars_lines(['\n'|R],[],R) :- !. chars_lines([A|R1],[A|R2],Z) :- chars_lines(R1,R2,Z). chars_lines([],[]) :- !. chars_lines(L,[A|R2]) :- chars_lines(L,U,R),concat_atom(U,A),chars_lines(R,R2). concat_atom([],'') :- !. concat_atom([A|R],S) :- concat_atom(R,S2),atom_concat(A,S2,S). % 以下のサイトは %% 1.0 剰余算 を核とするFizzBuzz %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz_2(M,S), writef('%w ',[S]), N = N. fizzbuzz_2(N,'FizzBuzz') :- 0 is N mod 3, 0 is N mod 5,!. fizzbuzz_2(N,'Fizz') :- 0 is N mod 3,!. fizzbuzz_2(N,N,'Buzz') :- 0 is N mod 5,!. fizzbuzz_2(N,N). %% 1.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz(M,X), writef('%w ',[X]), M = N. fizzbuzz(N,'Fizz') :- 0 is N mod 3,\+(0 is N mod 3). fizzbuzz(N,'Buzz') :- 0 is N mod 5,\+(0 is N mod 5). fizzbuzz(N,'FizzBuzz') :- 0 is N mod 3,0 is N mod 5. fizzbuzz(N,N) :- \+(0 is N mod 3),\+(0 is N mod 5). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- 'Nを1から生成しMになるまでFizzBuzzを表示する'(M),!. 'Nを1から生成しMになるまでFizzBuzzを表示する'(M) :- 'Nを1から生成し'(M,N), 'NがMになるまでFizzBuzzを表示する'(M,N). 'Nを1から生成し'(M,N) :- between(1,M,N). 'NがMになるまでFizzBuzzを表示する'(M,N) :- 'FizzBuzzを'(N,FizzBuzz), writef('%w ',[FizzBuzz]), M = N. 'FizzBuzzを、'(N,FizzBuzz) :- 'Nが、3と5で割り切れたらfizzbuzzを、3で割り切れ5で割り切れなかったらfizzを、5で割り切れ3で割り切れなかったらbuzzを、3でも5でも割り切れなければNを返す。'(N,FizzBuzz). 'Nが、3と5で割り切れたらfizzbuzzを、3で割り切れ5で割り切れなかったらfizzを、5で割り切れ3で割り切れなかったらbuzzを、3でも5でも割り切れなければNを返す。'(N,fizzbuzz) :- 'Nが、3と5で割り切れたら'(N). 'Nが、3と5で割り切れたらfizzbuzzを、3で割り切れ5で割り切れなかったらfizzを、5で割り切れ3で割り切れなかったらbuzzを、3でも5でも割り切れなければNを返す。'(N,fizz) :- 'Nが、3で割り切れ5で割り切れなかったら'(N). 'Nが、3と5で割り切れたらfizzbuzzを、3で割り切れ5で割り切れなかったらfizzを、5で割り切れ3で割り切れなかったらbuzzを、3でも5でも割り切れなければNを返す。'(N,buzz) :- 'Nが、5で割り切れ3で割り切れなかったら'(N). 'Nが、3と5で割り切れたらfizzbuzzを、3で割り切れ5で割り切れなかったらfizzを、5で割り切れ3で割り切れなかったらbuzzを、3でも5でも割り切れなければNを返す。'(N,N) :- 'Nが、3でも5でも割り切れなかったら'(N). 'Nが、3と5で割り切れたら'(N) :- 0 is N mod 3, 0 is N mod 5. 'Nが、3で割り切れ5で割り切れなかったら'(fizz) :- 0 is N mod 3. 'Nが、5で割り切れ3で割り切れなかったら'(buzz) :- 0 is N mod 5. 'Nが、3でも5でも割り切れなかったら'(N) :- \+(0 is N mod 3), \+(0 is N mod 5). %% 1.2 再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(0) :- !. fizzbuzz(N) :- fizzbuzz(N,X), N_1 is N - 1, fizzbuzz(N_1), writef('%w ',[X]). fizzbuzz(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz(M,M). %% 1.3 再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % @viperlikeさんのツイートを見てそこで示されている形式の再帰がまだないことに気がついた。 % fizzbuzz(N) :- fizzbuzz(N,[],L), write_fizzbuzz(L). fizzbuzz(0,L,L) :- !. fizzbuzz(N,L1,L) :- fizzbuzz(N,S), succ(N_1,N), fizzbuzz(N_1,[S|L1],L). fizzbuzz(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz(M,M). write_fizzbuzz(L) :- atomic_list_concat(L,' ',S), writef('%w\n',[S]). %% 1.4 末尾再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz_2(M,X), writef('%w ',[X]), M_2 is M + 1, fizzbuzz(M_2,N). fizzbuzz_2(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz_2(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz_2(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz_2(M,M). %% 1.5 forall/2とbetween/3を使用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- forall(( between(1,N,M), fizzbuzz_2(M,S), writef('%w ',[S])), true). fizzbuzz_2(M,'FizzBuzz') :- 0 is M mod 15,!. fizzbuzz_2(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz_2(M,N,'Buzz') :- 0 is M mod 5,!. fizzbuzz_2(M,M). %% 1.6 findsols/4とnth1/3を使用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,( nth1(M,_,_), fizzbuzz_2(M)),_),!. fizzbuzz_2(M) :- fizzbuzz_3(M,S), writef('%w ',[S]),!. fizzbuzz_3(M,'FizzBuzz') :- 0 is M mod 15. fizzbuzz_3(M,'Fizz') :- 0 is M mod 3. fizzbuzz_3(M,N,'Buzz') :- 0 is M mod 5. fizzbuzz_3(M,M). %% 1.7 between/3とfindall/3を使用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz(M,[[1,M],[3,'Fizz'],[5,'Buzz']],L2), fizzbuzz_2(L2,S), writef('%w ',[S]), N = M. fizzbuzz(M,L1,L2) :- findall(S,( member([U,S],L1), 0 is M mod U), L2). fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %% 1.8 末尾再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz表示(M), M_2 is M + 1, fizzbuzz(M_2,N). fizzbuzz表示(M) :- fizzbuzz表示(M,_表示), writef('%w ',[_表示]). fizzbuzz表示(M,'FizzBuzz') :- 0 is M mod 3, 0 is M mod 5,!. fizzbuzz表示(M,'Fizz') :- 0 is M mod 3,!. fizzbuzz表示(M,'Buzz') :- 0 is M mod 5,!. fizzbuzz表示(M,M). %% 1.9 剰余情報をリストに持つ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,_n), findall(A,( member([_m,A],[[1,_n],[3,'Fizz'],[5,'Buzz']]), 0 is _n mod _m), L), fizzbuzz_2(L,S), writef('%w ',[S]), N = _n. fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %% 1.10 剰余情報をリストに持ち、findnsols/4とbetween/3で制御 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,( nth1(M,_,_), findall(S,( member([U,S],[[1,M],[3,'Fizz'],[5,'Buzz']]), 0 is M mod U),L2), fizzbuzz_2(L2,S), writef('%w ',[S])),_),!. fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %% 1.11 末尾再帰 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(N,Max) :- N > Max. fizzbuzz(N,Max) :- fizzbuzz_2(N,C), nth0(C,[N,'Fizz','Buzz','FizzBuzz'],X), writef('%w ',[X]), N_2 is N + 1, fizzbuzz(N_2,Max). fizzbuzz_2(N,C) :- 0 is N mod 3 -> A=1;A=0. 0 is N mod 5 -> B=1;B=0, C is A + 2 * B. %% 2.0 FizzBuzzの変位をリストのパターンとして表現 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzに置換する(L,L1), buzzに置換する(L1,L2), 表示する(L2),!. fizzに置換する([_1,_2,_3|R1],[_1,_2,fizz|R2]) :- fizzに置換する(R1,R2). fizzに置換する(L,L). buzzに置換する([_1,_2,_3,_4,fizz|R1],[_1,_2,_3,_4,fizzbuzz|R2]) :- buzzに置換する(R1,R2). buzzに置換する([_1,_2,_3,_4,_5|R1],[_1,_2,_3,_4,buzz|R2]) :- buzzに置換する(R1,R2). buzzに置換する(L,L). 表示する(L) :- atomic_list_concat(L,' ',_表示文字列), writef('%w\n',[_表示文字列]). %% 2.1 リストのシフトで割り算を表現 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(N,_fizzbuzzならび), fizzbuzzならびを表示する(_fizzbuzzならび),!. fizzbuzz(N,L2) :- 最初に自然数ならびを作り(N,_自然数ならび), fizzに置換する(_自然数ならび,L1), buzzに置換する(L1,L2). 最初に自然数ならびを作り(N,_自然数ならび) :- findall(M,between(1,N,M),_自然数ならび). fizzに置換する([_1,_2,_3|R1],[_1,_2,fizz|R2]) :- fizzに置換する(R1,R2). fizzに置換する(L,L). buzzに置換する(L1,L2) :- fizzbuzzも考慮しつつbuzzに置換する(L1,L2). buzzに置換する(L,L). fizzbuzzも考慮しつつbuzzに置換する([_1,_2,_3,_4,fizz|R1],[_1,_2,_3,_4,fizzbuzz|R2]) :- buzzに置換する(R1,R2). fizzbuzzも考慮しつつbuzzに置換する([_1,_2,_3,_4,_5|R1],[_1,_2,_3,_4,buzz|R2]) :- buzzに置換する(R1,R2). fizzbuzzならびを表示する(_fizzbuzzならび) :- atomic_list_concat(_fizzbuzzならび,' ',_表示文字列), writef('%w\n',[_表示文字列]). %% 2.2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- length(L0,N), fizzbuzz([_],[_|L0],[_,_,_],[_,_,_,_,_]). fizzbuzz(Lm,Lm,_,_). fizzbuzz(L0,Lm,L1,L2) :- fizzbuzz(L0,L1,L2,L3,L4,_正解), writef('%w ',[_正解]), fizzbuzz([_|L0],Lm,L3,L4). fizzbuzz(_,[_],[_],[_,_,_],[_,_,_,_,_],'FizzBuzz'). fizzbuzz(_,[_],[_|L2],[_,_,_],L2,'Fizz'). fizzbuzz(_,[_|L1],[_],L1,[_,_,_,_,_],'Buzz'). fizzbuzz(L,[_|L1],[_|L2],L1,L2,N) :- length(L,N). %% 2.3 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz(_,_,[]) :- !. fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%w ',[A]), fizzbuzz([_|L1],[_|L2],R). %% 2.4 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_,_,_],[_,_,_,_,_],L). fizzbuzz(_,_,[]) :- !. fizzbuzz([],[],[_|R]) :- fizzbuzz([_,_,_],[_,_,_,_,_],['FizzBuzz'|R]). fizzbuzz([],L2,[_|R]) :- fizzbuzz([_,_,_],L2,['Fizz'|R]). fizzbuzz(L1,[],[_|R]) :- fizzbuzz(L1,[_,_,_,_,_],['Buzz'|R]). fizzbuzz([_|L1],[_|L2],[A|R]) :- writef('%w ',[A]), fizzbuzz(L1,L2,R). %% 2.5 リストのシフトで割り算 空文字を使いfizzbuzzを表示させない技法 %%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w ',[C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,C) :- atom_concat(A,B,C). %% 2.6 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz(['','','Fizz'],['','','','','Buzz'],L). fizzbuzz(_,_,[]). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w ',[C]), append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,C) :- atom_concat(A,B,C). %% 2.7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w%w%w',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N). fizzbuzz(A,B,_,' '). %% 2.8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w%w%w ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). %% 2.9 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']),!. fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,L1,L2) :- fizzbuzz_1([_|Ln],L1,L2,S), writef('%w ',[S]), fizzbuzz_2(L1,L2,L1_2,L2_2), fizzbuzz([_|Ln],N,L1_2,L2_2). fizzbuzz_1([_|Ln],[''|_],[''|_],N) :- length([_|Ln],N). fizzbuzz_1(_,[A|_],[B|_],S) :- atomic_list_concat([A,B],S). fizzbuzz_2([A|R1],[B|R2],L1_2,L2_2) :- append(R1,[A],L1_2), append(R2,[B],L2_2). %% 2.10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],['','','',fizz],['','','','',buzz],Lnx), length(Lnx,N). fizzbuzz(Ln,[A|R1],[B|R2],Ln) :- 表示(Ln,A,B). fizzbuzz(Ln,[A|R1],[B|R2],Lnx) :- 回転([A|R1],[B|R2],L1,L2), fizzbuzz([_|Ln],L1_2,L2_2,Lnx). 回転([A|R1],[B|R2],L1,L2) :- append(R1,[A],L1), append(R2,[B],L2). 表示(Ln,A,B) :- 表示項(Ln,A,B,X), writef('%w '[X]). 表示項(Ln,'','',N) :- length(Ln,N),!. 表示項(_,A,B,C) :- atom_concat([A,B],C). %% 2.11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(L,N,_,_) :- length(L,N),!. fizzbuzz(Ln,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- fizzbuzz_1(_31,_51,Ln,A), writef('%w%w%w ',[_31,_51,A]), fizzbuzz([_|Ln],N,[_32,_33,_31],[_52,_53,_54,_55,_51]). fizzbuzz_1('','',Ln,M) :- length([_|Ln],M),!. fizzbuzz_1(_,_,_,''). %% 2.12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],[_,_],[_,_,_,_],Ln,X), writef('%w',[X]), length(Ln,N),!. fizzbuzz(L1,L2,L3,Ln,X) :- fizzbuzz_1(L1,L2,L3,L2_1,L3_1,Y), fizzbuzz_2(L1,L2_1,L3_1,Y,Ln,X). fizzbuzz_2(L1,L2,L3,X,L1,X). fizzbuzz_2(L1,L2,L3,_,Ln,X) :- fizzbuzz([_|L1],L2,L3,Ln,X). fizzbuzz_1(R1,[],[],[_,_],[_,_,_,_],'FizzBuzz '). fizzbuzz_1(R1,[],[_|R3],[_,_],R3,'Fizz '). fizzbuzz_1(R1,[_|R2],[],R2,[_,_,_,_],'Buzz '). fizzbuzz_1(R1,[_|R2],[_|R3],R2,R3,N) :- length(R1,N). %% 2.13 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Nth,X) :- fizzbuzz([_],[_,_],[_,_,_,_],Nth,X). fizzbuzz(L1,L2,L3,Nth,X) :- length(L1,Nth_1), fizzbuzz_1(Nth_1,L2,L3,L2_1,L3_1,Y), fizzbuzz_2(L1,L2_1,L3_1,Nth_1,Nth,Y,X). fizzbuzz_2(L1,L2,L3,Nth,Nth,X,X). fizzbuzz_2(L1,L2,L3,_,Nth,_,X) :- fizzbuzz([_|L1],L2,L3,Nth,X). fizzbuzz_1(_,[],[],[_,_],[_,_,_,_],'FizzBuzz'). fizzbuzz_1(_,[],[_|R3],[_,_],R3,'Fizz'). fizzbuzz_1(_,[_|R2],[],R2,[_,_,_,_],'Buzz'). fizzbuzz_1(N,[_|R2],[_|R3],R2,R3,N). %% 2.14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- fizzbuzz(M,[_],[_,_,_],[_,_,_,_,_]). fizzbuzz(M,[_|L],_,_) :- length(L,M),!. fizzbuzz(M,L,L1,L2) :- fizzbuzz(L,L1,L2,L_1,L1_1,L2_1,S), writef('%w ',[S]), fizzbuzz(M,L_1,L1_1,L2_1). fizzbuzz(L,L,L,[_|L],[_,_,_|L],[_,_,_,_,_|L],fizzbuzz) :- !. fizzbuzz(L,L,L2,[_|L],[_,_,_|L],L2,fizz) :- !. fizzbuzz(L,L1,L,[_|L],L1,[_,_,_,_,_|L],buzz). fizzbuzz(L,L1,L2,[_|L],L1,L2,N) :- length(L,N). %% 2.15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % PrologというのはFizzBuzz問題向きなのだろうか。 % fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz([_],[_],L). fizzbuzz([_,_,_],[_,_,_,_,_],[_|R]) :- fizzbuzz([],[],['FizzBuzz'|R]). fizzbuzz([_,_,_],L2,[_|R]) :- fizzbuzz([],L2,['Fizz'|R]). fizzbuzz(L1,[_,_,_,_,_],[_|R]) :- fizzbuzz(L1,[],['Buzz'|R]). fizzbuzz(L1,L2,[A|R]) :- writef('%w ',[A]), fizzbuzz([_|L1],[_|L2],R). fizzbuzz(_,_,[]). %% 2.16 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizbuzz(1,N,['','','Fizz'],['','','','','Buzz']). fizzbuzz(M,N,_,_) :- M > N,!. fizzbuzz(M,N,[_31,_32,_33],[_51,_52,_53,_54,_55]) :- 出力情報(_31,_51,M,_N), writef('%w%w%w ',[_31,_51,_N]), fizzbuzz(M,N,[_32,_33,_31],[_52,_53,_54,_55,_51]). 出力情報('','',_N,_N) :- !. 出力情報(_,_,_,''). %% 2.17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), forall(fizzbuzz(['','','Fizz'],['','','','','Buzz'],L),true). fizzbuzz([A|R1],[B|R2],[N|R3]) :- fizzbuzz(A,B,N,C), writef('%w%w%w ',[A,B,C]). fizzbuzz([A|R1],[B|R2],[_|R3]) :- append(R1,[A],L1), append(R2,[B],L2), fizzbuzz(L1,L2,R3). fizzbuzz('','',N,N) :- !. fizzbuzz(A,B,_,''). %% 3.0 ペアノ数 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(M) :- s(S,M), fizzbuzz(S,s(0),s(s(s(0))),s(s(s(s(s(0)))))). fizzbuzz(S,s(S),_,_) :- !. fizzbuzz(MS,S,S1,S2) :- fizzbuzz(S,S1,S2,S_1,S1_1,S2_1,A), writef('%w ',[A]), fizzbuzz(MS,S_1,S1_1,S2_1). fizzbuzz(S,S,S,s(S),s(s(s(S))),s(s(s(s(s(S))))),fizzbuzz) :- !. fizzbuzz(S,S,S2,s(S),s(s(s(S))),S2,fizz) :- !. fizzbuzz(S,S1,S,s(S),S1,s(s(s(s(s(S))))),buzz). fizzbuzz(S,S1,S2,s(S),S1,S2,N) :- s(S,N). s(0,0) :- !. s(s(S),N) :- var(N), s(S,N_1), succ(N_1,N). s(s(S),N) :- integer(N), succ(N_1,N), s(S,N_1). %% 4.0 FizzBuzz整数の15個パターンの利用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% finzzbuzz(N) :- fizzbuzz([],N,['FizzBuzz',_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_],[]). fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,Ln2,[_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]) :- fizzbuzz(Ln,N,Ln2,[]). fizzbuzz(Ln,N,Ln2,L) :- append(_,[A|L],Ln2), fizzbuzz_2(Ln,A,B), writef('%w ',[B]), fizzbuzz([_|Ln],N,Ln2,[_|L]). fizzbuzz_2(Ln,A,A) :- atom(A). fizzbuzz_2(Ln,A,N) :- length([_|Ln],N). %% 4.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findall(M,between(1,N,M),L), fizzbuzz(L,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). fizzbuzz([],_) :- !. fizzbuzz(L,[]) :- fizzbuzz(L,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). fizzbuzz([A|R1],[B|R2]) :- var(B), writef('%w ',[A]), fizzbuzz(R1,R2). fizzbuzz([A|R1],[B|R2]) :- atomic(B), writef('%w ',[B]), fizzbuzz(R1,R2). %% 4.2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'FizzBuzz'(N) :- findall(M,between(1,N,M),L1), 'FizzBuzz置換パターン'(L1,L2), atomic_list_concat(L2,' ',S), writef('%w\n',[S]). 'FizzBuzz置換パターン'([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15|R1],[_1,_2,'Fizz',_4,'Buzz','Fizz',_7,_8,'Fizz','Buzz',_11,'Fizz',_13,_14,'FizzBuzz'|R2]) :- 'FizzBuzz置換パターン'(R1,R2). 'FizzBuzz置換パターン'(L,R) :- length(L,Len), length(R,Len), append(L,_,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15]), append(R,_,[_1,_2,'Fizz',_4,'Buzz','Fizz',_7,_8,'Fizz','Buzz',_11,'Fizz',_13,_14,'FizzBuzz']). %% 4.3 nth1/3とfindall/3とflatten/2を利用 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 置換パターンならびを生成(_置換パターンならび), nth1(_nth1,_置換パターンならび,A), fizzbuzz_2(_nth1,A), _nth1 = N. 置換パターンならびを生成(_置換パターンならび) :- U is (N // 15) + 1, findall([_,_,'Fizz',_,'Buzz',_,_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,U,_),LL), flatten(LL,_置換パターンならび). fizzbuzz_2(_nth1,A) :- var(A), writef('%w ',[_nth1]). fizzbuzz_2(_,A) :- atom(A), writef('%w ',[A]). %% 4.4 findall/3とforall/2を使う %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- M is N // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,M,_),LL), flatten(LL,L), forall(( append(L0,[A|R],L), length([_|L0],N_1), ( N_1 > Max,!,fail; fizzbuzz_2(A,N_1,B))), writef('%w ',[B])). fizzbuzz_2(A,N,N) :- var(A),!. fizzbuzz_2(A,N,A). %% 4.5 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L), 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数) :- nth1(_nth1,L,A), 表示項の選択(_nth1,A,_表示項), writef('%w ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,_nth1,_nth1) :- !. 表示項の選択(_nth1,A,A). %% 4.6 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%w ',[A])). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を埋める(N,L1,L2) :- findall(U,( nth1(_nth1,L1,U), _nth1 =< N, (U=_nth1;atom(U))), L2). %% 4.7 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%w ',[A])). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を埋める(M,N,L) :- M > N,!. 変数だけ要素位置番号を埋める(M,N,[M|R]) :- M_2 is M + 1, 変数だけ要素位置番号を埋める(M_2,N,R). 変数だけ要素位置番号を埋める(M,N,[_|R]) :- M_2 is M + 1, 変数だけ要素位置番号を埋める(M_2,N,R). %% 4.8 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を表示する(N,L1). 'fizzbuzzパターンの形成'(N,L) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L). 変数だけ要素位置番号を表示する(N,L1) :- forall((nth1(_nth1,L1,U),_nth1 =< N,(U=_nth1;atom(U))),writef('%w ',[U])). %% 4.9 情報の持ち方が独特 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(0,N),!. fizzbuzz(N,M) :- append(L0,[A|R],[1,2,[3,fizz],4,[5,buzz],[6,fizz],7,8,[9,fizz],[10,buzz],11,[12,fizz],13,14,[15,fizzbuzz]]), 表示値(N,A,N3,_表示値), fizzbuzz_2(N,M,R,N3,_表示値). fizzbuzz_2(N,M,R,N3,_表示値) :- N3 > M. fizzbuzz_2(N,M,R,N3,_表示値) :- writef('%w ',[_表示値]), R = [], N4 is N + 15, fizzbuzz(N4,M). 表示値(N1,[N2,A],N3,A) :- N3 is N1 + N2,!. 表示値(N1,N2,N3,N3) :- N3 is N1 + N2. %% 4.10 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],between(1,N_1,_),LL), flatten(LL,L1), forall((nth1(_nth1,L1,U),_nth1 =< N,(var(U),U=_nth1;atom(U))),writef('%w ',[U])). %% 4.11 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,(fizzbuzz_2(B),writef('%w ',[B])),_),!. fizzbuzz_2(B) :- nth0(I,_,_), member(A,[1,2,'Fizz',4,'Buzz','Fizz',7,8,'Fizz','Buzz',11,'Fizz',13,14,'FizzBuzz']), fizzbuzz_3(A,I,B). fizzbuzz_3(A,_,A) :- atom(A). fizzbuzz_3(A,I,B) :- integer(A), B is 15 * I + A. %% 4.12 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,(nth0(I,_,_),fizzbuzz_2(I,B)),_),!. fizzbuzz_2(I,B) :- member(A,[1,2,'Fizz',4,'Buzz','Fizz',7,8,'Fizz','Buzz',11,'Fizz',13,14,'FizzBuzz']), fizzbuzz_3(A,I,B), writef('%w ',[B]). fizzbuzz_3(A,_,A) :- atom(A). fizzbuzz_3(A,I,B) :- integer(A), B is 15 * I + A. %% 4.13 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,fizzbuzz_2(B),_),!. fizzbuzz_2(B) :- nth0(I,_,_), member(A,[1,2,'Fizz',4,'Buzz','Fizz',7,8,'Fizz','Buzz',11,'Fizz',13,14,'FizzBuzz']), fizzbuzz_3(A,I,B), writef('%w ',[B]). fizzbuzz_3(A,_,A) :- atom(A). fizzbuzz_3(A,I,B) :- integer(A), B is 15 * I + A. %% 4.14 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- findnsols(N,_,fizz_buzz_numberを表示する,_),!. fizz_buzz_numberを表示する :- fizz_buzz_numberを得る(A), writef('%w ',[A]). fizz_buzz_numberを得る(A) :- nth0(_順目,_,_), nth1(_位置,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz'],A), 変数には番号を埋める(_順目,_位置,A). 変数には番号を埋める(_,_,A) :- atom(A). 変数には番号を埋める(_順目,_位置,A) :- A is 15 * _順目 + _位置. %% 4.15 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'N個の変数かfizzbuzzならび'(N,L), 'N個の変数かfizzbuzzならびを変数に順序数を埋めながら表示する'(L),!. 'N個の変数かfizzbuzzならび'(N,L) :- findnsols(N,A,変数かfizzbuzzか(A),L). 変数かfizzbuzzか(A) :- repeat, member(A,[_,_,'Fizz',_,'Buzz','Fizz',_,_,'Fizz','Buzz',_,'Fizz',_,_,'FizzBuzz']). 'N個の変数かfizzbuzzならびを変数に順序数を埋めながら表示する'(L) :- forall(fizzbuzz表示情報(L,A),writef('%w ',[A])). fizzbuzz表示情報(L,A) :- nth1(_位置,L,A), 'Aはfizzbuzzか_位置'(_位置,A). 'Aはfizzbuzzか_位置'(_位置,A) :- atom(A). 'Aはfizzbuzzか_位置'(_位置,_位置). %% 4.16 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]), M=N,!. fizzbuzz(M_1,M,L,[]) :- fizzbuzz(M_1,M,L,L). fizzbuzz(M,M,L,[A|R]) :- writef('%w ',[A]). fizzbuzz(M_1,M,L,[_|R]) :- succ(M_1,M_2), fizzbuzz(M_2,M,L,R). %% 4.16 (書き直し) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]),M = N,!. fizzbuzz(I,J,L,[]) :- fizzbuzz(I,J,L,L). fizzbuzz(I,I,L,[A|R]) :- writef('%w ',[A]). fizzbuzz(I,J,L,[_|R]) :- succ(I,K), fizzbuzz(K,J,L,R). %% 4.17 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]),M = N,!. fizzbuzz(Ln,I,L,[]) :- fizzbuzz(Ln,I,L,L). fizzbuzz(Ln,I,L,[A|R]) :- length(Ln,I), writef('%w ',[A]). fizzbuzz(Ln,I,L,[_|R]) :- fizzbuzz([_|Ln],I,L,R). %% 4.18 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Max) :- fizzbuzz(M,A),writef('%w ',[A]),Max = M,!. fizzbuzz(M,A) :- fizzbuzz([_],M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[],A). fizzbuzz(Ln,I,L,[],A) :- fizzbuzz(Ln,I,L,L,A). fizzbuzz(Ln,I,L,[A|R],A) :- length(Ln,I). fizzbuzz(Ln,I,L,[_|R],A) :- fizzbuzz([_|Ln],I,L,R,A). %% 4.19 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Max) :- findnsols(Max,A,fizzbuzz([_],M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[],A),L), atomic_list_concat(L,' ',W), writef('%w\n',[W]),!. fizzbuzz(Ln,I,L,[],A) :- fizzbuzz(Ln,I,L,L,A). fizzbuzz(Ln,I,L,[A|R],A) :- length(Ln,I). fizzbuzz(Ln,I,L,[_|R],A) :- fizzbuzz([_|Ln],I,L,R,A). %% 4.20 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(Max) :- findnsols(Max,A,fizzbuzz([_],M,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[],A),Y,['\n']), atomic_list_concat(Y,' ',FizzBuzz), write(FizzBuzz),!. fizzbuzz(Ln,I,L,[],A) :- fizzbuzz(Ln,I,L,L,A). fizzbuzz(Ln,I,L,[A|R],A) :- length(Ln,I). fizzbuzz(Ln,I,L,[_|R],A) :- fizzbuzz([_|Ln],I,L,R,A). %% 4.21 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],M,A,[M,M,fizz,M,buzz,fizz,M,M,fizz,buzz,M,fizz,M,M,fizzbuzz],[]), M=N,!. fizzbuzz(Ln,M,A,L,[A|R]) :- 表示する(Ln,M,A). fizzbuzz(Ln,M,A,L,[_|R]) :- fizzbuzz([_|Ln],M,A,L,R). fizzbuzz(Ln,M,A,L,[]) :- fizzbuzz(Ln,M,A,L,L). 表示する(Ln,M,A) :- length(Ln,M), writef('%w ',[A]). %% 4.22 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,_,[A|_],[_,_,fizz,_,buzz,fizz,_,_,fizz,buzz,_,fizz,_,_,fizzbuzz],M), (A = M; atom(A)), writef('%w ',[A]), M = N,!. fizzbuzz(M,[],L,L,M). fizzbuzz(M,[A|L1],L2,[A|L3],N) :- M_2 is M + 1, append(L3,[A],L4), fizzbuzz(M_2,L1,L2,L4,N). %% 5.1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L_f,L_b), 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L_f,L_b,_順序数). 'fizzbuzzパターンの形成'(N,L_f,L_b) :- N_f is (N - 1) // 3 + 1, findall(['','','Fizz'],between(1,N_f,_),LL_f), flatten(LL_f,L_f), N_b is (N - 1) // 5 + 1, findall(['','','','','Buzz'],between(1,N_b,_),LL_b), flatten(LL_b,L_b). 'fizz/buzz/fizzbuzz/順序数のどれかを表示する'(N,L,_順序数) :- nth1(_nth1,L_f,F), nth1(_nth1,L_b,B), 表示項の選択(_nth1,F,B,_表示項), writef('%w ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,'','',_nth1) :- !. 表示項の選択(_,A,B,_表示項) :- atomic_list_concat([A,B],_表示項). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% # # FizzBuzz問題の要領で、1から100までの整数を、かいぎょう区切りで出力せよ、ただし、 # 3の倍数なら「Fizz」を、7の倍数なら「Buzz」を、13の倍数なら「hoge」を、 # 数値の代わりに出力することとする # 'FizzBuzzhoge' :- 'FizzBuzzhoge'([],['','','Fizz'],['','','','','','','Buzz'],['','','','','','','','','','','','','hoge']). 'FizzBuzzhoge'(Ln,_,_,_) :- length(Ln,100),!. 'FizzBuzzhoge'(Ln,L1,L2,L3) :- 'FizzBuzzhoge'([_|Ln],L1,L2,L3,_表示情報), writef('%w\n',[_表示情報]), 三つのリストの左シフト(L1,L2,L3,L1_2,L2_2,L3_2), 'FizzBuzzhoge'([_|Ln],L1_2,L2_2,L3_2). 'FizzBuzzhoge'(Ln,[''|_],[''|_],[''|_],_数値) :- length(Ln,_数値),!. 'FizzBuzzhoge'(Ln,[A|_],[B|_],[C|_],_FizzBuzzhoge文字列) :- atomic_list_concat([A,B,C],_FizzBuzzhoge文字列). 三つのリストの左シフト([A|R1],[B|R2],[C|R3],L1,L2,L3) :- append(R1,[A],L1), append(R2,[B],L2), append(R3,[C],L3). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(_まで) :- fizzbuzz([],_まで,あとふたつ,あとよっつ). fizzbuzz(L1,_まで,_,_) :- length(L1,_まで),!. fizzbuzz(L1,_まで,_Fizzまであといくつ_1,_Buzzまであといくつ_1) :- fizzbuzz_1([_|L1],_Fizzまであといくつ_1,_Buzzまであといくつ_1,_Fizzまであといくつ_2,_Buzzまであといくつ_2,Y), writef('%w ',[Y]), fizzbuzz([_|L1],_まで,_Fizzまであといくつ_2,_Buzzまであといくつ_2). fizzbuzz_1(_,ないよ,ないよ,あとふたつ,あとよっつ,'FizzBuzz'). fizzbuzz_1(_,ないよ,_Buzzまであといくつ_1,あとふたつ,_Buzzまであといくつ_2,'Fizz') :- ひとつ減らすよ(_Buzzまであといくつ_1,_Buzzまであといくつ_2). fizzbuzz_1(_,_Fizzまであといくつ_1,ないよ,_Fizzまであといくつ_2,あとよっつ,'Buzz') :- ひとつ減らすよ(_Fizzまであといくつ_1,_Fizzまであといくつ_2). fizzbuzz_1(L1,_Fizzまであといくつ_1,_Buzzまであといくつ_1,_Fizzまであといくつ_2,_Buzzまであといくつ_2,N) :- ひとつ減らすよ(_Fizzまであといくつ_1,_Fizzまであといくつ_2), ひとつ減らすよ(_Buzzまであといくつ_1,_Buzzまであといくつ_2), length(L1,N). ひとつ減らすよ(あとよっつ,あとみっつ). ひとつ減らすよ(あとみっつ,あとふたつ). ひとつ減らすよ(あとふたつ,あとひとつ). ひとつ減らすよ(あとひとつ,ないよ). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 佑(_丈) :- 校([],_丈,碩,漁). 校(_里,_丈,_,_) :- length(_里,_丈),!. 校(_里,_丈,_部,_寓) :- 乾([_|_里],_部,_寓,_料,_勘,_公), writef('%w ',[_公]), 校([_|_里],_丈,_料,_勘). 乾(_,建,建,碩,漁,'FizzBuzz'). 乾(_,建,_寓,碩,_勘,'Fizz') :- 装(_寓,_勘). 乾(_,_発,建,_塔,漁,'Buzz') :- 装(_発,_塔). 乾(_里,_発,_寓,_塔,_勘,_論) :- 装(_発,_塔), 装(_寓,_勘), length(_里,_論). 装(漁,宜). 装(宜,碩). 装(碩,週). 装(週,建). % % 述語名、変数からシンボル性を除去した述語定義。 % 一つ上のFizzBuzz定義の述語名と変数名を無作為に全角漢字を % 引いてきて置き換えた。プログラミングにはこういう一面が常に % 多少はある。 % %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(1) %%%%%%%%%%% fizzbuzz(M) :- fizzbuzz(0,M,[_,_],[_,_,_,_],L), atomic_list_concat(L,A), write(A). fizzbuzz(M,M,_,_,[]). fizzbuzz(N,M,L1,L2,[A|R3]) :- succ(N,N_2), dt(N_2,L1,L2,R1,R2,A), fizzbuzz(N_2,M,R1,R2,R3). dt(_,[],[],[_,_],[_,_,_,_],'FIZZBUZZ') :- !. dt(_,[],[_|R],[_,_],R,fizz) :- !. dt(_,[_|R],[],R,[_,_,_,_],buzz) :- !. dt(N,[_|R1],[_|R2],R1,R2,N). %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(2) %%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'fizz',_,'buzz','fizz',_,_,'fizz','buzz',_,'fizz',_,_,'FIZZBUZZ'],between(1,N_1,_),LL), flatten(LL,L1), forall((nth1(_nth1,L1,U),_nth1 =< N,(_nth1=U;atom(U))),writef('%w',[U])). %%%%%%% デスマコロシアム(5) fizzbuzzをFIZZBUZZと表記する(3) %%%%%%%%%%% fizzbuzz(N) :- N_1 is (N - 1) // 15 + 1, findall([_,_,'fizz',_,'buzz','fizz',_,_,'fizz','buzz',_,'fizz',_,_,'FIZZBUZZ'],between(1,N_1,_),LL), flatten(LL,L), 表示(N,L). 表示(N,L) :- nth1(_nth1,L,U), 表示選択(_nth1,U), writef('%w',[U]), _nth1=N. 表示選択(_nth1,_nth1). 表示選択(_,U) :- atom(U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 最小文字数を競ってみよう(現在 147字) % fizzbuzz(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 述語名fizzbuzzをfにして良いなら 140字 (twitterの1twit限度文字数) % f(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % IF/Prolog (for/3,if/3 を使って) % % 述語名fizzbuzzをfにして良いなら 83字 % f(M):-for(1,N,M),nl,if((1>N mod 3,A=fizz;1>N mod 5,A=buzz),write(A),write(N)),M=N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% f(M):-between(1,M,N),\+(forall((1>N mod 3,A=fizz;1>N mod 5,A=buzz),write(A))->write(N)),M=N. % 以下のサイトは % *** user: split / 3 *** % ?- split('a\n\nbc\n',['\n'],X). % % X = [a,bc] % split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X, ! . % *** user: sPlit / 3 *** % ?- sPlit('a\n\nbc\n',['\n'],X). % % X = [a,'',bc]. % sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,(member(U,Y) , not member(U,_区切り符号ならび)),Z), Z = X, ! . % *** user: sPLIT / 3 *** % ?- sPLIT('a\n\nbc\n',['\n'],X). % % X = [a,'\n','\n',bc,'\n'] % sPLIT(_文字列,_区切り符号ならび,X) :- 'SPLIT'(_文字列,_区切り符号ならび,Y), findall(U,(member(U,Y) , not U = ''),L), L = X, ! . % *** user: 'SPLIT' / 3 *** % ?- 'SPLIT'('a\n\nbc\n',['\n'],X). % % X = [a,'\n','','\n',bc,'\n']. % 'SPLIT'(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Z), Z = X, ! . % *** user: split_00 / 3 *** split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],(member(A,_区切り符号ならび) , atom_chars(A,B)),_区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X) . % *** user: split_0 / 3 *** split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび, ! . split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2), ! . split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X) . % *** user: split_1 / 3 *** split_1([],_,[]) :- ! . split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび, ! . split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X), ! . split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X), ! . split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X), ! . % *** user: split_2 / 5 *** split_2([],[],'',_,[]) :- ! . split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), ! . split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X), ! . split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X), ! . split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X), ! . % *** user: split_3 / 5 *** split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X), ! . split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X), ! . % *** user: split_4 / 5 *** split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X), ! . split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X), ! . split_4([],[],'',_,[]) :- ! . % *** user: split_4 / 4 *** split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X), ! . % *** user: split_5 / 2 *** split_5([],'') :- ! . split_5(B,C) :- numeric_list(B,Nl), number(C,Nl), ! . split_5(B,C) :- concat_atom(B,C), ! . % *** user: split_32 / 5 *** split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X), ! . split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X), ! . % *** user: split_42 / 5 *** split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X), ! . split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X), ! . split_42([],[],'',_,[]) :- ! . % *** user: split_42 / 4 *** split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X), ! . 区切り語ならびの変形(_区切り語ならび,_降順の区切り文字ならびのならび) :- sort(_区切り語ならび,_昇順の区切り語ならび), reverse(_昇順の区切り語ならび,_降順の区切り語ならび), atomList2charsList(_降順の区切り語ならび,_降順の区切り文字ならびのならび). atomList2charsList([],[]) :- !. atomList2charsList([A|R1],[L|R2]) :- atom_chars(A,L), atomList2charsList(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% concat_atom([A],A) :- !. concat_atom([A|R],X) :- concat_atom(R,Y), atom_concat(A,Y,X). concat_atom([A],Spliter,A) :- !. concat_atom([A|R],Spliter,X) :- concat_atom(R,Spliter,Y), atom_concat(A,Spliter,Z), atom_concat(Z,Y,X).