このディレクトリの索引

% 以下のサイトは # 出典 :: CodeIQ q1365 # # 成績の分布などを表すのに使われる度数分布表。 # ひと目で全体の散らばり具合がわかって便利です。 # # 【問題】 # 今回は素数の度数分布表を作ってみます。 # 入力として2つの正の整数が与えられます。 # 一つ目は分布させる素数の最大値、二つ目は区切りの大きさです。 # 例えば、30と5が与えられたとき、30までの素数を5で区切って出力します。 # 30までの素数は2, 3, 5, 7, 11, 13, 17, 19, 23, 29ですので、 # 出力内容は以下のようになります。 # 01-05:*** # 06-10:* # 11-15:** # 16-20:** # 21-25:* # 26-30:* # 同様に、40と7が与えられると、以下のように出力されます。 # 01-07:**** # 08-14:** # 15-21:** # 22-28:* # 29-35:** # 36-42:* # 上記のように出力するプログラムを作成してください。 # なお、最低限、以下の入力に対して正常に動作することを確認してください。 # 入力1:100 15 # 入力2:1200 25 # 入力3:12345 789 # '今回は素数の度数分布表を作ってみます。'(_最大値,_区切り) :- 素数の度数分布表(_最大値,_区切り,_度数分布表), 度数分布図として表示する(_度数分布表). 素数の度数分布表(_最大値,_区切り,_度数分布表) :- 素数を生成する(_最大値,_素数ならび), 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表). 素数を生成する(_最大値,_素数ならび) :- findall(_自然数,between(2,_最大値,_自然数),L), エラトステネスの篩(L,_素数ならび). エラトステネスの篩([],[]) :- !. エラトステネスの篩([M|R1],[M|R2]) :- エラトステネスの篩(M,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(M,R1,L) :- findall(N,( member(N,R1), \+(0 is N mod M)),L). 素数の度数分布表(_素数ならび,_区切り,_最大値,_度数分布表) :- findall([_範囲下限,_範囲上限,_度数],( 素数の度数分布(_素数ならび,_最大値,_区切り,1,_区切り,_範囲下限,_範囲上限,_度数)),_度数分布表). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限,_範囲上限,_範囲下限,_範囲上限,_度数) :- 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数). 素数の度数分布(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数). 範囲と度数を得る(_素数ならび,_最大値,_範囲下限,_範囲上限,_度数) :- _範囲下限 =< _最大値, 度数((between(_範囲下限,_範囲上限,_素数),member(_素数,_素数ならび)),_度数). '範囲をずらしながら、素数の度数分布を得る'(_素数ならび,_最大値,_区切り,_範囲下限_1,_範囲上限_1,_範囲下限,_範囲上限,_度数) :- _範囲下限_1 =< _最大値, 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限), 素数の度数分布(_素数ならび,_最大値,_区切り,_次の範囲下限,_次の範囲上限,_範囲下限,_範囲上限,_度数). 次の範囲を確定する(_区切り,_範囲下限_1,_範囲上限_1,_次の範囲下限,_次の範囲上限) :- _次の範囲下限 is _範囲下限_1 + _区切り, _次の範囲上限 is _範囲上限_1 + _区切り. 度数(_目標,_度数) :- findall(_,_目標,L), length(L,_度数). 度数分布図として表示する(_度数分布表) :- 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数), 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数). 範囲の下限値と上限値のそれぞれの最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数), 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲上限の表示桁数). 範囲下限値の最大値の桁数を得る(_度数分布表,_範囲下限の表示桁数) :- findall(_桁数,範囲下限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲下限の表示桁数). 範囲下限値の桁数(_度数分布表,_下限桁数) :- member([_範囲下限,_,_],_度数分布表), number_chars(_範囲下限,Chars), length(Chars,_下限桁数). 範囲上限値の最大値の桁数を得る(_度数分布表,_範囲の表示桁数) :- findall(_桁数,範囲上限値の桁数(_度数分布表,_桁数),L), max_list(L,_範囲の表示桁数). 範囲上限値の桁数(_度数分布表,_上限桁数) :- member([_,_範囲上限,_],_度数分布表), number_chars(_範囲上限,Chars), length(Chars,_上限桁数). 範囲毎に柱を表示する(_度数分布表,_範囲下限の表示桁数,_範囲上限の表示桁数) :- forall( member([_範囲下限,_範囲上限,_度数],_度数分布表), 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数)). 柱を表示する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_度数) :- ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列), 星文字列(_度数,_星文字列), writef('%t:%t\n',[_範囲表現文字列,_星文字列]). ヘッドゼロサプライで範囲を表現する(_範囲下限の表示桁数,_範囲上限の表示桁数,_範囲下限,_範囲上限,_範囲表現文字列) :- ヘッドゼロサプライ(_範囲下限の表示桁数,_範囲下限,_表示範囲下限), ヘッドゼロサプライ(_範囲上限の表示桁数,_範囲上限,_表示範囲上限), atomic_list_concat([_表示範囲下限,'-',_表示範囲上限],_範囲表現文字列). ヘッドゼロサプライ(_桁数,_数値,_ヘッドゼロサプライ数値表現) :- ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト), 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト), 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現). ヘッドゼロサプライを構成する枠を作る(_桁数,_ヘッドゼロサプライされたリスト) :- length(_ヘッドゼロサプライされたリスト,_桁数). 数値を文字のリスト変換してその頭部にゼロを埋める(_数値,_ヘッドゼロサプライされたリスト) :- number_chars(_数値,_数字のリスト), append(_頭部の枠リスト,_数字のリスト,_ヘッドゼロサプライされたリスト), 全ての要素が同じ(_頭部の枠リスト,'0'). 全ての要素が同じ([],_). 全ての要素が同じ([V|R],V) :- 全ての要素が同じ(R,V). 星文字列(_度数,_星文字列) :- findall(*,between(1,_度数,_),L), atomic_list_concat(L,_星文字列). 文字リストを文字列に変換(_ヘッドゼロサプライされたリスト,_ヘッドゼロサプライ数値表現) :- atom_chars(_ヘッドゼロサプライ数値表現,_ヘッドゼロサプライされたリスト). % 以下のサイトは 縦書文書を横書行ならびに変形する(_縦書文書,_横書き行ならび) :- 改行を区切りに行ならびに変形する(_縦書文書,_縦書行ならび), 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび). 縦書行ならびを横書行ならびに変形する(_縦書行ならび,_横書き行ならび) :- 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび), 転置(_反転した行文字ならび,_転置した行文字ならび), 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび). 縦書行ならびを反転した行文字ならびに変換(_縦書行ならび,_反転した行文字ならび) :- findall(_反転した文字ならび,( member(_行文字列,_縦書行ならび), 文字列を反転した文字ならびに変換(_行文字列,_反転した文字ならび)),_反転した行文字ならび). 文字列を反転した文字ならびに変換(_文字列,_反転した文字ならび) :- 文字列を反転した文字ならびに変換(_文字列,[],_反転した文字ならび). 文字列を反転した文字ならびに変換('',_反転した文字ならび,_反転した文字ならび) :- !. 文字列を反転した文字ならびに変換(_文字列,L1,_反転した文字ならび) :- 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列), 文字列を反転した文字ならびに変換(_残り文字列,[_先頭文字|L1],_反転した文字ならび). 先頭文字と残り文字列(_文字列,_先頭文字,_残り文字列) :- sub_atom(_文字列,0,1,_末尾からの変位,_先頭文字), sub_atom(_文字列,_,_末尾からの変位,0,_残り文字列). 改行を区切りに行ならびに変形する(_縦書文書,[_前文字列|R]) :- 改行を区切りに(_縦書文書,_前文字列,_後文字列), 改行を区切りに行ならびに変形する(_後文字列,R). 改行を区切りに行ならびに変形する(_文字列,R) :- 改行が存在しない場合停止する(_文字列,R). 改行が存在しない場合停止する('',[]) :- !. 改行が存在しない場合停止する(_文書,[_文書]). 改行を区切りに(_縦書文書,_前文字列,_後文字列) :- sub_atom(_縦書文書,_先頭からの変位,1,_末尾からの変位,'\n'), sub_atom(_縦書文書,0,_先頭からの変位,_,_前文字列), sub_atom(_縦書文書,_,_末尾からの変位,0,_後文字列),!. 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置した行文字ならびを横書き行ならびに変換(_転置した行文字ならび,_横書き行ならび) :- findall(_行文字列,( 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列)),_横書き行ならび). 空白行を取り除きながら行文字ならびを行文字列に変換する(_転置した行文字ならび,_行文字列) :- member(_行文字ならび,_転置した行文字ならび), 空白行ではない(_行文字ならび), atom_chars(_行文字列,_行文字ならび). 空白行ではない(_行文字ならび) :- \+(空白行(_行文字ならび)). 空白行(_行文字ならび) :- forall(member(_文字,_行文字ならび),_文字 = ' '). % 以下のサイトは # # 横書文書を縦書文書に変形する # # 事例として、あぜといへかの万葉仮名表記部分の生成 # :- 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 _式. % 以下のサイトは # 出典 :: CodeIQ q1347 # # 3人の几帳面な男たちがいました。 # ジェシー「みかんをたくさん頂いたんだ。みんなで分けようYO!」 # ダニエル「イイネ!…ええと、みかんは全部で30個あるみたいだから、ひとり10個ずつならきちんと分けられるNE!」 # ジョゼフ「それだけじゃダメだYO!みかんは一つひとつ大きさが違うんだから、その辺も考えてきっちり分けNIGHT!」 # # # 【問題】 # # 30個のみかんがあります。3人で10個ずつ分けようと思いますが、不公平にならないよう、みかんの重さの合計が均一になるように分けてください。たとえば、次のような重さのみかん6個 # 101g # 103g # 110g # 105g # 114g # 112g # # を、3人で2つずつ分ける場合、重さの合計が等しくなるように分けると # (101g, 114g) # (103g, 112g) # (105g, 110g) # # のように、合計が215グラムになるように分けることができます。 # # みかんの重さのデータを標準入力から読み込み、それを重さの合計・個数ともに3等分するプログラムを書いてください。 # # # 【入力】 # # 入力はテキストファイルで用意されています。これを標準入力から読み込んでください。 # 入力ファイルの1行目には、みかんの個数Nが与えられます。 # 2行目以降のN行分が、みかんの重さ(正の整数)です。 # # # 【出力】 # # 標準出力に、3等分したみかんのグループを出力してください。 # 1行につき1グループ、計3行を出力します。それ以外は出力しないでください。 # 分け方が複数ある場合、その中の1種類だけを出力してください。 # # # 【入出力例】 # # - sample1.in.txt # 6 # 101 # 103 # 110 # 105 # 114 # 112 # # - sample1.out.txt # (101, 114) # (103, 112) # (105, 110) # # # # - sample2.in.txt # 12 # 147 # 105 # 99 # 116 # 105 # 119 # 93 # 132 # 123 # 95 # 101 # 82 # # - sample2.out.txt # (82, 105, 105, 147) # (93, 95, 119, 132) # (99, 101, 116, 123) '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル) :- '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計), 配分した候補を得て(_みかんの重さならび,_一人あたりの重さ合計,_重複を許す配分した候補), 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補). '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで'(_入力ファイル,_みかんの重さならび,_一人あたりの重さ合計) :- 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび), sum_list(_みかんの重さならび,_みかんの重さの合計), _一人あたりの重さ合計 is _みかんの重さの合計 // 3. 入力ファイルからみかんの重さならびを得て(_入力ファイル,_みかんの重さならび) :- see(_入力ファイル), 先頭行から行数を得る(_みかんの個数), 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび), seen. 先頭行から行数を得る(_行数) :- 整数入力(_行数). 残り行からみかんの重さならびを得る(_みかんの個数,_みかんの重さならび) :- findall(_みかんの重さ,( between(1,_みかんの個数,_), 整数入力(_みかんの重さ)),_みかんの重さならび). 配分した候補を得て(_みかんの重さならび,_合計目標,_重複を許す配分した候補) :- findall(LL,同量に配分する(_みかんの重さならび,_合計目標,[],LL),_重複を許す配分した候補). 同量に配分する([],_,LL,LL). 同量に配分する(_みかんの重さならび,_合計目標,LL1,LL) :- 組み合計を得る(_みかんの重さならび,_合計目標,[],L,_残りみかんの重さならび), forall(member(L1,LL1),L1 @>= L), 同量に配分する(_残りみかんの重さならび,_合計目標,[L|LL1],LL). 組み合計を得る(_残りみかんの重さならび,_合計目標,L,L,_残りみかんの重さならび) :- sum_list(L,_合計目標). 組み合計を得る(_みかんの重さならび_1,_合計目標,L1,L,_残りみかんの重さならび) :- select(_一個,_みかんの重さならび_1,_残りみかんの重さならび_2), forall(member(A,L1),A @>= _一個), 組み合計を得る(_残りみかんの重さならび_2,_合計目標,[_一個|L1],L,_残りみかんの重さならび). 重複を取り除いて出力する(_出力ファイル,_重複を許す配分した候補) :- 重複なく昇順に整列する(_重複を許す配分した候補,_候補リスト), 一行ずつ出力する(_出力ファイル,_候補リスト). 重複なく昇順に整列する(L1,L2) :- 重複なく昇順に整列する(L1,[],L2). 重複なく昇順に整列する([],L,L). 重複なく昇順に整列する([_軸要素|L1],L2,L3) :- 重複のない昇順分割(_軸要素,L1,LS,LB), 重複なく昇順に整列する(LS,[_軸要素|L3_2],L3), 重複なく昇順に整列する(LB,L2,L3_2). 重複のない昇順分割(_,[],[],[]). 重複のない昇順分割(_軸要素,[A|R1],[A|R2],R3) :- A @< _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[A|R1],R2,[A|R3]) :- A @> _軸要素, 重複のない昇順分割(_軸要素,R1,R2,R3). 重複のない昇順分割(_軸要素,[_軸要素|R1],R2,R3) :- 重複のない昇順分割(_軸要素,R1,R2,R3). 一行ずつ出力する(_出力ファイル,_候補リスト) :- tell(_出力ファイル), forall(member(_三人分のみかんの重さならび,_候補リスト),配分候補ならびを三行で出力する(_三人分のみかんの重さならび)), told. 配分候補ならびを三行で出力する(_三人分のみかんの重さならび) :- forall(member(_みかんの重さならび,_三人分のみかんの重さならび),( 表示パターンのつくり(_みかんの重さならび,_表示パターン), writef(_表示パターン,_みかんの重さならび))). 表示パターンのつくり(_みかんの重さならび,_表示パターン) :- length(_みかんの重さならび,_要素数), findall('%t',between(1,_要素数,_),_表示パターンならび), atomic_list_concat(_表示パターンならび,',',_表示パターン_1), atomic_list_concat(['(',_表示パターン_1,')\n'],_表示パターン). 整数入力(_整数) :- 行入力(_行), read_term_from_atom(_行,_整数,[]). 行入力(_行) :- get_char(_文字), 行の文字ならび(_文字,_行の文字ならび), atom_chars(_行,_行の文字ならび). 行の文字ならび(end_of_file,[]) :- !. 行の文字ならび('\n',[]) :- !. 行の文字ならび(_文字,[_文字|R]) :- get_char(_次の文字), 行の文字ならび(_次の文字,R). ユーザパラメータならび(_ユーザパラメータならび) :- current_prolog_flag(argv,_ユーザパラメータならび). program :- ユーザパラメータならび([_入力ファイル,_出力ファイル]), '入力ファイルからみかんの重さならびを得て、三人とも同量の重さで、配分した候補を得て、重複を取り除いて出力する'(_入力ファイル,_出力ファイル). :- program,halt. % 以下のサイトは # # データベースに在る一日分売上データを給油所別月別ファイルに追加保存する。 # 保存ファイルは例えば "志村_売上_201501.pro" のようなファイル名である。 # 給油所(志村,'300203'). 給油所(上野毛,'300206'). 給油所(横浜南,'370113'). 給油所(熊谷銀座,'370105'). 給油所(けやき台,'370109'). 給油所(秩父21,'370111'). 給油所(狭山ヶ丘,'370112'). 売上保存(_保存月,_保存日) :- '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日), forall(売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ), 売上保存の一日分データを書き出す(_出力,_一日分データ)). '保存日から入力時刻下限、上限を得る'(_保存日,_入力年月日) :- '売上保存_年-_月-_日'(_保存日,_年,_月,_日), 売上保存_入力年月日(_年,_月,_日,_入力年月日). '売上保存_年-_月-_日'(_保存日,_年,_月,_日) :- sub_atom(_保存日,0,4,_,_年), sub_atom(_保存日,4,2,_,_月), sub_atom(_保存日,6,2,_,_日). 売上保存_入力年月日(_年,_月,_日,_入力年月日) :- atomic_list_concat([_年,'-',_月,'-',_日],_入力年月日). 売上保存の一日分の読み出し(_保存月,_入力年月日,_出力,_一日分データ) :- 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力), データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ). 出荷場所ファイルを追加モードで開く(_保存月,_出荷場所,_出力) :- 給油所(_給油所,_出荷場所), atomic_list_concat([_給油所,'_売上_',_保存月,'.pro'],_保存ファイル名), open(_保存ファイル名,append,_出力). データベースからの読み出し(_出荷場所,_入力年月日,_一日分データ) :- findall([_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20],( 売上(_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20), 出荷場所と入力時刻から組を得る(_16,_出荷場所,_20,_入力年月日)),_一日データ). 出荷場所と入力時刻から組を得る(_出荷場所,_出荷場所,_入力時刻,_入力年月日,_組) :- sub_atom(_入力時刻,0,10,_,_入力年月日). 売上保存の一日分データを書き出す(_出力,[]) :- close(_出力). 売上保存の一日分データを書き出す(_出力,[_組|_残り]) :- 売上保存一行表示(_出力,_組), 売上保存の一日分データを書き出す(_出力,_残り). 売上保存一行表示(_出力,_組) :- _売上 =.. [売上|_組], writeq(_出力,_売上), write(_出力,'.\n'). % 以下のサイトは :- op(470,xfx,(#)). :- op(700,xfx,は). :- op(710,xfx,(::)). A は B :- A is B. 連立一次方程式の解(_拡大係数行列,_解ならび) :- ガウス行列に変形(_拡大係数行列,_ガウス行列,_), 連立一次方程式の一般解(_ガウス行列,_解ならび). 連立一次方程式の一般解(_ガウス行列,_解ならび) :- 解が1つだけ存在する場合(_ガウス行列,_解ならび),!. 連立一次方程式の一般解(_ガウス行列,解は無数に存在する) :- 解が無数にある場合(_ガウス行列),!. 連立一次方程式の一般解(_ガウス行列,解は存在しない) :- 解がない場合(_ガウス行列). 解が1つだけ存在する場合(_ガウス行列,_解ならび) :- '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列), 既約ガウス行列に変形(_ガウス行列,_既約ガウス行列), 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび). '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(_,[]) :- !. '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N,[L|R]) :- 先頭から0がN要素(N,L), succ(N,N_2), '行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(N_2,R). 先頭から0がN要素(N,L) :- append(L1,[A|_],L), \+(A=0),!, length(L1,N). 既約ガウス行列の各行の最終要素が解である(_既約ガウス行列,_解ならび) :- findall(_解,( member(_行,_既約ガウス行列), last(_行,_解)),_解ならび). 解が無数にある場合(_ガウス行列) :- length(_ガウス行列,N), 行列の階数(_ガウス行列,_ガウス行列の階数), \+(N = _ガウス行列の階数). 解がない場合(_ガウス行列) :- \+('行が下がるごとに、最初に現れる0でない要素が、1つずつ右にずれていく'(0,_ガウス行列)), '最終要素が0でなく、それ以外は0である行がある'(_ガウス行列),!. '最終要素が0でなく、それ以外は0である行がある'(_ガウス行列) :- member(L,_ガウス行列), 最終要素が0でなく(L), それ以外は0である(L),!. 最終要素が0でなく(L) :- append(L1,[N],L), \+(N = 0),!. それ以外は0(L) :- append(L1,[_],L), all(L1,0),!. % *** user: 'ガウス行列' / 2 *** 'ガウス行列'(_,[]) :- ! . 'ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,_), 'ガウス行列'([0|P1],R) . 'ガウス行列'(_,[]) :- ! . 'ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,_), 'ガウス行列'([0|P1],R) . % *** user: 'ガウス行列' / 1 *** 'ガウス行列'(_行列) :- 'ガウス行列'([],_行列) . % *** user: 'ガウス行列に変形' / 7 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列,[]) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X,UL), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X,UL) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), B = 0, M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X,UL), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[-1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 >= 0, !, '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X,[N1|R]) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), N1 < 0, !, '行基本変形'(N3 # M + N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X,R), ! . % *** user: 'ガウス行列に変形' / 6 *** 'ガウス行列に変形'(N,M,Len,_,_行列,_行列) :- M > Len, ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N + 1, 'ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . 'ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), B = 0, M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,0,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列1,X), ! . 'ガウス行列に変形'(N,M,Len,A,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M + 1, 'ガウス行列に変形'(N,M2,Len,A,_行列2,X), ! . % *** user: 'ガウス行列に変形' / 5 *** 'ガウス行列に変形'(N,Len,X,X,[]) :- N >= Len, ! . 'ガウス行列に変形'(N,Len,_行列1,X,UL) :- nth1(N,_行列1,_行), nth1(N,_行,A), M is N + 1, 'ガウス行列に変形'(N,M,Len,A,_行列1,_行列2,UL1), N2 is N + 1, 'ガウス行列に変形'(N2,Len,_行列2,X,UL2), append(UL1,UL2,UL) . % *** user: 'ガウス行列に変形' / 4 *** 'ガウス行列に変形'(N,Len,X,X) :- N >= Len, ! . 'ガウス行列に変形'(N,Len,_行列1,X) :- nth1(N,_行列1,_行), nth1(N,_行,A), M is N + 1, 'ガウス行列に変形'(N,M,Len,A,_行列1,_行列2), N2 is N + 1, 'ガウス行列に変形'(N2,Len,_行列2,X) . % *** user: 'ガウス行列に変形' / 3 *** 'ガウス行列に変形'(_行列,_ガウス行列,UL) :- length(_行列,Len), 'ガウス行列に変形'(1,Len,_行列,_ガウス行列,UL) . % *** user: 'ガウス行列に変形' / 2 *** 'ガウス行列に変形'(_行列,_ガウス行列) :- length(_行列,Len), 'ガウス行列に変形'(1,Len,_行列,_ガウス行列) . % *** user: '既約ガウス行列に変形の二' / 4 *** '既約ガウス行列に変形の二'(N,Len,_既約ガウス行列,_既約ガウス行列) :- N > Len, ! . '既約ガウス行列に変形の二'(N,Len,G,_既約ガウス行列) :- nth1(N,G,_行), nth1(N,_行,A), '行基本変形'(1 / A # N,G,G1), N2 is N + 1, '既約ガウス行列に変形の二'(N2,Len,G1,_既約ガウス行列) . % *** user: '既約ガウス行列の一' / 2 *** '既約ガウス行列の一'(_,[]) :- ! . '既約ガウス行列の一'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列の一'([0|P1],R) . % *** user: '既約ガウス行列の一' / 1 *** '既約ガウス行列の一'([_行]) :- '零以外の最初の要素が1'(_行), ! . '既約ガウス行列の一'([_行|R]) :- '零以外の最初の要素が1'(_行), '既約ガウス行列の一'(R) . % *** user: '既約ガウス行列' / 2 *** '既約ガウス行列'(_,[]) :- ! . '既約ガウス行列'(L,[_行|R]) :- append(L,_,_行), '要素がゼロ以外に出会うまで'(_行,P1,[1|_]), '既約ガウス行列'([0|P1],R) . % *** user: '既約ガウス行列' / 1 *** '既約ガウス行列'(_行列) :- '既約ガウス行列の一'([],_行列), '行列の転置'(_行列,_転置された行列), '既約ガウス行列検査'(_転置された行列) . % *** user: '既約ガウス行列検査' / 1 *** '既約ガウス行列検査'([]) :- ! . '既約ガウス行列検査'([L|R]) :- append(L1,[1|L2],L), append(L1,L2,L3), 'すべての要素'(L3,0), '既約ガウス行列検査'(R), ! . '既約ガウス行列検査'([L|R]) :- \+(append(L1,[1|L2],L)), '既約ガウス行列検査'(R) . % *** user: '既約ガウス行列に変形' / 5 *** '既約ガウス行列に変形'(N,0,_,_行列,_行列) :- ! . '既約ガウス行列に変形'(N,M,Len,0,_行列1,X) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '行の置換'(N,M,_行列1,_行列2), M2 is N - 1, '既約ガウス行列に変形'(N,M2,Len,B,_行列2,X), ! . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- nth1(M,_行列1,_行1), nth1(N,_行1,0), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列1,_行列) . '既約ガウス行列に変形'(N,M,A,_行列1,_行列) :- nth1(M,_行列1,_行1), nth1(N,_行1,B), \+(B = 0), '最小公倍数'(N2 * A,N1 * B,_), '行基本変形'(N1 # M - N2 # N,_行列1,_行列2), M2 is M - 1, '既約ガウス行列に変形'(N,M2,A,_行列2,_行列) . % *** user: '既約ガウス行列に変形' / 3 *** '既約ガウス行列に変形'(1,_既約ガウス行列,_既約ガウス行列) :- ! . '既約ガウス行列に変形'(N,_ガウス行列,_既約ガウス行列) :- nth1(N,_ガウス行列,L0), '最初に現れる0ではない要素・位置'(1,L0,_列,Y), M is N - 1, nth1(M,_ガウス行列,L), '既約ガウス行列に変形'(_列,M,Y,_ガウス行列,G1), N2 is N - 1, '既約ガウス行列に変形'(N2,G1,_既約ガウス行列), ! . % *** user: '既約ガウス行列に変形' / 2 *** '既約ガウス行列に変形'(_行列,_既約ガウス行列) :- \+('ガウス行列'(_行列)), 'ガウス行列に変形'(_行列,_ガウス行列), '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列), ! . '既約ガウス行列に変形'(_ガウス行列,_既約ガウス行列) :- length(_ガウス行列,Len), '既約ガウス行列に変形'(Len,_ガウス行列,G1), '既約ガウス行列に変形の二'(1,Len,G1,_既約ガウス行列) . % *** user: 'n次正方行列の要素を行・列順序で取り出す' / 5 *** 'n次正方行列の要素を行・列順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_i行), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素) . % *** user: 'n次正方行列の要素を列・行順序で取り出す' / 5 *** 'n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i行,_j列,_正方行列の要素) :- between(1,_n,_j列), nth1(_i行,_正方行列,L), nth1(_j列,L,_正方行列の要素) . % *** user: 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。' / 5 *** 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) :- '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列), '行列式の値'(_n_1次正方行列,_n_1次正方行列の行列式の値), 'i,jから乗数を得る'(_i,_j,_乗数), _余因子 is _乗数 * _n_1次正方行列の行列式の値. % *** user: 'i,jから乗数を得る' / 3 *** 'i,jから乗数を得る'(_i,_j,-1) :- 1 is (_i + _j) mod 2, ! . 'i,jから乗数を得る'(_i,_j,1) :- 0 is (_i + _j) mod 2, ! . % *** user: '第何行を取り除く' / 3 *** '第何行を取り除く'(_正方行列,_第何行,_第i行が取り除かれた行列) :- append(L0,[L|R],_正方行列), length([_|L0],_第何行), append(L0,R,_第i行が取り除かれた行列) . % *** user: '正方行列から第i行と第j列を取り除く' / 4 *** '正方行列から第i行と第j列を取り除く'(_正方行列,_i,_j,_n_1次正方行列) :- '第何行を取り除く'(_正方行列,_i,_第i行が取り除かれた行列), '転置'(_第i行が取り除かれた行列,_転置された第i行が取り除かれた行列), '第何行を取り除く'(_転置された第i行が取り除かれた行列,_j,_転置された第i行第j列が取り除かれた行列), '転置'(_転置された第i行第j列が取り除かれた行列,_n_1次正方行列) . % *** user: '正方行列の対角要素' / 2 *** '正方行列の対角要素'(_正方行列,_対角要素) :- findall(A,(append(L0,[L|_],_正方行列) , \+(L = []) , length(L0,N2) , length(L1,N2) , append(L1,[A|_],L)),_対角要素) . % *** user: '正方行列' / 3 *** '正方行列'(N,_次数,[]) :- N > _次数, ! . '正方行列'(N,_次数,[_行|R]) :- length(_行,_次数), N2 is N + 1, '正方行列'(N2,_次数,R) . % *** user: '正方行列' / 2 *** '正方行列'(_,[]) :- ! . '正方行列'(_行数,[_行|R]) :- length(_行,_行数), '正方行列'(_行数,R) . % *** user: '正方行列' / 1 *** '正方行列'(_正方行列) :- length(_正方行列,_行数), '正方行列'(1,_行数,_正方行列) . % *** user: '正方行列の行列式' / 2 *** '正方行列の行列式'(_正方行列,_行列式) :- findsum(_符号付き要素積,'行列の符号付き要素積'(_正方行列,_符号付き要素積),_行列式) . % *** user: '正方行列の行列式の値' / 2 *** '正方行列の行列式の値'(_正方行列,_行列式の値) :- 'ガウス行列に変形'(_正方行列,X,Y), '行列式|C|の値'(X,Z1), 'ならびの積'(Y,Z2), _行列式の値 is Z1 // Z2 . % *** user: '正方行列の逆行列' / 3 *** '正方行列の逆行列'(_n次,_正方行列,_逆行列) :- '単位行列'(_n次,_単位行列), '二つのならびの同一順序要素の結合'(_正方行列,_単位行列,LL2), '既約ガウス行列に変形'(LL2,LL3), '行列の行の先頭からn列を切り取った残り行列'(_n次,LL3,_逆行列) . % *** user: '正方行列の逆行列' / 2 *** '正方行列の逆行列'(_正方行列,_逆行列) :- length(_正方行列,_n次), '単位行列'(_n次,_単位行列), '二つのならびの同一順序要素の結合'(_正方行列,_単位行列,LL2), '既約ガウス行列に変形'(LL2,LL3), '行列の行の先頭からn列を切り取った残り行列'(_n次,LL3,_逆行列) . % *** user: '単位行列' / 4 *** '単位行列'(M,N1,N,[]) :- N1 > N, ! . '単位行列'(M,M,N,[1|R]) :- N2 is M + 1, '単位行列'(M,N2,N,R) . '単位行列'(M,N1,N,[0|R]) :- \+(N1 = M), N2 is N1 + 1, '単位行列'(M,N2,N,R) . % *** user: '単位行列' / 3 *** '単位行列'(M,N,[]) :- M > N, ! . '単位行列'(M,N,[_行|R]) :- '単位行列'(M,1,N,_行), M2 is M + 1, '単位行列'(M2,N,R) . % *** user: '単位行列' / 2 *** '単位行列'(N,_単位行列) :- '単位行列'(1,N,_単位行列) . % *** user: '単位行列' / 1 *** '単位行列'(_単位行列) :- '正方行列'(_単位行列), length(_単位行列,_次数), '単位行列'(_次数,_単位行列) . % *** user: '単位行列の生成' / 2 *** '単位行列の生成'(N,LL) :- length(L,N), findall(L,(append(L0,[1|R],L) , all(L0,0) , all(R,0)),LL), ! . % *** user: '行列式の値' / 4 *** '行列式の値'(_正方行列,_i,_n,_行列式の値) :- findsum(W,('n次正方行列の要素を列・行順序で取り出す'(_n,_正方行列,_i,_j,_正方行列の要素) , '余因子'(_n,_正方行列,_i,_j,_余因子) , W is _正方行列の要素 * _余因子),_行列式の値) . % *** user: '行列式の値' / 2 *** '行列式の値'([[A,B],[C,D]],_行列式の値) :- _行列式の値 is A * D - B * C, ! . '行列式の値'(_正方行列,_行列式の値) :- _正方行列 = [_行_1|R], length([_行_1|R],_i), length(_行_1,_n), '行列式の値'(_正方行列,_i,_n,_行列式の値) . % *** user: '行列のすべての要素に値を掛ける' / 5 *** '行列のすべての要素に値を掛ける'(_行目,_n,LL,_,LL) :- _行目 > _n, ! . '行列のすべての要素に値を掛ける'(_行目,_n,LL1,_乗数 / _除数,LL2) :- '行基本変形'(_乗数 / _除数 # _行目,LL1,LL3), _行目_2 is _行目 + 1, '行列のすべての要素に値を掛ける'(_行目_2,_n,LL3,_乗数 / _除数,LL2) . % *** user: '行列の掛算_2' / 3 *** '行列の掛算_2'(_,[],[]) :- ! . '行列の掛算_2'(A,[B|R2],[C|R3]) :- '行列の掛算_3'(A,B,C), '行列の掛算_2'(A,R2,R3) . % *** user: '行列要素' / 4 *** '行列要素'(_行,_列,_行列,_値) :- nth1(_行,_行列,L), nth1(_列,L,_値) . % *** user: '行列の列置換' / 4 *** '行列の列置換'(_列,_置換する列,_対象行列,_置換された行列) :- '行列の転置'(_対象行列,_転置された行列), '要素番号によるならびの置換'(_列,_置換する列,_転置された行列,_置換された行列の二), '行列の転置'(_置換された行列の二,_置換された行列) . % *** user: '行列の行置換' / 4 *** '行列の行置換'(_行,_置換する行,_対象行列,_置換された行列) :- '要素番号によるならびの置換'(_行,_置換する行,_対象行列,_置換された行列), ! . % *** user: '行列の要素積の符号を判断する' / 3 *** '行列の要素積の符号を判断する'(_順列,_符号付き要素積,_符号付き要素積) :- '偶順列'(_順列), ! . '行列の要素積の符号を判断する'(_順列,_要素積の一,_符号付き要素積) :- '奇順列'(_順列), _符号付き要素積 is _要素積の一 * -1, ! . % *** user: '行列の符号付き要素積' / 2 *** '行列の符号付き要素積'(_正方行列,_符号付き要素積) :- length(_正方行列,Len), findall(U,for(1,U,Len),L0), '順列'(L0,Len,_順列), findall(V,(for(1,M,Len) , nth1(M,_正方行列,L1) , nth1(M,_順列,N) , nth1(N,L1,V)),L2), '積'(L2,_要素積の一), '行列の要素積の符号を判断する'(_順列,_要素積の一,_符号付き要素積) . % *** user: '行列から列を選択する' / 3 *** '行列から列を選択する'(_,[],[]) :- ! . '行列から列を選択する'(_選択する列位置ならび,[_行|R1],[L|R2]) :- '列の選択'(_選択する列位置ならび,_行,L), '行列から列を選択する'(_選択する列位置ならび,R1,R2) . % *** user: '行列行置換' / 5 *** '行列行置換'(N,N,L,[_|R],[L|R]) :- ! . '行列行置換'(M,N,L,[A|R1],[A|R2]) :- M2 is M + 1, '行列行置換'(M2,N,L,R1,R2) . % *** user: '行列の結合' / 5 *** '行列の結合'(Len1,Len2,[_行1],[_行2],[_行3]) :- append(_行1,_行2,_行3), length(_行1,Len1), length(_行2,Len2) . '行列の結合'(Len1,Len2,[_行1|R1],[_行2|R2],[_行3|R3]) :- append(_行1,_行2,_行3), '行列の結合'(Len1,Len2,R1,R2,R3), length(_行1,Len1), length(_行2,Len2) . % *** user: '行列の結合' / 3 *** '行列の結合'([_行1|R1],[_行2|R2],_結合された行列) :- '行列の結合'(Len1,Len2,[_行1|R1],[_行2|R2],_結合された行列), Len1 > 0, Len2 > 0 . % *** user: '行列の置換' / 5 *** '行列の置換'(_列,_行,_置換要素,_対象行列,_置換された行列) :- n_th(_行,_対象行列,_対象行), '要素番号によるならびの置換'(_列,_置換要素,_対象行,_置換された行), '要素番号によるならびの置換'(_行,_置換された行,_対象行列,_置換された行列), ! . % *** user: '行列の転置' / 2 *** '行列の転置'(_行列,_転置された行列) :- 転置(_行列,_転置された行列). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). % *** user: m_trans / 3 *** m_trans([],[],[]) :- ! . m_trans([[A|R]|R1],[A|R2],[R|R3]) :- m_trans(R1,R2,R3) . % *** user: m_trans / 2 *** m_trans([[]|_],[]) :- ! . m_trans(L,[B|R1]) :- m_trans(L,B,R2), m_trans(R2,R1), ! . % *** user: '行列式|C|の値' / 2 *** '行列式|C|の値'(_行列,_値) :- length(_行列,Len), findall(U,(for(1,N,Len) , nth1(N,_行列,_行) , nth1(N,_行,U)),L), 'ならびの積'(L,_値) . % *** user: '行列の階数' / 2 *** '行列の階数'(_行列,_階数) :- 'ガウス行列に変形'(_行列,_ガウス行列), count((member(L,_ガウス行列) , \+('すべての要素が0か0.0'(L))),_階数) . % *** user: '行列の要素積' / 2 *** '行列の要素積'(_正方行列,_要素積) :- length(_正方行列,Len), findall(U,for(1,U,Len),L0), '順列'(L0,Len,_順列), findall(V,(for(1,M,Len) , nth1(M,_正方行列,L1) , nth1(M,_順列,N) , nth1(N,L1,V)),L2), '積'(L2,_要素積) . % *** user: '行列の掛算' / 3 *** '行列の掛算'(L1,L2,X) :- '転置'(L2,L4), '行列の掛算_1'(L1,L4,X) . % *** user: '行列の掛算_1' / 3 *** '行列の掛算_1'([],_,[]) :- ! . '行列の掛算_1'([A|R1],L,[S1|R3]) :- '行列の掛算_2'(A,L,S1), '行列の掛算_1'(R1,L,R3) . % *** user: '行列の掛算_3' / 3 *** '行列の掛算_3'([],[],0) :- ! . '行列の掛算_3'([A|R1],[B|R2],S) :- '分数を含む掛算'(A,B,S1), '行列の掛算_3'(R1,R2,S2), '分数を含む加算'(S1,S2,S), ! . % *** user: '行列の行の先頭からn列を切り取った残り行列' / 3 *** '行列の行の先頭からn列を切り取った残り行列'(_n列,LL1,LL2) :- length(L0,_n列), findall(L2,(member(L1,LL1) , append(L0,L2,L1)),LL2) . % *** user: '行基本変形' / 6 *** '行基本変形'(*,_乗数,_行目,_行目,[_行1|R1],[_行2|R1]) :- findall(X,(member(A,_行1) , X is A * _乗数),_行2) . '行基本変形'(*,_乗数,M,_行目,[_行|R1],[_行|R2]) :- M2 is M + 1, '行基本変形'(*,_乗数,M2,_行目,R1,R2) . % *** user: '行基本変形' / 5 *** '行基本変形'(*,_乗数,_行目,_行列,X) :- '行基本変形'(*,_乗数,1,_行目,_行列,X) . % *** user: '行基本変形' / 3 *** '行基本変形'(_行列式,_行列,X) :- atom(_行列式), \+(_行列式 = []), & '行列式変換' # [2|pro], '行列式述語変換'(_行列式,P), '行基本変形'(P,_行列,X), ! . '行基本変形'([],_行列,[]) :- ! . '行基本変形'([N|R1],_行列,[L|R2]) :- !, list_nth(N,_行列,L), '行基本変形'(R1,_行列,R2), ! . '行基本変形'(# _行目1 # _行目2,_行列,X) :- list_nth(_行目1,_行列,_行1), list_nth(_行目2,_行列,_行2), 'ならびの位置指定置換'(_行目2,_行1,_行列,_行列1), 'ならびの位置指定置換'(_行目1,_行2,_行列1,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 >= 0, !, '分数を含む乗算'(-1,_乗数2,_乗数3), '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 >= 0, _乗数1 < 0, '分数を含む乗算'(_乗数1,-1,_乗数3), !, '行基本変形'(_乗数3 # _行目1 + _乗数2 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 >= 0, '分数を含む乗算'(_乗数2,-1,_乗数3), !, '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 - _乗数2 # _行目2,_行列,X) :- _乗数2 < 0, _乗数1 < 0, !, '分数を含む乗算'(-1,_乗数2,_乗数3), '行基本変形'(_乗数1 # _行目1 + _乗数3 # _行目2,_行列,X), ! . '行基本変形'(_乗数1 # _行目1 + _乗数2 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行1) , '分数を含む乗算'(A,_乗数1,U)),_乗算された行1), findall(W,(member(B,_行2) , '分数を含む乗算'(B,_乗数2,W)),_乗算された行2), '項加算'([_乗算された行1,_乗算された行2],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 # _行目2,_行列,X) :- !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,U)),_乗算された行), '項加算'([_乗算された行,_行1],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 # _行目2,_行列,X) :- !, '分数を含む乗算'(-1,_乗数,_乗数2), '行基本変形'(# _行目1 + _乗数2 * _行目2,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 * _行目2,_行列,X) :- integer(_除数), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,U)),_除算された行), '項加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 + _乗数 / _除数 # _行目2,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目2,_行列,_行2), list_nth(_行目1,_行列,_行1), findall(U,(member(A,_行2) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,U)),_除算された行), '項加算'([_行1,_除算された行],_加算された行), replace_nth(1,_行目1,_加算された行,_行列,X), ! . '行基本変形'(# _行目1 - _乗数 / _除数 # _行目2,_行列,X) :- !, '分数を含む乗算'(-1,_除数,_除数2), '行基本変形'(# _行目1 + _乗数 / _除数2 * _行目2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- integer(_除数), !, list_nth(_行目,_行列,_行1), findall(Y,(member(A,_行1) , '行基本変形除算'(A,_乗数,_除数,Y)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 / _除数 # _行目,_行列,X) :- \+(integer(_除数)), !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , '分数を含む乗算'(A,_乗数,A2) , '分数を含む除算'(A2,_除数,X)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . '行基本変形'(_乗数 # _行目,_行列,X) :- !, list_nth(_行目,_行列,_行1), findall(X,(member(A,_行1) , '分数を含む乗算'(A,_乗数,X)),_行2), replace_nth(1,_行目,_行2,_行列,X), ! . % *** user: '行基本変形2' / 3 *** '行基本変形2'(_乗数 # _行目,_行列,X) :- nth1(_行目,_行列,_行), findall(U,(member(A,_行) , U is A * _乗数),_乗算された行), replace_nth(1,_行目,_乗算された行,_行列,X), ! . % *** user: '行基本変形3の適用' / 7 *** '行基本変形3の適用'(A,B,M,N,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,M,N,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 6 *** '行基本変形3の適用'(A,B,M,N,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,M,N,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 5 *** '行基本変形3の適用'(A,B,_行列1,_行列2,N2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,_行列1,_行列2,N2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形3の適用' / 4 *** '行基本変形3の適用'(A,B,_行列1,_行列2) :- B >= 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M - N1 # N,_行列1,_行列2), ! . '行基本変形3の適用'(A,B,_行列1,_行列2) :- B < 0, A2 is abs(A), B2 is abs(B), '最小公倍数'(N1 * A2,N2 * B2,_), '行基本変形'(N2 # M + N1 # N,_行列1,_行列2), ! . % *** user: '行基本変形除算' / 4 *** '行基本変形除算'(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, 0 is A2 mod _除数, X is A * _乗数 // _除数, ! . '行基本変形除算'(A,_乗数,_除数,X) :- integer(A), integer(_乗数), integer(_除数), A2 is A * _乗数, \+(0 is A2 mod _除数), '約分'(A2 / _除数,X), ! . '行基本変形除算'(A,_乗数,_除数,X) :- X is A * _乗数 / _除数 . '分数を含む掛算'(A,B,C) :- '分数を含む乗算'(A,B,C). % *** user: '分数を含む乗算' / 3 *** '分数を含む乗算'(A1 / B1,A2 / B2,C) :- B3 is B1 * B2, A3 is A1 * A2, '約分'(A3 / B3,C), ! . '分数を含む乗算'(V,A2 / B2,C) :- number(V), A3 is V * A2, '約分'(U / B2,C), ! . '分数を含む乗算'(A1 / B1,V,C) :- number(V), A3 is A1 * V, '約分'(A3 / B1,C), ! . '分数を含む乗算'(A,B,C) :- C is A * B . % *** user: '分数を含む掛算' / 3 *** '分数を含む掛算'(A1 / A2,B1 / B2,C) :- S1 is A1 * B1, S2 is A2 * B2, '約分'(S1 / S2,C), ! . '分数を含む掛算'(A1 / A2,B,C) :- S1 is A1 * B, '約分'(S1 / A2,C), ! . '分数を含む掛算'(A,B1 / B2,C) :- S1 is B1 * A, '約分'(S1 / B2,C), ! . '分数を含む掛算'(A,B,C) :- C is A * B . % *** user: '分数を含む加算' / 3 *** '分数を含む加算'(A,B,C) :- number(A), number(B), C is A + B, ! . '分数を含む加算'(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 + A2 * B1, B3 is B1 * B2, '約分'(A3 / B3,C), ! . '分数を含む加算'(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 + A2, '約分'(C3 / B1,C), ! . '分数を含む加算'(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 + A2, '約分'(C3 / B2,C), ! . % *** user: '分数公倍数' / 3 *** '分数公倍数'(A1 / A2,B1 / B2,C1 / C2) :- C1 is A1 * B1, C2 is A2 * B2, ! . '分数公倍数'(A,B1 / B2,C1 / B2) :- integer(A), C1 is A * B1, ! . '分数公倍数'(A1 / A2,B,C1 / A2) :- integer(B), C1 is A1 * B, ! . '分数公倍数'(A,B1 / B2,C1 / B2) :- A float, C1 is A * B1, ! . '分数公倍数'(A1 / A2,B,C1 / A2) :- B float, C1 is A1 * B, ! . % *** user: '分数を含む減算' / 3 *** '分数を含む減算'(A,B,C) :- number(A), number(B), C is A - B, ! . '分数を含む減算'(A1 / B1,A2 / B2,C) :- A3 is A1 * B2 - A2 * B1, B3 is B1 * B2, '約分'(A3 / B3,C), ! . '分数を含む減算'(A1 / B1,V,C) :- number(V), A2 is V * B1, C3 is A1 - A2, '約分'(C3 / B1,C), ! . '分数を含む減算'(V,A2 / B2,C) :- number(V), A1 is V * B2, C3 is A1 - A2, '約分'(C3 / B2,C), ! . % *** user: '分数を含む除算' / 3 *** '分数を含む除算'(A,B,C) :- number(A), number(B), '約分'(A / B,C), ! . '分数を含む除算'(A1 / B1,A2 / B2,C) :- '分数を含む乗算'(A1 / B1,B2 / A2,C), ! . '分数を含む除算'(V,A2 / B2,C) :- number(V), '分数を含む乗算'(V,B2 / A2,C), ! . '分数を含む除算'(A1 / B1,V,C) :- number(V), B2 is V * B1, '約分'(A1 / B2,C), ! . % *** user: '最小公倍数' / 3 *** '最小公倍数'(N1 * A,B,C) :- integer(B), '最小公倍数'(A,B,C), N1 is C // A, ! . '最小公倍数'(A,N2 * B,C) :- integer(A), '最小公倍数'(A,B,C), N2 is C // B, ! . '最小公倍数'(N1 * A,N2 * B,C) :- '最小公倍数'(A,B,C), N1 is C // A, N2 is C // B, ! . '最小公倍数'(A,B,X) :- integer(A), integer(B), '最大公約数をユークリッドの互除法で求める'(A,B,C), X is A * B // C . % *** user: '最小公倍数' / 2 *** '最小公倍数'([N1 * A|R],X) :- findall(U,member(_ * U,[N1 * A|R]),L1), '最小公倍数'(L1,X), '最小公倍数_2'([N1 * A|R],X), ! . '最小公倍数'([A,B],X) :- '最小公倍数'(A,B,X), ! . '最小公倍数'([A|R],X) :- '最小公倍数'(R,B), '最小公倍数'(A,B,X), ! . % *** user: '最小公倍数_2' / 2 *** '最小公倍数_2'([],_) :- ! . '最小公倍数_2'([N * A|R],Y) :- N is Y // A, '最小公倍数_2'(R,Y), ! . '最小公倍数_2'([A|R],Y) :- integer(A), '最小公倍数_2'(R,Y), ! . % *** user: '最大公約数をユークリッドの互除法で求める' / 3 *** '最大公約数をユークリッドの互除法で求める'(M,N,N) :- 0 is M mod N, ! . '最大公約数をユークリッドの互除法で求める'(M,N,X) :- Mod is M mod N, '最大公約数をユークリッドの互除法で求める'(N,Mod,X) . % *** user: '最大公約数' / 3 *** '最大公約数'(M,N,X) :- '最大公約数をユークリッドの互除法で求める'(M,N,X), ! . % *** user: '要素数はnの倍数' / 2 *** '要素数はnの倍数'(L,_n) :- length(L,Len), 0 is Len mod _n . % *** user: '要素を削除するのニ' / 3 *** '要素を削除するのニ'(A,[],[]) :- ! . '要素を削除するのニ'(A,[A|R1],R2) :- '要素を削除するのニ'(A,R1,R2), ! . '要素を削除するのニ'(A,[B|R1],[B|R2]) :- '要素を削除するのニ'(A,R1,R2) . % *** user: '要素を削除する' / 3 *** '要素を削除する'(_,[],_) :- !, fail . '要素を削除する'(A,[A|R1],R2) :- '要素を削除するのニ'(A,R1,R2), ! . '要素を削除する'(A,[B|R1],[B|R2]) :- '要素を削除する'(A,R1,R2) . % *** user: '要素がn個' / 3 *** '要素がn個'(A,L,_n) :- findall(_,append(_,[A|_],L),L1), length(L1,_n), ! . % *** user: '要素数をnで割ると余りがmを収集' / 4 *** '要素数をnで割ると余りがmを収集'(L,_n,_m,Lx) :- findall(A,(append(L0,[A|R],L) , '要素数をnで割ると余りがm'([_|L0],_n,_m)),Lx) . % *** user: '要素数がnで割り切れる' / 2 *** '要素数がnで割り切れる'(L,_n) :- length(L,Len), 0 is Len mod _n . % *** user: '要素数が奇数' / 1 *** '要素数が奇数'(L) :- length(L,N), 1 is N mod 2 . % *** user: '要素位置は' / 2 *** '要素位置は'(L0,_要素位置) :- length([_|L0],_要素位置) . % *** user: '要素がゼロ以外に出会うまで' / 3 *** '要素がゼロ以外に出会うまで'([A|R],[],[A|R]) :- \+((A = 0 ; A = 0.0e+00)), ! . '要素がゼロ以外に出会うまで'([0|R],[0|R1],R2) :- '要素がゼロ以外に出会うまで'(R,R1,R2) . '要素がゼロ以外に出会うまで'([0.0e+00|R],[0.0e+00|R1],R2) :- '要素がゼロ以外に出会うまで'(R,R1,R2) . % *** user: '要素' / 2 *** '要素'(A,B) :- member(A,B) . % *** user: '要素番号によるならびの置換' / 4 *** '要素番号によるならびの置換'(_要素番号,_置換要素,_対象ならび,_置換ならび) :- update_list(_要素番号,_置換要素,_対象ならび,_置換ならび), ! . % *** user: '要素の複製' / 3 *** '要素の複製'(_複製数,_要素,_複製ならび) :- findall(_要素,for(1,N,_複製数),_複製ならび) . % *** user: '要素数' / 2 *** '要素数'(_ならび,_要素数) :- 'ならび'(_ならび), list_length(_ならび,_要素数) . % *** user: '要素数が偶数' / 1 *** '要素数が偶数'(L) :- length(L,N), 0 is N mod 2 . % *** user: '要素数をnで割ると余りがm' / 3 *** '要素数をnで割ると余りがm'(L,_n,_m) :- length(L,Len), _m is Len mod _n . % *** user: '要素数割り算' / 5 *** '要素数割り算'(L1,L2,Div,Div,L1) :- append([_|_],L1,L2), ! . '要素数割り算'(L1,L2,L4,Div,Mod) :- append(L2,L3,L1), length(L2,Len), length(L5,Len), '要素数割り算'(L3,L5,[_|L4],Div,Mod) . % *** user: '要素数割り算' / 4 *** '要素数割り算'(L1,L2,Div,Mod) :- length(L1,Len1), length(L2,Len2), length(L11,Len1), length(L22,Len2), '要素数割り算'(L11,L22,[],Div,Mod) . % *** user: '行の整列' / 5 *** '行の整列'(_,_,_,[],[]) :- ! . '行の整列'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, sort(A,B), M is N + 1, '行の整列'(M,S,E,R1,R2), ! . '行の整列'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '行の整列'(M,S,E,R1,R2), ! . % *** user: '行の整列' / 4 *** '行の整列'(_行目から,_行目まで,_表,_整列した表) :- '行の整列'(1,_行目から,_行目まで,_表,_整列した表), ! . % *** user: '行の整列' / 2 *** '行の整列'(_表,_整列した表) :- list_length(_表,E), '行の整列'(1,1,E,_表,_整列した表), ! . % *** user: '行の反転' / 5 *** '行の反転'(_,_,_,[],[]) :- ! . '行の反転'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, reverse(A,B), M is N + 1, '行の反転'(M,S,E,R1,R2), ! . '行の反転'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '行の反転'(M,S,E,R1,R2), ! . % *** user: '行の反転' / 4 *** '行の反転'(_行目から,_行目まで,_表,_反転した表) :- '行の反転'(1,_行目から,_行目まで,_表,_反転した表), ! . % *** user: '行の反転' / 2 *** '行の反転'(_表,_反転した表) :- list_length(_表,E), '行の反転'(1,1,E,_表,_反転した表), ! . % *** user: '行の置換' / 4 *** '行の置換'(_行番号1,_行番号2,_行列,_置換された行列) :- nth1(_行番号1,_行列,_行1), nth1(_行番号2,_行列,_行2), '要素番号によるならびの置換'(_行番号2,_行1,_行列,_行列2), '要素番号によるならびの置換'(_行番号1,_行2,_行列2,_置換された行列), ! . % *** user: 'すべての要素が0か0.0' / 1 *** 'すべての要素が0か0.0'([]). 'すべての要素が0か0.0'([0|R]) :- 'すべての要素が0か0.0'(R) . 'すべての要素が0か0.0'([0.0e+00|R]) :- 'すべての要素が0か0.0'(R) . % *** user: 'すべての要素' / 2 *** 'すべての要素'([A],A). 'すべての要素'([A|R],A) :- 'すべての要素'(R,A) . % *** user: 'すべての要素が変数である' / 1 *** 'すべての要素が変数である'([V]) :- var(V), ! . 'すべての要素が変数である'([V|R]) :- var(V), 'すべての要素が変数である'(R) . % *** user: 'すべての要素を左右反転する' / 2 *** 'すべての要素を左右反転する'([],[]) :- ! . 'すべての要素を左右反転する'([L1|R1],[L2|R2]) :- reverse(L1,L2), 'すべての要素を左右反転する'(R1,R2) . % *** user: '最初に現れる0ではない要素・位置' / 4 *** '最初に現れる0ではない要素・位置'(Nth,[X|_],Nth,X) :- \+((X = 0 ; X = 0.0e+00)), ! . '最初に現れる0ではない要素・位置'(Mth,[0|R],Nth,X) :- Mth_2 is Mth + 1, '最初に現れる0ではない要素・位置'(Mth_2,R,Nth,X) . '最初に現れる0ではない要素・位置'(Mth,[0.0e+00|R],Nth,X) :- Mth_2 is Mth + 1, '最初に現れる0ではない要素・位置'(Mth_2,R,Nth,X) . % *** user: replace_nth / 5 *** replace_nth(_,_,_,[],[]) :- ! . replace_nth(S,S,Y,[_|R1],[Y|R2]) :- S2 is S + 1, replace_nth(S2,S,Y,R1,R2), ! . replace_nth(S,N,Y,[A|R1],[A|R2]) :- S2 is S + 1, replace_nth(S2,N,Y,R1,R2) . % *** user: '余因子' / 5 *** '余因子'(_n,_正方行列,_i,_j,_余因子) :- 'n次正方行列から、第i行と第j列を取り除いた正方行列(n-1次正方行列の行列式に、(-1)のi+j乗をかけたものを、Aの(i,j)余因子といい、Cijで表します。'(_n,_正方行列,_i,_j,_余因子) . % *** user: '余因子行列の要素が余因子である' / 4 *** '余因子行列の要素が余因子である'(_n,_正方行列,_i,L) :- length(L,_n), findall(_余因子,(nth1(_j,L,_余因子) , '余因子'(_n,_正方行列,_i,_j,_余因子)),L) . % *** user: '余因子行列' / 3 *** '余因子行列'(_n,_正方行列,_余因子行列) :- length(_余因子行列,_n), findall(L,(nth1(_i,_余因子行列,L) , '余因子行列の要素が余因子である'(_n,_正方行列,_i,L)),_余因子行列) . % *** user: '余因子行列で行列値|a|を求める' / 2 *** '余因子行列で行列値|a|を求める'(_a,_行列式_aの値) :- '余因子行列'(_n,_a,_余因子行列), _a = [_aの第一行|_], _余因子行列 = [_余因子行列の第一行|_], '二つのならびの積の和'(_aの第一行,_余因子行列の第一行,_行列式_aの値) . % *** user: '余因子行列を使って逆行列を得る' / 3 *** '余因子行列を使って逆行列を得る'(_n,_正方行列,_逆行列) :- '余因子行列で行列値|a|を求める'(_正方行列,_行列式の値), '余因子行列'(_n,_正方行列,_余因子行列), '転置'(_余因子行列,_転置された余因子行列), '行列のすべての要素に値を掛ける'(1,_n,_転置された余因子行列,1 / _行列式の値,_逆行列) . % *** user: 'とからりすと' / 2 *** 'とからりすと'(A,[A]) :- atomic(A), ! . 'とからりすと'(A 'と' B,C) :- 'とからりすと'(A,A1), 'とからりすと'(B,B1), append(A1,B1,C) . % *** user: '項加算_1' / 3 *** '項加算_1'([],S,S) :- ! . '項加算_1'([A|R],Y,S) :- 'ならび'(A), 'ならび'(Y), !, 'ならび項加算'(A,Y,Z), '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, '項加算_1'(R,Z,S), ! . '項加算_1'([A|R],Y,S) :- atom(A), '項加算_1'(R,Y,S), ! . '項加算_1'([A|R],Y,S) :- '分数を含む加算'(A,Y,Z), '項加算_1'(R,Z,S) . '項加算_1'(A,Y,S) :- 'とからりすと'(A,L), !, '項加算_1'(L,Y,S) . % *** user: '項加算_2' / 2 *** '項加算_2'([],[]) :- ! . '項加算_2'([L|R],[S|R2]) :- '項加算'(L,S), '項加算_2'(R,R2) . % *** user: '項加算' / 2 *** '項加算'(trunc(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A is trunc(B)),SL), ! . '項加算'('四捨五入'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '四捨五入'(B)),SL), ! . '項加算'('切捨て'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切捨て'(B)),SL), ! . '項加算'('切り上げ'(L),SL) :- '項加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切り上げ'(B)),SL), ! . '項加算'([],L) :- var(L), L = 0, ! . '項加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), ! . '項加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '項加算_2'(L1,SL), ! . '項加算'(X,S) :- '項加算_1'(X,0,S) . % *** user: '加算' / 2 *** '加算'(truncate(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A is truncate(B)),SL), ! . '加算'('四捨五入'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '四捨五入'(B)),SL), ! . '加算'('切捨て'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切捨て'(B)),SL), ! . '加算'('切り上げ'(L),SL) :- '加算'(L,SL2), findall(A,(member(B,SL2) , A 'は' '切り上げ'(B)),SL), ! . '加算'([],L) :- var(L), L = 0, ! . '加算'([],L) :- \+(var(L)), '加算の変数に零をおく'(L), ! . '加算'([L|R],SL) :- 'ならび'(L), m_trans([L|R],L1), '加算_2'(L1,SL), ! . '加算'(X,S) :- '加算_1'(X,0,S) . % *** user: '加算_1' / 3 *** '加算_1'([],S,S) :- ! . '加算_1'([A|R],Y,S) :- 'ならび'(A), 'ならび'(Y), !, 'ならび加算'(A,Y,Z), '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), atom_number(A,I), integer(I), Z is I + Y, '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), atom_number(A,F), real(F), Z is F + Y, '加算_1'(R,Z,S), ! . '加算_1'([A|R],Y,S) :- atom(A), '加算_1'(R,Y,S), ! . '加算_1'([A|R],Y,S) :- A1 'は' A, Z is A1 + Y, '加算_1'(R,Z,S) . '加算_1'(A,Y,S) :- 'とからりすと'(A,L), !, '加算_1'(L,Y,S) . % *** user: '加算_2' / 2 *** '加算_2'([],[]) :- ! . '加算_2'([L|R],[S|R2]) :- '加算'(L,S), '加算_2'(R,R2) . % *** user: '加算の変数に零をおく' / 1 *** '加算の変数に零をおく'([]) :- ! . '加算の変数に零をおく'([A|R]) :- '変数'(A), A = 0, '加算の変数に零をおく'(R), ! . ならび(L) :- is_list(L). list(L) :- is_list(L). % *** user: '逆交差要素の一' / 5 *** '逆交差要素の一'(_,N,Len,_,[]) :- N > Len, ! . '逆交差要素の一'(M,_,_,_,[]) :- M =< 0, ! . '逆交差要素の一'(M,N,Len,LL,[]) :- M =< M - Len, ! . '逆交差要素の一'(M,N,Len,LL,[]) :- N >= N + Len, ! . '逆交差要素の一'(M,N,Len,LL,[A|R]) :- '行列要素'(M,N,LL,A), M1 is M - 1, N2 is N + 1, '逆交差要素の一'(M1,N2,Len,LL,R), ! . % *** user: '逆行列' / 2 *** '逆行列'(_行列,_逆行列) :- length(_行列,N), '変数正方行列'(1,N,_逆行列), '各行に単位行列の各行を結合して拡張した行列'(N,_行列,_行列の二), '既約ガウス行列に変形'(_行列の二,_既約ガウス行列), '行列の結合'(_,_逆行列,_既約ガウス行列) . % *** user: '各行で最初に現れる0ではない要素が1である' / 1 *** '各行で最初に現れる0ではない要素が1である'([]). '各行で最初に現れる0ではない要素が1である'([_行|R]) :- '最初に現れる0ではない要素が1である'(_行), '各行で最初に現れる0ではない要素が1である'(R) . % *** user: '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である' / 3 *** '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(_,_,[]). '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(N,_行列,[_行|R]) :- '最初に現れる0ではない要素・位置'(1,_行,_列位置,1), N2 is N + 1, '列において他の要素がすべて0である'(_行列,N,_列位置), '各行で最初に現れる0ではない要素が1である列において他の要素がすべて0である'(N2,_行列,R) . % *** user: '各行に単位行列の各行を結合して拡張した行列' / 3 *** '各行に単位行列の各行を結合して拡張した行列'(N,_行列,_行列の二) :- '単位行列'(N,L), '行列の結合'(_行列,L,_行列の二) . % *** user: '列において他の要素がすべて0である' / 3 *** '列において他の要素がすべて0である'(_行列,N,_列位置) :- length(_行列,Len), findall(U,(for(1,M,Len) , not M = N , nth1(M,_行列,_行) , nth1(_列位置,_行,U)),L), all(L,0), ! . % *** user: '変数分離' / 3 *** '変数分離'([],[],[]) :- ! . '変数分離'([V|R1],[V|R2],R3) :- var(V), '変数分離'(R1,R2,R3) . '変数分離'([A|R1],R2,[A|R3]) :- \+(var(A)), '変数分離'(R1,R2,R3) . % *** user: '変数でない項目だけ置き換える' / 3 *** '変数でない項目だけ置き換える'([],[],[]). '変数でない項目だけ置き換える'([Term|R1],[_|R2],[Term|R3]) :- \+(var(Term)), '変数でない項目だけ置き換える'(R1,R2,R3) . '変数でない項目だけ置き換える'([V|R1],[Term|R2],[Term|R3]) :- var(V), '変数でない項目だけ置き換える'(R1,R2,R3) . % *** user: '変数指定項複写' / 6 *** '変数指定項複写'(M,N,P,P1,V,V1) :- M > N, ! . '変数指定項複写'(M,N,P,P1,V,V1) :- arg(M,P,T), arg(M,P1,T1), '変数指定項複写'(T,T1,V,V1), M1 is M + 1, '変数指定項複写'(M1,N,P,P1,V,V1), ! . % *** user: '変数指定項複写' / 4 *** '変数指定項複写'(P,P1,V,V1) :- struct(P), functor(P,F,A), functor(P1,F,A), '変数指定項複写'(1,A,P,P1,V,V1), ! . '変数指定項複写'(P,P1,L1,L2) :- var(P), list(L1), list(L2), L1 = [V|_], L2 = [P1|_], P == V, ! . '変数指定項複写'(P,P1,L1,L2) :- var(P), list(L1), list(L2), L1 = [V|R1], L2 = [V2|R2], \+(P == V), '変数指定項複写'(P,P1,R1,R2), ! . '変数指定項複写'(P,P1,V,P1) :- var(P), var(V), P == V, ! . '変数指定項複写'(P,P1,V,V1) :- var(P), var(V), \+(P == V), ! . '変数指定項複写'(P,P1,V,V1) :- \+(var(P)), parse_atom(P,1,Q,_), \+(P == Q), sprintf('%q',[P],P1), ! . '変数指定項複写'(P,P,V,V1). % *** user: '変数を順に単一化する' / 3 *** '変数を順に単一化する'(_,[],[]) :- ! . '変数を順に単一化する'([],X,X) :- ! . '変数を順に単一化する'([A|R1],[V|R2],[A|R3]) :- var(V), '変数を順に単一化する'(R1,R2,R3), ! . '変数を順に単一化する'([A|R1],[B|R2],[B|R3]) :- \+(var(B)), '変数を順に単一化する'([A|R1],R2,R3) . % *** user: '変数を順に固定値に置換' / 5 *** '変数を順に固定値に置換'([],_,[],X,X) :- ! . '変数を順に固定値に置換'(R,_,R,[],[]) :- ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- var(A), \+((member(B,_忌避変数ならび) , A == B)), A = _固定値, '変数を順に固定値に置換'(R0,_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- var(A), member(B,_忌避変数ならび), A == B, '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,[A|R],[A|R1]) :- atomic(A), '変数を順に固定値に置換'([_固定値|R0],_忌避変数ならび,R02,R,R1), ! . '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R02,[A|R],[B|R1]) :- struct(A), A =.. L, '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R0,L,L1), B =.. L1, '変数を順に固定値に置換'(R0,_忌避変数ならび,R02,R,R1), ! . % *** user: '変数を順に固定値に置換' / 4 *** '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,_対象ならび,_置換ならび) :- '変数を順に固定値に置換'(_固定値ならび,_忌避変数ならび,R02,_対象ならび,_置換ならび), ! . % *** user: '変数を順に固定値に置換' / 3 *** '変数を順に固定値に置換'(_固定値ならび,_対象ならび,_置換ならび) :- '変数を順に固定値に置換'(_固定値ならび,[],_対象ならび,_置換ならび), ! . % *** user: '変数名の解決' / 1 *** '変数名の解決'([]) :- ! . '変数名の解決'([Varname = Var|R]) :- var(Var), Varname = Var, '変数名の解決'(R), ! . % *** user: '変数ならびの生成' / 3 *** '変数ならびの生成'(N,N,[]) :- ! . '変数ならびの生成'(S,E,[A|R]) :- S < E, S1 is S + 1, '変数ならびの生成'(S1,E,R) . % *** user: '変数を固定値に置換' / 3 *** '変数を固定値に置換'(A,X,X) :- var(X), A = X, ! . '変数を固定値に置換'(_,[],[]) :- ! . '変数を固定値に置換'(_固定値,[A|R],[A|R1]) :- var(A), A = _固定値, '変数を固定値に置換'(_固定値,R,R1), ! . '変数を固定値に置換'(_固定値,[A|R],[A|R1]) :- atomic(A), '変数を固定値に置換'(_固定値,R,R1), ! . '変数を固定値に置換'(_固定値,[A|R],[B|R1]) :- struct(A), A =.. L, '変数を固定値に置換'(_固定値,L,L1), B =.. L1, '変数を固定値に置換'(_固定値,R,R1), ! . % *** user: '変数束縛表示' / 1 *** '変数束縛表示'([]) :- ! . '変数束縛表示'([VN = V]) :- '表示'('%t = %q',[VN,V]), telling(F), tell(user_output), write_formatted('%t = %q.',[VN,V]), told, tell(F), ! . '変数束縛表示'([VN,V|R]) :- '表示'('%t = %q,',[VN,V]), telling(F), tell(user_output), write_formatted('%t = %q,',[VN,V]), told, tell(F), '変数束縛表示'(R) . % *** user: '変数ならび表示' / 1 *** '変数ならび表示'([]) :- ! . '変数ならび表示'([_変数項]) :- nl, write(_変数項), '表示'('\n%t',[_変数項]), reads(X), !, \+(X = (;)) . '変数ならび表示'([_変数項|_残りならび]) :- nl, write(_変数項), '表示'('\n%t',[_変数項]), '変数ならび表示'(_残りならび) . % *** user: '変数' / 1 *** '変数'(_項) :- var(_項) . % *** user: '変数ならび' / 3 *** '変数ならび'(0,R,R) :- ! . '変数ならび'(N,[_|R],X) :- M is N - 1, '変数ならび'(M,R,X) . % *** user: '変数ならび' / 1 *** '変数ならび'([]) :- ! . '変数ならび'([_変数|_残りならび]) :- '変数'(_変数), !, '変数ならび'(_残りならび) . % *** user: '変数ならび生成' / 2 *** '変数ならび生成'(0,[]) :- ! . '変数ならび生成'(_生成数,[_生成された変数|_残りならび]) :- _残り生成数 'は' _生成数 - 1, '変数ならび生成'(_残り生成数,_残りならび) . % *** user: '変数が存在する' / 1 *** '変数が存在する'([V|_]) :- var(V), ! . '変数が存在する'([Q|_]) :- struct(Q), Q =.. [_|L], '変数が存在する'(L), ! . '変数が存在する'([_|R]) :- '変数が存在する'(R) . % *** user: '変数正方行列' / 3 *** '変数正方行列'(M,N,[]) :- M > N . '変数正方行列'(M,N,[L|R]) :- length(L,N), M2 is M + 1, '変数正方行列'(M2,N,R) . % *** user: '変数は全て単一' / 2 *** '変数は全て単一'([],_). '変数は全て単一'([A|B],A) :- var(A), '変数は全て単一'(B,A) . '変数は全て単一'([A|B],C) :- \+(var(A)), '変数は全て単一'(B,C) . % *** user: '逆置' / 3 *** '逆置'(_順列,_ある要素,_逆置要素) :- append(_,[_ある要素|R],_順列), append(_,[_逆置要素|R1],R), _逆置要素 < _ある要素 . % *** user: '逆交差要素' / 5 *** '逆交差要素'(M,N,Len,LL,X) :- M2 is M + N - 1, '逆交差要素'(M2,Len,LL,X) . % *** user: '逆交差要素' / 4 *** '逆交差要素'(M,Len,_,_) :- M - Len >= Len, !, fail . '逆交差要素'(M,Len,LL,L) :- M =< Len, '逆交差要素の一'(M,1,Len,LL,L) . '逆交差要素'(M,Len,LL,L) :- M > Len, N is M - Len + 1, '逆交差要素の一'(Len,N,Len,LL,L) . '逆交差要素'(M,Len,LL,L) :- M2 is M + 1, '逆交差要素の一'(M2,Len,LL,L) . % *** user: '逆交差要素' / 2 *** '逆交差要素'(LL,L) :- length(LL,Len), '逆交差要素'(1,Len,LL,L) . % *** user: '逆斜行要素' / 7 *** '逆斜行要素'(M,N,Len1,Len2,LL,Z,X) :- M2 is M + N - 1, '逆斜行要素'(M2,Len1,Len2,LL,Z,X) . % *** user: '逆斜行要素' / 6 *** '逆斜行要素'(M,Len1,Len2,_,_,_) :- M - Len1 >= Len1, !, fail . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M =< Len1, '逆斜行要素の一'(M,1,Len1,Len2,LL,Z,L) . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M > Len1, N is M - Len1 + 1, '逆斜行要素の一'(Len1,N,Len1,Len2,LL,Z,L) . '逆斜行要素'(M,Len1,Len2,LL,Z,L) :- M2 is M + 1, '逆斜行要素の一'(M2,Len1,Len2,LL,Z,L) . % *** user: '逆斜行要素' / 5 *** '逆斜行要素'(M,Len,_,_,_) :- M - Len >= Len, !, fail . '逆斜行要素'(M,Len,LL,Z,L) :- M =< Len, '逆斜行要素の一'(M,1,Len,LL,Z,L) . '逆斜行要素'(M,Len,LL,Z,L) :- M > Len, N is M - Len + 1, '逆斜行要素の一'(Len,N,Len,LL,Z,L) . '逆斜行要素'(M,Len,LL,Z,L) :- M2 is M + 1, '逆斜行要素の一'(M2,Len,LL,Z,L) . % *** user: '逆斜行要素' / 2 *** '逆斜行要素'(LL,L) :- length(LL,Len), '逆斜行要素'(1,Len,LL,_,L) . % *** user: '逆斜行要素の一' / 7 *** '逆斜行要素の一'(_,N,Len1,Len2,_,[],[]) :- N > Len2, ! . '逆斜行要素の一'(M,_,_,_,_,[],[]) :- M =< 0, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[],[]) :- M =< M - Len1, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[],[]) :- N >= N + Len2, ! . '逆斜行要素の一'(M,N,Len1,Len2,LL,[[M,N]|R1],[A|R2]) :- '行列要素'(M,N,LL,A), M1 is M - 1, N2 is N + 1, '逆斜行要素の一'(M1,N2,Len1,Len2,LL,R1,R2), ! . % *** user: '逆斜行要素の一' / 6 *** '逆斜行要素の一'(M,_,_,_,[],[]) :- M =< 0, ! . % *** user: '上三角行列' / 3 *** '上三角行列'(N,N,_) :- ! . '上三角行列'(M,N,_行列) :- M2 is M + 1, nth1(M2,_行列,_行), findall(0,for(1,I,M),L), append(L,_,_行), '上三角行列'(M2,N,_行列) . % *** user: '上三角行列' / 1 *** '上三角行列'(_行列) :- length(_行列,_行), '上三角行列'(1,_行,_行列) . % *** user: '下三角行列' / 3 *** '下三角行列'(N,N,_) :- ! . '下三角行列'(M,N,_行列) :- nth1(M,_行列,_行), M2 is M + 1, findall(0,for(N,I,M2),L), append(_,L,_行), '下三角行列'(M2,N,_行列) . % *** user: '下三角行列' / 1 *** '下三角行列'(_行列) :- length(_行列,_行), '下三角行列'(1,_行,_行列) . % *** user: '零行列' / 1 *** '零行列'([]) :- ! . '零行列'([A|R]) :- '零行列_1'(A), '零行列'(R) . % *** user: '零行列_1' / 1 *** '零行列_1'([]) :- ! . '零行列_1'([0|R]) :- !, '零行列_1'(R) . '零行列_1'([0.0e+00|R]) :- '零行列_1'(R) . % *** user: '零以外の最初の要素が1' / 1 *** '零以外の最初の要素が1'([1]) :- ! . '零以外の最初の要素が1'([1|_]) :- ! . '零以外の最初の要素が1'([0|R]) :- '零以外の最初の要素が1'(R) . % *** user: '約分の二' / 3 *** '約分の二'(_分子,1,_分子) :- ! . '約分の二'(_分子,1.0,_分子) :- ! . '約分の二'(_分子,_分母,_分子 / _分母). % *** user: '約分' / 2 *** '約分'(B / A,X) :- '最大公約数'(B,A,C), _分子 is B // C, _分母 is A // C, '約分の二'(_分子,_分母,X), ! . % *** user: (all) / 2 *** all([],_). all([A|R],A) :- all(R,A). % *** user: '右下がり対角要素ならび' / 3 *** '右下がり対角要素ならび'(_n,_正方行列,_右下がり対角要素ならび) :- findall(V,(nth1(_nth1,_正方行列,L) , nth1(_nth1,L,V)),_右下がり対角要素ならび) . % *** user: '右上がり対角要素ならび' / 3 *** '右上がり対角要素ならび'(_n,_正方行列,_右上がり対角要素ならび) :- findall(V,(append(_,[L|R],_正方行列) , length([_|R],_nth1) , nth1(_nth1,L,V)),_右上がり対角要素ならび), ! . % *** user: '二つの対角要素を得る' / 4 *** '二つの対角要素を得る'(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび) :- '右下がり対角要素ならび'(_n,_正方行列,_右下がり対角要素ならび), '右上がり対角要素ならび'(_n,_正方行列,_右上がり対角要素ならび) . % *** user: '二つの対角要素の積を得る' / 4 *** '二つの対角要素の積を得る'(_n,_正方行列,_右下がり対角要素の積,_右上がり対角要素の積) :- '二つの対角要素を得る'(_n,_正方行列,_右下がり対角要素ならび,_右上がり対角要素ならび), '対角要素の掛算'(_右下がり対角要素ならび,_右下がり対角要素の積), '対角要素の掛算'(_右上がり対角要素ならび,_右上がり対角要素の積) . % *** user: '二つのならびの積の和' / 3 *** '二つのならびの積の和'([],[],0). '二つのならびの積の和'([A|R1],[B|R2],S) :- '二つのならびの積の和'(R1,R2,S_1), S is S_1 + A * B . % *** user: '二つのならびの同一順序要素の結合' / 3 *** '二つのならびの同一順序要素の結合'([],[],[]). '二つのならびの同一順序要素の結合'([A|R1],[B|R2],[C|R3]) :- append(A,B,C), '二つのならびの同一順序要素の結合'(R1,R2,R3) . % *** user: '二つの要素を交換する' / 4 *** '二つの要素を交換する'(L1,_要素位置1,_要素位置2,L2) :- nth1(_要素位置1,L1,A), nth1(_要素位置2,L1,B), '指定要素を置換する'(1,L1,[[_要素位置1,B],[_要素位置2,A]],L2) . % *** user: '対角要素の掛算' / 2 *** '対角要素の掛算'([],1). '対角要素の掛算'([A|R],X) :- '対角要素の掛算'(R,Y), X is A * Y . % *** user: '対角行列' / 3 *** '対角行列'(N,_対角要素が変数の対角行列,_変数ならび) :- integer(N), length(L,N), length(LX,N), findall([X,A],(append(L1,[A|L2],L) , length(L1,N1) , length(L11,N1) , length(L2,N2) , length(L22,N2) , L11 all 0 , L22 all 0 , append(L11,[A|L22],X)),LY), '対角行列_1'(LY,_対角要素が変数の対角行列,_変数ならび) . % *** user: '対角行列' / 2 *** '対角行列'(N,L) :- integer(N), length(LN,N), findall(LN,(append(L1,[A|L2],LN) , L1 all 0 , L2 all 0),L) . % *** user: '対角行列' / 1 *** '対角行列'(L) :- \+(var(L)), length(L,N), length(LN,N), findall(LN,(append(L1,[A|L2],LN) , L1 all 0 , L2 all 0),L) . % *** user: '対角要素' / 4 *** '対角要素'(M,N,_,[]) :- M > N, ! . '対角要素'(M,N,_行列,[_要素|R]) :- nth1(M,_行列,_行), list_length(_行,N), nth1(M,_行,_要素), M2 is M + 1, '対角要素'(M2,N,_行列,R) . % *** user: '対角要素' / 2 *** '対角要素'(_行列,_対角要素) :- list_length(_行列,N), '対角要素'(1,N,_行列,_対角要素) . % *** user: '対角行列_1' / 3 *** '対角行列_1'([],[],[]) :- ! . '対角行列_1'([[L,V]|R1],[L|R2],[V|R3]) :- '対角行列_1'(R1,R2,R3) . % *** user: '対角成分' / 4 *** '対角成分'(M,N,_,[]) :- M > N, ! . '対角成分'(M,N,_行列,[_成分|R]) :- nth1(M,_行列,_行), list_length(_行,N), nth1(M,_行,_成分), M2 is M + 1, '対角成分'(M2,N,_行列,R) . % *** user: '対角成分' / 2 *** '対角成分'(_行列,_対角成分) :- list_length(_行列,N), '対角成分'(1,N,_行列,_対角成分) . % *** user: '対角要素に交差した要素' / 2 *** '対角要素に交差した要素'(_行列,_対角要素に交差した要素) :- reverse(_行列,_行を逆順にした行列), '対角要素'(_行を逆順にした行列,_対角要素の一), reverse(_対角要素の一,_対角要素に交差した要素) . % *** user: '指定要素を置換する' / 4 *** '指定要素を置換する'(_,[],_,[]). '指定要素を置換する'(N,[L1|R1],_置換情報,[L2|R2]) :- member([N,L2],_置換情報), N2 is N + 1, '指定要素を置換する'(N2,R1,_置換情報,R2) . '指定要素を置換する'(N,[L1|R1],_置換情報,[L1|R2]) :- N2 is N + 1, '指定要素を置換する'(N2,R1,_置換情報,R2) . findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). findavg(A,B,C) :- findsum(A,B,S), length(A,D), C is S / D. % *** user: '列の選択' / 3 *** '列の選択'([],_,[]) :- ! . '列の選択'([_列位置|R1],_行,[A|R2]) :- integer(_列位置), nth1(_列位置,_行,A), '列の選択'(R1,_行,R2), ! . '列の選択'([A|R1],_行,[B|R2]) :- \+(integer(A)), B 'は' A, '列の選択'(R1,_行,R2), ! . % *** user: '列の選択' / 3 *** '列の選択'([],_,[]) :- ! . '列の選択'([_列位置|R1],_行,[A|R2]) :- integer(_列位置), nth1(_列位置,_行,A), '列の選択'(R1,_行,R2), ! . '列の選択'([A|R1],_行,[B|R2]) :- \+(integer(A)), B 'は' A, '列の選択'(R1,_行,R2), ! . % *** user: '列の整列' / 5 *** '列の整列'(_,_,_,[],[]) :- ! . '列の整列'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, sort(A,B), M is N + 1, '列の整列'(M,S,E,R1,R2), ! . '列の整列'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '列の整列'(M,S,E,R1,R2), ! . % *** user: '列の整列' / 4 *** '列の整列'(_列目から,_列目まで,_表,_整列した表) :- '行列の転置'(_表,_転置表), '列の整列'(1,_列目から,_列目まで,_転置表,_整列した転置表), '行列の転置'(_整列した転置表,_整列した表), ! . % *** user: '列の整列' / 2 *** '列の整列'(_表,_整列した表) :- '行列の転置'(_表,_転置表), list_length(_転置表,E), '列の整列'(1,1,E,_転置表,_整列した転置表), '行列の転置'(_整列した転置表,_整列した表), ! . % *** user: '列の反転' / 5 *** '列の反転'(_,_,_,[],[]) :- ! . '列の反転'(N,S,E,[A|R1],[B|R2]) :- N >= S, N =< E, reverse(A,B), M is N + 1, '列の反転'(M,S,E,R1,R2), ! . '列の反転'(N,S,E,[A|R1],[A|R2]) :- \+((N >= S , N =< E)), M is N + 1, '列の反転'(M,S,E,R1,R2), ! . % *** user: '列の反転' / 4 *** '列の反転'(_列目から,_列目まで,_表,_反転した表) :- '行列の転置'(_表,_転置表), '列の反転'(1,_列目から,_列目まで,_転置表,_反転した転置表), '行列の転置'(_反転した転置表,_反転した表), ! . % *** user: '列の反転' / 2 *** '列の反転'(_表,_反転した表) :- '行列の転置'(_表,_転置表), length(_転置表,E), '列の反転'(1,1,E,_転置表,_反転した転置表), '行列の転置'(_反転した転置表,_反転した表), ! . % *** user: '列において他の要素がすべて0である' / 3 *** '列において他の要素がすべて0である'(_行列,N,_列位置) :- length(_行列,Len), findall(U,(for(1,M,Len) , not M = N , nth1(M,_行列,_行) , nth1(_列位置,_行,U)),L), all(L,0), ! . 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). 組合せ(L,1,[A]) :- member(A,L). 組合せ([A|R1],N,[A|R2]) :- 'Nを1減らして残り要素の組合せ'(R1,N,R2). 組合せ([_|R1],N,R2) :- 'Nはそのままで残り要素の組合せ'(R1,N,R2). 'Nを1減らして残り要素の組合せ'(R1,N,R2) :- succ(N_1,N), 組合せ(R1,N_1,R2). 'Nはそのままで残り要素の組合せ'(R1,N,R2) :- 組合せ(R1,N,R2). % *** user: 'LU分解' / 2 *** 'LU分解'(LL1,LL2) :- '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび), 'LU分解'(_回数制御ならび,LL1,LL2). % *** user: '行数・列数のうち小さい方の回数制御ならび' / 2 *** '行数・列数のうち小さい方の回数制御ならび'(LL1,_回数制御ならび) :- 行数(LL1,_行数), 列数(LL1,_列数), min_list([_行数,_列数],Len), length(Ln,Len). 行数(LL1,_行数) :- length(LL1,_行数). 列数([L|_],_列数) :- length(L,_列数). % *** 'n次正方の疎行列の生成' / 3 *** 'n次正方の疎行列の生成'(_n,_行位置_列位置_値ならび,_n次正方の疎行列) :- 変数正方行列(1,_n,_n次正方の疎行列), 正方の疎行列の生成(_行位置_列位置_値ならび,_n次正方の疎行列), n次正方の疎行列の変数を0で埋める(_n次正方の疎行列). % *** 正方の疎行列の生成 / 2 *** 正方の疎行列の生成([],[]) :- !. 正方の疎行列の生成([[_i,_j,_値]|R],_n次正方の疎行列) :- nth1(_i,_n次正方の疎行列,L), nth1(_j,L,_値), 正方の疎行列の生成(R,_n次正方の疎行列). % *** n次正方の疎行列の変数を0で埋める / 1 *** n次正方の疎行列の変数を0で埋める([]) :- !. n次正方の疎行列の変数を0で埋める([L|R]) :- ならびの変数を0で埋める(L), n次正方の疎行列の変数を0で埋める(R). % *** ならびの変数を0で埋める / 1 *** ならびの変数を0で埋める([]). ならびの変数を0で埋める([0|R]) :- ならびの変数を0で埋める(R),!. ならびの変数を0で埋める([A|R]) :- ならびの変数を0で埋める(R). % *** user: 'LU分解' / 3 *** 'LU分解'([],LL,LL). 'LU分解'([_|Ln],_主小行列_1,[_lL|_LU_3]) :- '_lLと_uLと_主小行列に分割し主小行列部分を計算する'(_主小行列_1,_lL,_uL,_主小行列_2), 'LU分解'(Ln,_主小行列_2,_LU_2), '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). % *** '_lLと_uLと_主小行列に分割し主小行列部分を計算する' / 4 *** '_lLと_uLと_主小行列に分割し主小行列部分を計算する'([_lL|R1],_lL,_uL,_主小行列) :- _lL = [_l|L], '_uLと_主小行列を切り出す'(_l,R1,_uL,R2), '主小行列部分を計算する'(R2,_lL,_uL,_主小行列). % *** '_uLと_主小行列を切り出す' / 4 *** '_uLと_主小行列を切り出す'(_,[],[],[]). '_uLと_主小行列を切り出す'(_l,[[_u_1|L]|R2],[_u_2|R3],[L|R4]) :- 分数を含む除算(_u_1,_l,_u_2), '_uLと_主小行列を切り出す'(_l,R2,R3,R4). % *** '主小行列部分を計算する' / 4 *** 主小行列部分を計算する([],[],[],[]). 主小行列部分を計算する([L1|R1],_lL,[_u|_uL],[L3|R4]) :- 主小行列部分の一行を計算する(L1,_lL,_u,L3), 主小行列部分を計算する(R1,_lL,_uL,R4). % *** '主小行列部分の一行を計算する' / 4 *** 主小行列部分の一行を計算する([],[],_,[]) :- !. 主小行列部分の一行を計算する([_d_1|R1],[_l|R3],_u,[_d_2|R4]) :- '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2), 主小行列部分の一行を計算する(R1,R3,_u,R4). % *** '_d_2 is _d_1 - _u * _l' / 4 *** '_d_2 is _d_1 - _u * _l'(_u,_l,_d_1,_d_2) :- 分数を含む掛算(_u,_l,Y), 分数を含む減算(_d_1,Y,_d_2). % *** '_uLを主小行列に貼り付ける' / 3 *** '_uLを主小行列に貼り付ける'([],[],[]). '_uLを主小行列に貼り付ける'([_u|_uL],[L1|_LU_2],[[_u|L1]|_LU_3]) :- '_uLを主小行列に貼り付ける'(_uL,_LU_2,_LU_3). 行列の置換(_列,_行,_置換要素,_対象行列,_置換された表) :- list_nth(_行,_対象行列,_対象行), 要素番号によるならびの置換(_列,_置換要素,_対象行,_置換された行), 要素番号によるならびの置換(_行,_置換された行,_対象行列,_置換された表),!. ならびの置換(_対象要素,_置換要素,_対象ならび,_置換ならび) :- append(_前半のならび,[_対象要素|_残り対象要素ならび],_対象ならび), append(_前半のならび,[_置換要素|_残り対象要素ならび],_置換ならび),!. ならびの置換(X,[],X) :- !. ならびの置換([],X,X) :- !. ならびの置換([A|R],[A|R1],[A|R2]) :- ならびの置換(R,R1,R2). ならびの置換([A|R],[B|R1],[A|R2]) :- ならびの置換(R,R1,R2). 要素番号によるならびの置換(_要素番号,_置換要素,_対象ならび,_置換ならび) :- update_list(_要素番号,_置換要素,_対象ならび,_置換ならび),!. update_list(Pos,U,P,Q) :- integer(Pos),!, update_list(1,Pos,U,P,Q). update_list(Pos,U,P,Q) :- not(integer(Pos)), not(Pos =.. [',',Pos1,Rpos]), Pos1 is Pos, update_list(1,Pos1,U,P,Q). update_list(Pos,U,P,Q) :- Pos =.. [',',Pos1,Rpos], update_list(1,Pos1,Rpos,U,P,Q). update_list(_,_,_,_,[],[]):-!. update_list(_,V,Rpos,U,[A|R],[B|R1]) :- var(V),!, update_list(Rpos,U,A,B), update_list(_,V,Rpos,U,R,R1). update_list(E,E,Rpos,U,[A|R],[B|R1]) :- update_list(Rpos,U,A,B), update_list(R,R1). update_list(S,E,Rpos,U,[A|R],[A|R1]) :- S1 is S+1, update_list(S1,E,Rpos,U,R,R1). update_list(E,E,U,[A|R],[U|R1]) :- update_list(R,R1). update_list(S,E,U,[A|R],[A|R1]) :- S1 is S+1, update_list(S1,E,U,R,R1). update_list([],[]):-!. update_list([A|R],[A|R1]) :- update_list(R,R1). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/290 # # tblA # pkey|value # ----+----- # 1  |a # 2  |b # # tblB # pkey|value # ----+----- # 1  |c # # ・欲しい結果 # tblA # pkey|value # ----+----- # 1  |c # 2  |b tblA(1,a). tblA(2,B). tblB(1,c). update(_対象述語/Arity1,_キー位置1,_被置換項位置,_置換指定述語/Arity2,_キー位置2,_置換項位置) :-   length(L1,Arity1),   length(L2,Arity2),   P1 =.. [_対象述語|L1],   P2 =.. [_置換指定述語|L2],   list_nth(_キー位置1,L1,A),   list_nth(_キー位置2,L2,A),   list_nth(_置換項位置,L2,B),   call(P2),   call(P1),   retract(P1),   ならびの位置指定置換(_被置換項位置,B,L1,L3),   P3 =.. [_対象述語|L3],   asserta(P3). document.writeln(""); //--> document.writeln(""); //--> S 1- V50 [PR]KWFbg j[X[PR] # vO (a)-(j)for gB #include<stdio.h> int main() { int a[10]; double sum,ave; sum=0; a[0]=1; a[1]=5; a[2]=7; a[3]=2; a[4]=4; a[5]=1; a[6]=9; a[7]=4; a[8]=20; a[9]=5; sum=sum+a[0];
# /* (a) */ sum=sum+a[1]; /* (b) */ sum=sum+a[2]; /* (c) */ sum=sum+a[3]; /* (d) */ sum=sum+a[4]; /* (e) */ sum=sum+a[5]; /* (f) */ sum=sum+a[6]; /* (g) */ sum=sum+a[7];
# /* (h) */ sum=sum+a[8]; /* (i) */ sum=sum+a[9]; /* (j) */ ave=sum/10; printf("a %d B %d B\n",sum, ave); }
#
# S
# 5A\ヲAt\ヲvOB
# タsF F 3 F 7 F1 F 2 F 5
# \ヲ 3 7 1 2 5 t\ヲ 5 2 1 7 3 vOeLXgRs[eLXgtB[ho\toB

At@xbgtAt@xbg(,[a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x, y,z],[z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a]).
At@xbgtAt@xbg(,['A','B','C','D','E','F','G','H','I','J','K','L', 'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],['Z','Y','X','W','V','U','T','S','R','Q','P','O','N','M','L','K','J','I','H','G','F','E','D','C','B','A']). stack_operation(1,Stack1,Stack) :- write('f[^ :'),get_integer(N),push(N,Stack,Stack2),print_stack_list(Stack2),get_action(N2),stack_operation(N2,Stack2,Stack). pop(A,Stack1,Stack2),write_formatted('|bvf[^%tB \n',[A]),print_stack_list(Stack2),get_action(N2),stack_operation(N2,Stack2,Stack). &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& # t@Ct@CJAf[^L^Bvoid_read_data_file(char*file)A fileOwt@CJAdzW[]liz[]f[^B

@@get_file_info(_pX,[dev(Dev),ino(Ino),mode(Modes),nlink(Nlink),uid (Uid),uname(Uname),gid(Gid),gname(Gname),size(_TCY),atime(Atime),mtime (Mtime),ctime(_IX),blksize(Blksize),blocks(Blocks)]),
@@member(FI,Modes),
@@sub_atom(FI,0,2,_,if),
@@t@C(FI,_).

t@C(ifblk,ubNt@C).
t@C(ifchr,LN^t@C).
t@C(ififo,pCv).
t@C(ifreg,t@C).
t@C(ifdir,fBNg).
t@C(iflnk,V{bNN).

sBsB

VX\ヲ
S O100 100 V50 OF E-mail () :
# 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/474 # # SQL Server Compact 3.5 で、a_tbl と b_tbl のコードが一致した場合に # a_tbl に、b_tblの名前をセットするみたいなことしたいのですが無理ですか? # # UPDATE a_tbl # SET name = b_tbl.name # FROM b_tbl # WHERE a_tbl.no = b_tbl.no # # 実行すると、「FROM 句はこのクエリの種類では使用できません」ってエラーになります。 # SQL Server 2008 だと問題ないのですが・・・ # a_tbl(1,abc). a_tbl(2,add). b_tbl(1,uuu). b_tbl(2,jjj). 'a_tbl と b_tbl のコードが一致した場合に a_tbl に、b_tblの名前をセットする' :-   a_tbl(_no,_name1),   b_tbl(_no,_name2),   update_a_tbl(_no,_name2),   fail. 'a_tbl と b_tbl のコードが一致した場合に a_tbl に、b_tblの名前をセットする'. update_a_tbl(_no,_name2) :-   retract(a_tbl(_no,_)),   assertz(a_tbl(_no,_name2)),   fail. update_a_tbl(_,_). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/877 # # T_USER T_HOGE T_MAG         T_USER # ID|NUM  ID      MAG             ID|NUM # --|---- --      --             --|---- # A | 100  A      100  .→→→    A | 300 # B | 100  A         update結果  B | 200 # C | 100  B                   C | 100 # # 「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果を # T_USER.NUMに対し加算するUPDATE文を書きたいのですが # どうすればよいでしょうか。IDはVARCHAR型です。 # DBMSはMySQL 5.1です。 # # '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文' :- '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(_), fail. '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'. '「T_HOGE.IDがT_USER.IDと一致する数×T_MAG.MAG」の結果をT_USER.NUMに対し加算するUPDATE文'(ID) :- 'T_MAG'(MAG), retract('T_USER'(ID,NUM)), count('T_HOGE'(ID),Count), NUM2 is NUM + MAG * Count, assertz('T_USER'(ID,NUM2)). # 出典:: http://hibari.2ch.net/test/read.cgi/db/1274791771/488 # # updateのwhere in句でワイルカードを使いたいのですが、 # mysqlで、 UPDATE table SET col='新しいデータ' where col in ('001古%', '003古%'.) としたのですが、 # 上手く出来ませんでした。 # # どうしたら出来るのでしょうか。 # # % 新しいデータ(新しいデータ). 節の定義順を保って述語を更新したい :- findall(_col,retract(table(_col)),L), append(_,[A|R],L), update_data(A,B), assertz(table(B)), R = [],!. update_data(_col,_新しいデータ) :- sub_atom(_col,0,4,_,'001古'),新しいデータ(_新しいデータ),!. update_data(_col,_新しいデータ) :- sub_atom(_col,0,4,_,'003古'),新しいデータ(_新しいデータ),!. update_data(_col,col). # 出典:: http://pc11.2ch.net/test/read.cgi/db/1252492296/471 # # 【質問テンプレ】 # ・DBMS名とバージョン: SQLite 3 # ・テーブルデータ:長いため下記に記載 # ・欲しい結果:RSSリーダ(brief)のデータ(*.sqlite)から特定の記事データを削除したいです。 # ・説明:長いため下記に記載 # # ●テーブルデータ # ======================================================================================================================= # ■entries #  | id | feedID | primaryHash | secondaryHash | providerID | entryURL | date | read | updated | starred | deleted | bookmarkID | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text #  | title | content | authors | tags | # ----------------------------------------------------------------------------------------------------------------------- # ■entries_text_content #  | docid | c0title | c1content | c2authors | c3tags | # ----------------------------------------------------------------------------------------------------------------------- # ■sqlite_sequence #  | name | seq | # ======================================================================================================================= # # 1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除。 # # 2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した #   [id]フィールドと同じ値のレコードも削除。 # # 3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と #   同じレコード番号のレコードを削除。 ※idフィールドがない為 # # 4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 #   【entries】テーブルの[id]フィールド #   【entries_text_content】テーブルの[docid]フィールド # # 5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。 # # 6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を #   設定したい。 # # お手数ですが、以上よろしくお願いします。 # # '1.【entries】テーブルの[deleted]フィールドが「 2 」の場合に、そのレコードを削除' :- findsetof(_id,( entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), _deleted = '2'), L1), retract_all(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,'2',_bookmarkID)), findsetof(_docid,( member(_id,L1), entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)), _docid = _id), L2), '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2), '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1),!. '2.同時に、【entries_text_content】テーブルの[docid]フィールドが、1.で削除した[id]フィールドと同じ値のレコードも削除。'(L2) :- member(_docid,L2), retract_all(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags)),!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(L1) :- append(_,[Nth|R],L1), 節の定義位置指定による節の削除(L2,Nth), R = [],!. '3.更に同時に、【entries_textテーブル】から、1.で削除した[idフィールド]の値(数字)と同じレコード番号のレコードを削除。'(_). 節の定義位置指定による節の削除(L2,Nth) :- findall((Head :- Body),( clause(entries_text(_title,_content,_authors,_tags),Head,Body)), L2), list_nth(Nth,L2,P), retract(P),!. '4.その後、下記のフィールドの値を、1・2・3〜とリナンバリングしたい。 【entries】テーブルの[id]フィールド 【entries_text_content】テーブルの[docid]フィールド' :- findall(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),( retract(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID))), L1), append(L01,[entries(_,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)|R1],L1), length([_|L0],Nth1), assertz(entries(Nth1,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID)), R1 = [], findall(entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags),( retract(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags))), L2), append(L02,[entries_text_contents(_,_c0title,_c1content,_c2authors,_c3tags)|R2],L2), length([_|L02],Nth2), assertz(entries_text_contents(Nth2,_c0title,_c1content,_c2authors,_c3tags)), R2 = [],!. '5.そして、1.2.3.の三つのテーブルのレコード数がどれも同じ数だけあるか確認。'(Count) :- count(entries(_id,_feedID,_primaryHash,_secondaryHash,_providerID,_entryURL,_date,_read,_updated,_starred,_deleted,_bookmarkID),Count), count(entries_text_contents(_docid,_c0title,_c1content,_c2authors,_c3tags),Count), count(entries_text(_title,_content,_authors,_tags),Count). '6.最後に、【sqlite_sequence】テーブルの[seq]フィールドに5.で確認したレコード数を設定したい。'(Count) :- retract(sqlite_sequence(_name,_seq)), assertz(sqlite_sequence(_name,Count),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/374 # # [1]授業単元:オペレーティングシステム論 # [2]課題:適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。 # それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する。 # これを10万回繰り返すプログラムを作成し、HD、SSD、USBフラッシュメモリ等のデバイスの差 # 処理時間がどのくらい変わるかテストするプログラムを作成せよ # [3] OS:Windows IDE:Visual studio 2008 言語:C # [4] 6/15まで # [5] ディスクキャッシュが大きいとディスクに短期間では確実に書き込まれるとは限らないので、ファイルを100個作って1000回 # 繰り返すプログラムにしたほうが良い # とのことです。 # コードだけでなく、実行時間もお願いします。 # # '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする。それをクローズし、そのファイルを開き、すべてのビットを反転させた内容に置換する' :- '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream), それをクローズし(Outstream), 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File). '適当な名前の大きさ100Mバイトのバイナリファイルを作成し、内容を乱数バイト配列とする'(File,Outstream) :- tmpnam(File), open(File,write,Outstream,[type(binary)]), for(1,N,100000000), Code is random(256), put_byte(Outstream,Code), N = 100000000,!. それをクローズし(Outstream) :- close(Outstream). 'そのファイルを開き、すべてのビットを反転させた内容に置換する'(File) :- open(File,update,Updatestream,[type(binary)]), repeat, ( at_end_of_stream(Updatestream); get_byte(Updatestream,Byte), Byte1 is Byte - 255, put_byte(Updatestream,Byte1), fail ), close(Updatestream). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1307166756/478 # # [1] 授業単元:プログラム実行カウンタの作成 # [2] 問題文(含コード&リンク): # log.txtのファイルを利用して、作成したプログラムが何回目の実行かを画面表示するプログラムを作成しなさい # なお、簡単のため、log.txtには初めに0と入力し、保存しておいてもかまわない # 'log.txtのファイルを利用して、作成したプログラムが何回目の実行かを画面表示するプログラムを作成しなさい' :- open('log.txt',update,Updatestream), readln(Updatestream,[N]), N2 is N + 1, write(Updatestream,N2), close(Updatestream),!, writef('このプログラムは%t回目の実行です\n',[N2]),!. # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/411 # # MySQL 5.1.46 # #   ≪item≫ # ───────── # id  name  category # ───────── # 1  Name1   2 # 2  Name2   1 # 3  Name3   1 # 4  Name4   6 # 5  Name5   4 # 6  Name6   8 # 7  Name7   2 # 8  Name8   2 # ───────── # # item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い # # UPDATE item SET category = 7 WHERE category = 2 # # を発行したのですが、うまく動作しません。 # こういう場合にうまくいく方法を教えてください。 # # 'item 内のデータについて、 category が 2 のものだけ category の値を 7 に振り替えたいと思い' :- 節順序を変更するupdate(item/3,[[3,2]],[[3,7]]). 節順序を変更するupdate(_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L) :- 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび,L),!. 節順序を変更するupdate(先頭,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを先頭に付加する(_述語名,L),!. 節順序を変更するupdate(末尾,_述語名/_アリティ,_鍵情報ならび,_更新情報ならび) :- length(L1,_アリティ), 鍵情報を設定する(_鍵情報ならび,L1), _述語 =.. [_述語名|L1], findall(L2,( retract(_述語), 更新情報を設定する(_更新情報ならび,L1,L2)), L), 更新ならびを末尾に付加する(_述語名,L),!. 更新ならびを先頭に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], asserta(_述語3), R = []. 更新ならびを末尾に付加する(_述語名,L) :- append(_,[L3|R],L), _述語3 =.. [_述語名|L3], assertz(_述語3), R = []. 鍵情報を設定する([],L). 鍵情報を設定する([[_鍵位置,_鍵]|R],L) :- nth1(_鍵位置,L,_鍵), 鍵情報を設定する(R,L). 更新情報を設定する([],L,L). 更新情報を設定する([[_更新位置,_更新値]|R1],L1,L) :- append(L0,[_|R],L1), length([_|L0],_更新位置), append(L0,[_更新値|R],L2), 更新情報を設定する(R1,L2,L). # 出典:: http://hibari.2ch.net/test/read.cgi/db/1316769778/153 # # if select * from t where id=1 # then update t set foo=bar where id=1 # # これをSQLで表現したいのですが可能でしょうか? # # 'if select * from t where id=1 then update t set foo=bar where id=1' :- '1要素のupdate'(t,id1,'1',foo,bar). '1要素のupdate'(_テーブル名,_鍵属性名,_鍵値,_置換属性名,_置換する値) :- 組構造を得る(_テーブル名,_属性名ならび), 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,P), 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換する項), retract(_現在の項), '置換される組の変数部分だけ元の値に単一化する'(_現在の組,_置換する組), asserta(_置換する項). 組構造を得る(_テーブル名,_属性名ならび) :- findall([_属性番号,_属性名],( テーブル構造(_テーブル名,_属性番号,_属性名)), L1), sort(L1,L2), findall(_属性名,( member([_,_属性名],L2)), _属性名ならび). 置換する値を設定された項を作る(_テーブル名,_属性ならび,_置換属性名,_置換する値,_置換する組,_置換項) :- 置換する組(_属性名ならび,_置換する組), 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組), _置換項 =.. [_テーブル名|_置換する組]. 鍵値を設定された項を作る(_テーブル名,_属性ならび,_鍵属性名,_鍵値,_現在の組,_現在の項) :- 現在の組(_属性名ならび,_現在の組), 鍵を現在の組に設定(_属性名ならび,_鍵属性名,_鍵値,_現在の組), _現在の項 =.. [_テーブル名|_現在の組]. 現在の組(_属性名ならび,_現在の組) :- length(_属性名ならび,Len), length(_現在の組,Len). 置換する組(_属性名ならび,_置換する組) :- length(_属性名ならび,Len), length(_置換する組,Len). 鍵を現在の組に設定(_属性名ならび,_鍵名,_鍵値,_現在の組) :- nth1(_鍵属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_現在の組,_鍵値),!. 置換する値を置換する組に設定(_属性名ならび,_置換属性名,_置換する値,_置換する組) :- nth1(_置換属性名の位置,_属性名ならび,_鍵属性名), nth1(_鍵属性名の位置,_置換する組,_鍵値),!. '置換する組の変数部分だけ元の値に単一化する'([],[]). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[A|R2]) :- '置換する組の変数部分だけ元の値に単一化する'(R1,R2). '置換する組の変数部分だけ元の値に単一化する'([A|R1],[B|R2]) :- \+(A = B), '置換する組の変数部分だけ元の値に単一化する'(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/666 # # SQLite3を使っています。 # # カラムがなかったらinsert # あったらupdateしたいのですが、 # どういうSQLをかけばいいのでしょうか? # # insert into t1(c1, c2) values("hoge",10) # update t1 set c2=10 WHERE c1="hoge" # このときc1はuniqueです。 # # よろしくお願いします。 # # 'カラムがなかったらinsert あったらupdateしたい'(_テーブル,_カラムならび,_鍵カラム,_鍵値) :- findall(_カラム,( テーブル定義(_テーブル,_番目,_カラム)), L1), 鍵値をセットする(_テーブル,_鍵カラム,_鍵値,P), 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび). 鍵値をセットする(_テーブル,L1,_鍵カラム,_鍵値,P) :- length(L1,Len), length(L2,Len), nth1(Nth,L1,_鍵カラム), nth1(Nth,L2,_鍵値), P =.. [_テーブル|L2]. 'カラムがなかったらinsert あったらupdateしたい'(P,_テーブル,_カラムならび) :- call(P),!, ( retract(P), Q =.. [_テーブル|_カラムならび], asserta(Q), fail; true). 'カラムがなかったらinsert あったらupdateしたい'(_,_テーブル,_カラムならび) :- Q =.. [_テーブル|_カラムならび], asserta(Q). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1335517816/996 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/30Mz7Pbj # このプログラムで何番目の値段をかえるではなく # 名前を聞かれてその名前の値段をかえるプログラムにする。 # # #include # #include # main() # { # struct goods{ # char name[20]; # char price[5]; # }record; # FILE *fp; # int max,size,num; # long top,end,locat,ftell(); # fp=fopen("file1","r+"); # if(fp==NULL){ # printf("open error"); # exit(1); # } # size=sizeof(record); # fseek(fp,0L,2); # end=ftell(fp); # fseek(fp,0L,0); # top=ftell(fp); # max=(end-top)/size; # do{ # printf("rec no?\n"); # scanf("%d",&num); # }while(num<1||num>max); # locat=size*(num-1); # fseek(fp,locat,0); # fread(&record,size,1,fp); # printf("name=%s price=%s\n" # ,record.name,record.price); # printf("Current price\t:%s\n",record.price); # printf("New price?\t:"); # scanf("%s",record.price); # fseek(fp,-size,1); # fwrite(&record,size,1,fp); # fclose(fp); # printf("update....ended\n"); # } 'ファイル内の名前を鍵に指定して値段をかえる'(_ファイル名,_更新対象氏名,_値段) :- 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名), 値段の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた値段), open(_ファイル名,update,InOuttream), '名前を指定して値段をかえる'(InOutstream,_末尾に空白を埋めた対象氏名,_末尾に空白を埋めた値段), close(InOututstream). 更新対象氏名の末尾に空白を埋める(_更新対象氏名,_末尾に空白を埋めた更新対象氏名) :- length(L,20), atom_chars(_更新対象氏名,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた更新対象氏名,L). 値段の末尾に空白を埋める(_値段,_末尾に空白を埋めた値段) :- length(L,5), number_chars(_値段,Chars), append(Chars,L2,L), all(L2,' '), atom_chars(_末尾に空白を埋めた値段,L). '名前を指定して値段をかえる'(InOutstream,_,_) :- at_end_of_stream(InOutstream),!. '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段) :- 氏名を読み更新する(InOutstream,_更新対象氏名,_値段), 価格を更新する(InOutstream), '名前を指定して値段をかえる'(InOutstream,_更新対象氏名,_値段). 氏名を読み更新する(InOutstream,_更新対象氏名,_値段) :- findall(_文字,( between(1,20,N), get_char(InOutstream,_文字)), L), 更新対象氏名の時は価格も更新する(InOutstream,_更新対象氏名,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- atom_chars(_更新対象氏名,L), writef(InOutstream,'%t',[_更新対象氏名]), 価格を更新する(InOutstream,_値段). 更新対象氏名の時は価格も更新する(InOutstream,L,_更新対象氏名,_値段) :- \+(atom_chars(_更新対象氏名,L)), 価格をそのまま書く(InOutstream). 価格を更新する(InOutstream,_値段) :- writef(InOutstream,'%t',[_値段]). all([],_). all([A|R],A) :- all(R,A). # 出典:: http://toro.2ch.net/test/read.cgi/db/1316769778/787 # # id5とid10という2つの情報しかないのですが # id5がもつc1とid10がもつc1を交換するとき # どういうクエリーをかけばよいでしょうか? # # 1.select c1 from t where id=5 or id=10 order by id # 2.begin transaction # 3.update t set c1=? where id=5 (?は1でとったid10のc1値) # 4.update t set c1=? where id=10 (?は1でとったid5のc1値) # 5.commit # # 自分の能力ではこんな手順が限界ですが # サブクエリーを駆使したらupdate1文でいけたりするのでしょうか? # もしできたらどんな感じの文になるか教えていただきたいです # 'id5とid10という2つの情報しかないのですがid5がもつc1とid10がもつc1を交換する' :- '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置), idが5の処理(_引数の数,_c1の位置,_idの位置), idが10の処理(_引数の数,_c1の位置,_idの位置), 交換する(L0_1,L0_2,R1,R2). '引数の数,c1の位置,idの位置'(_引数の数,_c1の位置,_idの位置) :- findmax(_位置,( テーブル定義(t,_位置,_), _引数の数), テーブル定義(t,_c1の位置,c1), テーブル定義(t,_idの位置,id). idが5の処理(_引数の数,_c1の位置,_idの位置,L0_1,R1) :- 'idが5のデータを一旦削除する'(_引数の数,_c1の位置,_idの位置,L1), 'L1をc1の前と後に分解'(L1,L0_1,R1). idが5のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L1) :- length(L1,_引数の数), P =.. [t|L1], nth1(_c1の位置,L1,_c1_1), nth1(_idの位置,L1,5), retract(P). idが10の処理(_引数の数,_c1の位置,_idの位置,L0_2,R2) :- idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2), 'L1をc1の前と後に分解'(L2,L0_2,R2). idが10のデータを一旦削除する(_引数の数,_c1の位置,_idの位置,L2) :- length(L2,_引数の数), P =.. [t|L2], nth1(_c1の位置,L2,_c1_2), nth1(_idの位置,L2,10), retract(P). 'L1をc1の前と後に分解'(L1,L0_1,R1) :- length([_|L0_1],_c1の位置), append(L0_1,[A|R1],L1). 交換して定義する(L0_1,L0_2,R1,R2) :- append(L0_1,[B|R1],L1), append(L0_2,[A|R2],L2), P_1 =.. [t|L1], P_2 =.. [t|L2], asserta(P_1), asserta(P_2). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/598 # # mysql 5.5 # # テーブル master # tcode # tname # lastdate # 〜 # # daily_data # select tcode,max(tdate) as maxdate # from daily_date # group by tcode; # # このdaily_dateから得られるmaxdateを使って # masterのtcodeの対応するlastdateに入れたいのですが、 # どのようにupdateを書けば良いのでしょうか? # 'daily_dateから得られるmaxdateを使ってmasterのtcodeの対応するlastdateに入れたい' :- dail_dateテーブルの構造(P1,_daily_date_tcode,_date), masterテーブルの構造(P2,_master_tcode,_lastdate), findsetof(_tcode,P1,L1), 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate),!. daily_dateテーブルの構造(P,_tcode,_date) :- count(テーブル定義(daily_date,_,_),_アリティ), length(L,_アリティ), P =.. [daily_date|L], tcodeとdateの列位置を確定する(L,_tcode,_date),!. tcodeとdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(daily_date,_nth1_tcode,tcode), テーブル定義(daily_date,_nth1_date,date), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_date),!. masterテーブルの構造(P,_tcode,_date) :- count(テーブル定義(master,_,_),_アリティ), length(L,_アリティ), P =.. [master|L], tcodeとlastdateの列位置を確定する(L,_tcode,_lastdate),!. tcodeとlastdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(master,_nth1_tcode,tcode), テーブル定義(master,_nth1_lastdate,lastdate), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_lastdate),!. 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate) :- forall(( member(_tcode,L1), findmax(_date,P1,_maxdate), lastdateの更新(_maxdate,P2,_tcode,_lastdate)), true). lastdateの更新(_maxdate,P,_tcode,_lastdate) :- retract(P), _lastdate = _maxdate, asserta(P),!. lastdateの更新(_maxdate,P,_tcode,_lastdate) :- _lastdate = _maxdate, asserta(P),!. # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/635 # # 質問です、お願いします # id|col1|col2 という構成のテーブルがあります # # これに対して、以下のような条件と動作を実現したいと思います # 1)更新できるのはcol2が0の場合のみ # 2)更新できた場合、'updated'を返す # 3)もし、col2が0以外の場合、'update_fail' という値を返す # # どんなクエリ文を書いたら良いんでしょうか # (利用してるDBはmysql5です) # # 'id|col1|col2 という構成のテーブルがあります これに対して、以下のような条件と動作を実現したいと思います 1)更新できるのはcol2が0の場合のみ 2)更新できた場合、\'updated\'を返す 3)もし、col2が0以外の場合、\'update_fail\' という値を返す どんなクエリ文を書いたら良いんでしょうか'(_id,_新しい_col1,_新しい_col2) :- クエリ文(_id,_新しい_col1,_新しい_col2). クエリ文(_id,_新しい_col1,_新しい_col2) :- '更新できるのはcol2が0の場合のみそれ以外は\'update_fail\'を返す'(_id),!. クエリ文(_id,_新しい_col1,_新しい_col2) :- '更新できた場合、\'updated\'を返す'(_id,_新しい_col1,_新しい_col2),!. クエリ文(_id,_新しい_col1,_新しい_col2) :- 'idが存在しない場合、\'update_fail not found id\'を返す'(_id). '更新できるのはcol2が0の場合のみそれ以外は\'update_fail\'を返す'(_id) :- table(_id,_col1,_col2), \+(_col2 = 0), writef('update_fail :: table(%q,%q,%q).\n',[_id,_col1,_col2]),!. '更新できた場合、\'updated\'を返す'(_id,_新しい_col1,_新しい_col2) :- retract(table(_id,_col1,0)), asserta(table(_id,_新しい_col1,_新しい_col2)), writef('updated :: table(%q,%q,%q).\n',[_id,_新しい_col1,_新しい_col2]),!. 'idが存在しない場合、\'update_fail not found id\'を返す'(_id) :- writef('update_fail not found id :: %q\n',[_id]). # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/662 # # 1つのupdate文に set と条件 の組を複数指定できませんか。 # update table_foo # set x = new1 where x = old1, # set y = new2 where y = old2, # set z = new3 where y = old3 # みたいなことがしたい。 # # :- dynamic(table_foo/3). '1つのupdate文に set と条件 の組を複数指定できませんか。 update table_foo set x = new1 where x = old1, set y = new2 where y = old2, set z = new3 where y = old3 みたいなことがしたい。'(_x_1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3) :- retract(table_foo(_x_1,_y_1,_z_1)), 更新_1(_x_1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z). assertz(table_foo(_x,_y,_z)). 更新_1(_old1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z) :- 更新_2(_new1,_y_1,_z_1,_old1,_old2,_old3,_new1,_new2,_new3,_x,_y,_z),!. 更新_1(_x_1,_y_1,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z) :- 更新_2(_x_1,_y_1,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z). 更新_2(_x,_old2,_z_1,_,_old2,_old3,_,_new2,_new3,_x,_y,_z) :- 更新_3(_x,_new2,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z),!. 更新_2(_x,_y,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z) :- 更新_3(_x,_y,_z_1,_,_,_old3,_,_,_new3,_x,_y,_z). 更新_3(_x,_y,_old3,_,_,_old3,_,_,_new3,_x,_y,_new3) :- !. 更新_3(_x,_y,_z,_,_,_,_,_,_,_x,_y,_z). % 以下のサイトは # 出典 :: 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)). % 以下のサイトは % % SWI-Prolog のコマンド引数の内、ユーザパラメータ部分をリストに得る。 % user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/348 # # [1] C言語演習 # # [2] argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 # 但し、第一引数だけは別の配列(ary)に格納はしないこと。 # 例)argv:./test a b c d e f # 例)ary :./test b c d e f # # [3.1] redhat # [3.3] C言語 # [4] 本日中 # [5] 制限:なし # わかる方どうかよろしくお願いします。 # # 'argvで指定された可変引数個数の情報を別の配列(ary)に格納せよ。 但し、第一引数だけは別の配列(ary)に格納はしないこと'(UserParameterList) :- user_parameters([_|UserParameterList]),!. user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/425 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 与えた文字列を指定した回数繰り返す文字列に変換するプログラムを作成しなさい。 # ただし、main関数を以下のように宣言し、実行時に引数をとれるようにする。 # 第一引数は繰り返し回数とし、第二引数は繰り返される文字列とする。 # すなわち、./prog 3 "ABC"と実行した場合は、ABCABCABCとなる文字列が作られる。 # 作られた文字列は、表示すること。必要に応じて、数字を数値に変換する関数atoi()を使用してもよい。 # その際は、#include<stdlib.h>を加えること。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc,char*argv[]){ # /** argc:引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:引数**/ # x=atoi(argv[1]);/*atoiの使用例*/ # return(0); # } # program :- 与えた文字列を指定した回数繰り返す文字列に変換する. 与えた文字列を指定した回数繰り返す文字列に変換する :- user_parameters([_回数文字列,_文字列]), atom_to_term(_回数文字列,_回数,_), length(Ln,_回数), append(_,[_|R],Ln), write(_文字列), R = []. user_parameters(A) :- current_prolog_flag(argv, B), append(_, [--|A], B). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1308749241/639 # # [1] C言語演習 # [2] argvで入力された引数 "123:456:78:90" の様な文字列を ":" 区切りで # 別の配列へ順に格納せよ。(strchr関数を使いなさい) # 上記の例では、[0]=123,[1]=456,[2]=78,[3]=90となる。 # 尚、::の連続もありで、"12:34::90" は [0]=12,[1]=34,[2]=null,[3]=90となる。 # # 下の様に処理しているが、スマートに行きません。。。 # p = NULL; # p = strchr(str, ':'); # while (p != NULL) { # printf("length %d\n", strlen(str)-strlen(p)); # p++; # p = strchr(p, ':'); # } # 'argvで入力された引数 "123:456:78:90" の様な文字列を ":" で区切り、プログラム引数述語のリスト引数とする' :- user_parameters([_引数文字列]), split(_引数文字列,[':'],L), assertz(プログラム引数(L)). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/682 # # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(0,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,0,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,1,0,'OK') :- !. 組み合わせて使用した場合にNGを出力する(0,0,1,'OK') :- !. 組み合わせて使用した場合にNGを出力する(1,1,0,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,0,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(0,1,1,'NG') :- !. 組み合わせて使用した場合にNGを出力する(1,1,1,'NG') :- !. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1311089619/699 # # ../test/read.cgi/tech/1311089619/682について内容が不足していたので再投稿します。 # [1] 授業単元:C言語演習 # [2] 問題文:引数argvに以下の3種類がある。 # 組み合わせて使用した場合にNGを出力しなさい。 # [3] フラグ・判定にビット演算を使用してください。 # 例) # 0 ... 指定なし # 1 ... 指定あり # 引数 | --a | --b | --c | # -----+-----+-----+-----+------ # | 0 | 0 | 0 | OK # | 0 | 0 | 1 | OK # | 0 | 1 | 0 | OK # | 0 | 1 | 1 | NG # | 1 | 0 | 0 | OK # | 1 | 0 | 1 | NG # | 1 | 1 | 0 | NG # | 1 | 1 | 1 | NG # '引数argvに以下の3種類がある。組み合わせて使用した場合にNGを出力する。判定はビット演算を使う' :- current_prolog_flag(argv,ParameterList), パラメータ解析(ParameterList,_a,_b,_c), 組み合わせて使用した場合にNGを出力する(_a,_b,_c,_診断), writef('%t\n',[_診断]). パラメータ解析([_プログラム名|L],_a,_b,_c) :- findall(Y,( member(X,[a,b,c]), member(A,L), split(A,['--','='],[X,Y])), [_a,_b,_c]). 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'OK') :- 0 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. 組み合わせて使用した場合にNGを出力する(_a,_b,_c,'NG') :- 1 is (_a /\ _b) \/ (_a /\ _c) \/ (_b /\ _c),!. # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1309076891/453 # # 【 課題 】コマンドラインから入力された点数を集計するプログラムを作成。 #       ソースファイルにコードを追加して、以下の実行結果になるように。 # # 実行結果  #       java CalcMain 69 88 70 45 95 33 #       高得点順: 95点 , 88点 , 70点 , 69点 , 45点 , 33点 #       科目数:6科目 #       合計点:400点 #       平均点: 66.666664点 #        CalcMainクラスはmain()メソッドを持つ。 #        Calculationクラスは、合計点の計算をするgetTotal()メソッド、平均点の計算をするgetAve()メソッド、並び替え処理を行うsort()メソッドを持つ。 #        コマンドライン引数から受け取った不特定数の数値(点数)について、降順並び替え表示、科目数、合計点、平均点の表示を行う。 #        sort()メソッドの並び替え処理には「バブルソート」を使用する # # #       ソースファイル #       http://ime.nu/www.dotup.org/uploda/www.dotup.org2249012.java.html # # http://ime.nu/www.dotup.org/uploda/www.dotup.org2249060.java # # # # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11月14日まで # 【 Ver  】java version "1.6.0_22" # 【 用語 】 # 【 補足 】よろしくお願いします。 # # 'コマンドラインから入力された点数を集計するプログラムを作成。ソースファイルにコードを追加して、以下の実行結果になるように。' :- コマンドラインから入力された点数(_コマンドラインから入力された点数ならび), 高得点順に表示(_コマンドラインから入力された点数ならび), 科目数と合計点と平均点の表示(_コマンドラインから入力された点数ならび). コマンドラインから入力された点数(_コマンドラインから入力された点数ならび) :- current_prolog_flag(argv,_コマンドライン), append(_,['--'|_コマンドラインから入力された点数ならび],_コマンドライン]). 高得点順に表示(L) :- バブルソート降順(L,L2), concat_atom(L2,',',_表示文字列), writef('高得点順: %t\n',[_表示文字列]). 科目数の表示(L,_科目数) :- length(L,_科目数), writef('科目数: %t\n',[_科目数]), 科目数と合計点と平均点の表示(L) :- length(L,_科目数), sum(L,_合計点), _平均点 is _合計点 / _科目数. writef('科目数: %t\n合計点: %t\n平均点: %t\n',[_科目数,_合計点,_平均点]). バブルソート降順(_対象ならび,_整列済みならび) :- 降順交換(_対象ならび,_対象ならびの一), !, バブルソート降順(_対象ならびの一,_整列済みならび). バブルソート降順(_整列済みならび,_整列済みならび). 降順交換([],[]) :- !,fail. 降順交換([A,B|R],[B,A|R]) :- A @< B,!. 降順交換([A|R1],[A|R2]) :- 降順交換(R1,R2). # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1320365280/670 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # #include<stdio.h> # int main(void) # { # int i=0; # char *ptr; # char str[128]; # # ptr = str; # # scanf("%s",&str); # # while(*ptr++){ # i++; # } # # printf("%d\n",i); # } # # 上記の入力したテキストの文字数を表示するプログラムの読み込み部分をファイル処理に変更せよ。 # fgetc() 関数を使用し、コマンドラインにファイル名が指定できるようにすること。 # ただし、ファイル名を指定しない場合は標準入力とする。 # ファイルが見つからなかった時はエラーメッセージを出し、プログラムを終了する。 # 'length系組込述語を使わず入力したテキストの文字数を表示する' :- get_chars(_文字ならび), ならびの文字数を数える(_文字ならび,_文字数), writef('文字数は %t文字です\n',[_文字数]). ならびの文字数を数える([],0). ならびの文字数を数える([_|R],_文字数) :- ならびの文字数を数える(R,_文字数_1), _文字数 is _文字数_1 + 1. 読み込み部分をファイル処理に変更する :- コマンドラインからファイル名を取り出す(_ファイル名), 読み込み部分をファイル処理に変更する(_ファイル名). 読み込み部分をファイル処理に変更する(user_input,_文字数) :- ファイルから読み出しながら文字数を数える(user_input,_文字数). 読み込み部分をファイル処理に変更する(_ファイル名,_文字数) :- open(_ファイル名,read,Instream), ファイルから読み出しながら文字数を数える(Instream,_文字数), close(Instream). ファイルから読み出しながら文字数を数える(Instream,0) :- at_end_of_stream(Instream),!. ファイルから読み出しながら文字数を数える(Instream,_文字数) :- get_char(Instream,_), ファイルから読み出しながら文字数を数える(Instream,_文字数_1), _文字数 is _文字数_1 + 1. コマンドラインからファイル名を取り出す(_ファイル名) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList), ParameterList = [_ファイル名|_],!. コマンドラインからファイル名を取り出す(user_input). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1309076891/613 # # 明日までの課題です。 # まったくわかりません。 # # キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力するプログラムを書きなさい。 # なお、プログラムは次の要件を満たすこと。 # # 1.キーボードからの入力は、Enter(return)キーを2回連続して入力すると終了する # 2.入力終了後、画面に入力した行数を表示する # 3.コマンドラインからプログラムを起動後、入力する文字列に各自の氏名(ローマ字表記)を含めた場合、入力処理終了後、各自の氏名を含む行は何行目にあり、その行の文字列が何であるか表示する。 # 氏名が入力データに含まれていない場合には、含まれていなかったことを表示する # # よろしくお願いします。 # # program :- 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する' :- user_parameters([_ファイル名]), open(_ファイル名,write,Outstream), get_line(Line), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,[]), close(Outstream). 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,'',Ln) :- length(Ln,_行数), writef('行数は %t です\n',[_行数]),!. 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line,Ln) :- writef(Outstream,'%t\n',[Line]), get_line(Line_2), 'キーボードから入力するテキスト(文字列)をコマンドラインでファイル名を指定したファイルに出力する'(Outstream,Line_2,[_|Ln] user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/59 # # [1] 授業単元: c言語 # [2] 問題文(含コード&リンク): # main関数を以下のように宣言し、実行時に引数を取れるようにする。 # 引数がすべて得点であるとして、その平均値を # 求めるプログラムを作成しなさい。 # すなわち、 # ./prog 50 70 90 と実行した場合は、70と表示される。 # 必要に応じて、数字を数値に変換する関数atoi()や # atof()を使用してもよい。 # # #include <stdio.h> # #include <stdlib.h> # int main( int argc, char *argv[] ) { # /** argc: 引数の個数、argv[0]:プログラム名、argv[1]〜argv[n]:実数 **/ # x = atof( argv[1] ); /* atofの使用例 */ # return(0); # } # # ※ 配列のサイズなど、定数は必ず#defineを利用すること. # ※ 表示や入力を目的とする関数以外では、 # 関数の中で標準入力や標準出力への入出力は行わないこと. # # #  [3.1] OS:Linux #  [3.2] コンパイラ名とバージョン:gcc #  [3.3] 言語: c言語 # [4] 期限: 6月15日 # よろしくお願いします! # # program :- user_parameters(_ユーザパラメータならび), プログラム引数を整数ならびに変換(_ユーザパラメータならび,_整数ならび), avg(整数ならび,_相加平均), writef('%t\n',[_相加平均]). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). プログラム引数を整数ならびに変換([],[]). プログラム引数を整数ならびに変換([A|R1],[N|R2]) :- atom_to_term(A,N,_), integer(N), プログラム引数を整数ならびに変換(R1,R2). プログラム引数を整数ならびに変換([_|R1],R2) :- プログラム引数を整数ならびに変換(R1,R2). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/642 # # [1] 授業単元:C言語演習 # [2] 問題文: # 実行ファイル名をmultiとして、multiに続いて2つの正の整数を入力すると、小さい方の整数から大きい方の整数までの積を出力するプログラムを作成せよ。 # 但し、入力時には小さい方の整数、大きいほうの整数の順で入力されるものとする。 # <入力例>$./multi 3 6 # <計算結果>360 # program :- user_parameters([_引数1,_引数2]), 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2), user_parameters(ParametersList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). 小さい方の整数から大きい方の整数までの積を出力する(_引数1,_引数2) :- atom_number(_引数1,N1), atom_number(_引数2,N2), 小さい方の整数と大きい方の整数(N1,N2,_小さい方の整数,_大きい方の整数), 小さい方の整数から大きい方の整数までの積を(_小さい方の整数,_大きい方の整数,_積), 出力する(_積). 小さい方の整数と大きい方の整数(N1,N2,N1,N2) :- N1 =< N2. 小さい方の整数と大きい方の整数(N1,N2,N2,N1) :- N1 > N2. 小さい方の整数から大きい方の整数までの積を(N,N,N). 小さい方の整数から大きい方の整数までの積を(N,_大きい方の整数,_積) :- N < _大きい方の整数, N1_2 is N1 + 1, 小さい方の整数から大きい方の整数までの積を(N_2,_大きい方の整数,_積_2), _積 is _積_2 * N. 出力する(_積) :- writef('%t\n',[N]). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1349527750/786 # # C言語 # gcc # Linux # 問題:cat関数を作りなさい。ただし、fgets,fputsを用いること。です。 # # 明日のお昼までにお願いします。 # # cat :- user_parameters([]), get_code(user_input,Code), ストリームから読み取り書き出す(user_input,Code),!. cat :- user_parameters(L), append(_,[File|R],L), ファイルを書き出す(File), R = [],!. ファイルを書き出す(File) :- open(File,read,Instream), get_code(Instream,Code), ストリームから読み取り書き出す(Instream,Code), close(Instream). ストリームから読み取り書き出す(_,-1) :- !. ストリームから読み取り書き出す(Instream,Code_1) :- put_code(Code_1), get_code(Instream,Code_2), ストリームから読み取り書き出す(Instream,Code_2). user_parameters(UserParameterList) :- current_prolog_flag(argv,ParameterList), append(_,['--'|UserParameterList],ParameterList). % % SWI-Prologの起動は % # swipl -t cat -f プログラムファイル名 -- ファイル1 ファイル名2 ... % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/907 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # 以下のようにmain関数を定義し、mainの引数を合計するプログラムsumを作成せよ。ただし、引数の数は未定であり、実行時に決定されるものとする。 # int main(int argc, char *argv[]) # main :- 利用者引数ならび(_利用者引数ならび), findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値ならび), sum(_数値ならび,_合計), writef('%t\n',[_合計]). sum([],0). sum([_数値|R],_合計) :- sum(R,_合計_1), _合計 is _数値 + _合計_1. 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). % % # swipl --quiet -f c161_907.html -g main -- 33.0 25.1 38.4 % 96.5 % # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/957 # # [1] 授業単元:C言語入門 # [2] 問題文(含コード&リンク): # コマンド行から複数の数値を受け取りその平均値を出力するプログラムを # 作成し、プログラムリストと実行結果を示せ。ヒント:受け取った文字列を # double型に変換するには、関数double atof(const char *nPtr)を使う。 # この関数を使うには<stdlib.h>のインクルードが必要である。 # #include <stdio.h> # #include <stdlib.h> # int main(void) # { # char str[]="1.41421356"; # double x; # x = atof(str); # } # 'コマンド行から複数の数値を受け取りその平均値を出力する' :- 利用者引数ならび(_利用者引数ならび), 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび), 相加平均(_数値引数ならび,_相加平均), writef('平均値は %t です\n',[_相加平均]). 利用者引数ならび(_利用者引数ならび) :- current_prolog_flag(argv, _コマンド引数ならび), append(_, [--|_利用者引数ならび], _コマンド引数ならび). 数値引数ならびに変換(_利用者引数ならび,_数値引数ならび) :- findall(_数値,( member(_数値文字列,_利用者引数ならび), atom_number(_数値文字列,_数値)), _数値引数ならび). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0.0e+00,M). # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall('「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数),assertz(成績(_科目,_点数))). '「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める(_合計) :- findall(_点数,成績(_,_点数),_点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_平均) :- '3科目の合計を求める(_合計), _平均 is _合計 / 3. % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall('「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数),assertz(成績(_科目,_点数))). '「国語の点数=」のように表示し、科目の点数を入力する'(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める(_合計) :- findall(_点数,成績(_,_点数),_点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_平均) :- '3科目の合計を求める(_合計), _平均 is _合計 / 3. % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた部分がある # 或る文字がn回以上続いた部分がある(_n,_或る文字,_文字列) :- sub_atom(_文字列,_,_文字列長,_,_適合文字列), _文字列長 >= _n, forall(sub_atom(_適合文字列,_,1,_,_文字),_或る文字 = _文字). % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた # 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列) :- 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_文字列長), その連続部分では最長である(_或る文字,_前文字列,_後文字列). 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_適合文字列長) :- sub_atom(_文字列,S,_適合文字列長,R,_適合文字列), 長さがn文字以上の或る文字だけによる文字列(_n,_或る文字,_適合文字列長,_適合文字列), 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列). 長さがn文字以上の或る文字だけによる文字列(_n,_或る文字,_文字列長,_文字列) :- 長さがn文字以上(_n,_文字列長), forall(sub_atom(_文字列,_,1,_,_文字),_文字 = _或る文字). 長さがn文字以上(_n,_文字列長) :- _n =< _文字列長. 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). その連続部分では最長である(_或る文字,_前文字列,_後文字列) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)), \+(sub_atom(_後文字列,0,1,_,_或る文字)). % 以下のサイトは # # 文字列の中で或る文字がn回以上続いた # 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列) :- 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_), その連続部分では最長である(_或る文字,_前文字列,_後文字列). 或る文字がn回以上続いた(_n,_或る文字,_文字列,_前文字列,_適合文字列,_後文字列,_文字列長) :- sub_atom(_文字列,S,_文字列長,R,_適合文字列), _文字列長 >= _n, forall(sub_atom(_適合文字列,_,1,_,_文字),_或る文字 = _文字), 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列). 前文字列と後文字列を切り出す(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). その連続部分では最長である(_或る文字,_前文字列,_後文字列) :- \+(sub_atom(_前文字列,_,1,0,_或る文字)), \+(sub_atom(_後文字列,0,1,_,_或る文字)). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差). 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|_等差数列],_公差) :- '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差). 等差数列とは公差確定問題である([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差). 等差数列とは公差確定問題である([A|_等差数列],_公差) :- '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差). '先頭要素が変数の時、後続の数列が等差数列で公差が決まれば、後続の等差数列の先頭要素と公差からVが求まる'([V|_等差数列],_公差) :- 変数である(V), 等差数列(_等差数列,_公差), _等差数列 = [_後続の等差数列の先頭要素|_], V is _後続の等差数列の先頭要素 - _公差. 先頭要素と公差が変数でない時は後続の等差数列は順に解決できる([A,B|_等差数列],_公差) :- 先頭要素と公差が変数でない時は(A,_公差), 後続ならびは順に解決できる([A,B|_等差数列],_公差). 先頭要素と公差が変数でない時は(A,_公差) :- 変数ではない(A), 変数ではない(_公差). 後続ならびは順に解決できる([A,B|_等差数列],_公差) :- B is A + _公差, 等差数列([B|_等差数列],_公差). '公差が変数でAは変数でない時は、次の変数でない要素とそれまでの要素数から公差を推計して、等差数列部分を確定していく'([A|_等差数列],_公差) :- 公差が変数でAは変数でない時は(A,_公差), 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残り等差数列,_公差), 等差数列部分を確定していく(A,_次の変数でない要素,_変数ならび,_残り等差数列,_公差). 公差が変数でAは変数でない時は(A,_公差) :- 変数である(_公差), 変数ではない(A). 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,A,[],[],_公差) :- '等差数列が全て変数の時は変数は全てAとなり公差は0'(A,_等差数列,_公差),!. 次の変数でない要素とそれまでの要素数から公差を推計して(A,_等差数列,_次の変数でない要素,_変数ならび,_残りならび,_公差) :- 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび), 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差). 等差数列が全て変数の時は変数は全てAとなり公差は0(A,_等差数列,0) :- 等差数列が全て変数の時は(_等差数列), 変数は全てAとなり(A,_等差数列). 等差数列が全て変数の時は(_等差数列) :- forall(member(V,_等差数列),var(V)). 変数は全てAとなり(_等差数列,A) :- findall(A,member(_,_等差数列),_等差数列). 次の変数でない要素とそれまでの要素数から(_等差数列,_次の変数でない要素,_変数ならび,_残りならび) :- append(_変数ならび,[_次の変数でない要素|_残りならび],_等差数列), 要素は全て変数である(_変数ならび), 変数ではない(_次の変数でない要素). 要素は全て変数である(_変数ならび) :- forall(member(_変数,_変数ならび),変数である(_変数)). 公差を推計して(A,_次の変数でない要素,_変数ならび,_公差) :- length([_|_変数ならび],_分割数), _公差 is (_次の変数でない要素 - A) / _分割数. 等差数列部分を確定していく(A,B,L1,R2,_公差) :- 等差数列([A|L1],_公差), 等差数列([B|R2],_公差). 変数である(_変数) :- var(_変数). 変数ではない(_変数ではない項) :- \+(var(_変数ではない項)). % 以下のサイトは 等差数列([_],_公差) :- var(_公差),!,fail. 等差数列(_等差数列,_公差) :- 等差数列とは公差確定問題である(_等差数列,_公差),!. 等差数列とは公差確定問題である([_],_公差). 等差数列とは公差確定問題である([V|R],_公差) :- var(V), 等差数列(R,_公差), R = [B|_], V is B - _公差,!. 等差数列とは公差確定問題である([A,B|R],_公差) :- 変数ではない(A), 変数ではない(_公差), B is A + _公差, 等差数列([B|R],_公差). 等差数列とは公差確定問題である([A|R],_公差) :- var(_公差), 変数ではない(A), append(L1,[B|R2],R), forall(member(V,L1),var(V)), 変数ではない(B), length([_|L1],N), _公差 is (B - A) / N,!, 等差数列([A|L1],_公差), 等差数列([B|R2],_公差),!. 変数ではない(A) :- \+(var(A)). % 以下のサイトは # 文字aを10回出力するコードを書きなさい # # 但し以下の文字の使用を禁止する # [0-9<*+] 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字(a). 文字aを十回出力する :- forall(文字(_文字),write(_文字)). % 以下のサイトは # 出典: プログラミングのお題スレ Part5 #252 # お題: # 整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け # # n=9563なら # ######## # #oo|||o# # #||ooo|# # ######## # #||o|oo# # #oooo|o# # #oooooo# # #ooooo|# # #oo|ooo# # ######## # # 等幅フォントじゃないとちゃんと見れないけどごめんね '整数n(0<=n<1000000)をソロバンのAAに変換するプログラムを書け'(_n) :- '整数n(0<=n<1000000)をソロバンの'(_n,[],LL), 'AAに変換する'(LL). '整数n(0<=n<1000000)をソロバンの'(0,LL,LL) :- !. '整数n(0<=n<1000000)をソロバンの'(_n,LL1,LL) :- 一桁を天下に二分する(_n,[_1,_2,_3],[_4,_5,_6,_7,_8]), _n_2 is _n // 10, '整数n(0<=n<1000000)をソロバンの'(_n_2,[[_1,_2,_3,_4,_5,_6,_7,_8]|LL1],LL). 一桁を天下に二分する(_n,_天,_下) :- _n_1 is _n mod 10, _n_1_1 is _n_1 // 5, _n_1_2 is _n_1 mod 5, 天(_n_1_1,_天), 下(_n_1_2,_下). 天(0,['O','|']). 天(1,['|','O']). 下(0,['|','O','O','O','O']). 下(1,['O','|','O','O','O']). 下(2,['O','O','|','O','O']). 下(3,['O','O','O','|','O']). 下(4,['O','O','O','O','|']). 'AAに変換する'(LL) :- 梁(LL,_梁), 転置(LL,LL2), 枠の中に描く(_梁,LL2). 枠の中に描く(_梁,LL) :- writef('#%t#\n',[_梁]), forall(上から下まで枠と珠ならびを描く(_梁,LL,_表示行),writef('%t',[_表示行])), writef('#%t#\n',[_梁]). 上から下までの枠と珠ならびを描く(_梁,LL,_表示行) :- nth1(_nth1,LL,_横方向珠ならび), atomic_list_concat(_横方向珠ならび,_横方向珠文字列), 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行). 上から下までの枠と珠ならびを描く(4,_梁,_横方向珠文字列,_表示行) :- swritef(_表示行,'%t\n#%t#\n',[_梁,_横方向珠文字列]). 上から下までの枠と珠ならびを描く(_nth1,_梁,_横方向珠文字列,_表示行) :- \+(_nth1=4), swritef(_表示行,'#%t#\n',[_横方向珠文字列]). 梁(LL,_梁) :- length(LL,_幅), lenth(L,_幅), all(L,'#'), atom_chars(_梁,L). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/206 # お題:文字列中の数字が一文字以上連続する部分を右ローテイトする。 # 例 # "2014-10-03 00:17:21" -> "21-2014-10 03:00:17" # "1 2 3 4" -> "4 1 2 3" # "a0=0;a1=1;a2=2;a3=3" -> "a3=0;a0=1;a1=2;a2=3" # # '文字列中の数字が一文字以上連続する部分を右ローテイトする。'(_文字列,_数字が一文字以上連続する部分を右ローテイトした文字列) :- atom_chars(_文字列,_文字ならび), '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび), atomic_list_concat(_数字列部分が右ローテイトしたならび,_数字が一文字以上連続する部分を右ローテイトした文字列). '文字列ならびの数字が一文字以上連続する部分を右ローテイトする。'(_文字ならび,_数字列部分が右ローテイトしたならび) :- '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(_文字ならび,_数字列ならび,_数字列部分が右ローテイトしたならび), 右ローテイトしてから変数部分を埋める(_数字列ならび,_数字列部分が右ローテイトしたならび). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'([],[],[]). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,[_数字列|R2],[_|R3]) :- 先頭からの数字ならびを数字列に変換(L1,_数字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3). '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(L1,R2,[_文字列|R3]) :- 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1), '数字が一文字以上連続する部分だけ変数に置換し、別に数字列ならびを生成する'(R1,R2,R3), 先頭からの数字ならびを数字列に変換(L1,_数字列,R1) :- 先頭からの数字ならびを(L1,_数字ならび,R1), 数字列に変換(_数字ならび,_数字列). 先頭からの数字ならびを(L1,_数字ならび,R1) :- append(_数字ならび,R1,L1), 要素の全てが数字(_数字ならび), 'R1の最初の要素があればそれは数字ではない'(R1). 'R1の最初の要素があればそれは数字ではない'(R1) :- \+((R1 = [_文字|_],member(_文字,['0','1','2','3','4','5','6','7','8','9'])). 要素の全てが数字(_数字ならび) :- forall(member(_数字,_数字ならび),member(_数字,['0','1','2','3','4','5','6','7','8','9'])). 数字列に変換(_数字ならび,_数字列) :- atom_chars(_数字列,_数字ならび). 先頭からの数字以外の文字ならびを文字列に変換(L1,_文字列,R1) :- append(_文字ならび,R1,L1), 要素の全てが数字ではない(_文字ならび), 'R1の最初の要素があればそれは数字以外の文字ではない'(R1). 要素の全てが数字ではない(_文字ならび) :- forall(member(_文字,_文字ならび),\+(member(_文字,['0','1','2','3','4','5','6','7','8','9']))). 'R1の最初の要素があればそれは数字以外の文字ではない'(R1) :- \+((R1 = [A|_],\+(member(A,['0','1','2','3','4','5','6','7','8','9'])))). 右ローテイトしてから変数を埋める([],L2) :- !. 右ローテイトしてから変数を埋める(L1,L2) :- 右ローテイトしてから(L1,L3), 変数を埋める(L3,L2). 右ローテイトしてから([A|R],L3) :- append(R,[A],L3). 変数を埋める([],[]) :- !. 変数を埋める([_数字列|R1],[_数字列|R2]) :- 変数を埋める(R1,R2). 変数を埋める(R1,[_文字列|R2]) :- 変数を埋める(R1,R2). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1411227287/89 # 0と1のみでランダムに生成した文字列Sがある # 長さは2<=S<=1000である # 11001010110100011001011011111111111111000000000010111000000 # # 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX # 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN # としたときのMXとMNを求めよ # 見当たらない場合はFALSEを出力しろ # # S=110001010100 # MX=3 (000が一番長い) # MN=2 (11または00が二番目に長い) # # S=111111 # MX=3 (111111が一番長い) # MN=FALSE (2番目に短いものが存在しない) # # S=10 # MX=FALSE (1番長いのが存在しない) # MX=FALSE (2番目に短いものが存在しない) # # '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- '0と1のみでランダムに生成した文字列Sがある'(_文字列), forall('同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列), write('S=%t\nMX=%t,MN=%t\n',[_文字列,_最長文字列,_短い方から二番目の文字列])),!. '0と1のみでランダムに生成した文字列Sがある 長さは2<=S<=1000である 11001010110100011001011011111111111111000000000010111000000 同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ' :- write('FALSE\n'). '0と1のみでランダムに生成した文字列Sがある'(_文字列) :- R is random(999) + 2, findall(_0または1,( between(2,R,_), _0または1 is random(3341) mod 2), _0または1ならび), atomic_list_concat(_0または1ならび,_文字列). '同じ文字で連続した文字列の内、他の連続する文字列よりも一番長い文字列をMX 同じ文字で連続した文字列の内、ニ番目に短い文字列をMN としたときのMXとMNを求めよ 見当たらない場合はFALSEを出力しろ'(_文字列,_最長文字列,_短い方から二番目の文字列) :- 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび), 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列). 連続した文字列と文字数ならびを得る(_文字列,_連続した文字列と文字数ならび) :- findall([_連続した文字列,_文字数],( 連続した文字列と文字数(_文字列,_連続した文字列,_文字数)), _連続した文字列_文字数ならび). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '0の連続したの文字列'(_文字列,_連続した文字列,_文字数). 連続した文字列と文字数(_文字列,_連続した文字列,_文字数) :- '1の連続したの文字列と文字数'(_文字列,_連続した文字列,_文字数). '0の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='0'). '1の連続したの文字列'(_文字列,_連続した文字列,_文字数) :- sub_atom(_文字列,_開始点,_文字数,_残り文字数,_連続した文字列), 前後に0の文字がない(_文字列,_開始点,_文字数,_残り文字数), forall(sub_atom(_連続した文字列,_,1,_,_文字),_文字='1'). 前後に0の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'0')), \+(sub_atom(_文字列,_開始点_2,1,_,'0')). 前後に1の文字がない(_文字列,_開始点,_文字数) :- succ(_開始点_1,_開始点), _開始点_2 is _開始点 + _文字数, \+(sub_atom(_文字列,_開始点_1,1,_,'1')), \+(sub_atom(_文字列,_開始点_2,1,_,'1')). 最長文字列と短い方から二番目の文字列(_連続した文字列と文字数ならび,_最長文字列,_短い方から二番目の文字列) :- 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数), 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列). 最長文字数と短い方から二番目に短い文字数(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数) :- 文字列長ならび(_連続した文字列と文字数ならび,_文字列長ならび), sort(_文字列長ならび,_整列した文字列長ならび), nth1(2,_整列した文字列長ならび,_短い方から二番目に短い文字数), append(_,[_最長文字数],_整列した文字列長ならび). 文字数ならび(_連続した文字列と文字数ならび,_文字数ならび) :- findall(_文字数,( member([_,_文字数],_連続した文字列と文字列数ならび)), _文字数ならび). 最長文字数と短い方から二番目に短い文字列(_連続した文字列と文字数ならび,_最長文字数,_短い方から二番目に短い文字数,_最長文字列,_短い方から二番目に短い文字列) :- member([_最長文字列,_最長文字数],_連続した文字列と文字数ならび), member([_短い方から二番目に短い文字列,_短い方から二番目に短い文字数],_連続した文字列と文字数ならび). % 以下のサイトは '3年H組の最も高い身長'(_3年H組の生徒ならび,_3年H組の最も高い身長) :- '3年H組の身長と残りの生徒の身長ならび'(_3年H組の生徒ならび,_3年H組の最も高い身長,_残りの生徒の身長ならび). '3年H組の最も高い身長と残りの生徒の身長ならび'([_最も高い身長|_残りの生徒の身長],_最も高い身長,_残りの生徒の身長), 残り生徒ならびの全てが最も高い身長に等しいか小さい(_最も高い身長,_残りの生徒の身長). '3年H組の最も高い身長と残りの生徒の身長ならび'([_身長|R1],_最も高い身長,[_身長|_残り身長ならび]) :- '3年H組の最も高い身長と残りの生徒の身長ならび'(R1,_最も高い身長,_残り身長ならび). 残り生徒ならびの全てが最も高い身長に等しいか小さい(_最も高い身長,_残り身長ならび) :- forall(残り身長ならびから身長を取り出す(_残り身長ならび,_身長),_身長 @=< _最も高い身長). 残り身長ならびから身長を取り出す([_身長|_],_身長). 残り身長ならびから身長を取り出す([_|R],_身長) :- 残り身長ならびから身長を取り出す(R,_身長). % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'(_3年H組の身長ならび,_3年H組で最も高い身長) :- '3年H組で最も高い身長は'(_3年H組で最も高い身長,_3年H組の身長ならび,_残り身長ならび), '_残り身長ならびの要素は全て_3年H組で最も高い身長に等しいか小さい'(_残り身長ならび,_3年H組で最も高い身長). '3年H組の最も高い身長は'(A,[A|R],R). '3年H組の最も高い身長は'(A,[B|R1],[B|R2]) :- '3年H組の最も高い身長は'(A,R1,R2). '_残り身長ならびの要素は全て_3年H組で最も高い身長に等しいか小さい'(_残り身長ならび,_3年H組で最も高い身長) :- forall('3年H組の生徒の身長'(_生徒の身長,_残り身長ならび),_生徒の身長 @=< _3年H組で最も高い身長). '3年H組の生徒の身長'(_生徒の身長,[_生徒の身長|_]). '3年H組の生徒の身長'(_生徒の身長,[_|_残り生徒の身長]) :- '3年H組の生徒の身長'(_生徒の身長,_残り生徒の身長). % 以下のサイトは # # 3年H組で最も高い身長は # '3年H組で最も高い身長'(_3年H組の身長ならび,_3年H組で最も高い身長) :- select(_3年H組で最も高い身長,_3年H組の身長ならび,_残り身長ならび), forall(member(_生徒の身長,_残り身長ならび),_生徒の身長 @=< _3年H組で最も高い身長). % この select/3, forall/2, member/2 を具象化させることはかなり難しい。 % 例えば、ここで具象化とは、'3年H組・・・' に述語名を置き直すこと。 % 以下のサイトは # # あなたは既に読んでしまった札を記憶していることにします。 # まだ読まれていない、読み札も分かっていることとします。 # 読み札/2、既に読んでしまった札/2、自陣/1、敵陣/1がそれぞれ # 述語としして定義済みだとして、自陣、敵陣、あるいはその両方の札の # 決まり字を示すプログラムを定義してください。 # :- dynamic(読み札/1). :- dynamic(既に読んでしまった札/1). :- dynamic(自陣/1). :- dynamic(敵陣/1). 自陣または敵陣の全ての札の決まり字(_下の句,_上の句,_決まり字) :- 自陣または敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 自陣の札の決まり字(_下の句,_上の句,_決まり字) :- 自陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 敵陣の札の決まり字(_下の句,_上の句,_決まり字) :- 敵陣(_下の句), 読み札(_上の句,_下の句), 決まり字(_上の句,_決まり字). 決まり字(_上の句,_決まり字) :- 最長共通文字数(_上の句,_最長共通文字数), succ(_最長共通文字数,_決まり字の位置), sub_atom(_上の句,0,_決まり時の位置,_,_決まり字). 最長共通文字数(_上の句,_最長共通文字数) :- findmax(_先頭から最長共通文字数,( 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句), '先頭から最長共通文字数(0オリジン)'(_上の句,別の上の句,_先頭からの最長共通文字数)),_最長共通文字数). 対象としている上の句とは別の上の句を読み札から得る(_上の句,_別の上の句) :- 読み札(_別の上の句,_), \+(_上の句 = _別の上の句). '先頭から最長共通文字数(0オリジン)'(_上の句,_別の上の句,_文字数) :- nth0(_文字数,_,_), sub_atom(_上の句,_文字数,1,_,_文字_1), sub_atom(_別の上の句,_文字数,1,_,_文字_2), \+(_文字_1=_文字_2),!. 下の句から決まり字を得る(_下の句,_決まり字) :- 自陣または敵陣(_下の句), '下の句から上の句を得る'(_下の句,_上の句), 決まり字(_上の句,_決まり字). 自陣または敵陣(_下の句) :- 自陣(_下の句). 自陣または敵陣(_下の句) :- 敵陣(_下の句). 下の句から上の句を得る(_下の句,_上の句) :- 読み札(_上の句,_下の句). findmax(_値,_目標,_最大値) :- findall(_値,_目標,_値ならび), 最大値(_値ならび,_最大値). 最大値(_標本ならび,_最大値) :- select(_最大値,_標本ならび,_残り標本ならび), forall(member(_標本_1,_残り標本ならび),_標本_1 @=< _最大値),!. /* 読み札('あきのたのかりほのいほのとまをあらみ,わがころもではつゆにぬれつつ'). 読み札('はるすぎてなつきにけらししろたへの,ころもほすてふあまのかぐやま'). 読み札('あしびきのやまどりのをのしだりをの,ながながしよをひとりかもねむ'). 読み札('たごのうらにうちいでてみればしろたへの,ふじのたかねにゆきはふりつつ'). 読み札('おくやまにもみぢふみわけなくしかの,こゑきくときぞあきはかなしき'). 読み札('かささぎのわたせるはしにおくしもの,しろきをみればよぞふけにける'). 読み札('あまのはらふりさけみればかすがなる,みかさのやまにいでしつきかも'). 読み札('わがいほはみやこのたつみしかぞすむ,よをうぢやまとひとはいふなり'). 読み札('はなのいろはうつりにけりないたづらに,わがみよにふるながめせしまに'). 読み札('これやこのゆくもかへるもわかれては,しるもしらぬもあふさかのせき'). 読み札('わたのはらやそしまかけてこぎいでぬと,ひとにはつげよあまのつりぶね'). 読み札('あまつかぜくものかよひぢふきとぢよ,をとめのすがたしばしとどめむ'). 読み札('つくばねのみねよりおつるみなのがは,こひぞつもりてふちとなりぬる'). 読み札('みちのくのしのぶもぢずりたれゆゑに,みだれそめにしわれならなくに'). 読み札('きみがためはるののにいでてわかなつむ,わがころもでにゆきはふりつつ'). 読み札('たちわかれいなばのやまのみねにおふる,まつとしきかばいまかへりこむ'). 読み札('ちはやぶるかみよもきかずたつたがは,からくれなゐにみづくくるとは'). 読み札('すみのえのきしによるなみよるさへや,ゆめのかよひぢひとめよくらむ'). 読み札('なにはがたみじかきあしのふしのまも,あはでこのよをすぐしてよとや'). 読み札('わびぬればいまはたおなじなにはなる,みをつくしてもあはむとぞおもふ'). 読み札('いまこむといひしばかりにながつきの,ありあけのつきをまちいでつるかな'). 読み札('ふくからにあきのくさきのしをるれば,むべやまかぜをあらしといふらむ'). 読み札('つきみればちぢにものこそかなしけれ,わがみひとつのあきにはあらねど'). 読み札('このたびはぬさもとりあへずたむけやま,もみぢのにしきかみのまにまに'). 読み札('なにしおはばあふさかやまのさねかづら,ひとにしられでくるよしもがな'). 読み札('をぐらやまみねのもみぢばこころあらば,いまひとたびのみゆきまたなむ'). 読み札('みかのはらわきてながるるいづみがは,つみきとてかこひしかるらむ'). 読み札('やまざとはふゆぞさびしさまさりける,ひとめもくさもかれぬとおもへば'). 読み札('こころあてにをらばやをらむはつしもの,おきまどはせるしらぎくのはな'). 読み札('ありあけのつれなくみえしわかれより,あかつきばかりうきものはなし'). 読み札('あさぼらけありあけのつきとみるまでに,よしののさとにふれるしらゆき'). 読み札('やまがはにかぜのかけたるしがらみは,ながれもあへぬもみぢなりけり'). 読み札('ひさかたのひかりのどけきはるのひに,しづごころなくはなのちるらむ'). 読み札('たれをかもしるひとにせむたかさごの,まつもむかしのともならなくに'). 読み札('ひとはいさこころもしらずふるさとは,はなぞむかしのかににほひける'). 読み札('なつのよはまだよひながらあけぬるを,くものいづこにつきやどるらむ'). 読み札('しらつゆにかぜのふきしくあきののは,つらぬきとめぬたまぞちりける'). 読み札('わすらるるみをばおもはずちかひてし,ひとのいのちのをしくもあるかな'). 読み札('あさぢふのをののしのはらしのぶれど,あまりてなどかひとのこひしき'). 読み札('しのぶれどいろにいでにけりわがこひは,ものやおもふとひとのとふまで'). 読み札('こひすてふわがなはまだきたちにけり,ひとしれずこそおもひそめしか'). 読み札('ちぎりきなかたみにそでをしぼりつつ,すゑのまつやまなみこさじとは'). 読み札('あひみてののちのこころにくらぶれば,むかしはものをおもはざりけり'). 読み札('あふことのたえてしなくはなかなかに,ひとをもみをもうらみざらまし'). 読み札('あはれともいふべき人はおもほえで,みのいたづらになりぬべきかな'). 読み札('ゆらのとをわたるふなびとかぢをたえ,ゆくへもしらぬこひのみちかな'). 読み札('やへむぐらしげれるやどのさびしきに,ひとこそみえねあきはきにけり'). 読み札('かぜをいたみいはうつなみのおのれのみ,くだけてものをおもふころかな'). 読み札('みかきもりゑじのたくひのよるはもえ,ひるはきえつつものをこそおもへ'). 読み札('きみがためをしからざりしいのちさへ,ながくもがなとおもひけるかな'). 読み札('かくとだにえやはいぶきのさしもぐさ,さしもしらじなもゆるおもひを'). 読み札('あけぬればくるるものとはしりながら,なほうらめしきあさぼらけかな'). 読み札('なげきつつひとりぬるよのあくるまは,いかにひさしきものとかはしる'). 読み札('わすれじのゆくすゑまではかたければ,けふをかぎりのいのちともがな'). 読み札('たきのおとはたえてひさしくなりぬれど,なこそながれてなほきこえけれ'). 読み札('あらざらむこのよのほかのおもひでに,いまひとたびのあふこともがな'). 読み札('めぐりあひてみしやそれともわかぬまに,くもがくれにしよはのつきかな'). 読み札('ありまやまゐなのささはらかぜふけば,いでそよひとをわすれやはする'). 読み札('やすらはでねなましものをさよふけて,かたぶくまでのつきをみしかな'). 読み札('おほえやまいくののみちのとほければ,まだふみもみずあまのはしだて'). 読み札('いにしへのならのみやこのやへざくら,けふここのへににほひぬるかな'). 読み札('よをこめてとりのそらねははかるとも,よにあふさかのせきはゆるさじ'). 読み札('いまはただおもひたえなむとばかりを,ひとづてならでいふよしもがな'). 読み札('あさぼらけうぢのかはぎりたえだえに,あらはれわたるせぜのあじろぎ'). 読み札('うらみわびほさぬそでだにあるものを,こひにくちなむなこそをしけれ'). 読み札('もろともにあはれとおもへやまざくら,はなよりほかにしるひともなし'). 読み札('はるのよのゆめばかりなるたまくらに,かひなくたたむなこそをしけれ'). 読み札('こころにもあらでうきよにながらへば,こひしかるべきよはのつきかな'). 読み札('あらしふくみむろのやまのもみぢばは,たつたのかはのにしきなりけり'). 読み札('さびしさにやどをたちいでてながむれば,いづこもおなじあきのゆふぐれ'). 読み札('ゆふさればかどたのいなばおとづれて,あしのまろやにあきかぜぞふく'). 読み札('おとにきくたかしのはまのあだなみは,かけじやそでのぬれもこそすれ'). 読み札('たかさごのをのへのさくらさきにけり,とやまのかすみたたずもあらなむ'). 読み札('うかりけるひとをはつせのやまおろしよ,はげしかれとはいのらぬものを'). 読み札('ちぎりおきしさせもがつゆをいのちにて,あはれことしのあきもいぬめり'). 読み札('わたのはらこぎいでてみればひさかたの,くもゐにまがふおきつしらなみ'). 読み札('せをはやみいはにせかるるたきがはの,われてもすゑにあはむとぞおもふ'). 読み札('あはぢしまかよふちどりのなくこゑに,いくよねざめぬすまのせきもり'). 読み札('あきかぜにたなびくくものたえまより,もれいづるつきのかげのさやけさ'). 読み札('ながからむこころもしらずくろかみの,みだれてけさはものをこそおもへ'). 読み札('ほととぎすなきつるかたをながむれば,ただありあけのつきぞのこれる'). 読み札('おもひわびさてもいのちはあるものを,うきにたへぬはなみだなりけり'). 読み札('よのなかよみちこそなけれおもひいる,やまのおくにもしかぞなくなる'). 読み札('ながらへばまたこのごろやしのばれむ,うしとみしよぞいまはこひしき'). 読み札('よもすがらものおもふころはあけやらで,ねやのひまさへつれなかりけり'). 読み札('なげけとてつきやはものをおもはする,かこちがほなるわがなみだかな'). 読み札('むらさめのつゆもまだひぬまきのはに,きりたちのぼるあきのゆふぐれ'). 読み札('なにはえのあしのかりねのひとよゆゑ,みをつくしてやこひわたるべき'). 読み札('たまのをよたえなばたえねながらへば,しのぶることのよわりもぞする'). 読み札('みせばやなをじまのあまのそでだにも,ぬれにぞぬれしいろはかはらず'). 読み札('きりぎりすなくやしもよのさむしろに,ころもかたしきひとりかもねむ'). 読み札('わがそではしほひにみえぬおきのいしの,ひとこそしらねかわくまもなし'). 読み札('よのなかはつねにもがもななぎさこぐ,あまのをぶねのつなでかなしも'). 読み札('みよしののやまのあきかぜさよふけて,ふるさとさむくころもうつなり'). 読み札('おほけなくうきよのたみにおほふかな,わがたつそまにすみぞめのそで'). 読み札('はなさそふあらしのにはのゆきならで,ふりゆくものはわがみなりけり'). 読み札('こぬひとをまつほのうらのゆふなぎに,やくやもしほのみもこがれつつ'). 読み札('かぜそよぐならのをがはのゆふぐれは,みそぎぞなつのしるしなりける'). 読み札('ひともをしひともうらめしあぢきなく,よをおもふゆゑにものおもふみは'). 読み札('ももしきやふるきのきばのしのぶにも,なほあまりあるむかしなりけり'). */ % 以下のサイトは # 問題文 # ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! # でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 # さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 # 「うーむ、どうしたものか……ハッ!」 # 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。 # そうと決まれば、 身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算してくれるプログラムを有能プログラマーである君に作ってもらいたい。 # # # ※ BMI[kg?m2] とは、ボディマス指数と呼ばれるもので、以下の計算式で与えられる。ただし、Height と Weight はそれぞれ身長と体重のことである。 # # 入力 # 入力は以下の形式で標準入力から与えられる。 # # Height BMI # Height(120.0≦Height≦200.0) は、プログラムに与えられる身長[cm]を表す実数である。小数点第 1 位まで与えられる。 # BMI(10.0≦BMI≦40.0) は、プログラムに与えられる BMI[kg?m2] を表す実数である。小数点第 1 位まで与えられる。 # 出力 # 入力に基づいて逆算した 体重 [kg] を一行に出力せよ。 # 出力は絶対誤差が 10−2 以下であれば許容される。 # なお、出力の最後には改行を入れること。 'ぼく、一目惚れをしました。昨日学内ですれ違った彼女の名前、どうしても知りたいんです。いや、名前だけじゃない……!身長も体重も、彼女の全てが知りたい! でも、僕には彼女に話しかける勇気なんてない。彼女の体重は何 kg なんだろうか...彼女の身長は何 cm くらいなんだろうか...。結局、一晩中彼女のことだけを考えてぜんぜん寝られていない。 さすがに女性にいきなり体重を聞くのは失礼だろう。そんなことは分かっている。そんなものを聞いたりしたら、間違いなく嫌われてしまうだろう。 「うーむ、どうしたものか……ハッ!」 僕の脳内に稲妻が走った。そうだ、身長とBMI(※)を聞けばいいんだ。そうしたら体重を逆算できる。名前はもうどうでもいいや、これは名案だ。' :- 標準入力から身長とBMIを得る(_身長,_BMI), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重), format('~1f\n',[_体重]). 標準入力から身長とBMIを得る(_身長,_BMI) :- 文字列を得る(_文字列), split(_文字列,[' '],[_身長文字列,_BMI文字列]), get_term_from_atom(_身長文字列,_身長,[]), get_term_from_atom(_BMI文字列,_BMI,[]). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(_身長,_BMI,_体重) :- '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(0,_身長,_BMI,_体重_BMIとの差ならび), 'BMIの計算差が最小のものの体重'(_体重_BMIとの差ならび,_体重). '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(2000,_身長,_BMI,[]) :- !. '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N,_身長,_BMI,[[N,_BMI_の計算差]|R]) :- '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差), '身長[cm] と BMI[kg?m2] の2つの値に基づいて 体重[kg] を逆算する'(N_2,_身長,_BMI,R). '身長、体重から、BMIの計算差を得る'(N,_身長,_BMI,N_2,_体重,_BMIの計算差) :- _BMIの計算差 is abs((N / 10) / ((_身長 / 100) ^ 2)) - _BMI), succ(N,N_2), _体重 is N / 10. 'BMIの計算差が最小のものの体重'(_N_BMIとの差ならび,_体重) :- select([_体重,_BMIの差],_N_BMIとの差ならび,R), forall(member([_,_BMIの差_1],R),_BMIの差 =< _BMIの差_1). 文字列を得る(_文字列) :- findall(_文字,(repeat,get_char(_文字),(_文字=end_of_file,!,fail;_文字='\n',!,fail;true)),L), atomic_list_concat(L,_文字列). 文字列を区切り文字列で分ける(_文字列,_区切り文字列候補,[_前文字列|R]) :- 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列), 文字列を区切り文字列で分ける(_後文字列,_区切り文字列候補,R),!. 文字列を区切り文字列で分ける(_文字列,_,[_文字列]). 文字列を区切り文字列候補で前文字列と後文字列に分ける(_文字列,_区切り文字列候補,_前文字列,_区切り文字列,_後文字列) :- 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R), 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列). 文字列の先頭から区切り文字列を捜す(_文字列,_区切り文字列候補,_区切り文字列,S,R) :- sub_atom(_文字列,S,Len,R,_区切り文字列), member(_区切り文字列,_区切り文字列候補). 前文字列と後文字列に分ける(_文字列,S,R,_前文字列,_後文字列) :- sub_atom(_文字列,0,S,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. % 以下のサイトは # 問題文 # 天下一王国では整数は辞書順比較で表します。入国したばかりのダイキ君はとりあえず 1000 までの整数を書き出すことにしました。 # # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。 # # 辞書順比較について # 文字列 A に対して、 Ai で i 番目の文字を表し、 |A| で文字列 A の文字数を表すことにすると、文字列 A と文字列 B を辞書順比較で比較するとは、 # # Ai≠Bi となる最小の i (1?i?min(|A|, |B|))に対して # AiBi であれば、文字列 A は文字列 B より大きい # そのような i が存在しなければ、文字数が少ない方を小さいとする # として文字列 A と文字列 B の大小関係を決めることである。 # # 例えば、 1, 2, 11, 12, 21 を辞書順比較で昇順にソートすると 1, 11, 12, 2, 21 となる。 # # 入力 # この問題では入力は与えられない。 # # # 出力 # 1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力せよ。 # # なお、行の終端には改行が必要である。 '1 以上 1000 以下のすべての整数を十進数で表した文字列を辞書順比較で昇順にソートして、1 行ずつ出力してください。' :- '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび), '辞書順比較で昇順にソートして、'(_十進文字列ならび,_辞書順比較で昇順にソートされた文字列ならび), '1 行ずつ出力してください。'(_辞書順比較で昇順にソートされた文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した文字列を'(_十進文字列ならび) :- findall(_十進文字列,'1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列),_十進文字列ならび). '1 以上 1000 以下のすべての整数を十進数で表した'(_十進数文字列) :- '1 以上 1000 以下のすべての整数を'(_整数), 十進数で表した(_整数,_十進数で表した). '1 以上 1000 以下のすべての整数を'(_整数) :- between(1,1000,_整数). 十進数で表した文字列を(_整数,_十進数で表した文字列) :- number_chars(_整数,Chars), atom_chars(_十進数で表した文字列,Chars). '辞書順比較で昇順にソートして、'([],[]). '辞書順比較で昇順にソートして、'([_軸要素|L1],L2) :- '辞書順比較で軸要素との大小で分割'(_軸要素,L1,L1_1,L1_2), '辞書順比較で昇順にソートして、'(L1_1,L1_1_2), '辞書順比較で昇順にソートして、'(L1_2,L1_2_2), append(L1_1_2,[_軸要素|L1_2_2],L2). '辞書順比較で軸要素との大小で分割'(_,[],[],[]). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],[A|R3],R4) :- '辞書順に小さい'(A,_軸要素),!, '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順比較で軸要素との大小で分割'(_軸要素,[A|R2],R3,[A|R4]) :- '辞書順比較で軸要素との大小で分割'(_軸要素,R2,R3,R4). '辞書順に小さい'(_文字列_1,_文字列_2) :- '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2),!. '辞書順に小さい'(_文字列_1,_文字列_2) :- 文字列の差分が文字列_2にある(_文字列_1,_文字列_2). '文字列_1に小さい文字が先に出現した'(_文字列_1,_文字列_2) :- 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2), \+(_文字_1 = _文字_2),!, _文字_1 @< _文字_2. 先頭から同一位置の文字を比較して(_文字列_1,_文字列_2,_文字_1,_文字_2) :- sub_atom(_文字列_1,_同一位置,1,_,_文字_1), sub_atom(_文字列_2,_同一位置,1,_,_文字_2). '文字列の差分が文字列_2にある'(_文字列_1,_文字列_2) :- sub_atom(_文字列_2,0,_文字列_1の長さ,_差分文字数,_文字列_1), _差分文字数 > 0. '1 行ずつ出力してください。'(L2) :- forall(member(M,L2),writef('%t\n',[M])). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/933 # [1] 授業単元:プログラミング基礎 # [2] 問題文: # 氏名が"end"になるまで、氏名と点数を入力する。データがなくなったら点数の平均を算出 # する。平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上 # 下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。 # _____________________________ #   氏名   点数  備考  # --------------------- #   井上    70   #   田口    65  * #   佐藤    100   #   田中    30  ***   # ===================== # [3.1] Windows 8 #  [3.2] Visual studio 2008 #  [3.3] C # # '氏名が"end"になるまで、氏名と点数を入力する。データがなくなったら点数の平均を算出する。氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。' :- '氏名が"end"になるまで、氏名と点数を入力する。'(_氏名_点数ならび), 'データがなくなったら点数の平均を算出する。'(_氏名_点数ならび,_平均), '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名_点数ならび,_平均). '氏名が"end"になるまで、氏名と点数を入力する。'(_氏名_点数ならび) :- findall([_氏名,_点数],( 氏名の入力(_氏名),(_氏名=end,!,fail;点数の入力(_点数))), _氏名_点数ならび). 氏名の入力(_氏名) :- get_line(_氏名). 点数の入力(_点数) :- 整数を得る(_整数). 'データがなくなったら点数の平均を算出する。'(_氏名_点数ならび,_平均) :- length(_氏名_点数ならび,_人数), findall(_点数,member([_,_点数],_氏名_点数ならび),_点数ならび), sum_list(_点数ならび,_合計点), _平均 is _合計点 / _人数. '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名_点数ならび,_平均). forall( member([_氏名,_点数],_氏名_点数_ならび), '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名,_点数,_平均)). '氏名と点数を表示するが、平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、10点以上下回っていたら"**"、1点以上下回っていたら"*"を備考欄に表示する。'(_氏名,_点数,_平均) :- 備考(_氏名,_点数,_備考), writef('20r10r %4l\n,[_氏名,_点数,_備考]). 備考(_点数,_平均,_備考) :- '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均). 備考(_点数,_平均,_備考) :- '平均より10点以上下回っていたら"***"、'(_点数,_平均). 備考(_点数,_平均,_備考) :- '平均より1点以上下回っていたら"***"、'(_点数,_平均). 点数が平均点より低い場合(_点数,_平均,_備考),!. 備考(_,_,''). '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均,'***') :- 点数が平均点より低い場合(_点数,_平均,_備考) :- '平均と各人の点数を比較し、平均より20点以上下回っていたら"***"、'(_点数,_平均,'***') :- _平均 - _点数 >= 20. '10点以上下回っていたら"**"、'(_点数,_平均,'**') :- _平均 - _点数 >= 10, _平均 - _点数 < 20. '1点以上下回っていたら"*"を備考欄に表示する。'(_点数,_平均,'*') :- _平均 - _点数 < 10, _平均 - _点数 >= 1. % 以下のサイトは # # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/688 # お題:四国の四つの県を三色で塗り分ける。 # '四国の四つの県を三色で塗り分ける。'(_色_1,_色_2,_色_3) :- forall(順列([_色_1,_色_2,_色_3],2,[A,B]),assertz(隣接(A,B))), 三色で塗り分ける(_香川,_徳島,_愛媛,_高知), writef('香川=%t,徳島=%t,愛媛=%t,高知=%t\n',[_香川,_徳島,_愛媛,_高知]). 三色で塗り分ける(_香川,_徳島,_愛媛,_高知) :- 香川県からの隣接(_香川,_徳島,_愛媛), 徳島県からの隣接(_徳島,_香川,_愛媛,_高知), 愛媛県からの隣接(_愛媛,_香川,_徳島,_高知), 高知県からの隣接(_高知,_徳島,_愛媛). 香川県からの隣接(_香川,_徳島,_愛媛) :- 隣接(_香川,_徳島), 隣接(_香川,_愛媛). 徳島県からの隣接(_徳島,_香川,_愛媛,_高知) :- 隣接(_徳島,_香川), 隣接(_徳島,_愛媛), 隣接(_徳島,_高知). 愛媛県からの隣接(_愛媛,_徳島,_愛媛,_高知) :- 隣接(_愛媛,_香川), 隣接(_愛媛,_徳島), 隣接(_愛媛,_高知). 高知県からの隣接(_高知,_徳島,_愛媛) :- 隣接(_高知,_徳島), 隣接(_高知,_愛媛). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/688 # お題:九州の七つの県を三色で塗り分ける。 # '九州の七つの県を三色で塗り分ける。'(_色_1,_色_2,_色_3) :- forall(順列([_色_1,_色_2,_色_3],2,[A,B]),assertz(隣接(A,B))), 三色で塗り分ける(_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島), writef('福岡=%t,佐賀=%t,長崎=%t,熊本=%t,大分=%t,宮崎=%t,鹿児島=%t\n',[_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島]). 三色で塗り分ける(_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島) :- 福岡県からの隣接(_福岡,_佐賀,_熊本,_大分), 佐賀県からの隣接(_佐賀,_福岡,_長崎), 長崎県からの隣接(_長崎,_佐賀), 熊本県からの隣接(_熊本,_福岡,_大分,_宮崎,_鹿児島), 大分県からの隣接(_大分,_福岡,_熊本,_宮崎), 宮崎県からの隣接(_宮崎,_大分,_熊本,_鹿児島), 鹿児島県からの隣接(_鹿児島,_宮崎,_熊本). 福岡県からの隣接(_福岡,_佐賀,_熊本,_大分) :- 隣接(_福岡,_佐賀), 隣接(_福岡,_熊本), 隣接(_福岡,_大分). 佐賀県からの隣接(_佐賀,_福岡,_長崎) :- 隣接(_佐賀,_福岡), 隣接(_佐賀,_長崎). 長崎県からの隣接(_長崎,_佐賀) :- 隣接(_長崎,_佐賀). 熊本県からの隣接(_熊本,_福岡,_大分,_宮崎,_鹿児島) :- 隣接(_熊本,_福岡), 隣接(_熊本,_大分), 隣接(_熊本,_宮崎), 隣接(_熊本,_鹿児島). 大分県からの隣接(_大分,_福岡,_熊本,_宮崎) :- 隣接(_大分,_福岡), 隣接(_大分,_熊本), 隣接(_大分,_宮崎). 宮崎県からの隣接(_宮崎,_大分,_熊本,_鹿児島) :- 隣接(_宮崎,_大分), 隣接(_宮崎,_熊本), 隣接(_宮崎,_鹿児島). 鹿児島県からの隣接(_鹿児島,_熊本,_宮崎) :- 隣接(_鹿児島,_熊本), 隣接(_鹿児島,_宮崎). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/688 # お題:九州の七つの県を三色で塗り分ける。 # '九州の七つの県を三色で塗り分ける。'(_色_1,_色_2,_色_3) :- forall(順列([_色_1,_色_2,_色_3],2,[A,B]),assertz(隣接(A,B))), 三色で塗り分ける(_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島), writef('福岡=%t,佐賀=%t,長崎=%t,熊本=%t,大分=%t,宮崎=%t,鹿児島=%t\n',[_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島]). 三色で塗り分ける(_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島) :- 福岡県からの隣接(_福岡,_佐賀,_熊本,_大分), 佐賀県からの隣接(_佐賀,_福岡,_長崎), 長崎県からの隣接(_長崎,_佐賀), 熊本県からの隣接(_熊本,_福岡,_大分,_宮崎,_鹿児島), 大分県からの隣接(_大分,_福岡,_熊本,_宮崎), 宮崎県からの隣接(_宮崎,_大分,_熊本,_鹿児島), 鹿児島県からの隣接(_鹿児島,_宮崎,_熊本). 福岡県からの隣接(_福岡,_佐賀,_熊本,_大分) :- 隣接(_福岡,_佐賀), 隣接(_福岡,_熊本), 隣接(_福岡,_大分). 佐賀県からの隣接(_佐賀,_福岡,_長崎) :- 隣接(_佐賀,_福岡), 隣接(_佐賀,_長崎). 長崎県からの隣接(_長崎,_佐賀) :- 隣接(_長崎,_佐賀). 熊本県からの隣接(_熊本,_福岡,_大分,_宮崎,_鹿児島) :- 隣接(_熊本,_福岡), 隣接(_熊本,_大分), 隣接(_熊本,_宮崎), 隣接(_熊本,_鹿児島). 大分県からの隣接(_大分,_福岡,_熊本,_宮崎) :- 隣接(_大分,_福岡), 隣接(_大分,_熊本), 隣接(_大分,_宮崎). 宮崎県からの隣接(_宮崎,_大分,_熊本,_鹿児島) :- 隣接(_宮崎,_大分), 隣接(_宮崎,_熊本), 隣接(_宮崎,_鹿児島). 鹿児島県からの隣接(_鹿児島,_熊本,_宮崎) :- 隣接(_鹿児島,_熊本), 隣接(_鹿児島,_宮崎). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/688 # お題:九州の七つの県を三色で塗り分ける。 # '九州の七つの県を三色で塗り分ける。'(_色_1,_色_2,_色_3) :- forall(順列([_色_1,_色_2,_色_3],2,[A,B]),assertz(隣接(A,B))), 三色で塗り分ける(_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島), writef('福岡=%t,佐賀=%t,長崎=%t,熊本=%t,大分=%t,宮崎=%t,鹿児島=%t\n',[_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島]). 三色で塗り分ける(_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島) :- 隣接(_福岡,_佐賀), 隣接(_佐賀,_福岡), 隣接(_佐賀,_長崎), 隣接(_長崎,_佐賀), 隣接(_福岡,_熊本), 隣接(_熊本,_福岡), 隣接(_福岡,_大分), 隣接(_大分,_福岡), 隣接(_大分,_宮崎), 隣接(_大分,_熊本), 隣接(_熊本,_大分), 隣接(_宮崎,_大分), 隣接(_熊本,_宮崎), 隣接(_宮崎,_熊本), 隣接(_熊本,_鹿児島), 隣接(_鹿児島,_熊本), 隣接(_宮崎,_鹿児島), 隣接(_鹿児島,_宮崎). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/688 # お題:九州の七つの県を三色で塗り分ける。 # '九州の七つの県を三色で塗り分ける。'(_色_1,_色_2,_色_3) :- forall(順列([_色_1,_色_2,_色_3],2,[A,B]),assertz(隣接(A,B))), 三色で塗り分ける(_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島), writef('福岡=%t,佐賀=%t,長崎=%t,熊本=%t,大分=%t,宮崎=%t,鹿児島=%t\n',[_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島]). 三色で塗り分ける(_福岡,_佐賀,_長崎,_熊本,_大分,_宮崎,_鹿児島) :- 隣接(_福岡,_佐賀),隣接(_佐賀,_福岡),隣接(_佐賀,_長崎),隣接(_長崎,_佐賀), 隣接(_福岡,_熊本),隣接(_熊本,_福岡),隣接(_福岡,_大分),隣接(_大分,_福岡), 隣接(_大分,_宮崎),隣接(_大分,_熊本),隣接(_熊本,_大分),隣接(_宮崎,_大分), 隣接(_熊本,_宮崎),隣接(_宮崎,_熊本),隣接(_熊本,_鹿児島),隣接(_鹿児島,_熊本), 隣接(_宮崎,_鹿児島),隣接(_鹿児島,_宮崎). 順列(Y,0,[]). 順列(Y,N,[A|X]) :- select(A,Y,Z), M is N - 1, 順列(Z,M,X). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/808 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売 # 上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。 # ________________________________ # 担当者  売上  比率 # --------------------- # 山田  12000  30.0% # 鈴木   8000  20.0% # 井上  20000  50.0% # 合計  40000  100.0% # ===================== # '担当者はなん人でも構わない、担当者名と売上を入力する。売上合計を求める。各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。' :- '担当者はなん人でも構わない、担当者名と売上を入力する。', '売上合計を求める。'(_売上合計), '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'. '担当者はなん人でも構わない、担当者名と売上を入力する。' :- 担当者名と売上を入力(_担当者名,_売上), 担当者と売上を追加定義する(_担当者名,_売上), '担当者はなん人でも構わない、担当者名と売上を入力する。',!. '担当者はなん人でも構わない、担当者名と売上を入力する。'. 担当者名と売上を入力(_担当者名,_売上) :- 担当者名の入力(_担当者名), \+(_担当者名=''), 売上の入力(_売上). 担当者名の入力(_担当者名) :- write('担当者名を入力して下さい : '), get_line(_担当者名). 売上の入力(_売上) :- 整数を得る(売上,integer(_売上),_売上). 担当者と売上を追加定義する(_担当者,_売上) :- assertz('担当者・売上'(_担当者,_売上)). 売上合計を得る(_売上合計) :- findall(_売上,( '担当者・売上'(_,_売上)), _売上ならび), sum_list(_売上ならび,_売上合計). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_売上合計) :- write('担当者  売上  比率 \n'), forall('担当者・売上'(_担当者名,_売上),'各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計)), write('===================== \n'). '各担当の売上が売上合計の何%になるかの比率の計算を行い、担当者名、売上、比率を表示する。'(_担当者名,_売上,_売上合計) :- \+(_売上合計 = 0), _比率 is _売上 / _売上合計 * 100, '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率). '担当者名、売上、比率を表示する。'(_担当者名,_売上,_比率) :- format('~w ~0f ~1f%\n',[_担当者名,_売上,_比率]). % 以下のサイトは # 出典: twitter_by_@pleione45_20140726 '東京の気温を見ると、このスクリプトはバグってる?と思いたくなる' :- 'https://twitter.com/pleione45/status/492544531376529408', forall('☆気まぐれBot☆ 北海道の気温と風速 (14時)'(X,Y),true). '☆気まぐれBot☆ 北海道の気温と風速 (14時)'(宗谷岬,'23.3℃/8.5m'). '☆気まぐれBot☆ 北海道の気温と風速 (14時)'(納沙岬,'20.8℃/1.1m'). '☆気まぐれBot☆ 北海道の気温と風速 (14時)'(襟裳岬,'18.0℃/6.2m'). '☆気まぐれBot☆ 北海道の気温と風速 (14時)'(松前,'25.3℃/4.9m'). '☆気まぐれBot☆ 北海道の気温と風速 (14時)'(せたな,'24.5℃/3.9m'). 'https://twitter.com/pleione45/status/492544531376529408'. % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1392388003/788 # [1] 授業単元:プログラミング1 # [2] 問題文 # 正の整数を読み込み、その整数より小さい3の倍数を # 全て表示するプログラムを作る # # '正の整数を読み込み、その整数より小さい3の倍数を 全て表示するプログラムを作る' :- '正の整数を読み込み、'(_正の整数), その整数より小さい3の倍数を全て表示する(_正の整数). '正の整数を読み込み、'(_正の整数) :- 整数を得る(_正の整数,_正の整数 >= 0,_正の整数). その整数より小さい3の倍数を全て表示する(_正の整数) :- forall(その整数より小さい3の倍数を(_正の整数,_その整数より小さい3の倍数),全て表示する(_その整数より小さい3の倍数)). その整数より小さい3の倍数を(_正の整数,_その整数より小さい3の倍数) :- between(1,_正の整数,_その整数より小さい3の倍数), _その整数より小さい3の倍数 < _正の整数, 0 is _その整数より小さい3の倍数 mod 3. 全て表示する(_その整数より小さい3の倍数) :- writef('%t\n',[_その整数より小さい3の倍数]). % 以下のサイトは # 出題場所 :: http://peace.2ch.net/test/read.cgi/tech/1402622093/549 # お題:数独の答を表す文字列が与えられたとき、'1'が各列の何行目にあるかを # いちばん左の列から順に調べて表示する。 # 入力 # 145327698 # 839654127 # 672918543 # 496185372 # 218473956 # 753296481 # 367542819 # 984761235 # 521839764 # # 出力 # 159438276 # # '数独の答を表す文字列が与えられたとき、1が各列の何行目にあるかをいちばん左の列から順に調べて表示する。'(_数独文字列,_列目,_行目) :- 数独文字列を数独に変換(_数独文字列,_数独), 転置(_数独,_転置された数独), forall('1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目),write(_行目)). 数独文字列を数独に変換(_数独文字列,_数独) :- split(_数独文字列,['\n'],_数独文字列行ならび), findall(_数独行,( findall(_数,( sub_atom(_数独文字列,_,1,_,_文字), 数値に変換(_文字,_数)), _数独行)), _数独). '1が各列の何行目にあるかをいちばん左の列から順に調べて'(_転置された数独,_行目) :- nth1(_列目,_転置された数独,_列), nth1(_行目,_列,'1'). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/745 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 1)変数名 kokugo,shakai,rika を整数型で宣言する。(国語、社会、理科) # 変数名 goukei,heikinを整数型で宣言する。(合計、平均) # 2)「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。 # 3)3科目の合計を求める。 # 4)enumを使うこと # '「国語の点数=」のように表示し、キーボードよりそれぞれの科目の点数を入力する。'(_国語,_社会,_理科) :- forall(科目の点数を入力する(_科目,_点数),assertz(成績(_科目,_点数))). 科目の点数を入力する(_科目,_点数) :- member(_科目,[国語,社会,理科]), swritef(催促文,'%tの点数=',[_科目]), 整数を得る(催促文,integer(_点数),_点数). '3科目の合計を求める。'(_合計) :- findall(_点数,( 成績(_,_点数)), _点数ならび), sum_list(_点数ならび,_合計). '3科目の平均を求める。'(_国語,_社会,_理科,_平均) :- findall(_点数,( 成績(_,_点数)), _点数ならび), sum_list(_点数ならび,_合計), _平均 is _合計 / 3. % 以下のサイトは # 出題場所 :: 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'). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/737 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # ソートされた2つの数字列を入力 # *0より大きい整数 # *1行に5つの数字(固定) # それらを合わせて、ソートし、 # 大きい数から3つを表示すること # 実行例) # 11 21 23 33 35 入力1 # 24 25 27 32 85 入力2 # 85 35 33 出力 # 5 14 33 302 990 入力1 # 25 31 200 210 500 入力2 # 990 500 302 出力 # 21 43 99 100 902 入力1 # 10 20 30 275 320 入力2 # 902 320 275 出力 # 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定) それらを合わせて、ソートし、 大きい数から3つを表示すること' :- 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2), 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび), '大きい数から3つを表示すること'(_整列した数字ならび). 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1), 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_2). 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'([_1,_2,_3,_4,_5]) :- '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび), ソートされた数字列(_数字ならび),!. 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび). '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- write('5個の数字をカンマ区切りで入力して下さい : '), get_split_line([',',' '],[_1,_2,_3,_4,_5]). ソートされた数字列([_1,_2,_3,_4,_5]) :- sort([_1,_2,_3,_4,_5],[_1,_2,_3,_4,_5]), forall(member(A,[_1,_2,_3,_4,_5]),number(A)). 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび) :- append(_数字ならび_1,_数字ならび_2,_数字ならび), sort(_数字ならび,_整列した数字ならび). '大きい数から3つを表示すること'(_整列した数字ならび) :- append(_,[_3,_2,_1],_整列した数字ならび), writef('%3r%3r%3r\n',[_1,_2,_3]). % 以下のサイトは # 出典: http://peace.2ch.net/test/read.cgi/tech/1392388003/737 # [1] 授業単元: プログラミング基礎 # [2] 問題文 # 以下のプログラムを作成しなさい. # ソートされた2つの数字列を入力 # *0より大きい整数 # *1行に5つの数字(固定) # それらを合わせて、ソートし、 # 大きい数から3つを表示すること # 実行例) # 11 21 23 33 35 入力1 # 24 25 27 32 85 入力2 # 85 35 33 出力 # 5 14 33 302 990 入力1 # 25 31 200 210 500 入力2 # 990 500 302 出力 # 21 43 99 100 902 入力1 # 10 20 30 275 320 入力2 # 902 320 275 出力 # 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定) それらを合わせて、ソートし、 大きい数から3つを表示すること' :- 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2), 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび), '大きい数から3つを表示すること'(_整列した数字ならび). 'ソートされた2つの数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1,_数字ならび_2) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_1), 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび_2). 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'([_1,_2,_3,_4,_5]) :- '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび), ソートされた数字列(_数字ならび),!. 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- 'ソートされた数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび). '数字列を入力 *0より大きい整数 *1行に5つの数字(固定)'(_数字ならび) :- write('5個の数字をカンマ区切りで入力して下さい : '), get_split_line([',',' '],[_1,_2,_3,_4,_5]). ソートされた数字列([_1,_2,_3,_4,_5]) :- sort([_1,_2,_3,_4,_5],[_1,_2,_3,_4,_5]), forall(member(A,[_1,_2,_3,_4,_5]),number(A)). 'それらを合わせて、ソートし、'(_数字ならび_1,_数字ならび_2,_整列した数字ならび) :- append(_数字ならび_1,_数字ならび_2,_数字ならび), sort(_数字ならび,_整列した数字ならび). '大きい数から3つを表示すること'(_整列した数字ならび) :- append(_,[_3,_2,_1],_整列した数字ならび), writef('%3r%3r%3r\n',[_1,_2,_3]). % 以下のサイトは # 出典: # C/C++の宿題片付けます 167代目 #716 # [1] 授業単元: プログラミング基礎 # [2] 問題文:10個の整数を入力し配列に保存した後、入力された数字の中に # 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 # 含まれていない時に「5の倍数が含まれていません」と表示するプログラムを作りなさい。 # # よろしくお願いいたします。 '10個の整数を入力し配列に保存した後、入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。' :- '10個の整数を入力し配列に保存した後、'(L), '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L). '10個の整数を入力し配列に保存した後、'(L) :- write('カンマ区切りで整数を10個入力しなさい : '), get_split_line([','],L). '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L) :- '5の倍数が含まれているかを調べ、含まれていた時には'(L), write('5の倍数が含まれています\n'). '入力された数字の中に 5の倍数が含まれているかを調べ、含まれていた時には「5の倍数が含まれています」 含まれていない時に「5の倍数が含まれていません」と表示する。'(L) :- '5の倍数が含まれていない時に'(L), write('5の倍数が含まれていません\n'). '5の倍数が含まれているかを調べ、含まれていた時には'(L) :- member(N,L), 0 is N mod 5,!. '5の倍数が含まれていない時に'(L) :- forall(member(N,L),\+(0 is N mod 5)). % 以下のサイトは # # 述語名は'$解の度数','$射影項' の述語名は必須ではない。 # :- dynamic(['$解の度数'/2,'$射影項'/2]). 解の数を制限した全解照会(_限界実行回数,_射影項,_実行項,_射影項ならび) :- 履歴管理(_管理指標), forall(解の数を制限した解照会(_限界実行回数,_管理指標,_射影項,_実行項),true), 射影項の収集(_管理指標,_射影項ならび). 解の数を制限した解照会(_限界実行回数,_管理指標,_射影項,_実行項) :- 解の数を勘定しながらの実行(_管理指標,N,_射影項,_実行項), ( N = _限界実行回数; N = _限界実行回数,!,fail; asserta('$解の度数'(_管理指標,N))). 解の数を勘定しながらの実行(_管理指標,N,_射影項,_実行項) :- call(_実行項), 解は既出解を捨てて収集する(_管理指標,_射影項,_実行項), retract('$解の度数'(_管理指標,N_1)), succ(N_1,N). 解は既出解を捨てて収集する(_管理指標,_射影項,_実行項) :- \+(catch('$射影項'(_管理指標,_射影項),E,fail)), asserta('$解の度数'(_管理指標,_射影項)),!. 履歴管理(_管理指標) :- _管理指標 is random(2147483647), \+(catch('$射影項'(_管理指標,_),E,fail)), asserta('$解の度数'(_管理指標,0)),!. 履歴管理(_管理指標) :- 履歴管理(_管理指標). 射影項の収集(_管理指標,_射影項ならび) :- findall(_射影項,'$射影項'(_管理指標,_射影項)),_射影項ならび). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #670 # include # # int series(void); # # int main(void) # { # int i; # # for (i = 0; i < 10; i++) # printf("%d ", series()); # # return 0; # } # # /* これは正しくない */ # int series(void) # { # int total; # # total = (total + 1423) % 1422; # return total; # } '10解を表示する' :- forall('非決定性述語で一解を得る(主計算)'([_,_,_,_,_,_,_,_,_,_],0,X),表示する(X)). '非決定性述語で一解を得る(主計算)'([_|Ln],M,N) :- M_2 is (M + 1423) mod 1422, '非決定性述語で一解を得る(制御)'(Ln,M_2,N). '非決定性述語で一解を得る(制御)'(_,N,N). '非決定性述語で一解を得る(制御)'(Ln,M,N) :- '非決定性述語で一解を得る(主計算)'(Ln,M,N). 表示する(X) :- writef('%t\n',[X]). % 以下のサイトは # 出典: C/C++の宿題片付けます 167代目 #670 # include # # int series(void); # # int main(void) # { # int i; # # for (i = 0; i < 10; i++) # printf("%d ", series()); # # return 0; # } # # /* これは正しくない */ # int series(void) # { # int total; # # total = (total + 1423) % 1422; # return total; # } main :- forall(series([_,_,_,_,_,_,_,_,_,_],0,X),writef('%t\n',[X])). series([_|Ln],M,N) :- M_2 is (M + 1423) mod 1422, series_2(Ln,M_2,N). series_2(_,N,N). series_2(Ln,M,N) :- series(Ln,M,N). % 以下のサイトは # お題:与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。 # 例:123は、1,23 1,2,3 12,3のように分割出来る。 # 1,23 ---> 22*22 ---> 484 # 1,2,3 ---> 1*1+1*1 --> 2 # 12,3 ---> 9*9 ---> 81 # です。 '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、 隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_与えられた数値列,_隣り合う数の差の二乗の合計が最大になるような分割) :- '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割), '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). '与えられた数値を先頭から順に桁ごとに区切って使って数列を作り、'(_与えられた数値,_全数値分割) :- number_chars(_与えられた数値,_数字ならび), findall(_数値分割,( 数字ならびから数値分割(_数字ならび,_数値分割)), _全数値分割). 数字ならびから数値分割([],[]). 数字ならびから数値分割(_数字ならび,[N|LL2]) :- append(L1,L2,_数字ならび), number_chars(N,L1), 数字ならびから数値分割(L2,LL2). '隣り合う数の「差の二乗」の合計が最大になるような分割を求めよ。'(_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割) :- findall(_隣り合う数の差の二乗の合計,( member(_分割,_全数値分割), '隣り合う数の「差の二乗」の合計が'(_分割,_隣り合う数の差の二乗の合計)), _隣り合う数の差の二乗の合計ならび), 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_合計の最大値). '隣り合う数の「差の二乗」の合計が'(_全数値分割,_隣り合う数の差の二乗の合計) :- findsum(_隣り合う数の差の二乗,( append(_,[N1,N2|_],_全数値分割), _隣り合う数の差の二乗 is (N1 - N2) ^ 2), _隣り合う数の差の二乗の合計). 最大になるような分割(_全数値分割,_隣り合う数の差の二乗の合計ならび,_隣り合う数の差の二乗の合計が最大になるような分割) :- 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値), nth1(_位置,_全数値分割,_隣り合う数の差の二乗の合計が最大になるような分割). 最大になる(_隣り合う数の差の二乗の合計ならび,_位置,_合計の最大値) :- append(L1,[_合計の最大値|L2],_隣り合う数の差の二乗の合計ならび), forall(member(N1,L1),N1 =< _合計の最大値), forall(member(N2,L2),N2 =< _合計の最大値), length([_|L1],_位置). findsum(A,B,C) :- findall(A,B,L), sum_list(L,C). % 以下のサイトは # 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 # :- dynamic(行パターン,1). 白(白). 黒(黒). '_行数 is S * L, S(1≦S≦10) L(100≦L≦100) 標準入力から以下の形式で与えられる S L' :- 'S Lを得る'(_s,_l), 表示パターンの形成(_s,_l,LL1), 出力する(LL1). 表示パターンの形成(_s,_l,_表示パターン) :- 行パターンの定義(_s,_l), 表の形成(_s,_l,_表示パターン), 転置して具体値を埋める(_表示パターン). 行パターンの定義(_s,_l) :- 白(_白), 黒(_黒), 行パターンの生成(_白,_黒,_s,_l), 行パターンの生成(_黒,_白,_s,_l). 行パターンの生成(_文字_1,_文字_2,_s,_l) :- length(Ln,_l), findall(文字,( 同一文字列トグル(Ln,_s,_文字_1,_文字_2,_文字)), _行パターン), assertz(行パターン(_行パターン)). 同一文字列トグル([_|_],_s,_文字,_,_文字) :- between(1,_s,_). 同一文字列トグル([_|Ln],_s,_文字_1,_文字_2,_文字) :- 同一文字列トグル(Ln,_s,_文字_2,_文字_1,_文字). 転置して具体値を埋める([L1|R]) :- 転置([L1|R],LL2), findall(L,( member(L,LL2), 行パターン(L)), LL2). 表の形成(_s,_l,[_行パターン|LL]) :- 行パターン(_行パターン),!, findall(L,( between(2,_l,_), length(L,_s)), LL). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 'S Lを得る'(S,L) :- get_line(Line), split(Line,[' '],[S,L]). 出力する(LL) :- flatten(LL,L), forall(member(A,L),format('~w\n',[A])). % 以下のサイトは # 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). % 以下のサイトは # 出典: プログラミングのお題スレ Part4 #81 # お題:0から9のうち8種類の数字を使って4桁の10進数を2個つくり、その積をとると # 4桁の2個の数に使用した8種類の数字はひとつも現れなかった。 # この4桁の2個の10進数を求める。 '0から9のうち8種類の数字を使って4桁の10進数を2個つくり、その積をとると 4桁の2個の数に使用した8種類の数字はひとつも現れなかった。 この4桁の2個の10進数を求める。'(_4桁の10進数_1,_4桁の10進数_2) :- '0から9のうち8種類の数字を使って4桁の10進数を2個つくり、'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2), 'その積をとると4桁の2個の数に使用した8種類の数字はひとつも現れなかった。'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2). '0から9のうち8種類の数字を使って4桁の10進数を2個つくり、'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2) :- select(_残り数字_1,['0','1','2','3','4','5','6','7','8','9'],_残りならび_1), select(_残り数字_2,_残りならび_1,_8種類の数字), '4桁の10進数を2個つくり、'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2). '4桁の10進数を2個つくり、'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2) :- select(_1,_8種類の数字,R_1), select(_2,R_1,R_2), select(_3,R_2,R_3), select(_4,R_3,R_4), select(_5,R_4,R_5), select(_6,R_5,R_6), select(_7,R_6,R_7), select(_8,R_7,_), number_chars(_4桁の10進数_1,[_1,_2,_3,_4]), number_chars(_4桁の10進数_2,[_5,_6,_7,_8]), _4桁の10進数_1 >= 1023, _4桁の10進数_2 >= 1023. 'その積をとると4桁の2個の数に使用した8種類の数字はひとつも現れなかった。'(_8種類の数字,_4桁の10進数_1,_4桁の10進数_2) :- _積 is _4桁の10進数_1 * _4桁の10進数_2, '4桁の2個の数に使用した8種類の数字はひとつも現れなかった。'(_8種類の数字,_積). '4桁の2個の数に使用した8種類の数字はひとつも現れなかった。'(_8種類の数字,_積) :- number_chars(_積,_積の数字ならび), forall(member(_積に現れる数字,_積の数字ならび),\+(member(_積に現れる数字,_8種類の数字))). % 以下のサイトは # # 野球豚河内 @baseballbooo 3時間 # # 「ホモが嫌いな女子はいません」を表すProlog事実 # # female(someone). # fujoshi(X) :- female(X). # like(someone,homo) :- fujoshi(X). # ホモが嫌いな女子はいません :- forall(女子(_女子),好き(_女子,ホモ)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ホモが嫌いな女子はいません :- \+((嫌い(_女子,ホモ),女子(_女子))). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ホモが嫌いな女子はいません :- \+(ホモが嫌いな女子(_女子)). ホモが嫌いな女子(_女子) :- ホモが(_ホモ), 嫌いな(_女子,_ホモ), 女子(_女子). % 以下のサイトは # 出典: SQL質疑応答スレ 14問目 #935 # # ・DBMS名とバージョン Oracle11gR2 # PL/SQLのプログラムを作ってるのですが期待通り動作しておらず、その理由を知りたく思ってます # # テーブルA # a1 | a2 # --------- # 100 | 1 # 100 | 2 # 200 | 3 # というテーブルにて、a1='100'のレコードについては、a2に100を加算、といった処理をしたい。 # 'テーブルA a1 | a2 --------- 100 | 1 100 | 2 200 | 3 というテーブルにて、a1='100'のレコードについては、a2に100を加算、といった処理をしたい。' :- 'テーブルAのa1='100'のレコードについては、a2に100を加算'. 'テーブルAのa1='100'のレコードについては、テーブルAのa2に100を加算' :- _a1 = '100', forall('テーブルAのa1='100'のレコードについては、'(_a1,_a2), 'テーブルAのa2に100を加算'(_a1,_a2)). 'テーブルAのa1='100'のレコードについては、'(_a1,_a2) :- retract(テーブルA(_a1,_a2)). 'テーブルAのa2に100を加算'(_a1,_a2) :- _a2_2 is _a2 + 100, assertz(テーブルA(_a1,_a2_2). % 以下のサイトは # 出典: プログラミングのお題スレ 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(_第一引数,_第二引数). % 以下のサイトは # 出典 :: SQL質疑応答スレ 14問目 #896 # 質問です。 # PostgreSQL9.3 # # テーブル # DATE, VALUE # 20140401,-13 # 20140402,-11 # 20140403, 12 # 20140404, 13 # 20140405, 12 # 20140406,-11 # # 欲しい結果 # DATE, VALUE ,COUNT # 20140401,-13, 1 # 20140402,-11, 2 # 20140403, 12, 1 # 20140404, 13, 2 # 20140405, 12, 3 # 20140406,-11, 1 # # このように、VALUEの値の正負の連続数をCOUNTし出力するようなSQLは書けるのですか? 'VALUEの値の正負の連続数をCOUNTし出力する' :- findall([_DATE,_VALUE],( テーブル(_DATE,_VALUE)), LL), 'VALUEの値の正負の連続数をCOUNTし出力する'(LL). 'VALUEの値の正負の連続数をCOUNTし出力する'(LL) :- append(LL1,LL2,LL3,LL), 同一の符号の最大連続(LL1,LL2,LL3), 'COUNTして出力する'(LL2). LL3 = []. 同一の符号の最大連続(LL1,LL2,LL3) :- 全てが同一符号(LL2,_符号), 'LL1の最後の要素の符号は異なる'(LL1,_符号), 'LL3の最初の要素の符号は異なる'(LL3,_符号). 全てが同一符号([],_). 全てが同一符号([[_,_VALUE]|R],_符号) :- 符号(_VALUE,_符号), 全てが同一符号(R,_符号). 符号(_VALUE,+) :- _VALUE >= 0. 符号(_VALUE,-) :- _VALUE < 0. 'LL1の最後の要素の符号は異なる'(LL1,_符号) :- \+((append(_,[[_,_VALUE]],LL1),符号(_VALUE,_符号))). 'LL3の最初の要素の符号は異なる'(LL3,_符号) :- \+((LL3 = [[_,_VALUE]|_],符号(_VALUE,_符号))). 'COUNTして出力する'(LL2) :- forall( nth1(_nth1,LL2,[_DATE,_VALUE]), writef('%t,%t,%t\n',[_DATE,_VALUE,_nth1])). append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). % 以下のサイトは # 問題 # # 「mldsg」のうち3文字からなる英小文字の文字列を # 英大文字に変換して標準出力してください。 # 同じ文字を複数回使っても構いません。 # 言語はideoneで選択可能な言語を利用可能です。 # '「mldsg」のうち3文字からなる英小文字の文字列を 英大文字に変換して標準出力してください。 同じ文字を複数回使っても構いません。 言語はideoneで選択可能な言語を利用可能です。' :- forall( '「mldsg」のうち3文字からなる英小文字の文字列を'(_3文字からなる英小文字の文字列), '英大文字に変換して標準出力してください。'(_3文字からなる英小文字の文字列)). '「mldsg」のうち3文字からなる英小文字の文字列を'(_3文字からなる英小文字の文字列) :- '3文字からなる英小文字の文字列を'(mldsg,[],_3文字からなる英小文字の文字列). '3文字からなる英小文字の文字列を'(_,[_1,_2,_3],_3文字の文字列) :- atom_chars(_3文字の文字列,[_1,_2,_3]),!. '3文字からなる英小文字の文字列を'(_文字列,L,_3文字の文字列) :- sub_atom(_文字列,_,1,_,_文字), '3文字からなる英小文字の文字列を'(_文字列,[_文字|L],_3文字の文字列). '英大文字に変換して標準出力してください。'(_3文字からなる英小文字の文字列) :- 英大文字に変換して(_3文字からなる英小文字の文字列,_3文字からなる英大文字の文字列), '標準出力してください。'(_3文字からなる英大文字の文字列). 英大文字に変換して(_3文字からなる英小文字の文字列,_3文字からなる英大文字の文字列) :- findall(_大文字,( sub_atom(_3文字からなる英小文字の文字列,_,1,_,_小文字), 英小文字大文字(_小文字,_大文字)), _3文字からなる英大文字のならび), atom_chars(_3文字からなる英大文字の文字列,_3文字からなる英大文字のならび). 英小文字大文字(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'). '標準出力してください。'(_3文字からなる英大文字の文字列) :- writef('%t\n',[_3文字からなる英大文字の文字列]). :- '「mldsg」のうち3文字からなる英小文字の文字列を 英大文字に変換して標準出力してください。 同じ文字を複数回使っても構いません。 言語はideoneで選択可能な言語を利用可能です。'. % 以下のサイトは 行は前半の文字列と後半の数値で構成される(_行,_前半の文字列,_後半の数値) :- sub_atom(_行,0,Len,_,_前半の文字列), 文字列は数字とピリオドを含まない(_前半文字列), sub_atom(_行,Len,_,0,_後半の数字文字列), 文字列は数字かピリオドだけで構成されている(_後半の数字文字列), read_term_from_atom(_後半の数字文字列,_後半の数値,[]). 文字列は数字とピリオドを含まない(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),\+(数字かピリオド(_文字))). 文字列は数字かピリオドだけで構成されている(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),数字かピリオド(_文字)). 数字かピリオド('0'). 数字かピリオド('1'). 数字かピリオド('2'). 数字かピリオド('3'). 数字かピリオド('4'). 数字かピリオド('5'). 数字かピリオド('6'). 数字かピリオド('7'). 数字かピリオド('8'). 数字かピリオド('9'). 数字かピリオド('0'). 数字かピリオド('.'). % 以下のサイトは # [1] 授業単元: プログラミング基礎 # [2] 問題文(含コード&リンク): # 10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい. # # 出力形 # 8192 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2 # 因子数:13 # # [3] 環境 #  [3.1] OS: Linux #  [3.2] コンパイラ名とバージョン: gcc 3.4 #  [3.3] 言語: C # [4] 期限: 3月30日まで # [5] その他の制限: # ヒントを教授に聞きに行ったら自分で考えろと一蹴されました # よろしくお願いします '10000以下の自然数のうち素因数分解を行ったときにその因子の数が最多となる数を求め,その数,因子の数,素因数分解の結果を表示するプログラムを作成して下さい.' :- '10000以下の素数を求める'(_10000以下の素数ならび), '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび), 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数), 'その数,因子の数,素因数分解の結果を表示する'(_素因子分解ならび,_最多因子数). '10000以下の自然数のうち素因数分解を行ったときに'(_10000以下の自然数,_10000以下の素数ならび,_素因子分解ならび) :- findall([_10000以下の自然数,_10000の素因子の数,_素因子ならび],( between(1,10000,_10000以下の自然数), '10000の素因子分解'(_10000以下の素数ならび,_素因子ならび), length(_素因子ならび,_10000の素因子の数)), _素因子分解ならび). '10000以下の素数を求める'(_10000以下の素数ならび) :- エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび). エラトステネスの篩によって10000以下の素数を求める(_10000以下の素数ならび) :- findall(N,between(1,10000,N),_10000以下の自然数ならび), エラトステネスの篩(_10000以下の自然数ならび,_10000以下の素数ならび). '10000以下の自然数のうち素因数分解を行ったときに'(_,[],[]) :- !. '10000以下の自然数のうち素因数分解を行ったときに'(M,[N|R1],[N|R2]) :- 0 is M mod N, M_1 is M // N, '10000以下の自然数のうち素因数分解を行ったときに'(M_1,[N|R1],R2). '10000以下の自然数のうち素因数分解を行ったときに'(M,[_|R1],R2) :- '10000以下の自然数のうち素因数分解を行ったときに'(M,R1,R2). 'その因子の数が最多となる数を求め、'(_素因子分解ならび,_最多因子数) :- findmax(_素因子の数,( member([_,_因子の数,_],_素因子分解ならび)), _最多因子数). 'その数,因子の数,素因子分解の結果を表示する'(_素因子分解ならび,_最多因子数) :- forall( member([_数,_最多因子数,_素因子分解の結果],_素因子分解ならび), writef('%t,%t,%t\n',[_数,_最多因子数,_素因子分解の結果])). findmax(_選択項,_評価項,_最大値) :- findall(_選択項,_評価項,_評価ならび), 最大値(_評価ならび,_最大値). 最大値(_ならび,_最大値) :- append(L1,[_最大値|L2],_ならび), ならび要素に最大値を超えるものはない(L1,_最大値), ならび要素に最大値を超えるものはない(L2,_最大値). ならびの要素に最大値を超えるものはない(_ならび,_最大値) :- \+((member(_要素,_ならび),_要素 @> _最大値)). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # 出典 :: http://pc12.2ch.net/test/read.cgi/tech/1136994325/954 # pascal pcpad # 1個の自然数nを適当に決めて、nチームが参加する # リーグ戦の全試合を表示するプログラムを書きなさい。 '1個の自然数nを適当に決めて、nチームが参加するリーグ戦の全試合を表示する' :- '1個の自然数nを適当に決めて、'(_n), 'nチームが参加するリーグ戦の全試合を表示する'(_n). '1個の自然数nを適当に決めて、'(_n) :- _n is random(16) + 3. 'nチームが参加するリーグ戦の全試合を表示する'(_n) :- 'nチームが参加する'(_n,_nチームが参加する), forall( リーグ戦の全試合を(_nチームが参加する,_チーム番号_1,_チーム番号_2), 表示する(_チーム番号_1,_チーム番号_2)). 'nチームが参加する'(_n,_nチームが参加する) :- findall(M,between(1,_n,M),_nチームが参加する). リーグ戦の全試合を(_nチームが参加する,_チーム番号_1,_チーム番号_2) :- 組合せ(_nチームが参加する,2,[_チーム番号_1,_チーム番号_2]). 組合せ(X,1,[A]) :- member(A,X). 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). 表示する(_チーム番号_1,_チーム番号_2) :- チーム(_チーム番号_1,_チーム名_1), チーム(_チーム番号_2,_チーム名_2), writef('%t-%t\n',[_チーム名_1,_チーム名_2]). チーム(1,サンフレッチェ広島). チーム(2,'横浜F・マリノス'). チーム(3,川崎フロンターレ). チーム(4,セレッソ大阪). チーム(5,鹿島アントラーズ). チーム(6,浦和レッズ). チーム(7,アルビレックス新潟). チーム(8,'FC東京'). チーム(9,清水エスパルス). チーム(10,柏レイソル). チーム(11,名古屋グランパス). チーム(12,サガン鳥栖). チーム(13,ベガルタ仙台). チーム(14,大宮アルディージャ). チーム(15,ヴァンフォーレ甲府). チーム(16,湘南ベルマーレ). チーム(17,ジュビロ磐田). チーム(18,大分トリニータ). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # # かたやん印刷所では、いまの時代においてもグーテンベルグ印刷にこだわって印刷をしています。 # グーテンベルグ印刷とは、活版(活字を組み合わせて作った版)で印刷する方法です。(Wikipedia) # # かたやん印刷所の所長かたやんは、使った活字を元の場所に戻さないので、 # いつも活字を入れているボックスはぐちゃぐちゃで、 # ほしい活字をすぐに見つけ出すことができません。 # # そこで見かねた印刷所の副所長エミーは、活字を入れているボックスビデオで撮影し、 # 画像解析し、ボックスのどこにどの活字があるかを解析し、 # ほしい文字列の活字がどこにあるか瞬時にみつけだすプログラミングを作ることにしました。 # # 現状の状態のボックスは以下のようになっています。 # # # 6×6のボックスの中から"PRO, PROGRAMMER"という活字を探し出したいです。 # カンマやスペースは1つの活字としてカウントします。 # ですので、今回は文字13個、カンマ1個、スペース1個の合計15個の活字が必要です。 # 一度使った活字は2回使うことはできません。 # # 活字の場所は、(縦番号,横番号)で表すと以下のような順番で活字を取り出すことができます。 # 縦番号は上から下の方向に、横番号は左から右の方向に、1から数えます。 # 1,4 = P # 2,1 = R # 1,6 = O # 5,2 = , # 5,4 = space # 2,2 = P # 3,4 = R # 4,5 = O # 5,1 = G # 4,3 = R # 1,1 = A # 2,5 = M # 6,1 = M # 2,4 = E # 6,6 = R # # # 上記の例では、例えば"P"という文字が2回でてきますが、(1,4)と(2,2)にある"P"はどちらを先につかってもかまいません。 # また場所の特定は1つのみ記述すればよいです。すべての場所番号を書く必要はありません。 # # 画像解析したボックスのデータはCSVで出力されます。 # ボックスのデータを使ってほしい文字列を作るための活字の在り処を探しだしてください。 # # ■資料 # gutenberg.zip # zipファイルを解凍すると以下のファイルが入っています。 # # gutenberg.csv # このボックスから"STAY HUNGRY, STAY FOOLISH"という活字を取り出してください。 # 文字21個、カンマ1個、スペース3個で、合計25個の活字が必要です。 # # answer.txt # 解答用テキストファイルです。 # # ■解答方法 # 解答用テキストファイル(answer.txt)を完成させ、アップロードしてください。 # ※解答用テキストファイル(answer.txt)以外のファイル形式(zipなど)をアップロードした場合は評価対象外となります。 # '20×20のボックスの生成' :- open('gutenberg.csv',read,Instream), '20×20のボックスの生成'(Instream,_20掛ける20のボックス), close(Instream), assertz('20×20のボックス'(_20掛ける20のボックス)). '20×20のボックスの生成'(Instream,[]) :- at_end_of_stream(Instream),!. '20×20のボックスの生成'(Instream,[L|R]) :- get_line(Instream,Line), split(Line,['\t'],L), '20×20のボックスの生成'(Instream,R). '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス) :- atom_chars(_ある文字列,_文字ならび), '20×20のボックスの中からある文字列を取り出す'(_文字ならび,_20掛ける20のボックス,L), 解の表示(L). '20×20のボックスの中からある文字列を取り出す'([],_20掛ける20のボックス,[]) :- !. '20×20のボックスの中からある文字列を取り出す'([_文字|_残り文字ならび],_20掛ける20のボックス_1,[[_文字,_行目,_列目]|R]) :- ある文字を取り出す(_文字,_20掛ける20のボックス_1,1,_列目,_20掛ける20のボックス_2), '20×20のボックスの中からある文字列を取り出す'(_残り文字ならび,_20掛ける20のボックス_2,R). ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行_2|R_1]) :- nth1(_列目,_行,_文字), 行を更新する(_行,_列目,_行_2),!. ある文字を取り出す(_文字,[_行|R_1],_行目,_列目,[_行|R_2]) :- _行目_2 is _行目 + 1, ある文字を取り出す(_文字,R_1,_行目_2,_列目,R_2). 行を更新する(_行,_列目,_行_2) :- length([_|L1],_列目), append(L1,[_|R],_行), append(L1,[''|R],_行_2),!. 解の表示(L) :- tell('ans.txt'), forall(member([_文字,_行目,_列目],L),writef('%t,%t,%t\n',[_文字,_行目,_列目])), told. get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split('',_,[],[]) :- !. split(_文字列,_区切り文字列ならび,[_区切り文字列|R3],[_副文字列|R4]) :- 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列), split(_残り文字列,_区切り文字列ならび,R3,R4). 副文字列を切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_副文字列,_残り文字列) :- 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,_切り出し文字ならび,_残り文字列), atomic_list_concat(_切り出し文字ならび,_副文字列),!. 文字ならびとして切り出す('',_,'',[],'') :- !. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[],_残り文字列) :- 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列),!. 文字ならびとして切り出す(_文字列,_区切り文字列ならび,_区切り文字列,[_文字|R4],_残り文字列) :- 一文字切り出す(_文字列,_文字,_残り文字列_2), 文字ならびとして切り出す(_残り文字列_2,_区切り文字列ならび,_区切り文字列,R4,_残り文字列). 文字列の先頭は区切り文字列である(_文字列,_区切り文字列ならび,_区切り文字列,_残り文字列) :- member(_区切り文字列,_区切り文字列ならび), atom_length(_区切り文字列,_長さ), sub_atom(_文字列,0,_長さ,_残り文字数,_区切り文字列), sub_atom(_文字列,_,_残り文字数,0,_残り文字列),!. 一文字切り出す(_文字列,_文字,_残り文字列_2) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,_,0,_残り文字列_2). :- '20×20のボックスの生成'(_CSVファイル). :- '20×20のボックス'(_20掛ける20のボックス), '20×20のボックスの中からある文字列を取り出す'(_ある文字列,_20掛ける20のボックス). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックスの中から'(_20掛ける20のボックス), ある文字列を取り出す(_20掛ける20のボックス,_行目,_列目,_ある文字列). '20×20のボックスの中から'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall( member(_20のボックス,_20掛ける20のボックス), '20のボックス'(_20のボックス)). '20のボックス'(_20のボックス) :- length(_20のボックス,20), forall( member(_ボックス,_20のボックス), ボックス(_ボックス)). ボックス([_|_]) :- !. ボックス([]). ある文字列を取り出す(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- _ボックス = [_|_], '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,_ボックス), member(_ある文字列,_ボックス). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは # # 20×20のボックスの中からある文字列を取り出すプログラムを書いて! # '20×20のボックスの中からある文字列を取り出す'(_20掛ける20のボックス,_行目,_列目,_ある文字列) :- '20×20のボックス'(_20掛ける20のボックス), nth1(_行目,_20のボックス,_20掛ける20のボックス), nth1(_列目,_20のホックス,[_ある文字列]). '20×20のボックス'(_20掛ける20のボックス) :- length(_20掛ける20のボックス,20), forall(member(_20のボックス,_20掛ける20のボックス),length(_20のボックス,20)). % 以下のサイトは # # 文字列の先頭から連続文字を切り出す # 連続文字列を切り出す(_文字列,_前文字列,_同じ文字の文字列,_後文字列) :- sub_atom(_文字列,_開始位置,Len,_残り文字長さ,_同じ文字の文字列), 連続文字列(_同じ文字の文字列,_文字), '前後には文字がないか、あるいは異なった文字がある'(_文字列,_文字,_開始位置,_残り文字長さ,_前文字列,_後文字列). '前後には文字がないか、あるいは異なった文字がある'(_文字列,_文字,_開始位置,_残り文字長さ,_前文字列,_後文字列) :- sub_atom(_文字列,0,_開始位置,_,_前文字列), sub_atom(_文字列,_,_残り文字長さ,0,_後文字列), \+(sub_atom(_前文字列,_,1,0,_文字)), \+(sub_atom(_後文字列,0,1,_,文字)). 連続文字列(_文字列,_文字) :- 連続文字の確認(_文字列,_文字,_残り文字列), 残り文字列も同一文字(_文字列,_文字,_残り文字列). 連続文字の確認(_文字列,_文字,_残り文字列) :- sub_atom(_文字列,0,1,_,_文字), sub_atom(_文字列,1,1,_残り文字数,_文字). 残り文字列も同一文字(_文字列,_文字,_残り文字列) :- forall(( sub_atom(_文字列,_,1,_残り文字数_1,_文字_1), _残り文字数 > _残り文字数_1),_文字=_文字_1). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/300 # お題:次のような規則の配列でインデックス番号iの配列の値を求める。 # ・インデックス番号1の配列の値A(1)は1である。 # ・配列の値は昇順である。 # ・インデックス番号iの配列の値A(i)は配列内のiの個数である。 # 例 # A(10) -> 4 # A(100) -> 14 # A(1000) -> 45 # :- dynamic(a/2). a(1,1). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_i,X) :- '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(2,_i,2), a(_i,X). '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_インデッスク,_i,_繰り返し数_1) :- _インデックス > _i,!. '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_インデッスク,_i,_繰り返し数_1) :- 繰り返し数_1から繰り返し個数を求めてインデックス列を登録する(_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2), '次のような規則の配列でインデックス番号iの配列の値を求める。 ・インデックス番号1の配列の値A(1)は1である。 ・配列の値は昇順である。 ・インデックス番号iの配列の値A(i)は配列内のiの個数である。'(_次のインデックス,_i,_繰り返し数_2). 繰り返し数_1から繰り返し数を求めてインデックス列を登録する(_インデックス,_繰り返し数_1,_次のインデックス,_繰り返し数_2) :- 繰り返し個数を得る(_繰り返し数_1,_繰り返し数), _次のインデックス is _インデックス + _繰り返し数, インデッスク列の生成(_インデックス,_繰り返し数), _繰り返し数_2 is _繰り返し数_1 + 1. 繰り返し数を得る(N,M) :- a(N,M),!. 繰り返し数を得る(N,N). インデッスク列の生成(_インデックス,_繰り返し数) :- _インデックス_2 is _インデックス + _繰り返し数 - 1, forall(between(_インデックス,_インデックス_2,N),assertz(a(N,_繰り返し数))). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/648 # MySQL 5.5.28を使用しています。 # # テーブルAとBを対象として # 以下の出力結果を取得したいと考えているのですが、 # どのようなSQL文を記述すればよいでしょうか? # # どなたかお知恵を拝借させてください。 # # 1.テーブルAの「item_cd」と「use_date」を抽出。 # # 2.テーブルBから、以下の条件で「status」を抽出。 # #   “「item_cd」が一致” #   “「use_date」を起点とした直近の「chg_date」” # #   ※条件に該当するレコードがない場合はNULL。 # # 3.1〜2により、テーブルAの各レコードについて #   「item_cd」の「use_date」時点における「status」を出力。 # # # 【テーブルA】(キー:id) # ------------------------------------------ # id item_cd use_date # ------------------------------------------ # 1 111 2012-04-01 # 2 111 2013-04-01 # 3 111 2014-04-01 # 4 222 2014-04-01 # 5 333 2014-04-01 # # 【テーブルB】(キー:item_cd + chg_date) # ------------------------------------------ # item_cd status chg_date # ------------------------------------------ # 111 11 2013-01-01 # 111 12 2014-01-01 # 222 21 2012-01-01 # # 【出力結果】 # ------------------------------------------ # id item_cd use_date status chg_date # ------------------------------------------ # 1 111 2012-04-01 NULL NULL # 2 111 2013-04-01 11 2013-01-01 # 3 111 2014-04-01 12 2014-01-01 # 4 222 2014-04-01 21 2012-01-01 # 5 333 2014-04-01 NULL NULL # # # 以上です。 # よろしくお願いします。 # # '【出力結果】' :- forall('3.1〜2により、テーブルAの各レコードについて   「item_cd」の「use_date」時点における「status」を出力。'(_item_cd,_use_date,_status), writef('%3c%4r%11r%5l%11r\n',[_id,_item_cd,_use_date,_status,_chg_date])). '1.テーブルAの「item_cd」と「use_date」を抽出。'(_id,_item_cd,_use_date) :- テーブルA(_id,_item_cd,_use_date). '2.テーブルBから、以下の条件で「status」を抽出。   “「item_cd」が一致”   “「use_date」を起点とした直近の「chg_date」”   ※条件に該当するレコードがない場合はNULL。'(_item_cd,_use_date,_status,_chg_date) :- テーブルB(_item_cd,_status,_chg_date), _chg_date @>= _use_date,!. '3.1〜2により、テーブルAの各レコードについて   「item_cd」の「use_date」時点における「status」を出力。'(_id,_item_cd,_use_date,_status,_chg_date) :- '1.テーブルAの「item_cd」と「use_date」を抽出。'(_id,_item_cd,_use_date), '2.テーブルBから、以下の条件で「status」を抽出。   “「item_cd」が一致”   “「use_date」を起点とした直近の「chg_date」”   ※条件に該当するレコードがない場合はNULL。'(_item_cd,_use_date,_status). % 以下のサイトは # # シェル経由の他言語インターフェイス shs/3 です。 # shs(Command,_コマンドへの入力ならび,_コマンドからの出力ならび) :- popen(Command,Outstream,Instream), コマンドへの入力(Outstream,_コマンドへの入力ならび), close(Outstream), コマンドからの出力の収集(Instream,_コマンドからの出力ならび), close(Instream). popen(Command,Outstream,Instream) :- open(pipe(Command),write,Outstream), open(pipe(Outstream),read,Instream). コマンドへの入力(Outstream,_コマンドへの入力ならび) :- tell(Outstream), forall(member(_入力行,_コマンドへの入力ならび),writef('%t\n',[_入力行])), told. コマンドからの出力の収集(Instream,[]) :- at_end_of_stream(Instream),!. コマンドからの出力の収集(Instream,[_行|R]) :- get_line(Instream,_行), コマンドからの出力の収集(Instream,R). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,C,[C]) :- at_end_of_stream(Stream),!. get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). % 以下のサイトは % % カレンダー矩形/3 % '年カレンダー'(_年) :- 横並びカレンダーを表示する(_年,[1,2,3]), 横並びカレンダーを表示する(_年,[4,5,6]), 横並びカレンダーを表示する(_年,[7,8,9]), 横並びカレンダーを表示する(_年,[10,11,12]). 横並びカレンダーを表示する(_年,_月ならび) :- 月カレンダーを直列する(_年,_月ならび,LL1), 見出し表示(_年,_月ならび), カレンダー行の表示(LL2). 月カレンダーを直列する(_,[],[]). 月カレンダーを直列する(_年,[_月|R],LL) :- カレンダー矩形(_年,_月,LL1), 月カレンダーを直列する(_年,R,LL2), append(LL1,LL2,LL). 見出し表示(_年,_月ならび) :- write('\n'), forall(member(_月,_月ならび),writef('%6c%4r年 %2r月%8c')), write('\n\n'). カレンダー行の表示(_月カレンダー矩形ならび) :- between(1,7,_行), forall(member(_月カレンダー矩形,_月カレンダー矩形ならび), 週表示(_行,_月カレンダー矩形)), write('\n'), _行 = 7,!. 週表示(_行,_月カレンダー矩形) :- nth1(_行,_月カレンダー矩形,[_1,_2,_3,_4,_5,_6,_7]), writef('%3r%3r%3r%3r%3r%3r%3r '). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/83 # お題:次の式をn=10について計算し、大きい順に式と値を表示する。 # logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。 # 2^n # 2^log(n) # 4^n # n # n^2 # n! # n*log(n) # log(n!) # log(log(n)) # sqrt(log(n)) # # '次の式をn=10について計算し、大きい順に式と値を表示する。 logは自然対数、sqrtは平方根、!は階乗、^は累乗とする。 2^n,2^log(n),4^n,n,n^2,n!,n*log(n),log(n!),log(log(n)),sqrt(log(n))' :- _n = 10, _nの階乗 is 10*9*8*7*6*5*4*3*2*1, findall([X,A],( nth1(_nth1,[2^_n,2^log(_n),4^_n,_n,_n^2,_nの階乗,_n*log(_n),log(_nの階乗),log(log(_n)),sqrt(log(_n))],F), nth1(_nth1,[2^_n,2^log(_n),4^_n,_n,_n^2,'10!',_n*log(_n),log('10!'),log(log(_n)),sqrt(log(_n))],A), X is F), L1), '大きい順に式と値を表示する。'(L1). '大きい順に式と値を表示する。'(L1) :- sort(L1,L2), reverse(L2,L3), forall(member([X,F],L3),writef('%t=%t\n',[F,X])). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 'n=1のとき 01 10 n=2のとき 0011 0011 1100 1100 n=3のとき 000111 000111 000111 111000 111000 111000 を表示する。'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n) :- n個の数字0で構成されたアトム(_n,_0), n個の数字1で構成されたアトム(_n,_1), n行表示する(_n,_0,_1). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- n個の数字0で構成されたアトム(_n,_0), n個の数字1で構成されたアトム(_n,_1), n行表示する(_n,_1,_0). n個の数字0で構成されたアトム(_n,_0) :- length(L,_n), ならびの構成要素は全て数字0である(L), atomic_list_concat(L,_0). ならびの構成要素は全て数字0である([]). ならびの構成要素は全て数字0である(['0'|R]) :- ならびの構成要素は全て数字0である(R). n個の数字1で構成されたアトム(_n,_1) :- length(L,_n), ならびの構成要素は全て数字1である(L), atomic_list_concat(L,_1). ならびの構成要素は全て数字1である([]). ならびの構成要素は全て数字1である(['1'|R]) :- ならびの構成要素は全て数字1である(R). n行表示する(_n,A,B) :- forall(between(1,_n,_),writef('%t%t\n',[A,B])). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 'n=1のとき 01 10 n=2のとき 0011 0011 1100 1100 n=3のとき 000111 000111 000111 111000 111000 111000 を表示する。'(_n) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n) :- 'n個の数字0で構成されたアトム'(_n,_0), 'n個の数字1で構成されたアトム'(_n,_1), 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1). 'n個の数字0で構成されたアトム'(_n,_0) :- length(L,_n), ならびの構成要素は全て数字0である(L), atomic_list_concat(L,_0). ならびの構成要素は全て数字0である([]). ならびの構成要素は全て数字0である(['0'|R]) :- ならびの構成要素は全て数字0である(R). 'n個の数字1で構成されたアトム'(_n,_1) :- length(L,_n), ならびの構成要素は全て数字1である(L), atomic_list_concat(L,_1). ならびの構成要素は全て数字1である([]). ならびの構成要素は全て数字1である(['1'|R]) :- ならびの構成要素は全て数字1である(R). 'n個の数字0の後、n個の数字1を一行としてn行表示し、n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1) :- 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n,_0,_1), 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1). 'n個の数字0の後、n個の数字1を一行としてn行表示し、'(_n,_0,_1) :- forall(between(1,_n,_),writef('%t%t\n',[_0,_1])). 'n個の数字1の後、n個の数字0を一行としてn行表示する'(_n,_0,_1) :- forall(between(1,_n,_),writef('%t%t\n',[_1,_0])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/69 # お題: # n=1のとき # 01 # 10 # # n=2のとき # 0011 # 0011 # 1100 # 1100 # # n=3のとき # 000111 # 000111 # 000111 # 111000 # 111000 # 111000 # # を表示する。 # # ブロックを表示する(_n,LL) :- '_n * _n のブロックを生成する'(_n,0,1,LL1), '_n * _n のブロックを生成する'(_n,1,0,LL2), 表示する(LL1,LL2). '_n * _n のブロックを生成する'(_n,A,B,LL) :- findall(L,( all(_n,L1,A), all(_n,L2,B), between(1,_n,_), append(L1,L2,L)), LL). all(0,[],_) :- !. all(N,[A|R],A) :- N_1 is N - 1, all(N_1,R,A). 表示する(LL1,LL2) :- forall(member(L1,LL1),(atomic_list_concat(L1,A),writef('%t\n',[A]))), forall(member(L2,LL2),(atomic_list_concat(L2,B),writef('%t\n',[B]))), % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/23 # お題: # リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する # ソートされていなければ先頭からソートされている個数を出力する # [6,6,3,2,6,4,7,4,7,4] => 4 # [2,3,4,4,4,6,6,6,7,7] => AS # [7,7,6,6,6,4,4,4,3,2] => DES # [1,1,1,1,1,1,1,1,1,1] => EQ # [] => EQ # [1] => EQ # # 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,全て同じ要素) :- 全て同じ要素である(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,昇順) :- 昇順にソートされている(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,降順) :- 降順にソートされている(_リスト),!. 'リストを与え、ソートされていれば昇順(AS)か降順(DES)か全て同じ要素(EQ)かを出力する。ソートされていなければ先頭からソートされている個数を出力する'(_リスト,_個数) :- ソートされていなければ先頭からソートされている個数を出力する(_リスト,_個数). 全て同じ要素である([],_). 全て同じ要素である([A|R],A) :- 全て同じ要素である(R,A). 昇順にソートされている(_リスト) :- forall(append(_,[A,B|_],_リスト),A @=< B). 降順にソートされている(_リスト) :- forall(append(_,[A,B|_],_リスト),A @>= B). ソートされていなければ先頭からソートされている個数を出力する(L,_先頭からソートされている個数) :- findall(Len,( append(L1,L2,L), length(L1,Len), (昇順にソートされている(L1);降順にソートされている(L1)), _長さならび), 最大値(_長さならび,_先頭からソートされている個数). 最大値([A|R],_最大値) :- 最大値(R,A,_最大値). 最大値([],_最大値,_最大値). 最大値([A|R],_最大値_1,_最大値) :- A @> _最大値_1, 最大値(R,A,_最大値),!. 最大値([A|R],_最大値_1,_最大値) :- 最大値(R,_最大値_1,_最大値). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/901 # [2] 要素の数が10の配列に2から始まる倍数を逆順に表示せよ # '要素の数が10のならびに2から始まる倍数を逆順に格納した後、表示せよ'(_要素の数が10のならび) :- 要素の数が10のならびに(_要素の数が10のならび), '2から始まる倍数を逆順に格納した後、'(_要素の数が10のならび), 表示せよ(_要素の数が10のならび). 要素の数が10のならびに(_要素の数が10のならび) :- length(_要素の数が10のならび,10). '2から始まる倍数を逆順に格納した後、'(_要素の数が10のならび) :- 逆順に(_要素の数が10のならび,_要素の数が10の逆順ならび), '2から始まる倍数を格納した後、'(1,_要素の数が10の逆順ならび). 逆順に(_要素の数が10のならび,_要素の数が10の逆順ならび) :- reverse(_要素の数が10のならび,_要素の数が10の逆順ならび). '2から始まる倍数を格納した後、'(_,[]) :- !. '2から始まる倍数を格納した後、'(N,[N_1|R]) :- N_1 is N * 2, '2から始まる倍数を格納した後、'(N_1,R). 表示せよ(L) :- forall(member(N,L),writef('%t ',[N])), write('\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/901 # [2] 要素の数が10の配列に2から始まる倍数を逆順に表示せよ # '要素の数が10のならびに2から始まる倍数を逆順に格納した後、表示せよ'(_要素の数が10のならび) :- 要素の数が10のならびに(_要素の数が10のならび), '2から始まる倍数を逆順に格納した後、'(10,1,_要素の数が10のならび), 表示せよ(_要素の数が10のならび). 要素の数が10のならびに(_要素の数が10のならび) :- length(_要素の数が10のならび,10). '2から始まる倍数を逆順に格納した後、'(0,_,L) :- !. '2から始まる倍数を逆順に格納した後、'(_位置,N,L) :- nth1(_位置,L,N_1), N_1 is N * 2, _位置_1 is _位置 - 1, '2から始まる倍数を逆順に格納した後、'(_位置_1,N_1,L). 表示せよ(L) :- forall(member(N,L),writef('%t ',[N])), write('\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/901 # [2] 要素の数が10の配列に2から始まる倍数を逆順に表示せよ # '要素の数が10のならびに2から始まる倍数を逆順に格納した後、表示せよ'(_要素の数が10のならび) :- 要素の数が10のならびに(_要素の数が10のならび), '2から始まる倍数を逆順に格納した後、'(2,[],_要素の数が10のならび), 表示せよ(_要素の数が10のならび). 要素の数が10のならびに(_要素の数が10のならび) :- length(_要素の数が10のならび,10). '2から始まる倍数を逆順に格納した後、'(_,L,L) :- !. '2から始まる倍数を逆順に格納した後、'(_2から始まる倍数,L_1,L) :- _2から始まる倍数_1 is _2から始まる倍数 * 2, '2から始まる倍数を逆順に格納した後、'(_2から始まる倍数_1,[_2から始まる倍数|L_1],L). 表示せよ(_要素の数が10のならび) :- forall(member(_要素,_要素の数が10のならび),writef('%t ',[_要素])), write('\n'). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/885 # 夜分遅くに申し訳ございません… # 本日9時提出の課題を今になって気づいたのですが、私の頭ではさっぱりわからないのでお助け下さい… # # [1]プログラミングC # [2] 問題文(含コード&リンク): # 問1:以下の実行結果に示すような、3つの実数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 # ※例 # 3つの整数を入力してください。 # na=12 # nb=65 # nc=44 # 65と12の差は53です。 # # 問2:以下の文字列(programming_jissyu)が配列に格納されているとする。 # この文字列を任意の位置で2つ分割して表示するプログラムを作成せよ。 # ※例 # 難文字目で分割しますか:11 # 文字列の前半 # programming # 文字列の後半 # _jissyu # '問1:以下の実行結果に示すような、3つの整数を入力した後、最大値と最小値の差を求めるプログラムを作成せよ。 ※例 3つの整数を入力してください。 na=12 nb=65 nc=44 65と12の差は53です。' :- '3つの整数を入力した後、'(_3つの整数), 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差), writef('%tと%tの差は%tです。',[_最大値,_最小値,_最大値と最小値の差]). '3つの整数を入力した後、'(_3つの整数) :- write('3つの整数を入力してください。\n'), findall(_整数,( member(A,[na,nb,nc]), writef('%t=',[A]), 整数を得る(_整数)), _3つの整数). 最大値と最小値の差(_3つの整数,_最大値,_最小値,_最大値と最小値の差) :- 最大値(_3つの整数,_最大値), 最小値(_3つの整数,_最小値), _最大値と最小値の差 is _最大値 - _最小値. 最大値(_整数ならび,_最大値) :- select(N,_整数ならび,R), forall(member(M,R),M =< N). 最小値(_整数ならび,L_最小値) :- select(N,_整数ならび,R), forall(member(M,R),M >= N). 整数を得る(_整数) :- 一行読み込む(Line), '診断: 整数を得る'(Line,_整数),!. 整数を得る(_整数) :- 整数を得る(_整数). '診断: 整数を得る'(Line,_整数) :- read_term_from_atom(Line,_整数,[]), integer(_整数),!. '診断: 整数を得る'(Line,_整数) :- writef('入力された値"%t"から整数は得られません。再入力をお願いします。\n',[Line]), fail. 一行読み込む(_行) :- get_line(_行). get_line(Stream,X) :- get_char(Stream,C), get_line_1(Stream,C,Chars), atom_chars(X,Chars). get_line_1(Stream,'\n',[]) :- !. get_line_1(Stream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(Stream,C,[C|R]) :- get_char(Stream,C2), get_line_1(Stream,C2,R). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1(end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1381909900/868 # [2] 入力した5文字までの文字列を5個まで格納して表示する。 # 5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。 # '入力した5文字までの文字列を5個まで格納して表示する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、入力したすべての文字列を表示。' :- '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納), '入力したすべての文字列を表示。'(_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_文字列を5個まで格納) :- length(Ln,5), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,_文字列を5個まで格納). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'([_|Ln],[_5文字までの文字列|R]) :- 入力した5文字までの文字列を(_5文字までの文字列), \+(_文字列=''), '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(Ln,R). '入力した5文字までの文字列を5個まで格納する。5個未満で中断するときはEnterで入力し,5個入力後かEnter入力後に、'(_,_,[]). 入力した5文字までの文字列を(_5文字までの文字列) :- findall(_文字,( nth1(Nth1,_,_), ( Nth1 > 5,!,fail; get_char(_文字), ( _文字 = '\n',!,fail; true))), _入力文字ならび), atomic_list_concat(_入力文字ならび,_5文字までの文字列). '入力したすべての文字列を表示。'(_文字列を5個まで格納) :- forall(member(_文字列,_文字列を5個まで格納),writef('%t\n',[_文字列])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/896 # お題:単語データファイル「words.txt」から英単語リストを読み取り、アルファベットでしりとりを行い、 # 一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。 # # '一番長いしりとりの単語列を出力せよ。同じ単語は二度使わない。'(_単語列,_一番長いしりとりの単語列) :- '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列), forall(一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列),'出力せよ。'(_一番長いしりとりの単語列)). 一番長いしりとり単語列を(_整列した重複のない単語列,_一番長いしりとりの単語列) :- findall([_長さ,_しりとりの単語列],しりとりの単語列(_整列した重複のない単語列,_しりとりの単語列,_長さ),LL), 一番長い(LL,_一番長い), member([_一番長い,_しりとりの単語列],LL), reverse(_しりとりの単語列,_一番長いしりとりの単語列). '同じ単語は二度使わない。'(_単語列,_整列した重複のない単語列) :- sort(_単語列,_整列した重複のない単語列). しりとりの単語列(_単語列,_しりとりの単語列,_長さ) :- select(_単語,_単語列,_残り単語列), しりとり(_単語,_残り単語列,[_単語],_しりとりの単語列), length(_しりとりの単語列,_長さ). しりとり(_単語,_単語列,L1,_しりとりの単語列) :- 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_次の単語候補,_残り単語列), しりとり(_次の単語候補,_残り単語列,[_次の単語候補|L1],_しりとりの単語列). しりとり(_,_,_しりとりの単語列,_しりとりの単語列). 単語列の中から単語の末尾文字と同じ先頭文字を持つ単語を捜す(_単語,_単語列,_単語_2,_残り単語列) :- sub_atom(_単語,_,1,0,_文字), select(_単語_2,_単語列,_残り単語列), sub_atom(_単語_2,0,1,_,_文字). 一番長い(LL,_一番長い) :- 最大値を捜す(_長さ,member([_長さ,_],LL),_一番長い),!. 最大値を捜す(A,B,C) :- findall(A,B,L), 最大値(L,C). 最大値(L,C) :- select(C,L,R), forall(member(A,R),A @=< C). '出力せよ。'(_一番長いしりとりの単語列) :- atomic_list_concat(_一番長いしりとりの単語列,' ',_一番長いしりとりの単語列表現), writef('%t\n',[_一番長いしりとりの単語列表現]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/854 # 四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。 # # 塔A、B、C、Dの座標: # A(2, 2) B(5, 2) C(2, 5) D(5, 5) # # 幽霊の座標: # 0≦y≦7, 0≦x≦7, # # 図1:塔の配置 # □□□□□□□□ # □□□□□□□□ # □□A □□B,□□ # □□□□□□□□ # □□□□□□□□ # □□C □□D,□□ # □□□□□□□□ # □□□□□□□□ # # 図2:幽霊の座標(3, 3) # □□□□□□□□ # □□□□□□□□ # □□A □□B,□□ # □□□幽□□□□ # □□□□□□□□ # □□C □□D,□□ # □□□□□□□□ # □□□□□□□□ # # 入力と出力例: # in  : (3, 3) # out : A # # 塔('A',2,2). 塔('B',5,2). 塔('C',2,5). 塔('D',5,5). '四つの塔がある。幽霊に任意の座標を与えたとき、そこから最も近くにある塔を出力しなさい。' :- '幽霊に任意の座標を与えたとき、'(X,Y), 'そこから最も近くにある塔を出力しなさい。'(X,Y). '幽霊に任意の座標を与えたとき、'(X,Y) :- 整数を得る('幽霊のX座標',(X >= 0,X =< 7),X), 整数を得る('幽霊のY座標',(Y >= 0,Y =< 7),Y). 'そこから最も近くにある塔を出力しなさい。'(X,Y) :- 幽霊と四つの塔との距離ならび(_距離と塔ならび), 最短距離は(_距離と塔ならび,_最短距離), '最も近くにある塔を出力しなさい。'(_距離と塔ならび,_最短距離). 幽霊と四つの塔との距離ならび(_距離と塔ならび) :- findall([_距離,_塔],(塔(_塔,_x,_y),_距離 is abs(X - _x) + abs(Y - _Y)),_距離と塔ならび). 最短距離は(_距離と塔ならび,_最短距離) :- findmin(_距離,member([_距離,_],_距離と塔ならび),_最短距離). '最も近くにある塔を出力しなさい。'(_距離と塔ならび,_最短距離) :- forall(member([_最短距離,_塔],_距離と塔ならび),writef('%t\n',[_塔])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/789 # お題:1000以下の自然数で各桁がすべて奇数のものを求める。 # 例 # 121 -> ng //偶数の桁がある # 357 -> ok # # '1000以下の自然数で各桁がすべて奇数のものを求める。'(_1000以下の自然数で各桁がすべて奇数のもの) :- between(1,1000,_1000以下の自然数), number_chars(_1000以下の自然数,_数字ならび), forall(member(_数字,_数字ならび),member(_数字,['1','3','5','7','9'])), _1000以下の自然数 = _1000以下の自然数で各桁がすべて奇数のもの. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/789 # お題:1000以下の自然数で各桁がすべて奇数のものを求める。 # 例 # 121 -> ng //偶数の桁がある # 357 -> ok # # '1000以下の自然数で各桁がすべて奇数のものを求める。'(_1000以下の自然数で各桁がすべて奇数のもの) :- '1000以下の自然数で'(_1000以下の自然数), '各桁がすべて奇数のものを求める。'(_1000以下の自然数,_1000以下の自然数で各桁がすべて奇数のもの). '1000以下の自然数で'(_1000以下の自然数) :- between(1,1000,_1000以下の自然数). '各桁がすべて奇数のものを求める。'(_整数,_整数で各桁がすべて奇数のもの) :- forall(各桁が(_整数,_各桁),奇数(_各桁)), _整数 = _整数で各桁がすべて奇数のもの. 各桁が(_整数,_各桁) :- _整数 > 0, _各桁 is _整数 mod 10. 各桁が(_整数,_各桁) :- _整数 > 0, _整数_1 is _整数 // 10, 各桁が(_整数_1,_各桁). 奇数(_各桁) :- 1 is _各桁 mod 2. % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/775 # お題:文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。 # 半径は文字間隔が離れすぎず近すぎない程度になるよう適当に選ぶ。 # # '文字を円形に並べる。一番上が最初の文字。時計回りに等間隔で並べる。'(_文字列) :- atom_chars(_文字列,_文字ならび), 文字盤を用意する(_文字ならび,_文字盤), 文字盤に円形に文字を書き込む(_文字ならび,_文字盤), 文字を表示する(_文字盤). 文字盤を用意する(_文字ならび,_文字盤) :- length(_文字ならび,_文字数), '_文字数+1の文字盤を作る'(_文字数,_文字盤). '_文字数+1の文字盤を作る'(_文字数,_文字盤) :- _文字数_1 is _文字数 + 1, length(_文字盤,_文字数_1), findall(L,( length(L,_文字数_1)), _文字盤). 円形に文字を書き込む(_文字ならび,_文字盤) :- length(_文字ならび,_文字ならびの要素数), _半径 is _文字ならびの要素数 // 2, 点に文字を書き込む(0,_文字ならび,_文字ならびの要素数,_半径,_文字盤). 点に文字を書き込む(_,[],_,_,_文字盤) :- !. 点に文字を書き込む(_n,[_文字|R],_分割数,_半径,_文字盤) :- '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y), '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤), _n_2 is _n + 1, 点に文字を書き込む(_n_2,R,_分割数,_半径,_文字盤). '_x,_yの座標点を得る'(_n,_半径,_分割数,_x,_y) :- _x is truncate(sin((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5), _y is truncate(cos((2 * pi) / _分割数 * _n + (pi / 2)) * _半径 + _半径 + 0.5). '文字盤の_x,_yに_文字を埋める'(_x,_y,_文字,_文字盤) :- nth1(_y,_文字盤,L), nth1(_x,L,_文字),!. 文字を表示する([]) :- !. 文字を表示する([L|R]) :- forall(member(A,L),変数は空白に埋めて文字を出力する(A)), write('\n'), 文字を表示する(R). 変数は空白に埋めて文字を出力する(A) :- var(A), write(' '),!. 変数は空白に埋めて文字を出力する(A) :- write(A). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712 # 以前どこかで見かけた問題だけど # 「デジタル式の時計をアナログ式に変換する」 # 入出力サンプル # http://ime.nu/codepad.org/XcWCtEF5 # 目盛りをo、短針をX、長針をxで表す # 重なったときはXで表す # ただし短針は最も近い目盛りを指すようにする # # # X # o o # # o o # # o o # # o o # # o o # o # # (0時0分) # 時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11, [[' ',' ',' ',' ',' ',' ',' ',' ',' ',_0,' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',_11,' ',' ',' ',' ',' ',' ',' ',' ',' ',_1,' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',_10,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_2,' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [_9,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_3], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',_8,' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',_4,' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',_7,' ',' ',' ',' ',' ',' ',' ',' ',' ',_5,' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',_6,' ',' ',' ',' ',' ',' ',' ',' ',' ']]). 'デジタル式の時計をアナログ式に変換する。 目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :- 時計板(_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_時計板), '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11), 時計板の表示(_時計板). '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11) :- '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]), '長針はxで表す。 重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]), 変数として残っている所にoを埋める([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]),!. '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分 < 30, nth0(_時,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X'). '30分から59分までは短針は次の時に移動する'(_時,_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分 >= 30, _時_2 is (_時 + 1) mod 12, nth0(_時_2,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'X'). '長針はxで表す。 重なったときはXで表す。'(_分,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- _分_1 is truncate((_分 / 12) + 0.5), 分を埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]). 分をxで埋める(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11]) :- nth0(_分_1,[_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11],'x'),!. 分をxで埋める(_,_). 変数として残っている所にoを埋める([]). 変数として残っている所にoを埋める([o|R]) :- 変数として残っている所にoを埋める(R),!. 変数として残っている所にoを埋める([_|R]) :- 変数として残っている所にoを埋める(R). 時計板の表示(_時計板) :- forall(member(_行,_時計板),行を表示する(_行)). 行を表示する(_行) :- atomic_list_concat(_行,_表示行), writef('%t\n',[表示行]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/712 # 以前どこかで見かけた問題だけど # 「デジタル式の時計をアナログ式に変換する」 # 入出力サンプル # http://ime.nu/codepad.org/XcWCtEF5 # 目盛りをo、短針をX、長針をxで表す # 重なったときはXで表す # ただし短針は最も近い目盛りを指すようにする # # # X # o o # # o o # # o o # # o o # # o o # o # # (0時0分) # 時計板([_0,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11], [[' ',_0,' '], [' ',_11,' ',_1,' '], [' '], [' ',_10,' ',_2,' '], [' '], [_9,' ',_3], [' '], [' ',_8,' ',_4,' '], [' '], [' ',_7,' ',_5,' '], [' ',_6,' ']]). 'デジタル式の時計をアナログ式に変換する。 目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分) :- 時計板(_0から_11までの変数ならび,_時計板), '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび), 時計板の表示(_時計板). '目盛りをo、短針をX、長針をxで表す。 重なったときはXで表す。 ただし短針は最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび), '長針はxで表す。 重なったときはXで表す。'(_分,_0から_11までの変数ならび), 変数として残っている所にoを埋める(_0から_11までの変数ならび). '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,_0から_11までの変数ならび),!. '短針をXで表す。 ただし最も近い目盛りを指すようにする。'(_時,_分,_0から_11までの変数ならび) :- '30分から59分までは短針は次の時に移動する'(_時,_分,_0から_11までの変数ならび). '0分から29分までは短針の位置は本来の時の位置である'(_時,_分,_0から_11までの変数ならび) :- _分 < 30, nth0(_時,_0から_11までの変数ならび,'X'). '30分から59分までは短針は次の時に移動する'(_時,_分,_0から_11までの変数ならび) :- _分 >= 30, _時_2 is (_時 + 1) mod 12, nth0(_時_2,_0から_11までの変数ならび,'X'). '長針はxで表す。 重なったときはXで表す。'(_分,_0から_11までの変数ならび) :- _分_1 is truncate((_分 / 12) + 0.5), 分を埋める(_分_1,_0から_11までの変数ならび). 分をxで埋める(_分_1,_0から_11までの変数ならび) :- nth0(_分_1,_0から_11までの変数ならび,'x'),!. 分をxで埋める(_,_). 変数として残っている所にoを埋める([]). 変数として残っている所にoを埋める([o|R]) :- 変数として残っている所にoを埋める(R),!. 変数として残っている所にoを埋める([_|R]) :- 変数として残っている所にoを埋める(R). 時計板の表示(_時計板) :- forall(member(_行,_時計板),行を表示する(_行)). 行を表示する(_行) :- atomic_list_concat(_行,_表示行), writef('%t\n',[表示行]). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 葉と飾り(20,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b]). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_何段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_何段,_クリスマスツリー) :- length(_クリスマスツリー,_何段), append([☆|L1],['||'],_クリスマスツリー), findall(_段,( nth1(_段目,_クリスマスツリー,_段), 一段生成(_段目,_段)), _クリスマスツリー). 一段生成(_段目,_飾りを含む葉) :- var(_飾りを含む葉), length(_段,_段目), 飾りを含む葉の生成(_段,_飾りを含む葉),!. 一段生成(_,_既に存在するもの) :- \+(var(_既に存在するもの)). 飾りを含む葉の生成(_段,_一段の葉飾り) :- 葉と飾り(_基数,_葉と飾りならび), findall(_葉または飾り,( 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り)), _葉または飾りならび), atomic_list_concat(_葉または飾りならび,_一段の葉飾り),!. 葉または飾りの選択(_段,_基数,_葉と飾りならび,_葉または飾り) :- member(_葉または飾り,_段), _乱数 is random(_基数), nth0(_乱数,_葉と飾りならび,_葉または飾り). クリスマスツリーの表示(_クリスマスツリー) :- forall(member(_段,_クリスマスツリー), writef('%t\n',[_段])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/684 # お題: ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ # # 出力: http://ime.nu/codepad.org/9Qm1zRxy # # 一番上の「☆」と土台の「||」は固定でよい # 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する # # 解答例: http://ime.nu/codepad.org/aR7eI9F2 # # ☆ # || # ☆ # ** # || # ☆ # b* # *i*o # || # ☆ # ** # **** # ****** # || # ☆ # *b # **** # i**%*J # *Ni***** # || # ☆ # ** # *%** # *****i # **JX**** # ********** # || # ☆ # %* # **%* # *i***o # ******** # ****%***** # **o%****oi*b # || 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ 出力: http://ime.nu/codepad.org/9Qm1zRxy 一番上の「☆」と土台の「||」は固定でよい 装飾は適当な文字(例:N,i,X,J,o,%,bなど)を利用する' :- forall((between(2,8,_段), 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー)), クリスマスツリーの表示(_クリスマスツリー)). 'ランダムに装飾された大きさの異なるクリスマスツリーを7個作れ'(_段,_クリスマスツリー) :- length(L,_段), append([☆|L1],['||'],L), findall(A,( nth1(_nth1,L,A), '一段生成'(_nth1,A)), L). '一段生成'(_nth1,A) :- var(A), length(L,_nth1), 飾りを含む葉の生成(L,A),!. '一段生成'(_,A) :- \+(var(A)). 飾りを含む葉の生成(L,A) :- findall(B,( member(B,L), _乱数 is random(20), nth0(_乱数,[*,*,*,*,*,*,*,*,*,*,*,*,*,'N','i','X','J',o,'%',b],B)), L), atomic_list_concat(L,A),!. クリスマスツリーの表示(_クリスマスツリー) :- forall(member(A,_クリスマスツリー), writef('%t\n',[A])). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/tech/1357191974/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をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値定数ならび), 表示する(_整列した_開始位置_数値定数ならび). '1から100までのチャンパーノウン定数'(_チャンパーノウン定数) :- findall(_数値定数,( between(1,100,_数値), atom_number(_数値定数,_数値)), _数値定数ならび), atomic_list_concat(['0.'|_数値定数ならび],_チャンパーノウン定数). '1から100をチャンパーノウン定数での出現順に(出現位置が同じ場合は元のデータの順に)'(_チャンパーノウン定数,_整列した_開始位置_数値ならび) :- findall([_開始位置,_数値],( between(1,100,_数値), atom_number(_数値定数,_数値), sub_atom(_チャンパーノウン定数,_開始位置,_,_,_数値定数)), _開始位置_数値ならび), sort(_開始位置_数値ならび,_整列した_開始位置_数値ならび). 表示する(_整列した_開始位置_数値ならび) :- 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/1362913813/844 # たぶんやりたいことはこうだろう。数字以外の文字が1文字でもあればエラーを出す。# # [[ "$A" =~ [^0-9] ]] && echo "not number" # 数字以外の文字が1文字でもあればエラーを出す(_文字列) :- forall(sub_atom(_文字列,_,1,_,A),member(A,['0','1','2','3','4','5','6','7','8','9'])). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1362913813/843 # ^[^0-9]+$ は数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '数字以外だけの文字列の場合ヒット、数字混じりだと絶対ヒットしない '(_文字列) :- forall(sub_atom(_文字列,_,1,_,A),\+(member(A,['0','1','2','3','4','5','6','7','8','9']))). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1357191974/365 # お題:偶数の目が奇数の目より二倍でやすいイカサマさいころの実装と、 # それを実際に10万回ふって出た目の数を集計し出力するコード。 # # 出力例 # 1: 11103 # 2: 22287 # 3: 11114 # 4: 22170 # 5: 11089 # 6: 22237 # # 余力があれば、任意の目の数と出やすさに対応できるコードにしてください。 # # 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目) :- _乱数値 is random(9), nth0(_乱数値,[1,2,3,4,5,6,2,4,6],_イカサマさいころの目),!. 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際に10万回ふって出た目の数を集計し出力する :- 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([],[],[],[],[],[],[],Ln,_1,_2,_3,_4,_5,_6), length(Ln,100000), 出力する(_1,_2,_3,_4,_5,_6). 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln,_1,_2,_3,_4,_5,_6,Ln,_1,_2,_3,_4,_5,_6). 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し(Ln_1,LL_1,Ln,LL) :- 偶数の目が奇数の目より二倍でやすいイカサマさいころ(_イカサマさいころの目), 出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2), 偶数の目が奇数の目より二倍でやすいイカサマさいころを実際にふって出た目の数を集計し([_|Ln_1],LL_2,Ln,LL). 出た目の数を集計し(_イカサマさいころの目,LL_1,LL_2) :- length([_|LL0],_イカサマさいころの目), append(LL0,[L|LL2],LL_1), append(LL0,[[_|L]|LL2],LL_2),!. 出力する(_1,_2,_3,_4,_5,_6) :- forall((nth1(_nth1,[_1,_2,_3,_4,_5,_6],L),length(L,_集計値)), writef('%t: %t\n',[_nth1,_集計値]). % 以下のサイトは # 出題場所 # # ●Regular Expressionの使用環境 # Python3.3 # # ●検索か置換か? # 置換 # # ●説明 # 均等割りにしているスペースを削除したい # 一文字ずつスペースが入っている文字のスペースを削除したい # # ●対象データ # あ い う え お # かき くけ ここ # # ●希望する結果 # あいうえお # かき くけ ここ # 均等割りにしているスペースを削除したい(_文字列,_均等割文字列長さ,_スペースを削除した文字列) :- 均等割文字列(_文字列,_均等割文字列長さ,_均等割文字列ならび), atomic_list_concat(_均等割文字列ならび,_スペースを削除した文字列). 均等割文字列(_文字列,_均等割文字列長さ,[_文字列]) :- '文字列が均等割文字長さであり、構成する文字全てがスペースではない'(_文字列,_均等割文字列長さ). 均等割文字列(_文字列,_均等割文字列長さ,[_前文字列|R]) :- 均等割副文字列を得る(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ), 均等割文字列(_後文字列,_均等割文字列長さ,R). '文字列が均等割文字長さであり、構成する文字全てがスペースではない'(_文字列,_均等割文字列長さ) :- 文字列を構成する文字全てがスペースではない(_文字列), atom_length(_文字列,_均等割文字列長さ). 均等割副文字列を得る(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ) :- '前文字列・スペース文字列・後文字列候補'(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ), '前文字列は空文字でなく全て文字、スペース文字列は空文字でなく全てスペース'(_前文字列,_スペース文字列), 後文字列の先頭文字はスペースではない(_後文字列). '前文字列・スペース文字列・後文字列候補'(_文字列,_前文字列,_スペース文字列,_後文字列,_均等割文字列長さ) :- sub_atom(_文字列,_均等割文字列長さ,_,R,_スペース文字列), sub_atom(_文字列,0,_均等割文字列長さ,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列). '前文字列は空文字でなく全て文字、スペース文字列は空文字でなく全てスペース'(_前文字列,_スペース文字列) :- 前文字列は空文字でなく全て文字(_前文字列), スペース文字列は空文字でなく全てスペース(_スペース文字列). 前文字列は空文字でなく全て文字(_前文字列) :- 空文字ではなく(_前文字列), 文字列を構成する文字全てがスペースではない(_前文字列). スペース文字列は空文字でなく全てスペース(_スペース文字列) :- 空文字ではなく(_スペース文字列), 文字列を構成する文字全てがスペースである(_スペース文字列). 空文字ではなく(_文字列) :- \+(_文字列=''). 後文字列の先頭文字はスペースではない(_後文字列) :- \+(sub_atom(_後文字列,0,1,_,' ')). 文字列を構成する文字全てがスペースではない(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),\+(_文字=' ')). 文字列を構成する文字全てがスペースである(_文字列) :- forall(sub_atom(_文字列,_,1,_,_文字),_文字=' '). % 以下のサイトは # お題:ふたつの自然数の公約数をすべて求める。 'ふたつの自然数の公約数をすべて求める。'(_ひとつめの自然数,_ふたつ目の自然数) :- _ひとつめの自然数 > _ふたつ目の自然数, 'ふたつの自然数の公約数をすべて求める。'(_ふたつ目の自然数,_ひとつめの自然数). 'ふたつの自然数の公約数をすべて求める。'(_ひとつめの自然数,_ふたつ目の自然数) :- forall((between(1,_ひとつめの自然数,_公約数),0 is _ひとつめの自然数 mod _公約数,0 is _ふたつ目の自然数 mod _公約数),writef('%t ',[_公約数])). % 以下のサイトは # お題:ふたつの自然数の公約数をすべて求める。 'ふたつの自然数の公約数をすべて求める。'(_ひとつめの自然数,_ふたつ目の自然数) :- 最大公約数をユークリッドの互除法で求める(_ひとつめの自然数,_ふたつ目の自然数,_最大公約数), forall((between(1,_最大公約数,_公約数),0 is _最大公約数 mod _公約数),writef('%t ',[_公約数])). 最大公約数をユークリッドの互除法で求める(M,N,N) :- 0 is M mod N,!. 最大公約数をユークリッドの互除法で求める(M,N,X) :- Mod is M mod N, 最大公約数をユークリッドの互除法で求める(N,Mod,X) . % 以下のサイトは # 出題場所 # # お題:与えられた文字列が回文かどうかチェックせよ。 # 半角アルファベット文字のみを判定の対象とする。大文字小文字の区別はしない。 # 判定対象文字列のサイズがゼロの場合の判定結果はどちらでもよい。 '与えられた文字列が回文かどうかチェックせよ。 半角アルファベット文字のみを判定の対象とする。大文字小文字の区別はしない。 判定対象文字列のサイズがゼロの場合の判定結果はどちらでもよい。'(_与えられた文字列) :- forall(文字列の最初と最後の文字の対が順に(_与えられた文字列,_最初の文字,_最後の文字),大文字小文字の区別はせず一致する(_最初の文字,_最後の文字)). 文字列の最初と最後の文字の対が順に(_文字列,_最初の文字,_最後の文字) :- sub_atom(_文字列,0,1,_,_最初の文字列_1), sub_atom(_文字列,_,1,0,_最後の文字列_1), sub_atom(_文字列,1,_,1,_間の文字列), 文字列の最初と最後の文字の対が順に(_最初の文字_1,_間の文字列,_最後の文字_1,_最初の文字,_最後の文字). 文字列の最初と最後の文字の対が順に(_最初の文字,_,_最後の文字,_最初の文字,_最後の文字). 文字列の最初と最後の文字の対が順に(_,_間の文字列,_,_最初の文字,_最後の文字) :- 文字列の最初と最後の文字の対が順に(_間の文字列,_最初の文字,_最後の文字). 大文字小文字の区別はせず一致する(_最初の文字,_最後の文字) :- to_upper(_最初の文字列,A), to_upper(_最後の文字列,A). % 以下のサイトは # H. Hosaka @H_H: # [算数][問題] H君は10万円を持って銀行に行き、50枚のお札に両替してもらいました。H君は千円札、二千円札、五千円札、一万円札を何枚受け取ったでしょうか?あり得る可能性を全て答えなさい。 '[算数][問題] H君は10万円を持って銀行に行き、50枚のお札に両替してもらいました。H君は千円札、二千円札、五千円札、一万円札を何枚受け取ったでしょうか?あり得る可能性を全て答えなさい。'(_千円札の枚数,_二千円札の枚数,_五千円札の枚数,_一万円札の枚数) :- '四つ足して答えが50'(_千円札の枚数,_二千円札の枚数,_五千円札の枚数,_一万円札の枚数), 100000 is 1000 * _千円札の枚数 + 2000 * _二千円札の枚数 + 5000 * _五千円札の枚数 + 10000 * _一万円札の枚数. '四つ足して答えが50'(A,B,C,D) :- 答えが50以下の足し算(A,B,S1), 答えが50以下の足し算(S1,C,S2), 答えが50以下の足し算(S2,D,50). 答えが50以下の足し算(1,1,2). 答えが50以下の足し算(1,2,3). 答えが50以下の足し算(1,3,4). 答えが50以下の足し算(1,4,5). 答えが50以下の足し算(1,5,6). 答えが50以下の足し算(1,6,7). 答えが50以下の足し算(1,7,8). 答えが50以下の足し算(1,8,9). 答えが50以下の足し算(1,9,10). 答えが50以下の足し算(1,10,11). 答えが50以下の足し算(1,11,12). 答えが50以下の足し算(1,12,13). 答えが50以下の足し算(1,13,14). 答えが50以下の足し算(1,14,15). 答えが50以下の足し算(1,15,16). 答えが50以下の足し算(1,16,17). 答えが50以下の足し算(1,17,18). 答えが50以下の足し算(1,18,19). 答えが50以下の足し算(1,19,20). 答えが50以下の足し算(1,20,21). 答えが50以下の足し算(1,21,22). 答えが50以下の足し算(1,22,23). 答えが50以下の足し算(1,23,24). 答えが50以下の足し算(1,24,25). 答えが50以下の足し算(1,25,26). 答えが50以下の足し算(1,26,27). 答えが50以下の足し算(1,27,28). 答えが50以下の足し算(1,28,29). 答えが50以下の足し算(1,29,30). 答えが50以下の足し算(1,30,31). 答えが50以下の足し算(1,31,32). 答えが50以下の足し算(1,32,33). 答えが50以下の足し算(1,33,34). 答えが50以下の足し算(1,34,35). 答えが50以下の足し算(1,35,36). 答えが50以下の足し算(1,36,37). 答えが50以下の足し算(1,37,38). 答えが50以下の足し算(1,38,39). 答えが50以下の足し算(1,39,40). 答えが50以下の足し算(1,40,41). 答えが50以下の足し算(1,41,42). 答えが50以下の足し算(1,42,43). 答えが50以下の足し算(1,43,44). 答えが50以下の足し算(1,44,45). 答えが50以下の足し算(1,45,46). 答えが50以下の足し算(1,46,47). 答えが50以下の足し算(1,47,48). 答えが50以下の足し算(1,48,49). 答えが50以下の足し算(1,49,50). 答えが50以下の足し算(2,1,3). 答えが50以下の足し算(2,2,4). 答えが50以下の足し算(2,3,5). 答えが50以下の足し算(2,4,6). 答えが50以下の足し算(2,5,7). 答えが50以下の足し算(2,6,8). 答えが50以下の足し算(2,7,9). 答えが50以下の足し算(2,8,10). 答えが50以下の足し算(2,9,11). 答えが50以下の足し算(2,10,12). 答えが50以下の足し算(2,11,13). 答えが50以下の足し算(2,12,14). 答えが50以下の足し算(2,13,15). 答えが50以下の足し算(2,14,16). 答えが50以下の足し算(2,15,17). 答えが50以下の足し算(2,16,18). 答えが50以下の足し算(2,17,19). 答えが50以下の足し算(2,18,20). 答えが50以下の足し算(2,19,21). 答えが50以下の足し算(2,20,22). 答えが50以下の足し算(2,21,23). 答えが50以下の足し算(2,22,24). 答えが50以下の足し算(2,23,25). 答えが50以下の足し算(2,24,26). 答えが50以下の足し算(2,25,27). 答えが50以下の足し算(2,26,28). 答えが50以下の足し算(2,27,29). 答えが50以下の足し算(2,28,30). 答えが50以下の足し算(2,29,31). 答えが50以下の足し算(2,30,32). 答えが50以下の足し算(2,31,33). 答えが50以下の足し算(2,32,34). 答えが50以下の足し算(2,33,35). 答えが50以下の足し算(2,34,36). 答えが50以下の足し算(2,35,37). 答えが50以下の足し算(2,36,38). 答えが50以下の足し算(2,37,39). 答えが50以下の足し算(2,38,40). 答えが50以下の足し算(2,39,41). 答えが50以下の足し算(2,40,42). 答えが50以下の足し算(2,41,43). 答えが50以下の足し算(2,42,44). 答えが50以下の足し算(2,43,45). 答えが50以下の足し算(2,44,46). 答えが50以下の足し算(2,45,47). 答えが50以下の足し算(2,46,48). 答えが50以下の足し算(2,47,49). 答えが50以下の足し算(2,48,50). 答えが50以下の足し算(3,1,4). 答えが50以下の足し算(3,2,5). 答えが50以下の足し算(3,3,6). 答えが50以下の足し算(3,4,7). 答えが50以下の足し算(3,5,8). 答えが50以下の足し算(3,6,9). 答えが50以下の足し算(3,7,10). 答えが50以下の足し算(3,8,11). 答えが50以下の足し算(3,9,12). 答えが50以下の足し算(3,10,13). 答えが50以下の足し算(3,11,14). 答えが50以下の足し算(3,12,15). 答えが50以下の足し算(3,13,16). 答えが50以下の足し算(3,14,17). 答えが50以下の足し算(3,15,18). 答えが50以下の足し算(3,16,19). 答えが50以下の足し算(3,17,20). 答えが50以下の足し算(3,18,21). 答えが50以下の足し算(3,19,22). 答えが50以下の足し算(3,20,23). 答えが50以下の足し算(3,21,24). 答えが50以下の足し算(3,22,25). 答えが50以下の足し算(3,23,26). 答えが50以下の足し算(3,24,27). 答えが50以下の足し算(3,25,28). 答えが50以下の足し算(3,26,29). 答えが50以下の足し算(3,27,30). 答えが50以下の足し算(3,28,31). 答えが50以下の足し算(3,29,32). 答えが50以下の足し算(3,30,33). 答えが50以下の足し算(3,31,34). 答えが50以下の足し算(3,32,35). 答えが50以下の足し算(3,33,36). 答えが50以下の足し算(3,34,37). 答えが50以下の足し算(3,35,38). 答えが50以下の足し算(3,36,39). 答えが50以下の足し算(3,37,40). 答えが50以下の足し算(3,38,41). 答えが50以下の足し算(3,39,42). 答えが50以下の足し算(3,40,43). 答えが50以下の足し算(3,41,44). 答えが50以下の足し算(3,42,45). 答えが50以下の足し算(3,43,46). 答えが50以下の足し算(3,44,47). 答えが50以下の足し算(3,45,48). 答えが50以下の足し算(3,46,49). 答えが50以下の足し算(3,47,50). 答えが50以下の足し算(4,1,5). 答えが50以下の足し算(4,2,6). 答えが50以下の足し算(4,3,7). 答えが50以下の足し算(4,4,8). 答えが50以下の足し算(4,5,9). 答えが50以下の足し算(4,6,10). 答えが50以下の足し算(4,7,11). 答えが50以下の足し算(4,8,12). 答えが50以下の足し算(4,9,13). 答えが50以下の足し算(4,10,14). 答えが50以下の足し算(4,11,15). 答えが50以下の足し算(4,12,16). 答えが50以下の足し算(4,13,17). 答えが50以下の足し算(4,14,18). 答えが50以下の足し算(4,15,19). 答えが50以下の足し算(4,16,20). 答えが50以下の足し算(4,17,21). 答えが50以下の足し算(4,18,22). 答えが50以下の足し算(4,19,23). 答えが50以下の足し算(4,20,24). 答えが50以下の足し算(4,21,25). 答えが50以下の足し算(4,22,26). 答えが50以下の足し算(4,23,27). 答えが50以下の足し算(4,24,28). 答えが50以下の足し算(4,25,29). 答えが50以下の足し算(4,26,30). 答えが50以下の足し算(4,27,31). 答えが50以下の足し算(4,28,32). 答えが50以下の足し算(4,29,33). 答えが50以下の足し算(4,30,34). 答えが50以下の足し算(4,31,35). 答えが50以下の足し算(4,32,36). 答えが50以下の足し算(4,33,37). 答えが50以下の足し算(4,34,38). 答えが50以下の足し算(4,35,39). 答えが50以下の足し算(4,36,40). 答えが50以下の足し算(4,37,41). 答えが50以下の足し算(4,38,42). 答えが50以下の足し算(4,39,43). 答えが50以下の足し算(4,40,44). 答えが50以下の足し算(4,41,45). 答えが50以下の足し算(4,42,46). 答えが50以下の足し算(4,43,47). 答えが50以下の足し算(4,44,48). 答えが50以下の足し算(4,45,49). 答えが50以下の足し算(4,46,50). 答えが50以下の足し算(5,1,6). 答えが50以下の足し算(5,2,7). 答えが50以下の足し算(5,3,8). 答えが50以下の足し算(5,4,9). 答えが50以下の足し算(5,5,10). 答えが50以下の足し算(5,6,11). 答えが50以下の足し算(5,7,12). 答えが50以下の足し算(5,8,13). 答えが50以下の足し算(5,9,14). 答えが50以下の足し算(5,10,15). 答えが50以下の足し算(5,11,16). 答えが50以下の足し算(5,12,17). 答えが50以下の足し算(5,13,18). 答えが50以下の足し算(5,14,19). 答えが50以下の足し算(5,15,20). 答えが50以下の足し算(5,16,21). 答えが50以下の足し算(5,17,22). 答えが50以下の足し算(5,18,23). 答えが50以下の足し算(5,19,24). 答えが50以下の足し算(5,20,25). 答えが50以下の足し算(5,21,26). 答えが50以下の足し算(5,22,27). 答えが50以下の足し算(5,23,28). 答えが50以下の足し算(5,24,29). 答えが50以下の足し算(5,25,30). 答えが50以下の足し算(5,26,31). 答えが50以下の足し算(5,27,32). 答えが50以下の足し算(5,28,33). 答えが50以下の足し算(5,29,34). 答えが50以下の足し算(5,30,35). 答えが50以下の足し算(5,31,36). 答えが50以下の足し算(5,32,37). 答えが50以下の足し算(5,33,38). 答えが50以下の足し算(5,34,39). 答えが50以下の足し算(5,35,40). 答えが50以下の足し算(5,36,41). 答えが50以下の足し算(5,37,42). 答えが50以下の足し算(5,38,43). 答えが50以下の足し算(5,39,44). 答えが50以下の足し算(5,40,45). 答えが50以下の足し算(5,41,46). 答えが50以下の足し算(5,42,47). 答えが50以下の足し算(5,43,48). 答えが50以下の足し算(5,44,49). 答えが50以下の足し算(5,45,50). 答えが50以下の足し算(6,1,7). 答えが50以下の足し算(6,2,8). 答えが50以下の足し算(6,3,9). 答えが50以下の足し算(6,4,10). 答えが50以下の足し算(6,5,11). 答えが50以下の足し算(6,6,12). 答えが50以下の足し算(6,7,13). 答えが50以下の足し算(6,8,14). 答えが50以下の足し算(6,9,15). 答えが50以下の足し算(6,10,16). 答えが50以下の足し算(6,11,17). 答えが50以下の足し算(6,12,18). 答えが50以下の足し算(6,13,19). 答えが50以下の足し算(6,14,20). 答えが50以下の足し算(6,15,21). 答えが50以下の足し算(6,16,22). 答えが50以下の足し算(6,17,23). 答えが50以下の足し算(6,18,24). 答えが50以下の足し算(6,19,25). 答えが50以下の足し算(6,20,26). 答えが50以下の足し算(6,21,27). 答えが50以下の足し算(6,22,28). 答えが50以下の足し算(6,23,29). 答えが50以下の足し算(6,24,30). 答えが50以下の足し算(6,25,31). 答えが50以下の足し算(6,26,32). 答えが50以下の足し算(6,27,33). 答えが50以下の足し算(6,28,34). 答えが50以下の足し算(6,29,35). 答えが50以下の足し算(6,30,36). 答えが50以下の足し算(6,31,37). 答えが50以下の足し算(6,32,38). 答えが50以下の足し算(6,33,39). 答えが50以下の足し算(6,34,40). 答えが50以下の足し算(6,35,41). 答えが50以下の足し算(6,36,42). 答えが50以下の足し算(6,37,43). 答えが50以下の足し算(6,38,44). 答えが50以下の足し算(6,39,45). 答えが50以下の足し算(6,40,46). 答えが50以下の足し算(6,41,47). 答えが50以下の足し算(6,42,48). 答えが50以下の足し算(6,43,49). 答えが50以下の足し算(6,44,50). 答えが50以下の足し算(7,1,8). 答えが50以下の足し算(7,2,9). 答えが50以下の足し算(7,3,10). 答えが50以下の足し算(7,4,11). 答えが50以下の足し算(7,5,12). 答えが50以下の足し算(7,6,13). 答えが50以下の足し算(7,7,14). 答えが50以下の足し算(7,8,15). 答えが50以下の足し算(7,9,16). 答えが50以下の足し算(7,10,17). 答えが50以下の足し算(7,11,18). 答えが50以下の足し算(7,12,19). 答えが50以下の足し算(7,13,20). 答えが50以下の足し算(7,14,21). 答えが50以下の足し算(7,15,22). 答えが50以下の足し算(7,16,23). 答えが50以下の足し算(7,17,24). 答えが50以下の足し算(7,18,25). 答えが50以下の足し算(7,19,26). 答えが50以下の足し算(7,20,27). 答えが50以下の足し算(7,21,28). 答えが50以下の足し算(7,22,29). 答えが50以下の足し算(7,23,30). 答えが50以下の足し算(7,24,31). 答えが50以下の足し算(7,25,32). 答えが50以下の足し算(7,26,33). 答えが50以下の足し算(7,27,34). 答えが50以下の足し算(7,28,35). 答えが50以下の足し算(7,29,36). 答えが50以下の足し算(7,30,37). 答えが50以下の足し算(7,31,38). 答えが50以下の足し算(7,32,39). 答えが50以下の足し算(7,33,40). 答えが50以下の足し算(7,34,41). 答えが50以下の足し算(7,35,42). 答えが50以下の足し算(7,36,43). 答えが50以下の足し算(7,37,44). 答えが50以下の足し算(7,38,45). 答えが50以下の足し算(7,39,46). 答えが50以下の足し算(7,40,47). 答えが50以下の足し算(7,41,48). 答えが50以下の足し算(7,42,49). 答えが50以下の足し算(7,43,50). 答えが50以下の足し算(8,1,9). 答えが50以下の足し算(8,2,10). 答えが50以下の足し算(8,3,11). 答えが50以下の足し算(8,4,12). 答えが50以下の足し算(8,5,13). 答えが50以下の足し算(8,6,14). 答えが50以下の足し算(8,7,15). 答えが50以下の足し算(8,8,16). 答えが50以下の足し算(8,9,17). 答えが50以下の足し算(8,10,18). 答えが50以下の足し算(8,11,19). 答えが50以下の足し算(8,12,20). 答えが50以下の足し算(8,13,21). 答えが50以下の足し算(8,14,22). 答えが50以下の足し算(8,15,23). 答えが50以下の足し算(8,16,24). 答えが50以下の足し算(8,17,25). 答えが50以下の足し算(8,18,26). 答えが50以下の足し算(8,19,27). 答えが50以下の足し算(8,20,28). 答えが50以下の足し算(8,21,29). 答えが50以下の足し算(8,22,30). 答えが50以下の足し算(8,23,31). 答えが50以下の足し算(8,24,32). 答えが50以下の足し算(8,25,33). 答えが50以下の足し算(8,26,34). 答えが50以下の足し算(8,27,35). 答えが50以下の足し算(8,28,36). 答えが50以下の足し算(8,29,37). 答えが50以下の足し算(8,30,38). 答えが50以下の足し算(8,31,39). 答えが50以下の足し算(8,32,40). 答えが50以下の足し算(8,33,41). 答えが50以下の足し算(8,34,42). 答えが50以下の足し算(8,35,43). 答えが50以下の足し算(8,36,44). 答えが50以下の足し算(8,37,45). 答えが50以下の足し算(8,38,46). 答えが50以下の足し算(8,39,47). 答えが50以下の足し算(8,40,48). 答えが50以下の足し算(8,41,49). 答えが50以下の足し算(8,42,50). 答えが50以下の足し算(9,1,10). 答えが50以下の足し算(9,2,11). 答えが50以下の足し算(9,3,12). 答えが50以下の足し算(9,4,13). 答えが50以下の足し算(9,5,14). 答えが50以下の足し算(9,6,15). 答えが50以下の足し算(9,7,16). 答えが50以下の足し算(9,8,17). 答えが50以下の足し算(9,9,18). 答えが50以下の足し算(9,10,19). 答えが50以下の足し算(9,11,20). 答えが50以下の足し算(9,12,21). 答えが50以下の足し算(9,13,22). 答えが50以下の足し算(9,14,23). 答えが50以下の足し算(9,15,24). 答えが50以下の足し算(9,16,25). 答えが50以下の足し算(9,17,26). 答えが50以下の足し算(9,18,27). 答えが50以下の足し算(9,19,28). 答えが50以下の足し算(9,20,29). 答えが50以下の足し算(9,21,30). 答えが50以下の足し算(9,22,31). 答えが50以下の足し算(9,23,32). 答えが50以下の足し算(9,24,33). 答えが50以下の足し算(9,25,34). 答えが50以下の足し算(9,26,35). 答えが50以下の足し算(9,27,36). 答えが50以下の足し算(9,28,37). 答えが50以下の足し算(9,29,38). 答えが50以下の足し算(9,30,39). 答えが50以下の足し算(9,31,40). 答えが50以下の足し算(9,32,41). 答えが50以下の足し算(9,33,42). 答えが50以下の足し算(9,34,43). 答えが50以下の足し算(9,35,44). 答えが50以下の足し算(9,36,45). 答えが50以下の足し算(9,37,46). 答えが50以下の足し算(9,38,47). 答えが50以下の足し算(9,39,48). 答えが50以下の足し算(9,40,49). 答えが50以下の足し算(9,41,50). 答えが50以下の足し算(10,1,11). 答えが50以下の足し算(10,2,12). 答えが50以下の足し算(10,3,13). 答えが50以下の足し算(10,4,14). 答えが50以下の足し算(10,5,15). 答えが50以下の足し算(10,6,16). 答えが50以下の足し算(10,7,17). 答えが50以下の足し算(10,8,18). 答えが50以下の足し算(10,9,19). 答えが50以下の足し算(10,10,20). 答えが50以下の足し算(10,11,21). 答えが50以下の足し算(10,12,22). 答えが50以下の足し算(10,13,23). 答えが50以下の足し算(10,14,24). 答えが50以下の足し算(10,15,25). 答えが50以下の足し算(10,16,26). 答えが50以下の足し算(10,17,27). 答えが50以下の足し算(10,18,28). 答えが50以下の足し算(10,19,29). 答えが50以下の足し算(10,20,30). 答えが50以下の足し算(10,21,31). 答えが50以下の足し算(10,22,32). 答えが50以下の足し算(10,23,33). 答えが50以下の足し算(10,24,34). 答えが50以下の足し算(10,25,35). 答えが50以下の足し算(10,26,36). 答えが50以下の足し算(10,27,37). 答えが50以下の足し算(10,28,38). 答えが50以下の足し算(10,29,39). 答えが50以下の足し算(10,30,40). 答えが50以下の足し算(10,31,41). 答えが50以下の足し算(10,32,42). 答えが50以下の足し算(10,33,43). 答えが50以下の足し算(10,34,44). 答えが50以下の足し算(10,35,45). 答えが50以下の足し算(10,36,46). 答えが50以下の足し算(10,37,47). 答えが50以下の足し算(10,38,48). 答えが50以下の足し算(10,39,49). 答えが50以下の足し算(10,40,50). 答えが50以下の足し算(11,1,12). 答えが50以下の足し算(11,2,13). 答えが50以下の足し算(11,3,14). 答えが50以下の足し算(11,4,15). 答えが50以下の足し算(11,5,16). 答えが50以下の足し算(11,6,17). 答えが50以下の足し算(11,7,18). 答えが50以下の足し算(11,8,19). 答えが50以下の足し算(11,9,20). 答えが50以下の足し算(11,10,21). 答えが50以下の足し算(11,11,22). 答えが50以下の足し算(11,12,23). 答えが50以下の足し算(11,13,24). 答えが50以下の足し算(11,14,25). 答えが50以下の足し算(11,15,26). 答えが50以下の足し算(11,16,27). 答えが50以下の足し算(11,17,28). 答えが50以下の足し算(11,18,29). 答えが50以下の足し算(11,19,30). 答えが50以下の足し算(11,20,31). 答えが50以下の足し算(11,21,32). 答えが50以下の足し算(11,22,33). 答えが50以下の足し算(11,23,34). 答えが50以下の足し算(11,24,35). 答えが50以下の足し算(11,25,36). 答えが50以下の足し算(11,26,37). 答えが50以下の足し算(11,27,38). 答えが50以下の足し算(11,28,39). 答えが50以下の足し算(11,29,40). 答えが50以下の足し算(11,30,41). 答えが50以下の足し算(11,31,42). 答えが50以下の足し算(11,32,43). 答えが50以下の足し算(11,33,44). 答えが50以下の足し算(11,34,45). 答えが50以下の足し算(11,35,46). 答えが50以下の足し算(11,36,47). 答えが50以下の足し算(11,37,48). 答えが50以下の足し算(11,38,49). 答えが50以下の足し算(11,39,50). 答えが50以下の足し算(12,1,13). 答えが50以下の足し算(12,2,14). 答えが50以下の足し算(12,3,15). 答えが50以下の足し算(12,4,16). 答えが50以下の足し算(12,5,17). 答えが50以下の足し算(12,6,18). 答えが50以下の足し算(12,7,19). 答えが50以下の足し算(12,8,20). 答えが50以下の足し算(12,9,21). 答えが50以下の足し算(12,10,22). 答えが50以下の足し算(12,11,23). 答えが50以下の足し算(12,12,24). 答えが50以下の足し算(12,13,25). 答えが50以下の足し算(12,14,26). 答えが50以下の足し算(12,15,27). 答えが50以下の足し算(12,16,28). 答えが50以下の足し算(12,17,29). 答えが50以下の足し算(12,18,30). 答えが50以下の足し算(12,19,31). 答えが50以下の足し算(12,20,32). 答えが50以下の足し算(12,21,33). 答えが50以下の足し算(12,22,34). 答えが50以下の足し算(12,23,35). 答えが50以下の足し算(12,24,36). 答えが50以下の足し算(12,25,37). 答えが50以下の足し算(12,26,38). 答えが50以下の足し算(12,27,39). 答えが50以下の足し算(12,28,40). 答えが50以下の足し算(12,29,41). 答えが50以下の足し算(12,30,42). 答えが50以下の足し算(12,31,43). 答えが50以下の足し算(12,32,44). 答えが50以下の足し算(12,33,45). 答えが50以下の足し算(12,34,46). 答えが50以下の足し算(12,35,47). 答えが50以下の足し算(12,36,48). 答えが50以下の足し算(12,37,49). 答えが50以下の足し算(12,38,50). 答えが50以下の足し算(13,1,14). 答えが50以下の足し算(13,2,15). 答えが50以下の足し算(13,3,16). 答えが50以下の足し算(13,4,17). 答えが50以下の足し算(13,5,18). 答えが50以下の足し算(13,6,19). 答えが50以下の足し算(13,7,20). 答えが50以下の足し算(13,8,21). 答えが50以下の足し算(13,9,22). 答えが50以下の足し算(13,10,23). 答えが50以下の足し算(13,11,24). 答えが50以下の足し算(13,12,25). 答えが50以下の足し算(13,13,26). 答えが50以下の足し算(13,14,27). 答えが50以下の足し算(13,15,28). 答えが50以下の足し算(13,16,29). 答えが50以下の足し算(13,17,30). 答えが50以下の足し算(13,18,31). 答えが50以下の足し算(13,19,32). 答えが50以下の足し算(13,20,33). 答えが50以下の足し算(13,21,34). 答えが50以下の足し算(13,22,35). 答えが50以下の足し算(13,23,36). 答えが50以下の足し算(13,24,37). 答えが50以下の足し算(13,25,38). 答えが50以下の足し算(13,26,39). 答えが50以下の足し算(13,27,40). 答えが50以下の足し算(13,28,41). 答えが50以下の足し算(13,29,42). 答えが50以下の足し算(13,30,43). 答えが50以下の足し算(13,31,44). 答えが50以下の足し算(13,32,45). 答えが50以下の足し算(13,33,46). 答えが50以下の足し算(13,34,47). 答えが50以下の足し算(13,35,48). 答えが50以下の足し算(13,36,49). 答えが50以下の足し算(13,37,50). 答えが50以下の足し算(14,1,15). 答えが50以下の足し算(14,2,16). 答えが50以下の足し算(14,3,17). 答えが50以下の足し算(14,4,18). 答えが50以下の足し算(14,5,19). 答えが50以下の足し算(14,6,20). 答えが50以下の足し算(14,7,21). 答えが50以下の足し算(14,8,22). 答えが50以下の足し算(14,9,23). 答えが50以下の足し算(14,10,24). 答えが50以下の足し算(14,11,25). 答えが50以下の足し算(14,12,26). 答えが50以下の足し算(14,13,27). 答えが50以下の足し算(14,14,28). 答えが50以下の足し算(14,15,29). 答えが50以下の足し算(14,16,30). 答えが50以下の足し算(14,17,31). 答えが50以下の足し算(14,18,32). 答えが50以下の足し算(14,19,33). 答えが50以下の足し算(14,20,34). 答えが50以下の足し算(14,21,35). 答えが50以下の足し算(14,22,36). 答えが50以下の足し算(14,23,37). 答えが50以下の足し算(14,24,38). 答えが50以下の足し算(14,25,39). 答えが50以下の足し算(14,26,40). 答えが50以下の足し算(14,27,41). 答えが50以下の足し算(14,28,42). 答えが50以下の足し算(14,29,43). 答えが50以下の足し算(14,30,44). 答えが50以下の足し算(14,31,45). 答えが50以下の足し算(14,32,46). 答えが50以下の足し算(14,33,47). 答えが50以下の足し算(14,34,48). 答えが50以下の足し算(14,35,49). 答えが50以下の足し算(14,36,50). 答えが50以下の足し算(15,1,16). 答えが50以下の足し算(15,2,17). 答えが50以下の足し算(15,3,18). 答えが50以下の足し算(15,4,19). 答えが50以下の足し算(15,5,20). 答えが50以下の足し算(15,6,21). 答えが50以下の足し算(15,7,22). 答えが50以下の足し算(15,8,23). 答えが50以下の足し算(15,9,24). 答えが50以下の足し算(15,10,25). 答えが50以下の足し算(15,11,26). 答えが50以下の足し算(15,12,27). 答えが50以下の足し算(15,13,28). 答えが50以下の足し算(15,14,29). 答えが50以下の足し算(15,15,30). 答えが50以下の足し算(15,16,31). 答えが50以下の足し算(15,17,32). 答えが50以下の足し算(15,18,33). 答えが50以下の足し算(15,19,34). 答えが50以下の足し算(15,20,35). 答えが50以下の足し算(15,21,36). 答えが50以下の足し算(15,22,37). 答えが50以下の足し算(15,23,38). 答えが50以下の足し算(15,24,39). 答えが50以下の足し算(15,25,40). 答えが50以下の足し算(15,26,41). 答えが50以下の足し算(15,27,42). 答えが50以下の足し算(15,28,43). 答えが50以下の足し算(15,29,44). 答えが50以下の足し算(15,30,45). 答えが50以下の足し算(15,31,46). 答えが50以下の足し算(15,32,47). 答えが50以下の足し算(15,33,48). 答えが50以下の足し算(15,34,49). 答えが50以下の足し算(15,35,50). 答えが50以下の足し算(16,1,17). 答えが50以下の足し算(16,2,18). 答えが50以下の足し算(16,3,19). 答えが50以下の足し算(16,4,20). 答えが50以下の足し算(16,5,21). 答えが50以下の足し算(16,6,22). 答えが50以下の足し算(16,7,23). 答えが50以下の足し算(16,8,24). 答えが50以下の足し算(16,9,25). 答えが50以下の足し算(16,10,26). 答えが50以下の足し算(16,11,27). 答えが50以下の足し算(16,12,28). 答えが50以下の足し算(16,13,29). 答えが50以下の足し算(16,14,30). 答えが50以下の足し算(16,15,31). 答えが50以下の足し算(16,16,32). 答えが50以下の足し算(16,17,33). 答えが50以下の足し算(16,18,34). 答えが50以下の足し算(16,19,35). 答えが50以下の足し算(16,20,36). 答えが50以下の足し算(16,21,37). 答えが50以下の足し算(16,22,38). 答えが50以下の足し算(16,23,39). 答えが50以下の足し算(16,24,40). 答えが50以下の足し算(16,25,41). 答えが50以下の足し算(16,26,42). 答えが50以下の足し算(16,27,43). 答えが50以下の足し算(16,28,44). 答えが50以下の足し算(16,29,45). 答えが50以下の足し算(16,30,46). 答えが50以下の足し算(16,31,47). 答えが50以下の足し算(16,32,48). 答えが50以下の足し算(16,33,49). 答えが50以下の足し算(16,34,50). 答えが50以下の足し算(17,1,18). 答えが50以下の足し算(17,2,19). 答えが50以下の足し算(17,3,20). 答えが50以下の足し算(17,4,21). 答えが50以下の足し算(17,5,22). 答えが50以下の足し算(17,6,23). 答えが50以下の足し算(17,7,24). 答えが50以下の足し算(17,8,25). 答えが50以下の足し算(17,9,26). 答えが50以下の足し算(17,10,27). 答えが50以下の足し算(17,11,28). 答えが50以下の足し算(17,12,29). 答えが50以下の足し算(17,13,30). 答えが50以下の足し算(17,14,31). 答えが50以下の足し算(17,15,32). 答えが50以下の足し算(17,16,33). 答えが50以下の足し算(17,17,34). 答えが50以下の足し算(17,18,35). 答えが50以下の足し算(17,19,36). 答えが50以下の足し算(17,20,37). 答えが50以下の足し算(17,21,38). 答えが50以下の足し算(17,22,39). 答えが50以下の足し算(17,23,40). 答えが50以下の足し算(17,24,41). 答えが50以下の足し算(17,25,42). 答えが50以下の足し算(17,26,43). 答えが50以下の足し算(17,27,44). 答えが50以下の足し算(17,28,45). 答えが50以下の足し算(17,29,46). 答えが50以下の足し算(17,30,47). 答えが50以下の足し算(17,31,48). 答えが50以下の足し算(17,32,49). 答えが50以下の足し算(17,33,50). 答えが50以下の足し算(18,1,19). 答えが50以下の足し算(18,2,20). 答えが50以下の足し算(18,3,21). 答えが50以下の足し算(18,4,22). 答えが50以下の足し算(18,5,23). 答えが50以下の足し算(18,6,24). 答えが50以下の足し算(18,7,25). 答えが50以下の足し算(18,8,26). 答えが50以下の足し算(18,9,27). 答えが50以下の足し算(18,10,28). 答えが50以下の足し算(18,11,29). 答えが50以下の足し算(18,12,30). 答えが50以下の足し算(18,13,31). 答えが50以下の足し算(18,14,32). 答えが50以下の足し算(18,15,33). 答えが50以下の足し算(18,16,34). 答えが50以下の足し算(18,17,35). 答えが50以下の足し算(18,18,36). 答えが50以下の足し算(18,19,37). 答えが50以下の足し算(18,20,38). 答えが50以下の足し算(18,21,39). 答えが50以下の足し算(18,22,40). 答えが50以下の足し算(18,23,41). 答えが50以下の足し算(18,24,42). 答えが50以下の足し算(18,25,43). 答えが50以下の足し算(18,26,44). 答えが50以下の足し算(18,27,45). 答えが50以下の足し算(18,28,46). 答えが50以下の足し算(18,29,47). 答えが50以下の足し算(18,30,48). 答えが50以下の足し算(18,31,49). 答えが50以下の足し算(18,32,50). 答えが50以下の足し算(19,1,20). 答えが50以下の足し算(19,2,21). 答えが50以下の足し算(19,3,22). 答えが50以下の足し算(19,4,23). 答えが50以下の足し算(19,5,24). 答えが50以下の足し算(19,6,25). 答えが50以下の足し算(19,7,26). 答えが50以下の足し算(19,8,27). 答えが50以下の足し算(19,9,28). 答えが50以下の足し算(19,10,29). 答えが50以下の足し算(19,11,30). 答えが50以下の足し算(19,12,31). 答えが50以下の足し算(19,13,32). 答えが50以下の足し算(19,14,33). 答えが50以下の足し算(19,15,34). 答えが50以下の足し算(19,16,35). 答えが50以下の足し算(19,17,36). 答えが50以下の足し算(19,18,37). 答えが50以下の足し算(19,19,38). 答えが50以下の足し算(19,20,39). 答えが50以下の足し算(19,21,40). 答えが50以下の足し算(19,22,41). 答えが50以下の足し算(19,23,42). 答えが50以下の足し算(19,24,43). 答えが50以下の足し算(19,25,44). 答えが50以下の足し算(19,26,45). 答えが50以下の足し算(19,27,46). 答えが50以下の足し算(19,28,47). 答えが50以下の足し算(19,29,48). 答えが50以下の足し算(19,30,49). 答えが50以下の足し算(19,31,50). 答えが50以下の足し算(20,1,21). 答えが50以下の足し算(20,2,22). 答えが50以下の足し算(20,3,23). 答えが50以下の足し算(20,4,24). 答えが50以下の足し算(20,5,25). 答えが50以下の足し算(20,6,26). 答えが50以下の足し算(20,7,27). 答えが50以下の足し算(20,8,28). 答えが50以下の足し算(20,9,29). 答えが50以下の足し算(20,10,30). 答えが50以下の足し算(20,11,31). 答えが50以下の足し算(20,12,32). 答えが50以下の足し算(20,13,33). 答えが50以下の足し算(20,14,34). 答えが50以下の足し算(20,15,35). 答えが50以下の足し算(20,16,36). 答えが50以下の足し算(20,17,37). 答えが50以下の足し算(20,18,38). 答えが50以下の足し算(20,19,39). 答えが50以下の足し算(20,20,40). 答えが50以下の足し算(20,21,41). 答えが50以下の足し算(20,22,42). 答えが50以下の足し算(20,23,43). 答えが50以下の足し算(20,24,44). 答えが50以下の足し算(20,25,45). 答えが50以下の足し算(20,26,46). 答えが50以下の足し算(20,27,47). 答えが50以下の足し算(20,28,48). 答えが50以下の足し算(20,29,49). 答えが50以下の足し算(20,30,50). 答えが50以下の足し算(21,1,22). 答えが50以下の足し算(21,2,23). 答えが50以下の足し算(21,3,24). 答えが50以下の足し算(21,4,25). 答えが50以下の足し算(21,5,26). 答えが50以下の足し算(21,6,27). 答えが50以下の足し算(21,7,28). 答えが50以下の足し算(21,8,29). 答えが50以下の足し算(21,9,30). 答えが50以下の足し算(21,10,31). 答えが50以下の足し算(21,11,32). 答えが50以下の足し算(21,12,33). 答えが50以下の足し算(21,13,34). 答えが50以下の足し算(21,14,35). 答えが50以下の足し算(21,15,36). 答えが50以下の足し算(21,16,37). 答えが50以下の足し算(21,17,38). 答えが50以下の足し算(21,18,39). 答えが50以下の足し算(21,19,40). 答えが50以下の足し算(21,20,41). 答えが50以下の足し算(21,21,42). 答えが50以下の足し算(21,22,43). 答えが50以下の足し算(21,23,44). 答えが50以下の足し算(21,24,45). 答えが50以下の足し算(21,25,46). 答えが50以下の足し算(21,26,47). 答えが50以下の足し算(21,27,48). 答えが50以下の足し算(21,28,49). 答えが50以下の足し算(21,29,50). 答えが50以下の足し算(22,1,23). 答えが50以下の足し算(22,2,24). 答えが50以下の足し算(22,3,25). 答えが50以下の足し算(22,4,26). 答えが50以下の足し算(22,5,27). 答えが50以下の足し算(22,6,28). 答えが50以下の足し算(22,7,29). 答えが50以下の足し算(22,8,30). 答えが50以下の足し算(22,9,31). 答えが50以下の足し算(22,10,32). 答えが50以下の足し算(22,11,33). 答えが50以下の足し算(22,12,34). 答えが50以下の足し算(22,13,35). 答えが50以下の足し算(22,14,36). 答えが50以下の足し算(22,15,37). 答えが50以下の足し算(22,16,38). 答えが50以下の足し算(22,17,39). 答えが50以下の足し算(22,18,40). 答えが50以下の足し算(22,19,41). 答えが50以下の足し算(22,20,42). 答えが50以下の足し算(22,21,43). 答えが50以下の足し算(22,22,44). 答えが50以下の足し算(22,23,45). 答えが50以下の足し算(22,24,46). 答えが50以下の足し算(22,25,47). 答えが50以下の足し算(22,26,48). 答えが50以下の足し算(22,27,49). 答えが50以下の足し算(22,28,50). 答えが50以下の足し算(23,1,24). 答えが50以下の足し算(23,2,25). 答えが50以下の足し算(23,3,26). 答えが50以下の足し算(23,4,27). 答えが50以下の足し算(23,5,28). 答えが50以下の足し算(23,6,29). 答えが50以下の足し算(23,7,30). 答えが50以下の足し算(23,8,31). 答えが50以下の足し算(23,9,32). 答えが50以下の足し算(23,10,33). 答えが50以下の足し算(23,11,34). 答えが50以下の足し算(23,12,35). 答えが50以下の足し算(23,13,36). 答えが50以下の足し算(23,14,37). 答えが50以下の足し算(23,15,38). 答えが50以下の足し算(23,16,39). 答えが50以下の足し算(23,17,40). 答えが50以下の足し算(23,18,41). 答えが50以下の足し算(23,19,42). 答えが50以下の足し算(23,20,43). 答えが50以下の足し算(23,21,44). 答えが50以下の足し算(23,22,45). 答えが50以下の足し算(23,23,46). 答えが50以下の足し算(23,24,47). 答えが50以下の足し算(23,25,48). 答えが50以下の足し算(23,26,49). 答えが50以下の足し算(23,27,50). 答えが50以下の足し算(24,1,25). 答えが50以下の足し算(24,2,26). 答えが50以下の足し算(24,3,27). 答えが50以下の足し算(24,4,28). 答えが50以下の足し算(24,5,29). 答えが50以下の足し算(24,6,30). 答えが50以下の足し算(24,7,31). 答えが50以下の足し算(24,8,32). 答えが50以下の足し算(24,9,33). 答えが50以下の足し算(24,10,34). 答えが50以下の足し算(24,11,35). 答えが50以下の足し算(24,12,36). 答えが50以下の足し算(24,13,37). 答えが50以下の足し算(24,14,38). 答えが50以下の足し算(24,15,39). 答えが50以下の足し算(24,16,40). 答えが50以下の足し算(24,17,41). 答えが50以下の足し算(24,18,42). 答えが50以下の足し算(24,19,43). 答えが50以下の足し算(24,20,44). 答えが50以下の足し算(24,21,45). 答えが50以下の足し算(24,22,46). 答えが50以下の足し算(24,23,47). 答えが50以下の足し算(24,24,48). 答えが50以下の足し算(24,25,49). 答えが50以下の足し算(24,26,50). 答えが50以下の足し算(25,1,26). 答えが50以下の足し算(25,2,27). 答えが50以下の足し算(25,3,28). 答えが50以下の足し算(25,4,29). 答えが50以下の足し算(25,5,30). 答えが50以下の足し算(25,6,31). 答えが50以下の足し算(25,7,32). 答えが50以下の足し算(25,8,33). 答えが50以下の足し算(25,9,34). 答えが50以下の足し算(25,10,35). 答えが50以下の足し算(25,11,36). 答えが50以下の足し算(25,12,37). 答えが50以下の足し算(25,13,38). 答えが50以下の足し算(25,14,39). 答えが50以下の足し算(25,15,40). 答えが50以下の足し算(25,16,41). 答えが50以下の足し算(25,17,42). 答えが50以下の足し算(25,18,43). 答えが50以下の足し算(25,19,44). 答えが50以下の足し算(25,20,45). 答えが50以下の足し算(25,21,46). 答えが50以下の足し算(25,22,47). 答えが50以下の足し算(25,23,48). 答えが50以下の足し算(25,24,49). 答えが50以下の足し算(25,25,50). 答えが50以下の足し算(26,1,27). 答えが50以下の足し算(26,2,28). 答えが50以下の足し算(26,3,29). 答えが50以下の足し算(26,4,30). 答えが50以下の足し算(26,5,31). 答えが50以下の足し算(26,6,32). 答えが50以下の足し算(26,7,33). 答えが50以下の足し算(26,8,34). 答えが50以下の足し算(26,9,35). 答えが50以下の足し算(26,10,36). 答えが50以下の足し算(26,11,37). 答えが50以下の足し算(26,12,38). 答えが50以下の足し算(26,13,39). 答えが50以下の足し算(26,14,40). 答えが50以下の足し算(26,15,41). 答えが50以下の足し算(26,16,42). 答えが50以下の足し算(26,17,43). 答えが50以下の足し算(26,18,44). 答えが50以下の足し算(26,19,45). 答えが50以下の足し算(26,20,46). 答えが50以下の足し算(26,21,47). 答えが50以下の足し算(26,22,48). 答えが50以下の足し算(26,23,49). 答えが50以下の足し算(26,24,50). 答えが50以下の足し算(27,1,28). 答えが50以下の足し算(27,2,29). 答えが50以下の足し算(27,3,30). 答えが50以下の足し算(27,4,31). 答えが50以下の足し算(27,5,32). 答えが50以下の足し算(27,6,33). 答えが50以下の足し算(27,7,34). 答えが50以下の足し算(27,8,35). 答えが50以下の足し算(27,9,36). 答えが50以下の足し算(27,10,37). 答えが50以下の足し算(27,11,38). 答えが50以下の足し算(27,12,39). 答えが50以下の足し算(27,13,40). 答えが50以下の足し算(27,14,41). 答えが50以下の足し算(27,15,42). 答えが50以下の足し算(27,16,43). 答えが50以下の足し算(27,17,44). 答えが50以下の足し算(27,18,45). 答えが50以下の足し算(27,19,46). 答えが50以下の足し算(27,20,47). 答えが50以下の足し算(27,21,48). 答えが50以下の足し算(27,22,49). 答えが50以下の足し算(27,23,50). 答えが50以下の足し算(28,1,29). 答えが50以下の足し算(28,2,30). 答えが50以下の足し算(28,3,31). 答えが50以下の足し算(28,4,32). 答えが50以下の足し算(28,5,33). 答えが50以下の足し算(28,6,34). 答えが50以下の足し算(28,7,35). 答えが50以下の足し算(28,8,36). 答えが50以下の足し算(28,9,37). 答えが50以下の足し算(28,10,38). 答えが50以下の足し算(28,11,39). 答えが50以下の足し算(28,12,40). 答えが50以下の足し算(28,13,41). 答えが50以下の足し算(28,14,42). 答えが50以下の足し算(28,15,43). 答えが50以下の足し算(28,16,44). 答えが50以下の足し算(28,17,45). 答えが50以下の足し算(28,18,46). 答えが50以下の足し算(28,19,47). 答えが50以下の足し算(28,20,48). 答えが50以下の足し算(28,21,49). 答えが50以下の足し算(28,22,50). 答えが50以下の足し算(29,1,30). 答えが50以下の足し算(29,2,31). 答えが50以下の足し算(29,3,32). 答えが50以下の足し算(29,4,33). 答えが50以下の足し算(29,5,34). 答えが50以下の足し算(29,6,35). 答えが50以下の足し算(29,7,36). 答えが50以下の足し算(29,8,37). 答えが50以下の足し算(29,9,38). 答えが50以下の足し算(29,10,39). 答えが50以下の足し算(29,11,40). 答えが50以下の足し算(29,12,41). 答えが50以下の足し算(29,13,42). 答えが50以下の足し算(29,14,43). 答えが50以下の足し算(29,15,44). 答えが50以下の足し算(29,16,45). 答えが50以下の足し算(29,17,46). 答えが50以下の足し算(29,18,47). 答えが50以下の足し算(29,19,48). 答えが50以下の足し算(29,20,49). 答えが50以下の足し算(29,21,50). 答えが50以下の足し算(30,1,31). 答えが50以下の足し算(30,2,32). 答えが50以下の足し算(30,3,33). 答えが50以下の足し算(30,4,34). 答えが50以下の足し算(30,5,35). 答えが50以下の足し算(30,6,36). 答えが50以下の足し算(30,7,37). 答えが50以下の足し算(30,8,38). 答えが50以下の足し算(30,9,39). 答えが50以下の足し算(30,10,40). 答えが50以下の足し算(30,11,41). 答えが50以下の足し算(30,12,42). 答えが50以下の足し算(30,13,43). 答えが50以下の足し算(30,14,44). 答えが50以下の足し算(30,15,45). 答えが50以下の足し算(30,16,46). 答えが50以下の足し算(30,17,47). 答えが50以下の足し算(30,18,48). 答えが50以下の足し算(30,19,49). 答えが50以下の足し算(30,20,50). 答えが50以下の足し算(31,1,32). 答えが50以下の足し算(31,2,33). 答えが50以下の足し算(31,3,34). 答えが50以下の足し算(31,4,35). 答えが50以下の足し算(31,5,36). 答えが50以下の足し算(31,6,37). 答えが50以下の足し算(31,7,38). 答えが50以下の足し算(31,8,39). 答えが50以下の足し算(31,9,40). 答えが50以下の足し算(31,10,41). 答えが50以下の足し算(31,11,42). 答えが50以下の足し算(31,12,43). 答えが50以下の足し算(31,13,44). 答えが50以下の足し算(31,14,45). 答えが50以下の足し算(31,15,46). 答えが50以下の足し算(31,16,47). 答えが50以下の足し算(31,17,48). 答えが50以下の足し算(31,18,49). 答えが50以下の足し算(31,19,50). 答えが50以下の足し算(32,1,33). 答えが50以下の足し算(32,2,34). 答えが50以下の足し算(32,3,35). 答えが50以下の足し算(32,4,36). 答えが50以下の足し算(32,5,37). 答えが50以下の足し算(32,6,38). 答えが50以下の足し算(32,7,39). 答えが50以下の足し算(32,8,40). 答えが50以下の足し算(32,9,41). 答えが50以下の足し算(32,10,42). 答えが50以下の足し算(32,11,43). 答えが50以下の足し算(32,12,44). 答えが50以下の足し算(32,13,45). 答えが50以下の足し算(32,14,46). 答えが50以下の足し算(32,15,47). 答えが50以下の足し算(32,16,48). 答えが50以下の足し算(32,17,49). 答えが50以下の足し算(32,18,50). 答えが50以下の足し算(33,1,34). 答えが50以下の足し算(33,2,35). 答えが50以下の足し算(33,3,36). 答えが50以下の足し算(33,4,37). 答えが50以下の足し算(33,5,38). 答えが50以下の足し算(33,6,39). 答えが50以下の足し算(33,7,40). 答えが50以下の足し算(33,8,41). 答えが50以下の足し算(33,9,42). 答えが50以下の足し算(33,10,43). 答えが50以下の足し算(33,11,44). 答えが50以下の足し算(33,12,45). 答えが50以下の足し算(33,13,46). 答えが50以下の足し算(33,14,47). 答えが50以下の足し算(33,15,48). 答えが50以下の足し算(33,16,49). 答えが50以下の足し算(33,17,50). 答えが50以下の足し算(34,1,35). 答えが50以下の足し算(34,2,36). 答えが50以下の足し算(34,3,37). 答えが50以下の足し算(34,4,38). 答えが50以下の足し算(34,5,39). 答えが50以下の足し算(34,6,40). 答えが50以下の足し算(34,7,41). 答えが50以下の足し算(34,8,42). 答えが50以下の足し算(34,9,43). 答えが50以下の足し算(34,10,44). 答えが50以下の足し算(34,11,45). 答えが50以下の足し算(34,12,46). 答えが50以下の足し算(34,13,47). 答えが50以下の足し算(34,14,48). 答えが50以下の足し算(34,15,49). 答えが50以下の足し算(34,16,50). 答えが50以下の足し算(35,1,36). 答えが50以下の足し算(35,2,37). 答えが50以下の足し算(35,3,38). 答えが50以下の足し算(35,4,39). 答えが50以下の足し算(35,5,40). 答えが50以下の足し算(35,6,41). 答えが50以下の足し算(35,7,42). 答えが50以下の足し算(35,8,43). 答えが50以下の足し算(35,9,44). 答えが50以下の足し算(35,10,45). 答えが50以下の足し算(35,11,46). 答えが50以下の足し算(35,12,47). 答えが50以下の足し算(35,13,48). 答えが50以下の足し算(35,14,49). 答えが50以下の足し算(35,15,50). 答えが50以下の足し算(36,1,37). 答えが50以下の足し算(36,2,38). 答えが50以下の足し算(36,3,39). 答えが50以下の足し算(36,4,40). 答えが50以下の足し算(36,5,41). 答えが50以下の足し算(36,6,42). 答えが50以下の足し算(36,7,43). 答えが50以下の足し算(36,8,44). 答えが50以下の足し算(36,9,45). 答えが50以下の足し算(36,10,46). 答えが50以下の足し算(36,11,47). 答えが50以下の足し算(36,12,48). 答えが50以下の足し算(36,13,49). 答えが50以下の足し算(36,14,50). 答えが50以下の足し算(37,1,38). 答えが50以下の足し算(37,2,39). 答えが50以下の足し算(37,3,40). 答えが50以下の足し算(37,4,41). 答えが50以下の足し算(37,5,42). 答えが50以下の足し算(37,6,43). 答えが50以下の足し算(37,7,44). 答えが50以下の足し算(37,8,45). 答えが50以下の足し算(37,9,46). 答えが50以下の足し算(37,10,47). 答えが50以下の足し算(37,11,48). 答えが50以下の足し算(37,12,49). 答えが50以下の足し算(37,13,50). 答えが50以下の足し算(38,1,39). 答えが50以下の足し算(38,2,40). 答えが50以下の足し算(38,3,41). 答えが50以下の足し算(38,4,42). 答えが50以下の足し算(38,5,43). 答えが50以下の足し算(38,6,44). 答えが50以下の足し算(38,7,45). 答えが50以下の足し算(38,8,46). 答えが50以下の足し算(38,9,47). 答えが50以下の足し算(38,10,48). 答えが50以下の足し算(38,11,49). 答えが50以下の足し算(38,12,50). 答えが50以下の足し算(39,1,40). 答えが50以下の足し算(39,2,41). 答えが50以下の足し算(39,3,42). 答えが50以下の足し算(39,4,43). 答えが50以下の足し算(39,5,44). 答えが50以下の足し算(39,6,45). 答えが50以下の足し算(39,7,46). 答えが50以下の足し算(39,8,47). 答えが50以下の足し算(39,9,48). 答えが50以下の足し算(39,10,49). 答えが50以下の足し算(39,11,50). 答えが50以下の足し算(40,1,41). 答えが50以下の足し算(40,2,42). 答えが50以下の足し算(40,3,43). 答えが50以下の足し算(40,4,44). 答えが50以下の足し算(40,5,45). 答えが50以下の足し算(40,6,46). 答えが50以下の足し算(40,7,47). 答えが50以下の足し算(40,8,48). 答えが50以下の足し算(40,9,49). 答えが50以下の足し算(40,10,50). 答えが50以下の足し算(41,1,42). 答えが50以下の足し算(41,2,43). 答えが50以下の足し算(41,3,44). 答えが50以下の足し算(41,4,45). 答えが50以下の足し算(41,5,46). 答えが50以下の足し算(41,6,47). 答えが50以下の足し算(41,7,48). 答えが50以下の足し算(41,8,49). 答えが50以下の足し算(41,9,50). 答えが50以下の足し算(42,1,43). 答えが50以下の足し算(42,2,44). 答えが50以下の足し算(42,3,45). 答えが50以下の足し算(42,4,46). 答えが50以下の足し算(42,5,47). 答えが50以下の足し算(42,6,48). 答えが50以下の足し算(42,7,49). 答えが50以下の足し算(42,8,50). 答えが50以下の足し算(43,1,44). 答えが50以下の足し算(43,2,45). 答えが50以下の足し算(43,3,46). 答えが50以下の足し算(43,4,47). 答えが50以下の足し算(43,5,48). 答えが50以下の足し算(43,6,49). 答えが50以下の足し算(43,7,50). 答えが50以下の足し算(44,1,45). 答えが50以下の足し算(44,2,46). 答えが50以下の足し算(44,3,47). 答えが50以下の足し算(44,4,48). 答えが50以下の足し算(44,5,49). 答えが50以下の足し算(44,6,50). 答えが50以下の足し算(45,1,46). 答えが50以下の足し算(45,2,47). 答えが50以下の足し算(45,3,48). 答えが50以下の足し算(45,4,49). 答えが50以下の足し算(45,5,50). 答えが50以下の足し算(46,1,47). 答えが50以下の足し算(46,2,48). 答えが50以下の足し算(46,3,49). 答えが50以下の足し算(46,4,50). 答えが50以下の足し算(47,1,48). 答えが50以下の足し算(47,2,49). 答えが50以下の足し算(47,3,50). 答えが50以下の足し算(48,1,49). 答えが50以下の足し算(48,2,50). 答えが50以下の足し算(49,1,50). '答えが50以下の足し算/3を定義する' :- forall(( between(1,M,50),between(1,N,50),S is M + N,S =< 50), assertz(答えが50以下の足し算(M,N,S))). % 以下のサイトは # twitter_by_@ketcho0o_20131129 # # excelで仕事割出すやつ作ったけど、javaで作った方がよかったかなあ。 # むしろバンド名質問してそれに属する人達を除いたセクションメンバーを表示するってことでprologで作れたらかっこいいね。 セクションメンバー(ビートルズ,'ジョン・レノン'). セクションメンバー(ビートルズ,'ポール・マッカートニー'). セクションメンバー(ビートルズ,'ジョージ・ハリスン'). セクションメンバー(ビートルズ,'リンゴ・スター'). セクションメンバー(クラッシュ,'ジョー・ストラマー'). セクションメンバー(クラッシュ,'ミック・ジョーンズ'). セクションメンバー(クラッシュ,'ポール・シムノン'). セクションメンバー(クラッシュ,'トッパー・ヒードン'). 'バンド名質問してそれに属する人達を除いたセクションメンバーを表示する' :- バンド名質問して(_バンド名), それに属する人達を除いたセクションメンバーを表示する(_バンド名). バンド名質問して(_バンド名) :- write('バンド名は '), read(_バンド名). それに属する人達を除いたセクションメンバーを表示する(_バンド名) :- forall(それに属する人達を除いたセクションメンバーを(_バンド名,_セクション,_メンバー), 表示する(_セクション,_メンバー)). それに属する人達を除いたセクションメンバーを(_バンド名,_セクション,_メンバー) :- セクションメンバー(_セクション,_メンバー), \+(_セクション = _バンド名). 表示する(_セクション,_メンバー) :- writef('%t,%t\n',[_セクション,_メンバー]). % 参考 % 以下のサイトは # twitter_by_@ketcho0o_20131129 # # excelで仕事割出すやつ作ったけど、javaで作った方がよかったかなあ。 # むしろバンド名質問してそれに属する人達を除いたセクションメンバーを表示するってことでprologで作れたらかっこいいね。 セクションメンバー(ビートルズ,'ジョン・レノン'). セクションメンバー(ビートルズ,'ポール・マッカートニー'). セクションメンバー(ビートルズ,'ジョージ・ハリスン'). セクションメンバー(ビートルズ,'リンゴ・スター'). セクションメンバー(クラッシュ,'ジョー・ストラマー'). セクションメンバー(クラッシュ,'ミック・ジョーンズ'). セクションメンバー(クラッシュ,'ポール・シムノン'). セクションメンバー(クラッシュ,'トッパー・ヒードン'). 'バンド名質問してそれに属する人達を除いたセクションメンバーを表示する' :- write('バンド名は '), read(_バンド名), forall(それに属する人達を除いたセクションメンバーを(_バンド名,_セクション,_メンバー),表示する(_セクション,_メンバー)). それに属する人達を除いたセクションメンバーを(_バンド名,_セクション,_メンバー) :- セクションメンバー(_セクション,_メンバー), \+(_セクション = _バンド名). 表示する(_セクション,_メンバー) :- writef('%t,%t\n',[_セクション,_メンバー]). % 参考 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/309 # # C500問って本にあった # # * # ** # *** # **** # ***** # ****** # ******* # ******** # ********* # ********** # ってのもいい問題かと 'C500問って本にあった * ** *** **** ***** ****** ******* ******** ********* ********** ってのもいい問題かと' :- atom_chars('**********',L), forall(append([H|R],_,L),(atomic_list_concat([H|R],S),writef('%t\n',[S])). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_四桁の西暦,_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_年整数,_小計_年月日整数ならび) :- 年の組みの合計(_年整数,_年の組みの合計), forall((for(43,N,2),_小計 is _年の組みの合計 + N,member([_小計,_年月日整数],_小計_年月日整数ならび)),writef('%t = %t\n',[_年月日整数,_小計])). 年の組みの合計(_年整数,_年の組みの合計) :- _年の組みの合計 is _年整数 // 100 + _年整数 mod 100. % for/3 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/328 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # a) 4桁の西暦を入力として受け取り # b) その年のすべての日について次の演算を行い # c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 # (例) # 20 + 13 + 11 + 25 = 69 # d) 各日の小計を大きいものから順に # 20131231 = 76 # ... # 20131125 = 69 # ... # 20130101 = 35 # のように表示させるプログラムを作りなさい # 'a) 4桁の西暦を入力として受け取り b) その年のすべての日について次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日 (例) 20 + 13 + 11 + 25 = 69 d) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させるプログラムを作りなさい '(_四桁の西暦) :- findall([_小計,_年月日整数],( 'b) その年のすべての日について'(_四桁の西暦,_年月日整数), '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計)), _小計_年月日整数ならび), 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび). 'b) その年のすべての日について'(_四桁の西暦,_年月日整数) :- between(1,12,_月整数), 月末日(_四桁の西暦,_月整数,_月末日整数), between(1,_月末日整数,_日整数), _年月日整数 is _四桁の西暦 * 10000 + _月整数 * 10 + _日整数. 月末日(_年整数,_月整数,_月末日整数) :- うるう年(_年整数), nth1(_月整数,[31,29,31,30,31,30,31,31,30,31,30,31],_月末日整数). 月末日(_年整数,_月整数,_月末日整数) :- \+(うるう年(_年整数)), nth1(_月整数,[31,28,31,30,31,30,31,31,30,31,30,31],_月末日整数). うるう年(_年) :- 0 is _年 mod 400,!. うるう年(_年) :- 0 is _年 mod 100,!, fail. うるう年(_年) :- 0 is _年 mod 4. '次の演算を行い c) 小計 = 年の上位2桁 + 年の下位2桁 + 月 + 日'(_年月日整数,_小計) :- 年の上位2桁(_年月日整数,_年の上位2桁), 年の下位2桁(_年月日整数,_年の下位2桁), 月(_年月日整数,_月整数), 日(_年月日整数,_日整数), _小計 is _年の上位2桁 + _年の下位2桁 + _月整数 + _日整数. 年の上位2桁(_年月日整数,_年の上位2桁) :- _年の上位2桁 is _年月日整数 // 1000000. 年の下位2桁(_年月日整数,_年の下位2桁) :- _剰余 is _年月日整数 mod 10000, _年の下位2桁 is _剰余 mod 100. 月(_年月日整数,_月整数) :- _剰余 is _年月日整数 mod 10000, _月整数 is _剰余_1 // 100. 日(_年月日整数,_日整数) :- _日整数 is _年月日整数 mod 100. 'd) 各日の小計を大きいものから順に 20131231 = 76 ... 20131125 = 69 ... 20130101 = 35 のように表示させる'(_小計_年月日整数ならび) :- 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), forall(member([_小計,_年月日整数],_大きいものから順に整列した_小計_年月日整数ならび),writef('%t = %t\n',[_年月日整数,_小計])). 各日の小計を大きいものから順に(_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび) :- sort(_小計_年月日整数ならび,_小さいものから順に整列した_小計_年月日整数ならび), reverse(_小さいものから順に整列した_小計_年月日整数ならび,_大きいものから順に整列した_小計_年月日整数ならび), % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/290 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): 100000 # 110000 # 111000 # 111100 # 111110 # 111111 # とこのように表示させるプログラム。 # '100000 110000 111000 111100 111110 111111 とこのように表示させるプログラム。' :- length(L,6), forall(先頭文字だけは1固定で行を1と0のならびで分離する(L),表示させる(L)), 先頭文字だけは1固定で行を1と0のならびで分離する(L) :- append(['1'|L1],L2,L), all(L1,'1'), all(L2,'0'). 表示させる(L) :- atomic_list_concat(L,A), writef('%t\n',[A]). all([],_). all([V|R],V) :- all(R). % 以下のサイトは # # お題:'+'と'-'の文字を使わないコードで"Hello, world!"をn回、表示する。 # '''+''と''-''の文字を使わないコードで"Hello, world!"をn回、表示する。'(_n) :- forall(between(1,_n,_),write('Hello, Wold!\n')). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/779 # # ●Regular Expressionの使用環境 # Perl(Emeditor) # # ●検索か置換か? # 検索 # # ●説明 # 各行の1番目のAまでを検索したい # # ●対象データ # お肉料理 # お魚料理 # 料理 # # # ●希望する結果 # 3行目の"料理"のみマッチさせたいです。 '各行の1番目のAまでを検索したい。ただし前部に忌避する連接した語が存在します。'(_文字列,_A,_前文字列,_A,_後文字列) :- sub_atom(_文字列,_前文字列,_A,_後文字列), forall(忌避する連接した語(_A,_忌避する連接した語),\+(sub_atom(_前文字列,_,_,0,_忌避する連接した語))),!. 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/779 # # ●Regular Expressionの使用環境 # Perl(Emeditor) # # ●検索か置換か? # 検索 # # ●説明 # 各行の1番目のAまでを検索したい # # ●対象データ # お肉料理 # お魚料理 # 料理 # # # ●希望する結果 # 3行目の"料理"のみマッチさせたいです。 # '各行の1番目のAまでを検索したい。ただし前部に忌避する連接した語が存在します。'(_文字列,_A,_前文字列,_A,_後文字列) :- sub_atom(_文字列,S,Len,R,_A), sub_atom(_文字列,0,S,0,_前文字列), forall(忌避する連接した語(_A,_忌避する連接した語),\+(sub_atom(_前文字列,_,_,0,_忌避する連接した語))), sub_atom(_文字列,_,R,0,_後文字列). 忌避する連接した語(料理,お肉). 忌避する連接した語(料理,お魚). % 以下のサイトは # お題: # 入力 # AND # # 出力 # DDDDD # DNNND # DNAND # DNNND # DDDDD # 囲み(_入力) :- atom_chars(_入力,[_中心の文字|_囲み文字ならび]), 囲み(_囲み文字ならび,[[_中心の文字]],_囲み), 出力(_囲み). 囲み([],_囲み,_囲み) :- !. 囲み([_文字|R],_囲み_1,_囲み) :- 文字で囲む(_文字,_囲み_1,_囲み_2), 囲み(R,_囲み_2,_囲み). 文字で囲む(_文字,_囲み_1,_囲み_2) :- 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み_1,_先頭と末尾に_文字の行を付加された囲み_1), 囲みの各行の先頭と末尾に_文字を付加する(_文字,_先頭と末尾に_文字の行を付加された囲み_1,_囲み_2). 囲みの先頭と末尾に_文字の行を付加する(_文字,_囲み,_先頭と末尾に_文字の行を付加された囲み_1) :- 転置(_囲み_1,_転置された囲み_1), 行の先頭と末尾に文字を付加する(_文字,_転置された囲み_1,_行の先頭と末尾に_文字を付加された転置された囲み_1), 転置(_行の先頭と末尾に文字を付加された転置された囲み_1,_先頭と末尾に_文字の行を付加された囲み_1). 囲みの各行の先頭と末尾に_文字を付加する(_文字,_囲み,_行の先頭と末尾に_文字を付加された囲み) :- findall(_先頭と末尾に_文字を付加された行,( member(_行,_囲み), append([_文字|_行],[_文字],_先頭と末尾に_文字を付加された行)), _行の先頭と末尾に_文字を付加された囲み). 出力(_囲み) :- forall(member(_行,_囲み),(atomic_list_concat(_行,_行文字列),writef('%t\n',[_行文字列])). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/194 # # [1] 授業単元:C言語 # # [2] 問題文(含コード&リンク): # 1〜100の整数のうち「6の倍数」の個数を表示するプログラムを作成しなさい、ただし、for文とif文を用いて作成すること # 1次元配列を用いて5人分の数学の得点を100点満点で入力し、「数学の得点の最小値と最大値」を画面表示、およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。 # # '1次元配列を用いて5人分の数学の得点を100点満点で入力し、「数学の得点の最小値と最大値」を画面表示、およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。' :- '1次元配列を用いて5人分の数学の得点を100点満点で入力し'(_5人文の数学の得点), '「数学の得点の最小値と最大値」を'(_5人分の数学の得点,_数学得点の最小値,_数学得点の最大値), '画面表示、'(_数学得点の最小値,_数学得点の最大値), 'およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。'(_5人分の数学の得点). '1次元配列を用いて5人分の数学の得点を100点満点で入力し'(_5人文の数学の得点) :- length(_5人分の数学の得点,5), forall(nth1(_nth1,_5人分の数学の得点,_数学の得点),整数を得る(数学の得点,(_数学の得点>=0,_数学の得点=<100),_数学の得点)). '「数学の得点の最小値と最大値」を'(_5人分の数学の得点,_数学得点の最小値,_数学得点の最大値,_数学得点の最小値,_数学得点の最大値) :- 数学の得点の最小値(_5人分の数学の得点,_数学得点の最小値), 数学の得点の最大値(_5人分の数学の得点,_数学得点の最大値). 数学の得点の最小値(_5人分の数学の得点,_数学得点の最小値) :- select(_数学得点の最小値,_5人分の数学の得点,_残りの数学の得点), forall(member(N,_残りの数学の得点),N>=_数学得点の最小値). 数学の得点の最大値(_5人分の数学の得点,_数学得点の最大値) :- select(_数学得点の最大値,_5人分の数学の得点,_残りの数学の得点), forall(member(N,_残りの数学の得点),N=<_数学得点の最大値). '画面表示、'(_数学得点の最小値,_数学得点の最大値) :- writef('数学得点の最小値 = %t\n数学得点の最大値 = %t\n',[_数学得点の最小値,_数学得点の最大値]). 'およびファイルに書き出すプログラムを作成しなさい。ただし、書き出し用ファイル名は「sugaku.txt」にしなさい。'(_5人分の数学の得点) :- open('sugaku.txt',write,Outstream), forall(nth1(_nth1,_5人分の数学の得点,_数学の得点),writef(Outstream,'%t\n',[_数学の得点])), close(Outstream). % 以下のサイトは # 以下の2次元配列「Shopping」のデータを用い、 # 以下のように、各商品の単価、個数、小計を表示し、 # 最後に合計を表示させる。 # var shopping = [ [500, 9], [5000, 8], [50, 1], [10000, 2] ]; # # 単価:500 個数:9 小計:4500 # 単価:5000 個数:8 小計:40000 # 単価:50 個数:1 小計:50 # 単価:10000 個数:2 小計:20000 # 合計:64550 # # できる人は、下図のように小計の降順表示させよ # # 単価:5000 個数:8 小計:40000 # 単価:10000 個数:2 小計:20000 # 単価:500 個数:9 小計:4500 # 単価:50 個数:1 小計:50 # 合計:64550 # '「Shopping」のデータを用い、 # var shopping = [ [500, 9], [5000, 8], [50, 1], [10000, 2] ]; 以下のように、各商品の単価、個数、小計を表示し、最後に合計を表示させる。 # 単価:5000 個数:8 小計:40000 # 単価:10000 個数:2 小計:20000 # 単価:500 個数:9 小計:4500 # 単価:50 個数:1 小計:50 # 合計:64550' :- '「Shopping」のデータを用い、'(_Shopping), '各商品の単価、個数、小計を表示し、'(_Shopping,_小計_単価_数量_ならび), '最後に合計を表示させる。'(_小計_単価_数量_ならび). '「Shopping」のデータを用い、'(_Shopping) :- 'Shopping'(_Shopping). 'Shopping'([ [500, 9], [5000, 8], [50, 1], [10000, 2] ]). '各商品の単価、個数、小計を表示し、'(_Shopping,_小計_単価_数量_ならび) :- '各商品の単価、個数、小計を'(_Shopping,_小計_単価_数量_ならび), '表示し、'(_小計_単価_数量_ならび). '各商品の単価、個数、小計を'(_Shopping,_小計_単価_数量_ならび) :- findall([_小計,_単価,_数量],( member([_単価,_数量],_Shopping), _小計 is _単価 * _数量), _小計_単価_数量_ならび). '表示し、'(_小計_単価_数量_ならび) :- 降順整列(_小計_単価_数量_ならび,_降順の_小計_単価_数量_ならび), forall(member([_小計,_単価,_数量],_降順の_小計_単価_数量_ならび), writef('単価:%t 数量:%t 小計:%t\n',[_単価,_数量,_小計])). 降順整列(L1,L2) :- sort(L1,L3), reverse(L3,L2). '最後に合計を表示させる。'(_小計_単価_数量_ならび) :- findsum(_小計,member([_小計,_,_],_小計_単価_数量_ならび),_合計). writef('合計:%t\n',[_合計]). findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sum_list(_値ならび,_合計値),!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/835 # # 【課題】X * Y = 115 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 115 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- forall('X * Y = 115 になる 素数Xと素数Yを求める'(_X,_Y), 表示しなさい(_X,_Y)). 'X * Y = 115 になる 素数Xと素数Yを求める'(_X,_Y) :- '115以下の素数ならびを得る'(_115以下の素数ならび), 組合せ(_115以下の素数ならび,2,[_X,_Y]), 115 is _X * _Y. '115以下の素数ならびを得る'(_115以下の素数ならび) :- findall(N,between(2,115,N),_2から115までの整数ならび), エラトステネスの篩(_2から115までの整数ならび,_115以下の素数ならび). 組合せ(X,1,[A]) :- member(A,X) . 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 表示しなさい(_X,_Y) :- writef('%t\n',[_X,_Y]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/832 # # 【課題】X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい # 【 期限 】2013/11/06 # 【 Ver  】"1.7.0_11" # # いまいちわからず困っています。 # よろしくお願いします。 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび),!, forall(member([_X,_Y],_X_Y_組合せならび), 表示しなさい(_X,_Y)). 'X * Y = 125 になる 素数Xと素数Yをクラスを3つ使って求め結果を表示しなさい' :- writef('解がありません!\n'), fail. 'X * Y = 125 になる 素数Xと素数Yを求める'(_X_Y_組合せならび) :- '125以下の素数ならびを得る'(_125以下の素数ならび), findall([_X,_Y],( 組合せ(_125以下の素数ならび,2,[_X,_Y]), 125 is X * Y), _X_Y_組合せならび), \+(_X_Y_組合せならび=[]). '125以下の素数ならびを得る'(_125以下の素数ならび) :- findall(N,between(2,125,N),_2から125までの整数ならび), エラトステネスの篩(_2から125までの整数ならび,_125以下の素数ならび). 組合せ(X,1,[A]) :- member(A,X) . 組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 組合せ(Y,M,X). 組合せ([_|Y],N,A) :- N > 1, 組合せ(Y,N,A). エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). 表示しなさい(_X,_Y) :- writef('%t %t\n',[_X,_Y]). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1381909900/142 # # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): # テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ # input関数とshow関数を作ること # コマンド引数にテキストファイルの名前を入れること # 'テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ。コマンド引数にテキストファイルの名前を入れること' :- コマンド引数からテキストファイルの名前を得る(_テキストファイル), テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル). コマンド引数からテキストファイルの名前を得る(_テキストファイル) :- current_prolog_flag(argv,ParameterList), append(_,['--'|[_テキストファイル]],ParameterList). テキストファイルを作りそのなかに整数5個数字を入れるそのテキストファイルの中身を出力せよ(_テキストファイル) :- テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル,Outstream), そのテキストファイルの中身を出力せよ(_テキストファイル). テキストファイルを作りそのなかに整数5個数字を入れる(_テキストファイル) :- open(_テキストファイル,write,Outstream). そのなかに整数5個数字を入れる(Outstream), close(Outstream). そのなかに整数5個数字を入れる(Outstream) :- between(1,5,_何番目), 整数を得る(_整数), writef(Outstream,'%t\n',[_整数]), _何番目 = 5. そのテキストファイルの中身を出力せよ(_テキストファイル) :- open(_テキストファイル,read,Instream), copy_stream_data(Instream,user_output), close(Instream). % % ここではズルをして組込述語 copy_stream_data/2 を使って見た。 % % 本来ならget_lines/2とput_lines/2の組合せでコピーを表現するところ。 % % そのテキストファイルの中身を出力せよ(_テキストファイル) :- % get_lines(_テキストファイル,_行ならび), % put_lines(user_output,_行ならび). % % get_lines(_ファイル名,_行ならび) :- % open(_ファイル名,read,Instream), % findall(_行,( % repeat, % ( at_end_of_stream(Instream),!,fail; % get_line(Instream,_行))), % _行ならび), % close(Instream). % % put_lines(_ファイル名,_行ならび) :- % open(_ファイル名,write,Outstream), % forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), % close(Outstream). % % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1337692704/777 # # 【課題】X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。 # 【 期限 】2013/10/15 # 【 Ver  】"1.7.0_11" # がんばってますが期限までに理解できる気がしないので # 基礎的なことだとは思いますが、よろしく御願いします 'X * Y = 123 になる素数 XとYを求め、結果をすべて表示しなさい。' :- forall('X * Y = 123 になる素数 XとYを求め、'(X,Y), '結果をすべて表示しなさい。'(X,Y)). 'X * Y = 123 になる素数 XとYを求め、'(X,Y) :- findall(N,between(2,123,N),L), エラトステネスの篩(L,_素数ならび), 重複組合せ(_素数ならび,2,[X,Y]), 123 is X * Y. '結果をすべて表示しなさい。'(X,Y) :- writef('X=%t,Y=%t\n',[X,Y]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 重複組合せ(X,1,[A]) :- member(A,X). 重複組合せ([A|Y],N,[A|X]) :- N > 1, M is N - 1, 重複組合せ([A|Y],M,X) . 重複組合せ([_|Y],N,A) :- N > 1, 重複組合せ(Y,N,A) . エラトステネスの篩([],[]) :- !. エラトステネスの篩([A|R1],[A|R2]) :- エラトステネスの篩(A,R1,L), エラトステネスの篩(L,R2). エラトステネスの篩(_,[],[]) :- !. エラトステネスの篩(N,[A|R1],R2) :- 0 is A mod N, エラトステネスの篩(N,R1,R2),!. エラトステネスの篩(N,[A|R1],[A|R2]) :- エラトステネスの篩(N,R1,R2). % 以下のサイトは # Prolog問題: http://nojiriko.asia/prolog/olympic.html # をCopy&Pasteしてあなたの環境に 夏季オリンピック/2 と 冬季オリンピック/2 を # 定義した上で、述語 オリンピック/3 を夏季、冬季オリンピック混在して、 # 開催年の古い順に節定義せよ。 '夏季オリンピック/2 と 冬季オリンピック/2 を定義した上で、述語 オリンピック/3 を夏季、冬季オリンピック混在して、開催年の古い順に節定義せよ。' :- '述語 オリンピック/3 を夏季、冬季オリンピック混在して、'(LL1), 開催年の古い順に節定義せよ(LL1). '述語 オリンピック/3 を夏季、冬季オリンピック混在して、'(LL1) :- findall([_年,_冬季または夏季,_都市],( 夏季オリンピック(_年,_都市), _冬季または夏季=夏季; 冬季オリンピック(_年,_都市), _冬季または夏季=冬季), LL1). 開催年の古い順に節定義せよ(LL1) :- sort(LL1,LL2), forall(member([_年,_冬季または夏季,_都市],LL2),assertz(オリンピック(_冬季または夏季,_年,_都市))). 夏季オリンピック(1896,アテネ). 夏季オリンピック(1900,パリ). 夏季オリンピック(1904,セントルイス). 夏季オリンピック(1906,アテネ). 夏季オリンピック(1908,ロンドン). 夏季オリンピック(1912,ストックホルム). 夏季オリンピック(1920,アントワープ). 夏季オリンピック(1924,パリ). 夏季オリンピック(1928,アムステルダム). 夏季オリンピック(1932,ロサンジェルス). 夏季オリンピック(1936,ベルリン). 夏季オリンピック(1948,ロンドン). 夏季オリンピック(1952,ヘルシンキ). 夏季オリンピック(1956,メルボルン). 夏季オリンピック(1960,ローマ). 夏季オリンピック(1964,東京). 夏季オリンピック(1968,メキシコシチー). 夏季オリンピック(1972,ミュンヘン). 夏季オリンピック(1976,モントリオール). 夏季オリンピック(1980,モスクワ). 夏季オリンピック(1984,ロサンジェルス). 夏季オリンピック(1988,ソウル). 夏季オリンピック(1992,バルセロナ). 夏季オリンピック(1996,アトランタ). 夏季オリンピック(2000,シドニー). 夏季オリンピック(2004,アテネ). 夏季オリンピック(2008,北京). 夏季オリンピック(2012,ロンドン). 冬季オリンピック(1924,シャモニー). 冬季オリンピック(1928,サンモリッツ). 冬季オリンピック(1932,レークプラシッド). 冬季オリンピック(1936,ガルミッシュパルテンキルヒェン). 冬季オリンピック(1948,サンモリッツ). 冬季オリンピック(1952,オスロ). 冬季オリンピック(1956,コルティナダンペッツォ). 冬季オリンピック(1960,スコーバレー). 冬季オリンピック(1964,インスブルック). 冬季オリンピック(1968,グルノーブル). 冬季オリンピック(1972,札幌). 冬季オリンピック(1976,インスブルック). 冬季オリンピック(1980,レークプラシッド). 冬季オリンピック(1984,サラエボ). 冬季オリンピック(1988,カルガリー). 冬季オリンピック(1992,アルベールビル). 冬季オリンピック(1994,リレハンメル). 冬季オリンピック(1998,長野). 冬季オリンピック(2002,ソルトレイクシティ). 冬季オリンピック(2006,トリノ). 冬季オリンピック(2010,バンクーバー). % 以下のサイトは # Prolog問題: http://nojiriko.asia/prolog/olympic.html # をCopy&Pasteしてあなたの環境に 夏季オリンピック/2 と 冬季オリンピック/2 を # 定義した上で、述語 オリンピック/2 を夏季、冬季オリンピック混在して、 # 開催年の古い順に節定義せよ。 '夏季オリンピック/2 と 冬季オリンピック/2 を 定義した上で、述語 オリンピック/2 を夏季、冬季オリンピック混在して、 開催年の古い順に節定義せよ。' :- '述語 オリンピック/2 を夏季、冬季オリンピック混在して、'(LL1), 開催年の古い順に節定義せよ(LL1). '述語 オリンピック/2 を夏季、冬季オリンピック混在して、'(LL1) :- findall([_年,_都市],( 夏季オリンピック(_年,_都市); 冬季オリンピック(_年,_都市)), LL1). 開催年の古い順に節定義せよ(LL1) :- sort(LL1,LL2), forall((member([_年,_都市],LL2),assertz(オリンピック(_年,_都市))). 夏季オリンピック(1896,アテネ). 夏季オリンピック(1900,パリ). 夏季オリンピック(1904,セントルイス). 夏季オリンピック(1906,アテネ). 夏季オリンピック(1908,ロンドン). 夏季オリンピック(1912,ストックホルム). 夏季オリンピック(1920,アントワープ). 夏季オリンピック(1924,パリ). 夏季オリンピック(1928,アムステルダム). 夏季オリンピック(1932,ロサンジェルス). 夏季オリンピック(1936,ベルリン). 夏季オリンピック(1948,ロンドン). 夏季オリンピック(1952,ヘルシンキ). 夏季オリンピック(1956,メルボルン). 夏季オリンピック(1960,ローマ). 夏季オリンピック(1964,東京). 夏季オリンピック(1968,メキシコシチー). 夏季オリンピック(1972,ミュンヘン). 夏季オリンピック(1976,モントリオール). 夏季オリンピック(1980,モスクワ). 夏季オリンピック(1984,ロサンジェルス). 夏季オリンピック(1988,ソウル). 夏季オリンピック(1992,バルセロナ). 夏季オリンピック(1996,アトランタ). 夏季オリンピック(2000,シドニー). 夏季オリンピック(2004,アテネ). 夏季オリンピック(2008,北京). 夏季オリンピック(2012,ロンドン). 冬季オリンピック(1924,シャモニー). 冬季オリンピック(1928,サンモリッツ). 冬季オリンピック(1932,レークプラシッド). 冬季オリンピック(1936,ガルミッシュパルテンキルヒェン). 冬季オリンピック(1948,サンモリッツ). 冬季オリンピック(1952,オスロ). 冬季オリンピック(1956,コルティナダンペッツォ). 冬季オリンピック(1960,スコーバレー). 冬季オリンピック(1964,インスブルック). 冬季オリンピック(1968,グルノーブル). 冬季オリンピック(1972,札幌). 冬季オリンピック(1976,インスブルック). 冬季オリンピック(1980,レークプラシッド). 冬季オリンピック(1984,サラエボ). 冬季オリンピック(1988,カルガリー). 冬季オリンピック(1992,アルベールビル). 冬季オリンピック(1994,リレハンメル). 冬季オリンピック(1998,長野). 冬季オリンピック(2002,ソルトレイクシティ). 冬季オリンピック(2006,トリノ). 冬季オリンピック(2010,バンクーバー). % 以下のサイトは 重複要素を削る(_ならび,_重複要素を削ったならび) :- findall(_要素,( append(L0,[_要素|R],_ならび), \+(member(_要素,L0))), _重複要素を削ったならび). 重複要素を削って表示する(_ならび) :- forall(( append(L0,[要素|_],_ならび), \+(member(要素,L0))), writef('%t ',[_要素])). % 以下のサイトは # # 目標_1と目標_2を限界度数成功させる。 # 目標_1と目標_2を限界度数成功させる(_限界度数,_目標_1,_目標_2) :- forall_n(_限界度数,_目標_1,_目標_2). forall_n(_限界度数,_目標_1,_目標_2) :- message_queue_create(_キュー番号), ( thread_create(度数(_限界度数,_キュー番号),_,[]); forall(( thread_get_message(_キュー番号,_項), ( _項 = 0,!,fail;call(_目標_1))), call(_目標_2)). 度数(_限界度数,_キュー番号) :- between(1,_限界度数,_度数), _剰余 is _度数 mod ( _限界度数 + 1 ), thread_send_message(_キュー番号,_剰余), _度数 = _限界度数. % 以下のサイトは # # 1:数値a,b を入力し,a+b,a‐b,a*b,a/b を計算するプログラムを作成してください。 # '数値a,b を入力し,a+b,a‐b,a*b,a/b を計算する' :- 数を得る(a,_a), 数を得る(b,_b), '数値a,b を入力し,a+b,a‐b,a*b,a/b を計算する'(_a,_b). '数値a,b を入力し,a+b,a‐b,a*b,a/b を計算する'(_a,_b) :- forall( 'a+b,a‐b,a*b,a/b を計算する'(F,_a,_b,_値), writef('a %t b = %t\n',[F,_値])). 'a+b,a‐b,a*b,a/b を計算する'(F,_a,_b,_値) :- member(F,[+,-,*,/]), _式 =.. [F,_a,_b], _値 is _式. % 以下のサイトは '[1-9]?[0-9]'(_文字列,_前文字列,_適合文字列,_後文字列) :- '0から99までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列). '0から99までの数字に一致させる'(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,_,_,_,_前文字列,_適合文字列,_後文字列,L1,L2,L3), '2文字以下の数字ならび'(L2), 前後の文字は数字ではない(L1,L3). '2文字以下の数字ならび'(L2) :- length(L2,_文字数), _文字数 =< 2, forall(member(A,L2),数字(A)). 前後の文字は数字ではない(L1,L3) :- \+((last(L1,_直前の文字),数字(_直前の文字))), \+((L3=[_直後の文字|_],数字(_直後の文字))),!. 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. % 以下のサイトは # 例題の1つに、すべての製品を注文したすべての顧客の平均の売掛残高、および # すべての製品を注文していない顧客の平均の売掛残高を求めるといったものがありました。 % 単位節データベースを抽象するならば、 すべての製品を注文していない顧客の平均の売掛残高を求める(_すべての製品を注文していない顧客の平均の売掛残高) :- findsum(_売掛残高,( すべての製品を注文していない顧客の売掛残高(_売掛残高)), _すべての製品を注文していないすべての顧客の平均の売掛残高). すべての製品を注文していない顧客の平均の売掛残高(_売掛残高) :- すべての製品を注文していない顧客(_顧客), 売掛残高(_顧客,_売掛残高). すべての製品を注文していない顧客(_顧客) :- 顧客(_顧客), forall(商品(_商品),\+(注文(_顧客,_商品))). % 以下のサイトは # 例題の1つに、すべての製品を注文したすべての顧客の平均の売掛残高、および # すべての製品を注文していない顧客の平均の売掛残高を求めるといったものがありました。 % 単位節データベースを抽象するならば、 すべての製品を注文したすべての顧客の平均の売掛残高を求める(_すべての製品を注文したすべての顧客の平均の売掛残高) :- findavg(_売掛残高,( すべての製品を注文した顧客の売掛残高(_売掛残高)), _すべての製品を注文したすべての顧客の平均の売掛残高). すべての製品を注文した顧客の売掛残高(_売掛残高) :- すべての製品を注文した顧客(_顧客), 売掛残高(_顧客,_売掛残高). すべての製品を注文した顧客(_顧客) :- 顧客(_顧客), forall(商品(_商品),注文(_顧客,_商品)). findavg(_選択,_目標,_平均値) :- findall(_選択,_目標,L), sum_list(L,_合計), length(L,_標本数), _平均値 is _合計 / _標本数. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/391 # # ●要望 # 5桁の英数字の文字列データから、各桁が M W w のいずれかのみ、で構成されている文字列を検索する # # MwwWM # wwWMw # WWWMM # wMWww などがヒットするようにする # # [MWw][MWw][MWw][MWw][MWw]と書けば良いとは思いますが、[MWw]{5}と記述しても同様の結果は得られるのでしょうか? # 10桁とか12桁でも考えているので、コンパクトにまとめたいのです # {}は直前の繰り返しだから # MMMMM # WWWWW # wwwww としか一致しないのでしょうか? # # 一日でヒットするデータが得られるとは限らないものなので、簡単に検証できないのです # # よろしくです # # '5桁の英数字の文字列データから、各桁が M W w のいずれかのみ、で構成されている文字列を検索する'(_5桁の英数字の文字列) :- forall(sub_atom(_5桁の英数字の文字列,_,1,_,A),member(A,['M','W',w])). % 以下のサイトは 項の中に変数を含まない(_項) :- '項が変数の時は偽、atomicの時は真である'(_項),!. 項の中に変数を含まない(_項) :- '項が複合項の時は全ての引数について「項の中に変数を含まない」ことを検査する'(_項). '項が変数の時は偽、atomicの時は真である'(_項) :- '項が変数の時は偽、'(_項). '項が変数の時は偽、atomicの時は真である'(_項) :- '項がatomicの時は真である'(_項). '項が変数の時は偽、'(_項) :- var(_項),!, fail. '項がatomicの時は真である'(_項) :- atomic(_項). '項が複合項の時は全ての引数について「項の中に変数を含まない」ことを検査する'(_項) :- forall(項が複合項の時は全ての引数について(_項,_引数),項の中に変数を含まない(_引数)). 項が複合項の時は全ての引数について(_項,_引数) :- functor(_項,_関数名,_引数の数), between(1,_引数の数,_n番目), arg(_n番目,_項,_引数). % 以下のサイトは 項の中に変数を含まない(_項) :- var(_項),!,fail. 項の中に変数を含まない(_項) :- atom(_項),!. 項の中に変数を含まない(_項) :- forall((functor(_項,_関数名,_引数の数), between(1,_引数の数,_n番目), arg(_n番目,_項,_引数)), 項の中に変数を含まない(_引数)). % 以下のサイトは ダイクストラ法による最短距離探索(_出発点,_距離,_最短経路,_確定集合) :- _確定集合_1 = [[_出発点,0,[_出発点]]], 初期の未確定集合を得る(_出発点,_未確定集合), ダイクストラ法による最短距離探索(_確定集合_1,_未確定集合,_確定集合). 初期の未確定集合を得る(_出発点,_初期未確定集合) :- findsetof([_出発点,9999,[]],( 経路(_点,_,_), \+(_点 = _出発点)), _初期未確定集合). ダイクストラ法による最短距離探索(_確定集合,[],_確定集合). ダイクストラ法による最短距離探索([[_直前に確定した点,_距離,_経路]|R],_未確定集合_1,_確定集合) :- 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2), 未確定集合から最小距離点を抜き取る(_未確定集合_2,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_3), 確定集合に追加(_最小距離点,_最小距離,_最小経路点の経路,[[_直前に確定した点,_距離,_経路]|R],_確定集合_2), ダイクストラ法による最短距離探索(_確定集合_2,_未確定集合_3,_確定集合). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,_未確定集合_1,_未確定集合_2) :- findall([_隣接点,_距離], 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離), LL), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_距離,_経路,LL,_未確定集合_1,_未確定集合_2). 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,[[_隣接点,_距離]|R],_未確定集合_1,_未確定集合_2) :- 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_3), 直前に確定した点から全ての隣接点の未確定集合を更新する(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,R,_未確定集合_3,_未確定集合_2). 隣接点を得る(_直前に確定した点,_未確定集合,_隣接点,_距離) :- 経路(_直前に確定した点,_隣接点,_距離), member([_隣接点,_,_],_未確定集合). 未確定集合の更新(_直前に確定した点,_直前に確定した点までの距離,_直前に確定した点までの経路,_隣接点,_距離,_未確定集合_1,_未確定集合_2) :- _距離_2 is _直前に確定した点までの距離 + _距離, append(L1,[[_隣接点,_距離_1,_経路_1]|L2],_未確定集合_1), _距離_1 > _距離_2, append(L1,[[_隣接点,_距離_1,[_隣接点|_直前に確定した点までの経路]]|L2],_未確定集合_2),!. 未確定集合の更新(_,_,_,_,_,_未確定集合,_未確定集合). 未確定集合から最小距離点を抜き取る(_未確定集合_1,_最小距離点,_最小距離,_最小距離点の経路,_未確定集合_2) :- append(L1,[[_最小距離点,_最小距離,_最小距離の経路]|L2],_未確定集合_1), forall(member([_,_距離_1,_],L1),_距離_1 >= _最小距離), forall(member([_,_距離_2,_],L1),_距離_2 >= _最小距離), append(L1,L2,_未確定集合_2),!. 確定集合に追加(_点,_距離,_経路,_確定集合_1,[[_点,_距離,_経路]|_確定集合_1]). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L). % 以下のサイトは # # 文字列から数字列を検索する # 数字文字列を検索してその数値を得る(_文字列,_前文字列,_数字文字列,_後文字列,_数値) :- 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列), その数値を得る(_数字文字列,_数値). 数字文字列を検索して(_文字列,_前文字列,_数字文字列,_後文字列) :- 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列). その数値を得る(_数字文字列,_数値) :- atom_number(_数字文字列,_数値). 数字文字列を検索する(_文字列,_前文字列,_数字文字列,_後文字列) :- '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列), 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列), 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列). '前文字列・数字文字列・後文字列に分割'(_文字列,_前文字列,_数字文字列,_後文字列) :- sub_atom(_文字列,_開始点,_長さ,_残り長さ,_数字文字列), _長さ > 0, 数字文字列である(_数字文字列), sub_atom(_文字列,0,_開始点,_,_前文字列), sub_atom(_文字列,_,_残り長さ,0,_後文字列). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(''). 前文字列が空文字であるか前文字列の最後の文字が数字ではない(_前文字列) :- sub_atom(_前文字列,_,1,0,_文字), 符号とピリオドを含む数字ではない(_文字). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(''). 後文字列が空文字であるか後文字列の最初の文字が数字ではない(_後文字列) :- sub_atom(_後文字列,0,1,_,_文字), 符号とピリオド含む数字ではない(_文字). 符号とピリオドを含む数字である('+'). 符号とピリオドを含む数字である('-'). 符号とピリオドを含む数字である('.'). 符号とピリオドを含む数字である(_文字) :- 数字である(_文字). 符号とピリオドを含む数字ではない(_文字) :- \+(符号とピリオドを含む数字である(_文字)). 数字である(_文字) :- _文字 @>= '0', _文字 @=< '9'. 数字ではない(_文字) :- \+(数字である(_文字)). 数字文字列である(_数字文字列) :- 'IEEE974等の浮動小数点数表示形式'(_数字文字列). 数字文字列である(_数字文字列) :- 全ての文字が数字である(_数字文字列), \+(数字列の禁則(_数字文字列)). 全ての文字が符号とピリオドを含む数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),符号とピリオドを含む数字である(_文字)). 全ての文字が数字である(_数字文字列) :- forall(sub_atom(_数字文字列,_,1,_,_文字),数字である(_文字)). 'IEEE974等の浮動小数点数表示形式'(_数字文字列) :- sub_atom(_数字文字列,S,2,R,_二文字), member(_二文字,['E+','E-','e+','e-']), 二文字は先頭または末尾にはこない(S,R), 前後文字列の形式が正しい(_数字文字列,S,R). 二文字は先頭または末尾にはこない(S,R) :- S > 0, R > 0. 前後文字列の形式が正しい(_数字文字列,S,R) :- sub_atom(_数字文字列,0,S,_,_数字文字列_1), sub_atom(_数字文字列,_,S,0,_数字文字列_2), 全ての文字が符号とピリオドを含む数字である(_数字文字列_1), 全ての文字が数字である(_数字文字列_2). 数字列の禁則(_数字文字列) :- ピリオドが2個以上ある(_数字文字列),!. 数字列の禁則(_数字文字列) :- ピリオドが先頭文字か末尾文字にある(_数字文字列),!. 数字列の禁則(_数字文字列) :- 'ピリオドの前後に+か-がある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '+が先頭文字以外にある'(_数字文字列),!. 数字列の禁則(_数字文字列) :- '-が先頭文字以外にある'(_数字文字列),!. ピリオドが2個以上ある(_数字文字列) :- findall(1,sub_atom(_数字文字列,_,1,_,'.'),L), length(L,_度数), _度数 > 1,!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,0,1,_,'.'),!. ピリオドが先頭文字か末尾文字にある(_数字文字列) :- sub_atom(_数字文字列,_,1,0,'.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'+.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'-.'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.+'),!. 'ピリオドの前後に+か-がある'(_数字文字列) :- sub_atom(_数字文字列,_,2,_,'.-'),!. '+が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'+'), _開始点 > 0,!. '-が先頭文字以外にある'(_数字文字列) :- sub_atom(_数字文字列,_開始点,1,_,'-'), _開始点 > 0,!. % 以下のサイトは 偶数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,Len1,_,Len2,_適合文字列), 適合文字列は数字だけで構成される(_適合文字列), 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列), 適合文字列を数値に変換すると偶数になる(_適合文字列). 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列) :- sub_atom(_文字列,0,Len1,_,_前文字列), sub_atom(_文字列,_,Len2,0,_後文字列). 適合文字列は数字だけで構成される(_文字列) :- \+(_文字列=''), forall(sub_atom(_文字列,_,1,_,_数字),数字(_数字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列) :- \+((sub_atom(_前文字列,_,1,0,A),数字(A))), \+((sub_atom(_後文字列,0,1,_,B),数字(B))). 適合文字列を数値に変換すると偶数になる(_適合文字列) :- 適合文字列を数値に変換すると(_適合文字列,_数値), 偶数になる(_数値). 適合文字列を数値に変換すると(_適合文字列,_数値) :- atom_chars(_適合文字列,Chars), number_chars(_数値,Chars). 偶数になる(N) :- 1 is N mod 2. 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 奇数に一致させる(_文字列,_前文字列,_適合文字列,_後文字列) :- sub_atom(_文字列,Len1,_,Len2,_適合文字列), 適合文字列は数字だけで構成される(_適合文字列), 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列), 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列), 適合文字列を数値に変換すると奇数になる(_適合文字列). 前文字列と後文字列を得る(_文字列,Len1,Len2,_前文字列,_後文字列) :- sub_atom(_文字列,0,Len1,_,_前文字列), sub_atom(_文字列,_,Len2,0,_後文字列). 適合文字列は数字だけで構成される(_文字列) :- \+(_文字列=''), forall(sub_atom(_文字列,_,1,_,_数字),数字(_数字)). 前文字列の最後の文字と後文字列の最初の文字は数字ではない(_前文字列,_後文字列) :- \+((sub_atom(_前文字列,_,1,0,A),数字(A))), \+((sub_atom(_後文字列,0,1,_,B),数字(B))). 適合文字列を数値に変換すると奇数になる(_適合文字列) :- 適合文字列を数値に変換すると(_適合文字列,_数値), 奇数になる(_数値). 適合文字列を数値に変換すると(_適合文字列,_数値) :- atom_chars(_適合文字列,Chars), number_chars(_数値,Chars). 奇数になる(N) :- 1 is N mod 2. 数字(A) :- A @>= '0', A @=< '9'. % 以下のサイトは 素数生成(_素数) :- 素数生成(2,[],_素数). 素数生成(N,L,_素数) :- 素数検査(N,L,L_2,_診断), 素数生成(N,L_2,_診断,_素数). 素数検査(_素数,L,[_素数|L],素数) :- forall(member(_素数_1,L),\+(0 is _素数 mod _素数_1)),!. 素数検査(N,L,L,素数ではない). 素数生成(_素数,_,素数,_素数). 素数生成(N,L,_診断,_素数) :- N_2 is N + 1, 素数生成(N_2,L,_素数). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362913813/370 # # ●Regular Expressionの使用環境 # ActivePerl5.8 # # ●検索か置換か? # 検索 # # ●説明 # 連続する数を検索したい(1965から2011までの数) # # ●対象データ(配列内に格納) # 1952 # 1965 # 1986 # 2012 # 1972 # 2011 #  ・ #  ・ # ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) # 1965 # 1986 # 1972 # 2011 #  ・ #  ・ # # 配列の各要素が1955から2011までの数の場合にマッチする正規表現を教えてください # # '●検索か置換か? 検索 ●説明 連続する数を検索したい(1965から2011までの数) ●対象データ(配列内に格納) 1952 1965 1986 2012 1972 2011  ・  ・ ●希望する結果(配列の各要素を正規表現で検索して、マッチする要素だけ抽出) 1965 1986 1972 2011  ・  ・'(_文字列,_前文字列,_適合文字列,_後文字列) :- '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列). '連続する数を検索したい(1965から2011までの数)'(_文字列,_前文字列,_適合文字列,_後文字列) :- atom_chars(_文字列,_文字ならび), '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列). '文字ならびから連続する数を検索したい(1965から2011までの数)'(_文字ならび,_前文字列,_適合文字列,_後文字列) :- '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N), atom_chars(_前文字列,L1), atom_chars(_後文字列,L3), atom_chars(_適合文字列,L2). '数値を切り出す(1965から2011までの数)'(_文字ならび,L1,L2,L3,N) :- append(L1,L2,L3,_文字ならび), 全てが数字(L2), 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3), number_chars(_数,L2), '1965から2011までの数'(_数). 全てが数字(_ならび) :- forall(member(_数字,_ならび),数字(_数字)). 数字(_数字) :- _数字 @>= '0', _数字 @=< '9'. 'L1の最後の文字とL3の最初の文字は数字ではない'(L1,L3) :- 'L1の最後の文字は数字ではない'(L1), 'L3の最初の文字は数字では無い'(L3). 'L1の最後の文字は数字ではない'(L1) :- \+((last(L1,A),数字(A))). 'L3の最初の文字は数字では無い'(L3) :- \+(([B|_]=L3,数字(B))). '1965から2011までの数'(_数) :- between(1965,2011,_数). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 色(赤). 色(青). 色(緑). 塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,塗り分け(_塗り分けならび),_塗り分けならび). 全色塗り分けならび(_塗り分けならび) :- findall(_塗り分けならび,全色塗り分け(_塗り分けならび),_塗り分けならび). 塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_塗り分けならび) :- 領域名と色の対ならび(_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名と色の対ならび(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), 色ならび(_色ならび), 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 色ならび(_色ならび) :- findall(_色,色(_色),_色ならび). 対ならびの形成(_領域名ならび,_色ならび,_塗り分けならび) :- length(_領域名ならび,Len), length(_塗り分けならび,Len), findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),領域が隣接している(A,B)),\+(member([B,C],_塗り分けならび))). 領域が隣接している(A,A) :- 領域が孤立している,!,fail. 領域が隣接している(A,B) :- 隣接(A,B). 領域が孤立している. % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(_塗り分けならび,Len), findall(_塗り分けならび,塗り分け(_領域名ならび,_色ならび,_塗り分けならび),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), 色検査(_塗り分けならび). 全色塗り分け(_領域名ならび,_色ならび,_塗り分けならび) :- 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび), 色を割り振る(_色ならび,_塗り分けならび), forall(member(_色,_色ならび),member([_,_色],_塗り分けならび)), 色検査(_塗り分けならび). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,_塗り分けならび) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,_塗り分けならび,_色)), _塗り分けならび). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(_塗り分けならび) :- forall((member([A,C],_塗り分けならび),隣接(A,B)),\+(member([B,C],_塗り分けならび))). % 以下のサイトは 隣接(1,2). 隣接(1,3). 隣接(2,4). 隣接(3,4). 塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 全色塗り分け(_色ならび,_塗り分けならび) :- 領域名ならび(_領域名ならび), length(_領域名ならび,Len), length(LL1,Len), findall(LL1,塗り分け(_領域名ならび,_色ならび,LL1),_塗り分けならび). 塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), 色検査(LL). 全色塗り分け(_領域名ならび,_色ならび,LL) :- 領域名と色の対ならび(_領域名ならび,_色ならび,LL), 色を割り振る(_色ならび,LL), forall(member(_色,_色ならび),member([_,_色],LL)), 色検査(LL). 領域名ならび(_領域名ならび) :- findall(A,隣接(A,_),L1), findall(B,隣接(_,B),L2), append(L1,L2,L3), sort(L3,_領域名ならび). 領域名と色の対ならび(_領域名ならび,_色ならび,LL) :- findall([_領域名,_色],( nth1(N,_領域名ならび,_領域名), nth1(N,LL,_色)), LL). 色を割り振る(_,[]). 色を割り振る(_色ならび,[[_,_色]|R]) :- member(_色,_色ならび), 色を割り振る(_色ならび,R). 色検査(L) :- forall((member([A,C],L),隣接(A,B)),\+(member([B,C],L))). % 以下のサイトは # 出題場所:: http://toro.2ch.net/test/read.cgi/db/1343899481/819 # 環境:アクセス2007 # # 得点テーブル # 日 科目 得点 # 1/1 英語 80 # 1/1 国語 50 # 1/1 数学 90 # # 1/2 英語 70 # 1/2 国語 70 # # 1/3 国語 60 # 1/3 数学 80 # # 1/4 英語 60 # 1/4 国語 60 # 1/4 数学 60 # # このようなテーブルから、下記のようにデータを取ってエクセルに張り付けたいのですが # どのようにすればよいでしょうか。 # # 日 英語  国語  数学 # 1/1 80 50 90 # 1/2 70 70 # 1/3 60 80 # 1/4 60 60 60 # # '環境:アクセス2007 得点テーブル 日 科目 得点 1/1 英語 80 1/1 国語 50 1/1 数学 90 1/2 英語 70 1/2 国語 70 1/3 国語 60 1/3 数学 80 1/4 英語 60 1/4 国語 60 1/4 数学 60 このようなテーブルから、下記のようにデータを取ってエクセルに張り付けたいのですが どのようにすればよいでしょうか。 日 英語  国語  数学 1/1 80 50 90 1/2 70 70 1/3 60 80 1/4 60 60 60' :- write('日,英語,国語,数学\n'), 日付ごとに三科目の得点を表示する(R). 日付ごとに三科目の得点を表示する :- forall(日付の選択(_日),三科目の得点を表示する(_日,_英語,_国語,_数学)). 日付の選択(_日) :- findsetof(_日,得点テーブル(_日,_,_),_日ならび), member(_日,_日ならび). 三科目の得点を表示する(_日) :- writef('%t,',[_日]), 英語表示(_日), 国語表示(_日), 数学表示(_日). 英語表示(_日) :- 得点テーブル(_日,英語,_得点), writef('%3r,',[_得点]),!. 英語表示(_日) :- writef('%t,',[' ']). 国語表示(_日) :- 得点テーブル(_日,国語,_得点), writef('%3r,',[_得点]),!. 国語表示(_日) :- writef('%t,',[' ']). 数学表示(_日) :- 得点テーブル(_日,数学,_得点), writef('%3r\n',[_得点]),!. 数学表示(_日) :- writef('%t\n',[' ']). % 以下のサイトは # ●問題文 # <b>タグのように開始タグの部分にマッチする正規表現を最小限の階数のキャプチャを用いて書きなさい。 # タグ名は1文字以上の英単語であり、属性には「>」以外の任意の文字を使えるものとする。 # ●例文 # <b>ゴレイヌさん</b>は、えげつねぇ・・・<font color="red">ゴレイヌさん</font>は # えげつねぇ。。。<font color="blue">富樫仕事</font>しろ。 # ●マッチする例 # <b> # <font color="red"> # <font color="blue"> # # ●答え # <(?:\w+)(?:\s+[^>]*)*> # ●解説 # 「<」と「>」に囲まれた部分にマッチさせればよいのですが、属性付きのタグを考慮しなくてはいけません。 # また、最小限のキャプチャという条件があるため、グループ化のみでキャプチャを必要としない場所では「(?:)」を使います。 # この問題の場合には、1回もキャプチャを使わずに記述する事が可能です。 # # と、あるのですが # <\w+(?:\s+[^>]*)*> # でないかと思っています。 # \w+はグループ化する必要がそもそもあるのでしょうか? # '<b>タグのように開始タグの部分にマッチする'(_文字列,_前文字列,_開始タグ,_後文字列) :- 開始タグを切り出す(_文字列,_前文字列_1,_開始タグ_1,_後文字列_1), 開始タグ名は1文字以上の英単語であり(_開始タグ_1), '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_開始タグ_1,_後文字列_1,_前文字列,_開始タグ,_後文字列). '<b>タグのように開始タグの部分にマッチする'(_前文字列,_適合文字列,_後文字列,_前文字列,_適合文字列,_後文字列). '<b>タグのように開始タグの部分にマッチする'(_前文字列_1,_適合文字列_1,_後文字列_1,_前文字列,_適合文字列,_後文字列) :- '<b>タグのように開始タグの部分にマッチする'(_後文字列_1,_前文字列_2,_適合文字列,_後文字列), atomic_list_concat([_前文字列_1,_適合文字列_1,_前文字列_2],_前文字列). 開始タグを切り出す(_前文字列,_開始タグ,_後文字列) :- sub_atom(_文字列,St,Len,R,_開始タグ), 開始タグ(_開始タグ), sub_atom(_文字列,0,St,_,_前文字列), sub_atom(_文字列,_,R,0,_後文字列),!. 開始タグ(_開始タグ) :- sub_atom(_開始タグ,0,1,_,<), \+(sub_atom(_開始タグ,0,2,_,'). '開始タグの情報部分は>を含まない'(_開始タグ) :- sub_atom(_開始タグ,1,_,1,_開始タグの情報部分), \+(sub_atom(_開始タグの情報部分,_,1,_,>)),!. 開始タグ名は1文字以上の英単語であり(_開始タグ) :- 開始タグ名は(_開始タグ,_開始タグ名), '1文字以上の英単語である'(_開始タグ名),!. 開始タグ名は(_開始タグ,_開始タグ名) :- sub_atom(_開始タグ,1,_,1,_開始タグの情報部分), 開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名),!. 開始タグ名を切り出す(_開始タグの情報部分,_開始タグ名) :- sub_atom(_開始タグの情報部分,St,1,_,' '), sub_atom(_開始タグの情報部分,0,St,_,_開始タグ名),!. 開始タグ名を切り出す(_開始タグ名,_開始タグ名). '1文字以上の英単語である'(_タグ名の文字ならび) :- forall(sub_atom(_開始タグ名,_,1,_,A),英文字か数字(A)). 英文字か数字(A) :- 英文字(A). 英文字か数字(A) :- 数字(A). 英文字(A) :- A @>= 'a', A @=< 'z',!. 英文字(A) :- A @>= 'A', A @=< 'Z',!. 数字(A) :- A @>= '0', A @=< '9',!. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/764 # # 【質問テンプレ】 # ・DBMS名とバージョン # SQLiteバージョン3 # # ・テーブルデータ # ドメインID,ドメイン名 # ------------ # 1,test1.co.jp # 2,test2.co.jp # # ・欲しい結果 # "server1.test1.co.jp"という入力に対し # "test1.co.jp"のドメインIDである1 # # ・説明 # 自分のサイトへのアクセスを行うドメインを管理しています。 # "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 # それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。 # # 以上、宜しくお願いします。 '・DBMS名とバージョン SQLiteバージョン3 ・テーブルデータ ドメインID,ドメイン名 ------------ 1,test1.co.jp 2,test2.co.jp ・欲しい結果 "server1.test1.co.jp"という入力に対し "test1.co.jp"のドメインIDである1 ・説明 自分のサイトへのアクセスを行うドメインを管理しています。 "server1.test1.co.jp"や、"server2.test1.co.jp"等、第4レベルだけが違う同じ業者からのアクセスがあります。 それらを"test1.co.jp"からのアクセスであると判断し、ドメインIDである1を取得したいのです。'(_URL,_第三レベルドメイン名,_ドメインID) :- 第三ドメイン名を取得する(_URL,_第三レベルドメイン名), ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID). 第三ドメイン名を取得する(_URL,_第三レベルドメイン名) :- split(_URL,['/','ftp://','file:///','http://','mailto://'],[A|_]), '第二・第一レベルドメインを切り捨てる'(A,C), split(C,['.'],L). last(L,_第三レベルドメイン名),!. '第二・第一レベルドメインを切り捨てる'(A,C) :- '第二・第一レベルドメイン'(A), sub_atom(A,St,Len,0,B), sub_atom(A,0,St,Len,C),!. ドメインIDを取り出す(_第三レベルドメイン名,_ドメインID) :- atom_chars(_第三レベルドメイン名,Chars), append(L1,L2,Chars), forall(member(E,L2),数字(E)), atomic_list_concat(L2,_ドメインID),!. 数字(A) :- member(A,['0','1','2','3','4','5','6','7','8','9']). '第二・第一レベルドメイン'(a). '第二・第一レベルドメイン'(ab). '第二・第一レベルドメイン'(abo). '第二・第一レベルドメイン'(abog). '第二・第一レベルドメイン'(aboga). '第二・第一レベルドメイン'(abogad). '第二・第一レベルドメイン'(abogado). '第二・第一レベルドメイン'(ac). '第二・第一レベルドメイン'(ad). '第二・第一レベルドメイン'(adu). '第二・第一レベルドメイン'(adul). '第二・第一レベルドメイン'(adult). '第二・第一レベルドメイン'(ae). '第二・第一レベルドメイン'(aer). '第二・第一レベルドメイン'(aero). '第二・第一レベルドメイン'(af). '第二・第一レベルドメイン'(afr). '第二・第一レベルドメイン'(afri). '第二・第一レベルドメイン'(afric). '第二・第一レベルドメイン'(africa). '第二・第一レベルドメイン'(ag). '第二・第一レベルドメイン'(ai). '第二・第一レベルドメイン'(al). '第二・第一レベルドメイン'(am). '第二・第一レベルドメイン'(ams). '第二・第一レベルドメイン'(amst). '第二・第一レベルドメイン'(amste). '第二・第一レベルドメイン'(amster). '第二・第一レベルドメイン'(amsterd). '第二・第一レベルドメイン'(amsterda). '第二・第一レベルドメイン'(amsterdam). '第二・第一レベルドメイン'(ap). '第二・第一レベルドメイン'(app). '第二・第一レベルドメイン'(as). '第二・第一レベルドメイン'(asi). '第二・第一レベルドメイン'(asia). '第二・第一レベルドメイン'(at). '第二・第一レベルドメイン'(au). '第二・第一レベルドメイン'(auc). '第二・第一レベルドメイン'(auct). '第二・第一レベルドメイン'(aucti). '第二・第一レベルドメイン'(auctio). '第二・第一レベルドメイン'(auction). '第二・第一レベルドメイン'(ax). '第二・第一レベルドメイン'(az). '第二・第一レベルドメイン'(b). '第二・第一レベルドメイン'(ba). '第二・第一レベルドメイン'(bab). '第二・第一レベルドメイン'(baby). '第二・第一レベルドメイン'(ban). '第二・第一レベルドメイン'(bank). '第二・第一レベルドメイン'(bar). '第二・第一レベルドメイン'(barc). '第二・第一レベルドメイン'(barce). '第二・第一レベルドメイン'(barcel). '第二・第一レベルドメイン'(barcelo). '第二・第一レベルドメイン'(barcelon). '第二・第一レベルドメイン'(barcelona). '第二・第一レベルドメイン'(bb). '第二・第一レベルドメイン'(be). '第二・第一レベルドメイン'(bee). '第二・第一レベルドメイン'(beer). '第二・第一レベルドメイン'(ber). '第二・第一レベルドメイン'(berl). '第二・第一レベルドメイン'(berli). '第二・第一レベルドメイン'(berlin). '第二・第一レベルドメイン'(bg). '第二・第一レベルドメイン'(bi). '第二・第一レベルドメイン'(bik). '第二・第一レベルドメイン'(bike). '第二・第一レベルドメイン'(biz). '第二・第一レベルドメイン'(bj). '第二・第一レベルドメイン'(bl). '第二・第一レベルドメイン'(blo). '第二・第一レベルドメイン'(blog). '第二・第一レベルドメイン'(bm). '第二・第一レベルドメイン'(bo). '第二・第一レベルドメイン'(boo). '第二・第一レベルドメイン'(book). '第二・第一レベルドメイン'(booki). '第二・第一レベルドメイン'(bookin). '第二・第一レベルドメイン'(booking). '第二・第一レベルドメイン'(bos). '第二・第一レベルドメイン'(bost). '第二・第一レベルドメイン'(bosto). '第二・第一レベルドメイン'(boston). '第二・第一レベルドメイン'(br). '第二・第一レベルドメイン'(bru). '第二・第一レベルドメイン'(brus). '第二・第一レベルドメイン'(bruss). '第二・第一レベルドメイン'(brusse). '第二・第一レベルドメイン'(brussel). '第二・第一レベルドメイン'(brussels). '第二・第一レベルドメイン'(bs). '第二・第一レベルドメイン'(bu). '第二・第一レベルドメイン'(bud). '第二・第一レベルドメイン'(buda). '第二・第一レベルドメイン'(budap). '第二・第一レベルドメイン'(budape). '第二・第一レベルドメイン'(budapes). '第二・第一レベルドメイン'(budapest). '第二・第一レベルドメイン'(by). '第二・第一レベルドメイン'(bz). '第二・第一レベルドメイン'(c). '第二・第一レベルドメイン'(ca). '第二・第一レベルドメイン'(cap). '第二・第一レベルドメイン'(cape). '第二・第一レベルドメイン'(capet). '第二・第一レベルドメイン'(capeto). '第二・第一レベルドメイン'(capetow). '第二・第一レベルドメイン'(capetown). '第二・第一レベルドメイン'(car). '第二・第一レベルドメイン'(care). '第二・第一レベルドメイン'(caree). '第二・第一レベルドメイン'(career). '第二・第一レベルドメイン'(cas). '第二・第一レベルドメイン'(cash). '第二・第一レベルドメイン'(cat). '第二・第一レベルドメイン'(cc). '第二・第一レベルドメイン'(cd). '第二・第一レベルドメイン'(cf). '第二・第一レベルドメイン'(cg). '第二・第一レベルドメイン'(ch). '第二・第一レベルドメイン'(chr). '第二・第一レベルドメイン'(chri). '第二・第一レベルドメイン'(chris). '第二・第一レベルドメイン'(christ). '第二・第一レベルドメイン'(christm). '第二・第一レベルドメイン'(christma). '第二・第一レベルドメイン'(christmas). '第二・第一レベルドメイン'(ci). '第二・第一レベルドメイン'(cl). '第二・第一レベルドメイン'(cli). '第二・第一レベルドメイン'(clic). '第二・第一レベルドメイン'(click). '第二・第一レベルドメイン'(cm). '第二・第一レベルドメイン'(cn). '第二・第一レベルドメイン'(co). '第二・第一レベルドメイン'('co.'). '第二・第一レベルドメイン'('co.a'). '第二・第一レベルドメイン'('co.ao'). '第二・第一レベルドメイン'('co.at'). '第二・第一レベルドメイン'('co.b'). '第二・第一レベルドメイン'('co.bw'). '第二・第一レベルドメイン'('co.c'). '第二・第一レベルドメイン'('co.ck'). '第二・第一レベルドメイン'('co.cm'). '第二・第一レベルドメイン'('co.cr'). '第二・第一レベルドメイン'('co.f'). '第二・第一レベルドメイン'('co.fk'). '第二・第一レベルドメイン'('co.h'). '第二・第一レベルドメイン'('co.hu'). '第二・第一レベルドメイン'('co.i'). '第二・第一レベルドメイン'('co.id'). '第二・第一レベルドメイン'('co.il'). '第二・第一レベルドメイン'('co.in'). '第二・第一レベルドメイン'('co.ir'). '第二・第一レベルドメイン'('co.j'). '第二・第一レベルドメイン'('co.jp'). '第二・第一レベルドメイン'('co.k'). '第二・第一レベルドメイン'('co.ke'). '第二・第一レベルドメイン'('co.kr'). '第二・第一レベルドメイン'('co.l'). '第二・第一レベルドメイン'('co.ls'). '第二・第一レベルドメイン'('co.m'). '第二・第一レベルドメイン'('co.mz'). '第二・第一レベルドメイン'('co.n'). '第二・第一レベルドメイン'('co.nl'). '第二・第一レベルドメイン'('co.no'). '第二・第一レベルドメイン'('co.nz'). '第二・第一レベルドメイン'('co.r'). '第二・第一レベルドメイン'('co.rs'). '第二・第一レベルドメイン'('co.t'). '第二・第一レベルドメイン'('co.th'). '第二・第一レベルドメイン'('co.tt'). '第二・第一レベルドメイン'('co.tz'). '第二・第一レベルドメイン'('co.u'). '第二・第一レベルドメイン'('co.ug'). '第二・第一レベルドメイン'('co.uk'). '第二・第一レベルドメイン'('co.z'). '第二・第一レベルドメイン'('co.za'). '第二・第一レベルドメイン'('co.zw'). '第二・第一レベルドメイン'(cof). '第二・第一レベルドメイン'(coff). '第二・第一レベルドメイン'(coffe). '第二・第一レベルドメイン'(coffee). '第二・第一レベルドメイン'(com). '第二・第一レベルドメイン'('com.'). '第二・第一レベルドメイン'('com.a'). '第二・第一レベルドメイン'('com.ag'). '第二・第一レベルドメイン'('com.ai'). '第二・第一レベルドメイン'('com.al'). '第二・第一レベルドメイン'('com.an'). '第二・第一レベルドメイン'('com.ar'). '第二・第一レベルドメイン'('com.au'). '第二・第一レベルドメイン'('com.aw'). '第二・第一レベルドメイン'('com.az'). '第二・第一レベルドメイン'('com.b'). '第二・第一レベルドメイン'('com.bd'). '第二・第一レベルドメイン'('com.bh'). '第二・第一レベルドメイン'('com.bn'). '第二・第一レベルドメイン'('com.bo'). '第二・第一レベルドメイン'('com.br'). '第二・第一レベルドメイン'('com.bs'). '第二・第一レベルドメイン'('com.bt'). '第二・第一レベルドメイン'('com.c'). '第二・第一レベルドメイン'('com.cm'). '第二・第一レベルドメイン'('com.cn'). '第二・第一レベルドメイン'('com.co'). '第二・第一レベルドメイン'('com.cy'). '第二・第一レベルドメイン'('com.d'). '第二・第一レベルドメイン'('com.de'). '第二・第一レベルドメイン'('com.dz'). '第二・第一レベルドメイン'('com.e'). '第二・第一レベルドメイン'('com.ec'). '第二・第一レベルドメイン'('com.eg'). '第二・第一レベルドメイン'('com.es'). '第二・第一レベルドメイン'('com.et'). '第二・第一レベルドメイン'('com.f'). '第二・第一レベルドメイン'('com.fj'). '第二・第一レベルドメイン'('com.g'). '第二・第一レベルドメイン'('com.ge'). '第二・第一レベルドメイン'('com.gh'). '第二・第一レベルドメイン'('com.gi'). '第二・第一レベルドメイン'('com.gl'). '第二・第一レベルドメイン'('com.gn'). '第二・第一レベルドメイン'('com.gr'). '第二・第一レベルドメイン'('com.gt'). '第二・第一レベルドメイン'('com.gu'). '第二・第一レベルドメイン'('com.h'). '第二・第一レベルドメイン'('com.hk'). '第二・第一レベルドメイン'('com.hr'). '第二・第一レベルドメイン'('com.j'). '第二・第一レベルドメイン'('com.jm'). '第二・第一レベルドメイン'('com.jo'). '第二・第一レベルドメイン'('com.k'). '第二・第一レベルドメイン'('com.kh'). '第二・第一レベルドメイン'('com.kw'). '第二・第一レベルドメイン'('com.l'). '第二・第一レベルドメイン'('com.lb'). '第二・第一レベルドメイン'('com.lr'). '第二・第一レベルドメイン'('com.lv'). '第二・第一レベルドメイン'('com.ly'). '第二・第一レベルドメイン'('com.m'). '第二・第一レベルドメイン'('com.mg'). '第二・第一レベルドメイン'('com.mk'). '第二・第一レベルドメイン'('com.mo'). '第二・第一レベルドメイン'('com.mt'). '第二・第一レベルドメイン'('com.mx'). '第二・第一レベルドメイン'('com.my'). '第二・第一レベルドメイン'('com.n'). '第二・第一レベルドメイン'('com.na'). '第二・第一レベルドメイン'('com.ng'). '第二・第一レベルドメイン'('com.ni'). '第二・第一レベルドメイン'('com.np'). '第二・第一レベルドメイン'('com.o'). '第二・第一レベルドメイン'('com.om'). '第二・第一レベルドメイン'('com.p'). '第二・第一レベルドメイン'('com.pa'). '第二・第一レベルドメイン'('com.pe'). '第二・第一レベルドメイン'('com.ph'). '第二・第一レベルドメイン'('com.pk'). '第二・第一レベルドメイン'('com.pl'). '第二・第一レベルドメイン'('com.pr'). '第二・第一レベルドメイン'('com.pt'). '第二・第一レベルドメイン'('com.py'). '第二・第一レベルドメイン'('com.q'). '第二・第一レベルドメイン'('com.qa'). '第二・第一レベルドメイン'('com.r'). '第二・第一レベルドメイン'('com.ro'). '第二・第一レベルドメイン'('com.s'). '第二・第一レベルドメイン'('com.sg'). '第二・第一レベルドメイン'('com.sn'). '第二・第一レベルドメイン'('com.sv'). '第二・第一レベルドメイン'('com.sy'). '第二・第一レベルドメイン'('com.t'). '第二・第一レベルドメイン'('com.tn'). '第二・第一レベルドメイン'('com.tr'). '第二・第一レベルドメイン'('com.tw'). '第二・第一レベルドメイン'('com.u'). '第二・第一レベルドメイン'('com.ua'). '第二・第一レベルドメイン'('com.uy'). '第二・第一レベルドメイン'('com.v'). '第二・第一レベルドメイン'('com.ve'). '第二・第一レベルドメイン'('com.vn'). '第二・第一レベルドメイン'(con). '第二・第一レベルドメイン'(cond). '第二・第一レベルドメイン'(condo). '第二・第一レベルドメイン'(condos). '第二・第一レベルドメイン'(cons). '第二・第一レベルドメイン'(consu). '第二・第一レベルドメイン'(consul). '第二・第一レベルドメイン'(consult). '第二・第一レベルドメイン'(consulti). '第二・第一レベルドメイン'(consultin). '第二・第一レベルドメイン'(consulting). '第二・第一レベルドメイン'(coo). '第二・第一レベルドメイン'(coop). '第二・第一レベルドメイン'(cor). '第二・第一レベルドメイン'(cors). '第二・第一レベルドメイン'(corsi). '第二・第一レベルドメイン'(corsic). '第二・第一レベルドメイン'(corsica). '第二・第一レベルドメイン'(cr). '第二・第一レベルドメイン'(cre). '第二・第一レベルドメイン'(cred). '第二・第一レベルドメイン'(credi). '第二・第一レベルドメイン'(credit). '第二・第一レベルドメイン'(cu). '第二・第一レベルドメイン'(cv). '第二・第一レベルドメイン'(cw). '第二・第一レベルドメイン'(cx). '第二・第一レベルドメイン'(cy). '第二・第一レベルドメイン'(cym). '第二・第一レベルドメイン'(cymr). '第二・第一レベルドメイン'(cymru). '第二・第一レベルドメイン'(cz). '第二・第一レベルドメイン'(d). '第二・第一レベルドメイン'(de). '第二・第一レベルドメイン'('de.'). '第二・第一レベルドメイン'('de.c'). '第二・第一レベルドメイン'('de.co'). '第二・第一レベルドメイン'('de.com'). '第二・第一レベルドメイン'(den). '第二・第一レベルドメイン'(dent). '第二・第一レベルドメイン'(denta). '第二・第一レベルドメイン'(dental). '第二・第一レベルドメイン'(dj). '第二・第一レベルドメイン'(dk). '第二・第一レベルドメイン'(dm). '第二・第一レベルドメイン'(do). '第二・第一レベルドメイン'(dow). '第二・第一レベルドメイン'(down). '第二・第一レベルドメイン'(downl). '第二・第一レベルドメイン'(downlo). '第二・第一レベルドメイン'(downloa). '第二・第一レベルドメイン'(download). '第二・第一レベルドメイン'(du). '第二・第一レベルドメイン'(dub). '第二・第一レベルドメイン'(duba). '第二・第一レベルドメイン'(dubai). '第二・第一レベルドメイン'(dz). '第二・第一レベルドメイン'(e). '第二・第一レベルドメイン'(ec). '第二・第一レベルドメイン'(eco). '第二・第一レベルドメイン'(ed). '第二・第一レベルドメイン'(edu). '第二・第一レベルドメイン'(ee). '第二・第一レベルドメイン'(eg). '第二・第一レベルドメイン'(em). '第二・第一レベルドメイン'(ema). '第二・第一レベルドメイン'(emar). '第二・第一レベルドメイン'(emara). '第二・第一レベルドメイン'(emarat). '第二・第一レベルドメイン'(es). '第二・第一レベルドメイン'(eu). '第二・第一レベルドメイン'('eu.'). '第二・第一レベルドメイン'('eu.c'). '第二・第一レベルドメイン'('eu.co'). '第二・第一レベルドメイン'('eu.com'). '第二・第一レベルドメイン'(ev). '第二・第一レベルドメイン'(eve). '第二・第一レベルドメイン'(even). '第二・第一レベルドメイン'(event). '第二・第一レベルドメイン'(events). '第二・第一レベルドメイン'(f). '第二・第一レベルドメイン'(fi). '第二・第一レベルドメイン'(fil). '第二・第一レベルドメイン'(film). '第二・第一レベルドメイン'(fl). '第二・第一レベルドメイン'(fli). '第二・第一レベルドメイン'(flig). '第二・第一レベルドメイン'(fligh). '第二・第一レベルドメイン'(flight). '第二・第一レベルドメイン'(flights). '第二・第一レベルドメイン'(fly). '第二・第一レベルドメイン'(fm). '第二・第一レベルドメイン'(fo). '第二・第一レベルドメイン'(foo). '第二・第一レベルドメイン'(food). '第二・第一レベルドメイン'(foot). '第二・第一レベルドメイン'(footb). '第二・第一レベルドメイン'(footba). '第二・第一レベルドメイン'(footbal). '第二・第一レベルドメイン'(football). '第二・第一レベルドメイン'(for). '第二・第一レベルドメイン'(foru). '第二・第一レベルドメイン'(forum). '第二・第一レベルドメイン'(fr). '第二・第一レベルドメイン'(fre). '第二・第一レベルドメイン'(free). '第二・第一レベルドメイン'(fri). '第二・第一レベルドメイン'(frie). '第二・第一レベルドメイン'(frien). '第二・第一レベルドメイン'(friend). '第二・第一レベルドメイン'(friends). '第二・第一レベルドメイン'(fu). '第二・第一レベルドメイン'(fun). '第二・第一レベルドメイン'(fund). '第二・第一レベルドメイン'(fut). '第二・第一レベルドメイン'(futb). '第二・第一レベルドメイン'(futbo). '第二・第一レベルドメイン'(futbol). '第二・第一レベルドメイン'(g). '第二・第一レベルドメイン'(ga). '第二・第一レベルドメイン'(gam). '第二・第一レベルドメイン'(game). '第二・第一レベルドメイン'(gay). '第二・第一レベルドメイン'(gd). '第二・第一レベルドメイン'(ge). '第二・第一レベルドメイン'(gen). '第二・第一レベルドメイン'(gent). '第二・第一レベルドメイン'(gf). '第二・第一レベルドメイン'(gg). '第二・第一レベルドメイン'(gl). '第二・第一レベルドメイン'(gm). '第二・第一レベルドメイン'(gmb). '第二・第一レベルドメイン'(gmbh). '第二・第一レベルドメイン'(go). '第二・第一レベルドメイン'(gol). '第二・第一レベルドメイン'(gold). '第二・第一レベルドメイン'(gov). '第二・第一レベルドメイン'(gp). '第二・第一レベルドメイン'(gr). '第二・第一レベルドメイン'('gr.'). '第二・第一レベルドメイン'('gr.c'). '第二・第一レベルドメイン'('gr.co'). '第二・第一レベルドメイン'('gr.com'). '第二・第一レベルドメイン'(gs). '第二・第一レベルドメイン'(gt). '第二・第一レベルドメイン'(gy). '第二・第一レベルドメイン'(h). '第二・第一レベルドメイン'(he). '第二・第一レベルドメイン'(hel). '第二・第一レベルドメイン'(hels). '第二・第一レベルドメイン'(helsi). '第二・第一レベルドメイン'(helsin). '第二・第一レベルドメイン'(helsink). '第二・第一レベルドメイン'(helsinki). '第二・第一レベルドメイン'(hi). '第二・第一レベルドメイン'(hiv). '第二・第一レベルドメイン'(hk). '第二・第一レベルドメイン'(hn). '第二・第一レベルドメイン'(ho). '第二・第一レベルドメイン'(hoc). '第二・第一レベルドメイン'(hock). '第二・第一レベルドメイン'(hocke). '第二・第一レベルドメイン'(hockey). '第二・第一レベルドメイン'(hol). '第二・第一レベルドメイン'(holi). '第二・第一レベルドメイン'(holid). '第二・第一レベルドメイン'(holida). '第二・第一レベルドメイン'(holiday). '第二・第一レベルドメイン'(hor). '第二・第一レベルドメイン'(hors). '第二・第一レベルドメイン'(horse). '第二・第一レベルドメイン'(hos). '第二・第一レベルドメイン'(hosp). '第二・第一レベルドメイン'(hospi). '第二・第一レベルドメイン'(hospit). '第二・第一レベルドメイン'(hospita). '第二・第一レベルドメイン'(hospital). '第二・第一レベルドメイン'(hot). '第二・第一レベルドメイン'(hote). '第二・第一レベルドメイン'(hotel). '第二・第一レベルドメイン'(hou). '第二・第一レベルドメイン'(hous). '第二・第一レベルドメイン'(house). '第二・第一レベルドメイン'(hr). '第二・第一レベルドメイン'(ht). '第二・第一レベルドメイン'(hu). '第二・第一レベルドメイン'(i). '第二・第一レベルドメイン'(ie). '第二・第一レベルドメイン'(im). '第二・第一レベルドメイン'(in). '第二・第一レベルドメイン'(inc). '第二・第一レベルドメイン'(inf). '第二・第一レベルドメイン'(info). '第二・第一レベルドメイン'(ins). '第二・第一レベルドメイン'(insu). '第二・第一レベルドメイン'(insur). '第二・第一レベルドメイン'(insure). '第二・第一レベルドメイン'(io). '第二・第一レベルドメイン'(iq). '第二・第一レベルドメイン'(ir). '第二・第一レベルドメイン'(iri). '第二・第一レベルドメイン'(iris). '第二・第一レベルドメイン'(irish). '第二・第一レベルドメイン'(is). '第二・第一レベルドメイン'(isl). '第二・第一レベルドメイン'(isla). '第二・第一レベルドメイン'(islam). '第二・第一レベルドメイン'(ist). '第二・第一レベルドメイン'(ista). '第二・第一レベルドメイン'(istan). '第二・第一レベルドメイン'(istanb). '第二・第一レベルドメイン'(istanbu). '第二・第一レベルドメイン'(istanbul). '第二・第一レベルドメイン'(it). '第二・第一レベルドメイン'(j). '第二・第一レベルドメイン'(je). '第二・第一レベルドメイン'(jo). '第二・第一レベルドメイン'(job). '第二・第一レベルドメイン'(jobs). '第二・第一レベルドメイン'(jp). '第二・第一レベルドメイン'(k). '第二・第一レベルドメイン'(kg). '第二・第一レベルドメイン'(ki). '第二・第一レベルドメイン'(kit). '第二・第一レベルドメイン'(kitc). '第二・第一レベルドメイン'(kitch). '第二・第一レベルドメイン'(kitche). '第二・第一レベルドメイン'(kitchen). '第二・第一レベルドメイン'(kn). '第二・第一レベルドメイン'(ko). '第二・第一レベルドメイン'(koe). '第二・第一レベルドメイン'(koel). '第二・第一レベルドメイン'(koeln). '第二・第一レベルドメイン'(kr). '第二・第一レベルドメイン'(ky). '第二・第一レベルドメイン'(kz). '第二・第一レベルドメイン'(l). '第二・第一レベルドメイン'(la). '第二・第一レベルドメイン'(lat). '第二・第一レベルドメイン'(law). '第二・第一レベルドメイン'(lc). '第二・第一レベルドメイン'(li). '第二・第一レベルドメイン'(lim). '第二・第一レベルドメイン'(limi). '第二・第一レベルドメイン'(limit). '第二・第一レベルドメイン'(limite). '第二・第一レベルドメイン'(limited). '第二・第一レベルドメイン'(lk). '第二・第一レベルドメイン'(lo). '第二・第一レベルドメイン'(lon). '第二・第一レベルドメイン'(lond). '第二・第一レベルドメイン'(londo). '第二・第一レベルドメイン'(london). '第二・第一レベルドメイン'(lot). '第二・第一レベルドメイン'(lott). '第二・第一レベルドメイン'(lotto). '第二・第一レベルドメイン'(lt). '第二・第一レベルドメイン'(lu). '第二・第一レベルドメイン'(lv). '第二・第一レベルドメイン'(ly). '第二・第一レベルドメイン'(m). '第二・第一レベルドメイン'(ma). '第二・第一レベルドメイン'(mc). '第二・第一レベルドメイン'(md). '第二・第一レベルドメイン'(me). '第二・第一レベルドメイン'(med). '第二・第一レベルドメイン'(medi). '第二・第一レベルドメイン'(medic). '第二・第一レベルドメイン'(medica). '第二・第一レベルドメイン'(medical). '第二・第一レベルドメイン'(mel). '第二・第一レベルドメイン'(melb). '第二・第一レベルドメイン'(melbo). '第二・第一レベルドメイン'(melbou). '第二・第一レベルドメイン'(melbour). '第二・第一レベルドメイン'(melbourn). '第二・第一レベルドメイン'(melbourne). '第二・第一レベルドメイン'(men). '第二・第一レベルドメイン'(menu). '第二・第一レベルドメイン'(mg). '第二・第一レベルドメイン'(mi). '第二・第一レベルドメイン'(mia). '第二・第一レベルドメイン'(miam). '第二・第一レベルドメイン'(miami). '第二・第一レベルドメイン'(mk). '第二・第一レベルドメイン'(mn). '第二・第一レベルドメイン'(mo). '第二・第一レベルドメイン'(mob). '第二・第一レベルドメイン'(mobi). '第二・第一レベルドメイン'(mos). '第二・第一レベルドメイン'(mosc). '第二・第一レベルドメイン'(mosco). '第二・第一レベルドメイン'(moscow). '第二・第一レベルドメイン'(mp). '第二・第一レベルドメイン'(ms). '第二・第一レベルドメイン'(mu). '第二・第一レベルドメイン'(mus). '第二・第一レベルドメイン'(musi). '第二・第一レベルドメイン'(music). '第二・第一レベルドメイン'(mv). '第二・第一レベルドメイン'(mw). '第二・第一レベルドメイン'(mx). '第二・第一レベルドメイン'(my). '第二・第一レベルドメイン'(n). '第二・第一レベルドメイン'(na). '第二・第一レベルドメイン'(nam). '第二・第一レベルドメイン'(name). '第二・第一レベルドメイン'(ne). '第二・第一レベルドメイン'(net). '第二・第一レベルドメイン'('net.'). '第二・第一レベルドメイン'('net.a'). '第二・第一レベルドメイン'('net.au'). '第二・第一レベルドメイン'('net.b'). '第二・第一レベルドメイン'('net.bn'). '第二・第一レベルドメイン'('net.br'). '第二・第一レベルドメイン'('net.c'). '第二・第一レベルドメイン'('net.cm'). '第二・第一レベルドメイン'('net.cn'). '第二・第一レベルドメイン'('net.g'). '第二・第一レベルドメイン'('net.gt'). '第二・第一レベルドメイン'('net.h'). '第二・第一レベルドメイン'('net.hk'). '第二・第一レベルドメイン'('net.i'). '第二・第一レベルドメイン'('net.il'). '第二・第一レベルドメイン'('net.m'). '第二・第一レベルドメイン'('net.mx'). '第二・第一レベルドメイン'('net.n'). '第二・第一レベルドメイン'('net.nz'). '第二・第一レベルドメイン'('net.p'). '第二・第一レベルドメイン'('net.ph'). '第二・第一レベルドメイン'('net.u'). '第二・第一レベルドメイン'('net.uk'). '第二・第一レベルドメイン'(new). '第二・第一レベルドメイン'(news). '第二・第一レベルドメイン'(nl). '第二・第一レベルドメイン'(no). '第二・第一レベルドメイン'(nom). '第二・第一レベルドメイン'('nom.'). '第二・第一レベルドメイン'('nom.e'). '第二・第一レベルドメイン'('nom.es'). '第二・第一レベルドメイン'(nr). '第二・第一レベルドメイン'(nu). '第二・第一レベルドメイン'(o). '第二・第一レベルドメイン'(or). '第二・第一レベルドメイン'(org). '第二・第一レベルドメイン'('org.'). '第二・第一レベルドメイン'('org.b'). '第二・第一レベルドメイン'('org.bn'). '第二・第一レベルドメイン'('org.c'). '第二・第一レベルドメイン'('org.cn'). '第二・第一レベルドメイン'('org.e'). '第二・第一レベルドメイン'('org.es'). '第二・第一レベルドメイン'('org.i'). '第二・第一レベルドメイン'('org.il'). '第二・第一レベルドメイン'('org.l'). '第二・第一レベルドメイン'('org.lv'). '第二・第一レベルドメイン'('org.n'). '第二・第一レベルドメイン'('org.nz'). '第二・第一レベルドメイン'('org.p'). '第二・第一レベルドメイン'('org.ph'). '第二・第一レベルドメイン'('org.pl'). '第二・第一レベルドメイン'('org.u'). '第二・第一レベルドメイン'('org.uk'). '第二・第一レベルドメイン'(orga). '第二・第一レベルドメイン'(organ). '第二・第一レベルドメイン'(organi). '第二・第一レベルドメイン'(organic). '第二・第一レベルドメイン'(p). '第二・第一レベルドメイン'(pa). '第二・第一レベルドメイン'(par). '第二・第一レベルドメイン'(pari). '第二・第一レベルドメイン'(paris). '第二・第一レベルドメイン'(pe). '第二・第一レベルドメイン'(ph). '第二・第一レベルドメイン'(pho). '第二・第一レベルドメイン'(phot). '第二・第一レベルドメイン'(photo). '第二・第一レベルドメイン'(pi). '第二・第一レベルドメイン'(pin). '第二・第一レベルドメイン'(pink). '第二・第一レベルドメイン'(piz). '第二・第一レベルドメイン'(pizz). '第二・第一レベルドメイン'(pizza). '第二・第一レベルドメイン'(pk). '第二・第一レベルドメイン'(pl). '第二・第一レベルドメイン'(pm). '第二・第一レベルドメイン'(pn). '第二・第一レベルドメイン'(po). '第二・第一レベルドメイン'(pok). '第二・第一レベルドメイン'(poke). '第二・第一レベルドメイン'(poker). '第二・第一レベルドメイン'(por). '第二・第一レベルドメイン'(porn). '第二・第一レベルドメイン'(pr). '第二・第一レベルドメイン'(pro). '第二・第一レベルドメイン'(ps). '第二・第一レベルドメイン'(pt). '第二・第一レベルドメイン'(pu). '第二・第一レベルドメイン'(pub). '第二・第一レベルドメイン'(pw). '第二・第一レベルドメイン'(q). '第二・第一レベルドメイン'(qa). '第二・第一レベルドメイン'(qu). '第二・第一レベルドメイン'(que). '第二・第一レベルドメイン'(queb). '第二・第一レベルドメイン'(quebe). '第二・第一レベルドメイン'(quebec). '第二・第一レベルドメイン'(r). '第二・第一レベルドメイン'(re). '第二・第一レベルドメイン'(rei). '第二・第一レベルドメイン'(reis). '第二・第一レベルドメイン'(reise). '第二・第一レベルドメイン'(rep). '第二・第一レベルドメイン'(repo). '第二・第一レベルドメイン'(repor). '第二・第一レベルドメイン'(report). '第二・第一レベルドメイン'(res). '第二・第一レベルドメイン'(rest). '第二・第一レベルドメイン'(resta). '第二・第一レベルドメイン'(restau). '第二・第一レベルドメイン'(restaur). '第二・第一レベルドメイン'(restaura). '第二・第一レベルドメイン'(restauran). '第二・第一レベルドメイン'(restaurant). '第二・第一レベルドメイン'(ro). '第二・第一レベルドメイン'(rom). '第二・第一レベルドメイン'(roma). '第二・第一レベルドメイン'(rs). '第二・第一レベルドメイン'(ru). '第二・第一レベルドメイン'(rug). '第二・第一レベルドメイン'(rugb). '第二・第一レベルドメイン'(rugby). '第二・第一レベルドメイン'(ruh). '第二・第一レベルドメイン'(ruhr). '第二・第一レベルドメイン'(rw). '第二・第一レベルドメイン'(s). '第二・第一レベルドメイン'(sa). '第二・第一レベルドメイン'(sc). '第二・第一レベルドメイン'(sco). '第二・第一レベルドメイン'(scot). '第二・第一レベルドメイン'(sd). '第二・第一レベルドメイン'(se). '第二・第一レベルドメイン'(sec). '第二・第一レベルドメイン'(secu). '第二・第一レベルドメイン'(secur). '第二・第一レベルドメイン'(secure). '第二・第一レベルドメイン'(sg). '第二・第一レベルドメイン'(sh). '第二・第一レベルドメイン'(sho). '第二・第一レベルドメイン'(shoe). '第二・第一レベルドメイン'(shoes). '第二・第一レベルドメイン'(shop). '第二・第一レベルドメイン'(si). '第二・第一レベルドメイン'(sk). '第二・第一レベルドメイン'(ska). '第二・第一レベルドメイン'(skat). '第二・第一レベルドメイン'(skate). '第二・第一レベルドメイン'(ski). '第二・第一レベルドメイン'(sl). '第二・第一レベルドメイン'(sm). '第二・第一レベルドメイン'(sn). '第二・第一レベルドメイン'(so). '第二・第一レベルドメイン'(sp). '第二・第一レベルドメイン'(spa). '第二・第一レベルドメイン'(spac). '第二・第一レベルドメイン'(space). '第二・第一レベルドメイン'(spo). '第二・第一レベルドメイン'(spor). '第二・第一レベルドメイン'(sport). '第二・第一レベルドメイン'(sr). '第二・第一レベルドメイン'(st). '第二・第一レベルドメイン'(sto). '第二・第一レベルドメイン'(stoc). '第二・第一レベルドメイン'(stock). '第二・第一レベルドメイン'(stockh). '第二・第一レベルドメイン'(stockho). '第二・第一レベルドメイン'(stockhol). '第二・第一レベルドメイン'(stockholm). '第二・第一レベルドメイン'(su). '第二・第一レベルドメイン'(sup). '第二・第一レベルドメイン'(supp). '第二・第一レベルドメイン'(suppo). '第二・第一レベルドメイン'(suppor). '第二・第一レベルドメイン'(support). '第二・第一レベルドメイン'(sur). '第二・第一レベルドメイン'(surf). '第二・第一レベルドメイン'(sv). '第二・第一レベルドメイン'(sx). '第二・第一レベルドメイン'(sy). '第二・第一レベルドメイン'(syd). '第二・第一レベルドメイン'(sydn). '第二・第一レベルドメイン'(sydne). '第二・第一レベルドメイン'(sydney). '第二・第一レベルドメイン'(t). '第二・第一レベルドメイン'(ta). '第二・第一レベルドメイン'(tat). '第二・第一レベルドメイン'(tatt). '第二・第一レベルドメイン'(tatto). '第二・第一レベルドメイン'(tattoo). '第二・第一レベルドメイン'(tc). '第二・第一レベルドメイン'(td). '第二・第一レベルドメイン'(te). '第二・第一レベルドメイン'(tel). '第二・第一レベルドメイン'(ten). '第二・第一レベルドメイン'(tenn). '第二・第一レベルドメイン'(tenni). '第二・第一レベルドメイン'(tennis). '第二・第一レベルドメイン'(tf). '第二・第一レベルドメイン'(tg). '第二・第一レベルドメイン'(th). '第二・第一レベルドメイン'(tha). '第二・第一レベルドメイン'(thai). '第二・第一レベルドメイン'(ti). '第二・第一レベルドメイン'(tir). '第二・第一レベルドメイン'(tiro). '第二・第一レベルドメイン'(tirol). '第二・第一レベルドメイン'(tj). '第二・第一レベルドメイン'(tk). '第二・第一レベルドメイン'(tl). '第二・第一レベルドメイン'(tm). '第二・第一レベルドメイン'(tn). '第二・第一レベルドメイン'(to). '第二・第一レベルドメイン'(tok). '第二・第一レベルドメイン'(toky). '第二・第一レベルドメイン'(tokyo). '第二・第一レベルドメイン'(tr). '第二・第一レベルドメイン'(tra). '第二・第一レベルドメイン'(trai). '第二・第一レベルドメイン'(train). '第二・第一レベルドメイン'(traini). '第二・第一レベルドメイン'(trainin). '第二・第一レベルドメイン'(training). '第二・第一レベルドメイン'(trav). '第二・第一レベルドメイン'(trave). '第二・第一レベルドメイン'(travel). '第二・第一レベルドメイン'(tv). '第二・第一レベルドメイン'(tw). '第二・第一レベルドメイン'(u). '第二・第一レベルドメイン'(ua). '第二・第一レベルドメイン'(ug). '第二・第一レベルドメイン'(uk). '第二・第一レベルドメイン'('uk.'). '第二・第一レベルドメイン'('uk.c'). '第二・第一レベルドメイン'('uk.co'). '第二・第一レベルドメイン'('uk.com'). '第二・第一レベルドメイン'(us). '第二・第一レベルドメイン'('us.'). '第二・第一レベルドメイン'('us.c'). '第二・第一レベルドメイン'('us.co'). '第二・第一レベルドメイン'('us.com'). '第二・第一レベルドメイン'('us.o'). '第二・第一レベルドメイン'('us.or'). '第二・第一レベルドメイン'('us.org'). '第二・第一レベルドメイン'(uy). '第二・第一レベルドメイン'(uz). '第二・第一レベルドメイン'(v). '第二・第一レベルドメイン'(vc). '第二・第一レベルドメイン'(vg). '第二・第一レベルドメイン'(vi). '第二・第一レベルドメイン'(via). '第二・第一レベルドメイン'(viaj). '第二・第一レベルドメイン'(viaje). '第二・第一レベルドメイン'(viajes). '第二・第一レベルドメイン'(vn). '第二・第一レベルドメイン'(vo). '第二・第一レベルドメイン'(voy). '第二・第一レベルドメイン'(voya). '第二・第一レベルドメイン'(voyag). '第二・第一レベルドメイン'(voyage). '第二・第一レベルドメイン'(w). '第二・第一レベルドメイン'(wa). '第二・第一レベルドメイン'(wal). '第二・第一レベルドメイン'(wale). '第二・第一レベルドメイン'(wales). '第二・第一レベルドメイン'(we). '第二・第一レベルドメイン'(web). '第二・第一レベルドメイン'('web.'). '第二・第一レベルドメイン'('web.d'). '第二・第一レベルドメイン'('web.do'). '第二・第一レベルドメイン'(wf). '第二・第一レベルドメイン'(wi). '第二・第一レベルドメイン'(wie). '第二・第一レベルドメイン'(wien). '第二・第一レベルドメイン'(win). '第二・第一レベルドメイン'(wine). '第二・第一レベルドメイン'(ws). '第二・第一レベルドメイン'(x). '第二・第一レベルドメイン'(xx). '第二・第一レベルドメイン'(xxx). '第二・第一レベルドメイン'(y). '第二・第一レベルドメイン'(yt). '第二・第一レベルドメイン'('м'). '第二・第一レベルドメイン'('мо'). '第二・第一レベルドメイン'('мос'). '第二・第一レベルドメイン'('моск'). '第二・第一レベルドメイン'('москв'). '第二・第一レベルドメイン'('москва'). '第二・第一レベルドメイン'('р'). '第二・第一レベルドメイン'('рф'). '第二・第一レベルドメイン'('с'). '第二・第一レベルドメイン'('ср'). '第二・第一レベルドメイン'('срб'). '第二・第一レベルドメイン'('香'). '第二・第一レベルドメイン'('香港'). '第二・第一レベルドメイン'('中'). '第二・第一レベルドメイン'('中国'). % 以下のサイトは # ^.*\d{2}[a-zA-Z]?\.gif # という表現がマッチする文字列があるとします。 # 例えば、img01A.gifです。 # この文字列から、頭のゼロを外した数字を抜き出したいです。 # 上の例では、「1」を抜き出したいです。 # 「01」を抜き出すのでよければ、 # ^.*(\d{2})[a-zA-Z]?\.gif # として、「$1」で受ければいいですが、 # 頭のゼロをスマートに取り除く方法を模索しています。 # よろしくお願いします。有難うございます。 '^.*\d{2}[a-zA-Z]?\.gif という表現がマッチする文字列があるとします。 例えば、img01A.gifです。 この文字列から、頭のゼロを外した数字を抜き出したいです。 上の例では、「1」を抜き出したいです。 「01」を抜き出すのでよければ、 ^.*(\d{2})[a-zA-Z]?\.gif として、「$1」で受ければいいですが、 頭のゼロをスマートに取り除く方法を模索しています。 よろしくお願いします。有難うございます。'(_文字列,_頭部のゼロを取り除いた数字文字列) :- '文字列から、頭のゼロを外した数字を抜き出したいです。'(_文字列,_頭のゼロを取り除いた数字文字列). '文字列から、頭のゼロを外した数字を抜き出したいです。'(_文字列,_頭のゼロを取り除いた数字文字列) :- 数字文字ならびを切り取る(_文字列,_数字文字ならび), 頭のゼロを取り除く(_数字文字ならび,_頭のゼロを取り除いた数字文字ならび), atom_chars(_頭のゼロを取り除いた数字文字列,_頭のゼロを取り除いた数字文字ならび). 数字文字ならびを切り取る(_文字列,_数字文字ならび) :- sub_atom(_文字列,_,_,_,S1,S2,S3,L1,_数字文字ならび,L3), '_数字文字ならびは数字のみで構成され、L1に数字は含まず、L3の先頭文字は数字ではない'(L1,_数字文字ならび,L3). '_数字文字ならびは数字のみで構成され、L1に数字は含まず、L3の先頭文字は数字ではない'(L1,_数字文字ならび,L3) :- forall(member(_数字文字,_数字文字ならび),数字(_数字文字)), forall(member(_文字,L1),\+(数字(_文字))), \+((L3 = [_文字|_],数字(_文字))),!. 頭のゼロを取り除く([],[]). 頭のゼロを取り除く([A|R],[A|R]) :- \+(A='0'),!. 頭のゼロを取り除く(['0'|R1],R2) :- 頭のゼロを取り除く(R1,R2). 頭のゼロを取り除く([A|R1],[A|R2]) :- 頭のゼロを取り除く(R1,R2). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1362715265/18 # :- dynamic(todo/1). 'お題 こんな感じにコマンドラインで動くTODO管理アプリを作りなさい $ ./todo add "本屋でPythonの本を買ってくる" $ ./todo add "たいやきを買ってくる" $ ./todo list 1: 本屋でPythonの本を買ってくる 2: たいやきを買ってくる $ ./todo done 2 $ ./todo list 1: たいやきを買ってくる アドリブも可' :- todoを準備する, user_parameters(_パラメーター), 解析実行(_パラメーター), todoデータを保存する. 解析実行([add,_文字列]) :- assertz(todo(_文字列)),!. 解析実行([done,N]) :- 'N行目のtodoデータを削除する'(N). 解析実行([list]) :- 行番号を振ってtodoデータを表示する. 'N行目のtodoデータを削除する'(N) :- 一旦todoデータを削除しながらリストに取得し(L1), 'N番目の要素を削除して'(N,L1,L2), todoデータを定義し直す(L2). 一旦todoデータを削除しながらリストに取得し(L) :- findall(_データ,( retract(todo(_データ)), L). 'N番目の要素を削除して'(N,L1,L2) :- length([_|L0],N), append(L0,[_|R],L1), append(L0,R,L2). todoデータを定義し直す(L2) :- forall( member(_データ,L2), assertz(todo(_データ))). 行番号を振ってtodoデータを表示する :- findall(_データ,todo(_データ),L), forall(( nth1(No,L,_データ), writef('%t %t\n',[No,_データ]). todoデータを準備する :- reconsult('todo.pro'). todoデータを保存する :- tell('todo.pro'), listing(todo/1), told. % 以下のサイトは % % 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('%t ',[A]), fizzbuzz([_|L1],[_|L2],R). fizzbuzz(_,_,[]). 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('%t%t%t ',[_31,_51,_N]), fizzbuzz(M,N,[_32,_33,_31],[_52,_53,_54,_55,_51]). 出力情報('','',_N,_N) :- !. 出力情報(_,_,_,''). 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('%t%t%t ',[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,_,''). % PrologによるFizzBuzz問題プログラムの比較 % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/610 # # [1] 授業単元:プログラミング基礎I # [2] 問題文(含コード&リンク): # 入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントするプログラムを作成せよ. # # 【実行例】 # % ./a.out # tataatccg ← 入力し,リターンを押して ^D # Thymine (t) : 3 # Cytosine (c) : 2 # Adenine (a) : 3 # Guanine (g) : 1 # % # program :- '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする'. '入力したDNA塩基配列中にある塩基 t, c, a, g それぞれの個数をカウントする' :- 入力したDNA塩基配列(_DNA配列), forall(( 塩基(_塩基名,_塩基記号), count(sub_atom(_DNA配列,_,1,_,_塩基記号),_個数)), writef('%t (%t) : %t\n',[_塩基名,_塩基記号,_個数])). 入力したDNA塩基配列(_DNA配列) :- write('DNA塩基配列を入力してください : '), get_line(_DNA配列). 塩基('Thymine',t). 塩基('Cytosine',c). 塩基('Adenine',a). 塩基('Guanine',g). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/561 # # [1] 授業単元:C言語演習 # [2] 問題文(含コード&リンク): # 問題A # 0と1だけで構成されたテキストファイルAがある。このファイルを読み込み、文字数をカウントし、 # 同じ文字数の0と1で構成された乱数列を生成し、テキストファイルBとして出力するプログラムを作成せよ。 # シード値はシステム時刻など適当なものを使用せよ。 # 問題B # 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。 # '問題B 問題Aで使用したテキストファイルA、Bを一文字ずつXORしテキストファイルCとして出力するプログラムを作成せよ。'(_テキストファイルA,_テキストファイルB,_テキストファイルC) :- get_chars(_テキストファイルA,Chars_1), get_chars(_テキストファイルB,Chars_2), 一文字ずつXORしテキストファイルCとして出力する(_テキストファイルC,Chars_,Chars_2). 一文字ずつXORしテキストファイルCとして出力する(Outstream,Chars_,Chars_2) :- open(_テキストファイルC,write,Outstream), forall(一文字ずつXORし(Chars_1,Chars_2,C), writef(Outstream,'%t',[C])), close(Outstream). 一文字ずつXORし(Chars_1,Chars_2,C) :- nth1(_nth1,Chars_1,A), nth1(_nth1,Chars_2,B), '数字のXOR'(A,B,C). '数字のXOR'('0','0','0'). '数字のXOR'('1','0','1'). '数字のXOR'('0','1','1'). '数字のXOR'('1','1','0'). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/db/1343899481/598 # # mysql 5.5 # # テーブル master # tcode # tname # lastdate # 〜 # # daily_data # select tcode,max(tdate) as maxdate # from daily_date # group by tcode; # # このdaily_dateから得られるmaxdateを使って # masterのtcodeの対応するlastdateに入れたいのですが、 # どのようにupdateを書けば良いのでしょうか? # 'daily_dateから得られるmaxdateを使ってmasterのtcodeの対応するlastdateに入れたい' :- dail_dateテーブルの構造(P1,_daily_date_tcode,_date), masterテーブルの構造(P2,_master_tcode,_lastdate), findsetof(_tcode,P1,L1), 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate),!. daily_dateテーブルの構造(P,_tcode,_date) :- count(テーブル定義(daily_date,_,_),_アリティ), length(L,_アリティ), P =.. [daily_date|L], tcodeとdateの列位置を確定する(L,_tcode,_date),!. tcodeとdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(daily_date,_nth1_tcode,tcode), テーブル定義(daily_date,_nth1_date,date), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_date),!. masterテーブルの構造(P,_tcode,_date) :- count(テーブル定義(master,_,_),_アリティ), length(L,_アリティ), P =.. [master|L], tcodeとlastdateの列位置を確定する(L,_tcode,_lastdate),!. tcodeとlastdateの列位置を確定する(L,_tcode,_date),!. テーブル定義(master,_nth1_tcode,tcode), テーブル定義(master,_nth1_lastdate,lastdate), nth1(_nth1_tcode,L,_tcode), nth1(_nth1_date,L,_lastdate),!. 最大日付に変更する(L1,P1,P2,_daily_date_tcode,_date,_master_tcode,_lastdate) :- forall(( member(_tcode,L1), findmax(_date,P1,_maxdate), lastdateの更新(_maxdate,P2,_tcode,_lastdate)), true). lastdateの更新(_maxdate,P,_tcode,_lastdate) :- retract(P), _lastdate = _maxdate, asserta(P),!. lastdateの更新(_maxdate,P,_tcode,_lastdate) :- _lastdate = _maxdate, asserta(P),!. % 以下のサイトは yes. # 出典:: http://toro.2ch.net/test/read.cgi/tech/1357748713/158 # # [1] 授業単元: プログラミング 〜構造体〜 # [2] 問題文(含コード&リンク): 3名の名前と性別、10桁の会員番号を入力し表示せよ # *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ # 入力(1234567890)→出力(12-3456-7890) # *入力された会員番号が10桁に満たない場合、 # または大きい場合は再度入力する指示を入れること # '3名の名前と性別、10桁の会員番号を入力し表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890) *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること' :- '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号), '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号). '3名の名前と性別、10桁の会員番号を入力し *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_3名の名前と性別と会員番号) :- findall([_名前,_性別,_会員番号],( between(1,3,_), 名前を得る(_名前), 性別を得る(_性別), '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号)), _3名の名前と性別と会員番号). 名前を得る(_名前) :- write('名前を入力してください : '), get_line(_名前). 性別を得る(_性別) :- 整数を得る('性別を番号で入力してください 1..男 2..女\n',between(1,2,_性別番号),_性別番号), 性別番号から性別を得る(_性別番号,_性別). 性別番号から性別を得る(1,男). 性別番号から性別を得る(2,女). '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- write('会員番号(数字10桁)を入力してください : '), get_line(Line), '診断:: 会員番号を得る'(Line,_会員番号),!. '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号) :- '会員番号を得る *会員番号は数字のみで入力し、 *入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(_会員番号). '診断:: 会員番号を得る'(Line,_会員番号) :- atom_chars(Line,Chars), 会員番号は数字のみで入力し(Chars), '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars),!. '診断:: 会員番号を得る'(Line,_会員番号) :- write('再入力をお願いします\n'), fail. 会員番号は数字のみで入力し(Chars) :- forall((member(A,Chars), member(A,['0','1','2','3','4','5','6','7','8','9'])),true),!. 会員番号は数字のみで入力し(Chars) :- writef('入力された文字列 %t には数字以外の文字が混入しています\n',[Chars]), fail. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- length(Chars,10),!. '入力された会員番号が10桁に満たない場合、 または大きい場合は再度入力する指示を入れること'(Chars) :- writef('入力された文字列 %t は10桁でありません\n',[Chars]), fail. '表示せよ *会員番号は数字のみで入力し、2,6桁目の後に「-」を出力で表示せよ 入力(1234567890)→出力(12-3456-7890)'(_3名の名前と性別と会員番号) :- append(_,[[_名前,_性別,_会員番号]|R],_3名の名前と性別と会員番号), number_chars(_会員番号,[_1,_2,_3,_4,_5,_6,_7,_8,_9,_10]), atomic_list_concat([[_1,_2,-,_3,_4,_5,_6,-,_7,_8,_9,_10],_会員表示文字列), writef('名前: %t\n性別: %t\n会員番号: %t\n\n',[_会員番号表示文字列]), R = []. % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1354070278/648 # # [1] 授業単元:Cプログラミング # [2] 問題文(含コード&リンク): # 下記のアップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt) # へ出力するプログラムを作成せよ # http://ime.nu/www1.axfc.net/uploader/He/so/280605 # 以下実行結果 # # 並び替え方法をしていしてください(1:昇順、2:降順) # 1 # # 並び替えたファイルへ出力しました。 # # cat out.txt ←catコマンドで中身確認 # 1 # 3 # 3 # 3 # 'アップロードされたファイル(数字の羅列)を読み込み、並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_アップロードされたファイル名) :- 'アップロードされたファイル(数字の羅列)を読み込み'(_アップロードされたファイル名,_行ならび), '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび). 'アップロードされたファイル(数字の羅列)を読み込み'(_行ならび) :- get_lines('input.txt',_行ならび). '並び替え方法(昇順/降順)で指定されたファイル(out.txt)へ出力する'(_行ならび) :- '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法), 並び替え(_並び替え方法,_行ならび,_並び替えた行ならび), '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび). '並び替え方法を指定してください(1:昇順、2:降順)'(_並び替え方法) :- write('並び替え方法を指定してください(1:昇順、2:降順)'), 整数を得る('並び替え方法を指定してください(1:昇順、2:降順)',between(1,2,N),N), 並び替え方法(N,_並び替え方法). 並び替え方法(1,昇順). 並び替え方法(2,降順). 並び替え(昇順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた行ならび). 並び替え(降順,_行ならび,_並び替えた行ならび) :- 整列(_行ならび,_並び替えた昇順行ならび), reverse(_並び替えた昇順行ならび,_並び替えた行ならび). '指定されたファイル(out.txt)へ出力する'(_並び替えた行ならび) :- put_lines('out.txt',_並び替えた行ならび). put_lines(_ファイル名,_行ならび) :- open(_ファイル名,write,Outstream), forall(nth1(_,_行ならび,_行),writef(Outstream,'%t\n',[_行])), close(Outstream). % 以下のサイトは forall(P,Q) :- (( P,\+(Q),!,fail ; \+(P),\+(Q),!,fail; fail); true). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1339338438/54 # # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/Q5HCQPvq # 上記のプログラムを参考にしてa君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ # a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。 # 但し上記の3つの配列の要素番号0,1,2,3,4の得点は、それぞれ英語、数学、国語、理科、社会の得点に対応する。 # このとき、教科別の3人の平均点を求めるプログラムをポインタ配列を用いて作成せよ。 # 'a君、b君、c君の5教科(英語、数学、国語、理科、社会)の試験の得点をそれぞれ a[5]={55,32,67,61,77};,b[5]={74,80,56,78,42};,c[5]={38,67,78,62,82}; と初期化する。' :- '5教科を定義する'([英語,数学,国語,理科,社会]), 得点を定義する(a,[英語,数学,国語,理科,社会],[55,32,67,61,77]), 得点を定義する(b,[英語,数学,国語,理科,社会],[74,80,56,78,42]), 得点を定義する(c,[英語,数学,国語,理科,社会],[38,67,78,62,82]). '5教科を定義する'(_教科ならび) :- forall(nth0(_,_教科ならび,_教科),assertz(教科(_教科))). 得点を定義する(_,[],[]). 得点を定義する(_君,[_科目|R1],[_得点|R2]) :- assertz(得点(_君,_科目,_得点)), 得点を定義する(_君,R1,R2). 教科別の3人の平均点を求める(_教科,_3人の平均点) :- 教科別の(_教科), '3人の平均点を求める'(_教科,_3人の平均点). 教科別の(_教科) :- 教科(_教科). '3人の平均点を求める'(_教科,_3人の平均点) :- '3人の合計点を求める'(_教科,_3人の合計点), _平均点 is _3人の合計点 / 3. '3人の合計点を求める'(_教科,_3人の合計点) :- findall(_得点,得点(_,_教科,_得点),_得点ならび), sumlist(_得点ならび,_3人の合計点). % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/db/1299305530/721 # # ユーザ毎に各商品を何点購入、合計何点購入したかを集計するSQLがうまく書けず悩んでおります。 # 下記のようなテーブルを想定しております。 # # Shohinテーブル # 商品id, 商品名 # sid, sname # 1, "商品A" # 2, "商品B" # 3, "商品C" # 4, "商品D" # # Userテーブル # ユーザid, ユーザ名 # uid, uname # 1, "ユーザA" # 2, "ユーザB" # 3, "ユーザC" # # Rirekiテーブル(購入履歴) # rid,uid, sid, kazu # 1, 2, 3, 2 # 2, 1, 1, 1 # 3, 3, 2, 4 # # Shohinテーブルの商品,Userテーブルのユーザは追加・削除される可能性があります。 # # このような場合に下のように集計結果を得るにはどのようなSQLを書けばよいでしょうか。 # # 集計結果 # ユーザ名 商品A 商品B 商品 商品D … 合計 # ユーザA 1 2 0 2 5 # ユーザB 3 1 2 2 8 # ユーザC 0 2 0 0 2 # … # # 使用予定のデータベースはMySQL 5.0です。 # 何卒よろしくお願い致します。 # # 'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する' :- 見出し表示, 行表示フォーマット(_行表示フォーマット), forall( 'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する'(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計), ユーザ合計表示(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計)). 'ユーザ毎に各商品を何点購入、合計何点購入したかを集計する'(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計) :- ユーザ毎に(_uid,_uname), findall(_何点,( '各商品を何点購入、'(_uid,_何点)), _各商品何点), 合計何点購入したか(_各商品何点,_合計何点). ユーザ毎に(_uid,_uname) :- user(_uid,_uname). '各商品を何点購入、'(_uid,_何点) :- shohin(_sid,_), findsum(_kazu,( rireki(_,_uid,_sid,_kazu), _何点). 合計何点購入したか(_各商品何点,_合計何点) :- sumlist(_各商品何点,_合計何点). 見出し表示 :- 見出し項目ならび(_見出し項目ならび), 見出し表示フォーマット(_見出し表示フォーマット), writef(_見出し表示フォーマット,_見出し項目ならび). 見出し項目ならび(_見出し項目ならび) :- findall(_sname,( shohin(_sid,_sname)), _商品名ならび), append(_商品名ならび,[合計],_見出し項目ならび). 見出し表示フォーマット(_見出し表示フォーマット) :- findall('%8r',shohin(_,_),L1), atomic_list_concat(L1,S1), atomic_list_concat([' ',S1,'%8r'],_見出し表示フォーマット). 行表示フォーマット(_行表示フォーマット) :- findall('%8r',shohin(_,_),L1), atomic_list_concat(L1,S1), atomic_list_concat(['%8l',S1,'%8r\n'],_行表示フォーマット). ユーザ合計表示(_行表示フォーマット,_uname,_商品合計ならび,_ユーザ毎総合計) :- append([_uname|_商品合計ならび],[_ユーザ毎総合計],L), writef(_行表示フォーマット,L),!. findsum(_選択項,_項,_合計値) :- findall(_選択項,_項,_値ならび), sumlist(_値ならび,_合計値),!. % 以下のサイトは # 出典:: http://hibari.2ch.net/test/read.cgi/tech/1272006124 # # <問題> # 全社員が売上を記録した日を求めよ。 # これを Prolog プログラムとして表現しなさい。 売上(稲葉,'20140228'). 売上(尾崎,'20140227'). 売上(稲葉,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140226'). 売上(尾崎,'20140228'). 社員(尾崎). 社員(稲葉). '全社員が売上を記録した日を求めよ。'(_全社員が売上を記録した日) :- findsetof(_日,売上(_,_日),L), member(_全社員が売上を記録した日,L), forall(社員(_社員),売上(_社員,_全社員が売上を記録した日)). findsetof(A,B,L) :- findall(A,B,C), setof(A,member(A,C),L) . % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1260532772/194 # # [1] 授業単元: プログラミング1 # [2] 問題文(含コード&リンク): http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10277.txt # # 必修課題2 # 初項1公差1の等差数列がある(An={1 2 3 4 5 ・・・n})。数値XとYを入力して、 # この数列におけるX項からY項までの数列の和を算出するプログラムを作成せよ。 # 実行結果の例を以下に示す。 # ------------------------------------------------ # 第X項から:1 # 第Y項まで:10 # 初項1公差1の等差数列において、 # 第1項から第10項までの数列の和は55です。 # ------------------------------------------------ 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_数列の和) :- 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_,_数列の和). 初項1公差1の等差数列におけるX項からY項までの数列の和を算出する(X,Y,_初項1公差1の等差数列,_数列の和) :- 初項1公差1の等差数列におけるX項からY項までの数列の(X,Y,_初項1公差1の等差数列,_X項からY項までの数列), 和を算出する(_X項からY項までの数列,_数列の和). 初項1公差1の等差数列におけるX項からY項までの数列の(X,Y,_等差数列,_X項からY項までの数列) :- 初項1公差1の等差数列(_等差数列), 'X項からY項までの数列の'(X,Y,_等差数列,_X項からY項までの数列),!. 初項1公差1の等差数列(_等差数列) :- 初項1公差1の等差数列(1,_等差数列). 初項1公差1の等差数列(M,[M|R]) :- 公差1の(M,N), 初項1公差1の等差数列(N,X). 公差1の(M,N) :- succ(M,N). 'X項からY項までの数列の'(X,Y,_等差数列,_X項からY項までの数列) :- 'X項からY項までの数列'(X,Y,_X項からY項までの数列), append(_,_X項からY項までの数列,_,_等差数列), 'X項からY項までの数列は全て整数'(_X項からY項までの数列). 'X項からY項までの数列'(X,Y,_X項からY項までの数列) :- length([_|L1],X), length(L2,Y), append(L1,_X項からY項までの数列,L2). 'X項からY項までの数列は全て整数'(_X項からY項までの数列) :- forall(member(A,_X項からY項までの数列),integer(A)). 和を算出する(_X項からY項までの数列,_数列の和) :- sum_list(_X項からY項までの数ならび,_数列の和). 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/1247438792/659 # # [1] C言語 # [2] 入力された英字文字列(a~z,A-Z)に、どの文字がいくつ入っているかを # 調べるプログラムcount_char.cを作成せよ。 # # 実行例 # String: cbbbAcAccZ # A: ** # Z: * # b: *** # c: **** # % '入力された英字文字列(a~z,A-Z)に、どの文字がいくつ入っているかを 調べるプログラムcount_char.cを作成せよ。 実行例 String: cbbbAcAccZ A: ** Z: * b: *** c: ****' :- '入力された英字文字列(a~z,A-Z)に'(_文字列), count_char(_文字列). '入力された英字文字列(a~z,A-Z)に'(_文字列) :- get_line(_文字列), '診断::入力された英字文字列(a~z,A-Z)'(_文字列),!. '入力された英字文字列(a~z,A-Z)に'(_文字列) :- '入力された英字文字列(a~z,A-Z)に'(_文字列). '診断::入力された英字文字列(a~z,A-Z)'(_文字列) :- forall(sub_atom(文字列,_,1,_,_文字),英字文字(_文字)). 英字文字(_文字) :- 英小文字(_文字). 英字文字(_文字) :- 英大文字(_文字). 英小文字(_文字) :- _文字 @>= 'a', _文字 @=< 'z'. 英大文字(_文字) :- _文字 @>= 'A', _文字 @=< 'Z'. count_char(_文字列) :- atom_chars(_文字列,Chars), count_char_1(Chars,[],QL), キューを表示する(QL). count_char_1([],X,X). count_char_1([A|R],QL,X) :- count_char_2(A,QL,QL2), count_char_1(R,QL2,X). count_char_2(A,[],[[A,QA]]) :- 新しいキューを作る(Q), キューに要素を追加する('*',Q,QA),!. count_char_2(A,[[A,QA]|R],[[A,QB],R]) :- キューに要素を追加する('*',QA,QB),!. count_char_2(A,[U|R1],[U|R2]) :- count_char_2(A,R1,R2). 新しいキューを作る(X-X). キューは空である(X-Y) :- X == Y. キューに要素を追加する(_要素,X-[_要素|Y],X-Y). キューを表示する(QL) :- forall(( member([U,Q-[]],QL), atomic_list_concat(Q,S)), writef('%t: %t\n',[U,S]). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/822 # # 何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて # 処理するプログラムを作る。 # # (1)科目別の最高点、最低点を表示する。 # (2)各学生の3教科の平均点を表示する。 # (3)各教科の平均点を表示する。 # # ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。 % テーマ findallを使った集約処理 '何人かの学生の3教科(数学、国語、英語)の得点を2次元配列を用いて 処理するプログラムを作る。 (1 )科目別の最高点、最低点を表示する。 (2)各学生の3教科の平均点を表示する。 (3)各教科の平均点を表示する。 ただし Ctrl+zが押されるまで次々と整数値を読み込んでいくものとする。' :- 'Ctrl+zが押されるまで次々と整数値を読み込んでいく'(_整数行列), '(1 )科目別の最高点、最低点を表示する。 '(_整数行列), '(2)各学生の3教科の平均点を表示する。 '(_整数行列), '(3)各教科の平均点を表示する。 '(_整数行列). 'Ctrl+zが押されるまで次々と整数値を読み込んでいく'(_整数行列) :- findall(_行,( get_split_line([','],_行)), _整数行列). '(1 )科目別の最高点、最低点を表示する。 '(_整数行列) :- 転置(_整数行列,[_学年ならび|LL]), forall(( nth1(_nth1,LL,L), 最高点と最低点を得る(L,_最高点,_最低点)), 表示する('科目番号:%t 最高点:%t 最低点:%t\n',[_nth1,_最高点,_最低点])). 最高点と最低点を得る([A|R],_最高点,_最低点) :- 最高点を得る(R,A,_最高点), 最低点を得る(R,A,_最低点). 最高点を得る([],_最高点,_最高点). 最高点を得る([N|R],_最高点_1,_最高点) :- N > _最高点_1, 最高点を得る(R,N,_最高点). 最高点を得る([N|R],_最高点_1,_最高点) :- N =< _最高点_1, 最高点を得る(R,_最高点_1,_最高点). 最低点を得る([],_最低点,_最低点). 最低点を得る([N|R],_最低点_1,_最低点) :- N < _最低点_1, 最低点を得る(R,N,_最低点). 最低点を得る([N|R],_最低点_1,_最低点) :- N >= _最低点_1, 最低点を得る(R,_最低点_1,_最低点). '(2)各学生の3教科の平均点を表示する。 '(_整数行列) :- forall(( nth1(_nth1,_整数行列,[_|R]), 相加平均(R,_相加平均)), writef('学生:%t 3教科の平均点:%t\n',[_nth1,_相加平均])). '(3)各教科の平均点を表示する。 '(_整数行列) :- 転置(_整数行列,[_学年ならび|LL]), forall(( nth1(_nth1,LL,L), 相加平均(L,_相加平均)), 表示する('科目番号:%t 平均点:%t\n',[_nth1,_相加平均])). 転置([[]|_],[]) :- !. 転置(L,[L1|R2]) :- 転置(L,L2,L1), 転置(L2,R2). 転置([],[],[]) :- !. 転置([[A|R1]|R2],[R1|R3],[A|R4]) :- 転置(R2,R3,R4). 相加平均(L,M) :- length(L,N), 相加平均(L,N,0,M). 相加平均([],N,S,M) :- M is S / N,!. 相加平均([A|R],N,S,M) :- S1 is S + A, 相加平均(R,N,S1,M). get_split_line(File,Splitter,List) :- get_split_lines(File,Splitter,Lines), member(List,Lines) . get_split_line(Splitters,List) :- get_line(Line), split(Line,Splitters,List). get_line(X) :- get_char(C), get_line_1(C,Chars), atom_chars(X,Chars). get_line_1('\n',[]) :- !. get_line_1('\z',[]) :- !. get_line_1(end_of_file,[]) :- !. get_line_1(C,[C|R]) :- get_char(C2), get_line_1(C2,R). split(_文字列,_区切り符号ならび,X) :- sPlit(_文字列,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(U = '')), L), L = X,!. sPlit(_文字列,_区切り符号ならび,X) :- atom_chars(_文字列,L), split_00(L,_区切り符号ならび,Y), findall(U,( member(U,Y), \+(member(U,_区切り符号ならび))), Z), Z = X,!. split_00(_文字ならび,_区切り符号ならび,X) :- findall([B,A],( member(A,_区切り符号ならび), atom_chars(A,B)), _区切り符号ならびの二), split_0(_文字ならび,_区切り符号ならびの二,X). split_0(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_0(_文字ならび,_区切り符号ならび,['',_区切り符号|R2]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_1(R,_区切り符号ならび,R2),!. split_0(L,_区切り符号ならび,X) :- split_1(L,_区切り符号ならび,X). split_1([],_,[]) :- !. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号,'']) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), _文字ならび = _区切り文字ならび,!. split_1(_文字ならび,_区切り符号ならび,['',_区切り符号_1,C,_区切り符号_2|X]) :- member([_区切り文字ならび,_区切り符号_1],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび), split_2(R,R2,_区切り符号_2,_区切り符号ならび,B), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), _区切り符号 = '', split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_1(_文字ならび,_区切り符号ならび,[C,_区切り符号|X]) :- split_2(_文字ならび,R2,_区切り符号,_区切り符号ならび,B), \+(_区切り符号 = ''), split_5(B,C), split_0(R2,_区切り符号ならび,X),!. split_2([],[],'',_,[]) :- !. split_2(_文字ならび,R,_区切り符号,_区切り符号ならび,[]) :- member([_区切り文字ならび,_区切り符号],_区切り符号ならび), append(_区切り文字ならび,R,_文字ならび),!. split_2([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_3([''''|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_32(['"'|R],R2,_区切り符号,_区切り符号ならび,X),!. split_2([_文字|R],R2,_区切り符号,_区切り符号ならび,[_文字|X]) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_3([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4(['''',''''|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([''''|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_4([],[],'',_,[]) :- !. split_4([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_4(R,R2,_区切り符号,_区切り符号ならび,X),!. split_5([],'') :- !. split_5(B,C) :- numeric_list(B,Nl), number(C,Nl),!. split_5(B,C) :- atomic_list_concat(B,C),!. split_32(['"','"'|R],R2,_区切り符号,_区切り符号ならび,[''''|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_32([_|R],R2,_区切り符号,_区切り符号ならび,X) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"','"'|R],R2,_区切り符号,_区切り符号ならび,['"'|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42(['"'|R],R2,_区切り符号,_区切り符号ならび,X) :- split_2(R,R2,_区切り符号,_区切り符号ならび,X),!. split_42([],[],'',_,[]) :- !. split_42([_文字|R],R2,_区切り符号ならび,[_文字|X]) :- split_42(R,R2,_区切り符号,_区切り符号ならび,X),!. numeric_list([],[]) :- !. numeric_list([A|R],[B|R1]) :- digit(A), char_code(A,B), numeric_list(R,R1),!. numeric_list(['.'|R],[46|R1]) :- numeric_list(R,R1),!. numeric_list([-|R],[45|R1]) :- numeric_list(R,R1),!. % 以下のサイトは # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9554.txt # ◎フォネティックコード # # 無線などで会話する際、A,B,Cなどのアルファベットをそのまま発音しても相手方に聞き取りにくい事がある.アルファベットを明瞭 # に伝達するために,各アルファベットに対して1つの単語が割り当てられており,これを使用することが国際的に定められている. # この単語をフォネティックコードと呼ぶ. フォネティックコードファイルを読み込み,1つの文章を全てフォネティックコード化でき # るようなプログラムを作成せよ. # 課題実行においては以下の点に注意すること. # ・プログラム名は「phon」とすること. # ・フォネティックコードはスペースで区切って表示すること. # ・コードファイル名を指定して読み込めるようにすること. # ・コードファイルのフォーマットは、a,Alphaのように、文字,コードの形式である # # # # 実行結果 # cat ./nato.cod # a,Alfa # b,Bravo # c,Charlie #  ・ #  ・ #  ・ # z,Zulu # ./phon # nato.cod # OPA627 # Oscar Papa Alfa 627 # ./phon # ./nato.cod # IEICE # India Echo India Charlie Alfa Echo # # # # # フォネティックコード # a,Alfa # b,Bravo # c,Charlie # d,Delta # e,Echo # f,Foxtrot # g,Golf # h,Hotel # i,India # j,Juliett # k,Kilo # l,Lima # m,Mike # n,November # o,Oscar # p,Papa # q,Quebec # r,Romeo # s,Sierra # t,Tango # u,Uniform # v,Victor # w,Whiskey # x,X-ray # y,Yankee # z,Zulu phon(_フォネティックコードファイル,_文字列) :- assertz_フォネティックコード(_フォネティックコードファイル), atom_chars(_文字列,Chars), phon_1(Chars,XL), phon_2(XL). phon_1([],[]) :- !. phon_1([A],[C]) :- フォネティックコード(A,C),!. phon_1([A],[A]) :- not(フォネティックコード(A,_)),!. phon_1([A,B|R1],[C,' '|R2]) :- フォネティックコード(A,C), フォネティックコード(B,_), phon_1([B|R1],R2). phon_1([A,B|R1],[C,' '|R2]) :- フォネティックコード(A,C), not(フォネティックコード(B,_)), phon_1([B|R1],R2). phon_1([A,B|R1],[A,' '|R2]) :- not(フォネティックコード(A,_)), フォネティックコード(B,_), phon_1([B|R1],R2). phon_1([A,B|R1],[A|R2]) :- not(フォネティックコード(A,_)), not(フォネティックコード(B,_)), phon_1([B|R1],R2). phon_2([]). phon_2([A|R]) :- write(A), phon_2(R). assertz_フォネティックコード(_フォネティックコードファイル) :- フォネティックコードファイルの読み込み(_フォネティックコードファイル,Lines), abolish(フォネティックコード/2), フォネティックコードベースの登録(Lines). フォネティックコードファイルの読み込み(_フォネティックコードファイル,Lines) :- get_lines(_フォネティックコードファイル,Lines). フォネティックコードベースの登録(Lines) :- member(Line,Lines), split(Line,[','],[A,B]), forall(フォネティックコードベースの登録(A,B),true). フォネティックコードベースの登録(A,B) :- assertz(フォネティックコード(A,B). フォネティックコードベースの登録(A,B) :- to_upper(A,C), assertz(フォネティックコード(C,B). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/75 # # [1] 授業単元: C # [2] 問題文(含コード&リンク): # キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示するプログラムを作成せよ # 。また、0や負の数が入力された場合はプログラムが終了するようにせよ。 # 表示結果の例 # 正の整数:6 # 1****** # 2 ***** # 3 **** # 4  *** # 5 ** # 6 * 'キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示するプログラムを作成せよ。また、0や負の数が入力された場合はプログラムが終了するようにせよ。表示結果の例 正の整数:6 1****** 2 ***** 3 **** 4  *** 5 ** 6 *'(N) :- 'キーボードから入力された1以上の整数n'(_n), length(L,_n), forall((append(L1,L2,L), not(L2=[])), 行表示(L1,L2,L)). 'キーボードから入力された1以上の整数n'(_n) :- 整数を得る('正の整数',_n >= 1,_n). 行表示(L1,L2,L) :- all(L1,' '), all(L2,'*'), length([_|L1],_nth1), atomic_list_concat(L,_空白と星文字列), writef('%t %t\n',[_nth1,_空白と星文字列]). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/75 # # [1] 授業単元: C # [2] 問題文(含コード&リンク): # キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示するプログラムを作成せよ # 。また、0や負の数が入力された場合はプログラムが終了するようにせよ。 # 表示結果の例 # 正の整数:6 # 1****** # 2 ***** # 3 **** # 4  *** # 5 ** # 6 * t293(N) :- length(L,N), forall((append(L1,L2,L), not(L2=[])), 行表示(L1,L2,L)). 行表示(L1,L2,L) :- all(L1,' '), all(L2,'*'), length([_|L1],_nth1), atomic_list_concat(L,_空白と星文字列), writef('%t %t\n',[_nth1,_空白と星文字列]). all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1244449887/650 # # [1] 授業単元: C # [2] 問題文(含コード&リンク):キーボードから入力された1以上の整数nについて、 # 次の例に示すように行番号と*を表示するプログラムを作成せよ。 # なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 # 表示結果の例 # 正の整数:7 # 1******* # 2****** # 3***** # 4**** # 5*** # 6** # 7* # のように作れとのことです。 # # [3] 環境 # [3.1]linux # [3.2] gcc # [3.3]C # [4]6月20日 # [5]繰り返しまでです、関数まではいっていません、お願いします 'キーボードから入力された1以上の整数nについて、 次の例に示すように行番号と*を表示するプログラムを作成せよ。 なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。 表示結果の例 正の整数:7 1******* 2****** 3***** 4**** 5*** 6** 7* のように作れとのことです。' :- 'キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示する'. 'キーボードから入力された1以上の整数nについて、次の例に示すように行番号と*を表示する' :- 'キーボードから入力された1以上の整数n(_n), forall('次の例に示すように行番号と*を表示する なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。'(1,_n),true). 'キーボードから入力された1以上の整数n(_n) :- 整数を得る('1以上の整数n',_n >= 1,_n). '次の例に示すように行番号と*を表示する なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。'(_m,_n) :- '行番号と*を表示する'(_m,_n). '次の例に示すように行番号と*を表示する なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。'(_m,_n) :- _n > 0, _n_1 is _n - 1, _m_2 is _m + 1, '次の例に示すように行番号と*を表示する なお、*の数は、1行目はn個とし、1行毎に1ずつへっていくこととする。 また、0や負の数が入力された場合はプログラムが終了するようにせよ。'(_m_2,_n_1). '行番号と*を表示する'(_m,_n) :- 同一要素ならび(*,_同一要素ならび,_n), atom_chars(_星文字列,_同一要素ならび), writef('%t %t\n',[_m,_星文字列]). 同一要素ならび(_要素,_ならび,_要素数) :- length(_ならび,_要素数), 同一要素ならび(_要素,_ならび) . 同一要素ならび(_,[]). 同一要素ならび(_値,[_値|_残りならび]) :- 同一要素ならび(_値,_残りならび). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1200175247/550 # # # (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい # # p wday["sunday"] #=> "日曜日" # p wday["monday"] #=> "月曜日" # p wday["saturday"] #=> "土曜日" # # (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい # # (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ い。 # 「sunday」は日曜日のことです。 # 「monday」は月曜日のことです。 # … # # (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行 # (正規表現で定義するなら「/\s+/」)で区切られた文字列をハッシュに変換するメ ソッド # str2hashを定義してください。 # # p str2hash("bule 青 white 白\nred赤"); # #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} % (1) wday(sunday,日曜日). wday(monday,月曜日). wday(saturday,土曜日). % (2) wdayの節数(_節数) :- 節数(wday(_,_),_節数). 節数(_節形式,_節数) :- findall(1,_節形式,L), length(L,_節数). % (3) '(3)' :- forall(wday(A,B), writef('「%t」は%tのことです。\n',[A,B])). % (4) str2hash(S,_述語名) :- split(S,['\n'],L), member(A,L), split(A,['\t',' '],L1), str2hash(L1). str2hash([]). str2hash([_述語名,_値|R]) :- P =.. [_述語名,_値], assertz(P), str2has(R). % 以下のサイトは # [1] 授業単元: # [2] 問題文 # 今テキストファイルAが1つとBが10個あるとする。 # Aには # haru # natsu # aki # fuyu # とかかれ # Bにはそれぞれのテキストに以下のような文字列がかかれている # wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo # iouaiojoiajwioejio121j3oi1j2iojlajia # これらをまとめ # テキストCに # aki[tab]wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo[改行] # natsu[tab]iouaiojoiajwioejio121j3oi1j2iojlajia[改行] # になるようなプログラムをかけ # ただし。Bのそれぞれのテキストは非常に長くても大丈夫にせよ。 # [3] 環境 [3.1] OS:linux #  [3.2] gcc #  [3.3 C # [4] 期限: 5/23 '今テキストファイルAが1つとBが10個あるとする。 Aには haru natsu aki fuyu とかかれ Bにはそれぞれのテキストに以下のような文字列がかかれている wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo iouaiojoiajwioejio121j3oi1j2iojlajia これらをまとめ テキストCに aki[tab]wheiowfjhoiejwio2121oij3io12ji2oj3io2j3oijo[改行] natsu[tab]iouaiojoiajwioejio121j3oi1j2iojlajia[改行] になるようなプログラムをかけ ただし。Bのそれぞれのテキストは非常に長くても大丈夫にせよ。' :- テキストファイルAとならびBに現れるファイルを結合する(_A,_ならびB). テキストファイルAとならびBに現れるファイルを結合する(_A,_ならびB) :- get_lines(_A,Lines), forall(( nth1(_nth1,Lines,Line), atom_chars(Line,Chars1), テキストファイルAとならびBに現れるファイルを結合する(Chars1,_nth1,_ならびB)), true). テキストファイルAとならびBに現れるファイルを結合する(Chars1,_nth1,_ならびB) :- nth1(_nth1,_ならびB,File), get_chars(File,Chars2), append(Chars1,['\t'|Chars2],Chars3), atom_chars(_表示文字列,Chars3), writef('%t\n',[_表示文字列]). % 以下のサイトは fizzbuzz(N) :- between(1,N,M), fizzbuzz_2(M,S), writef('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,N,M), fizzbuzz(M,X), writef('%t ',[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(0) :- !. fizzbuzz(N) :- fizzbuzz(N,X), N_1 is N - 1, fizzbuzz(N_1), writef('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz(1,N). fizzbuzz(M,N) :- M > N,!. fizzbuzz(M,N) :- fizzbuzz_2(M,X), writef('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- forall(( between(1,N,M), fizzbuzz_2(M,S), writef('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- between(1,M,N), fizzbuzz(N,[[1,N],[3,'Fizz'],[5,'Buzz']],L2), fizzbuzz_2(L2,S), writef('%t ',[S]), N = M. fizzbuzz(N,L1,L2) :- findall(S,( member([U,S],L1), 0 is N mod U), L2). fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',S), N = _n. fizzbuzz_2([N],N). fizzbuzz_2([_,A|L],S) :- atomic_list_concat([A|L],S). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[_表示]). 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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[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. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t\n',[_表示文字列]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- length(L0,N), fizzbuzz([_],[_|L0],[_,_,_],[_,_,_,_,_]). fizzbuzz(Lm,Lm,_,_). fizzbuzz(L0,Lm,L1,L2) :- fizzbuzz(L0,L1,L2,L3,L4,_正解), writef('%t ',[_正解]), 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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[A]), fizzbuzz([_|L1],[_|L2],R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[A]), fizzbuzz(L1,L2,R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t%t%t',[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,_,' '). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t%t%t ',[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,_,''). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([],N,['','','Fizz'],['','','','','Buzz']),!. fizzbuzz(Ln,N,_,_) :- length(Ln,N). fizzbuzz(Ln,N,L1,L2) :- fizzbuzz_1([_|Ln],L1,L2,S), writef('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t '[X]). 表示項(Ln,'','',N) :- length(Ln,N),!. 表示項(_,A,B,C) :- atom_concat([A,B],C). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t%t%t ',[_31,_51,A]), fizzbuzz([_|Ln],N,[_32,_33,_31],[_52,_53,_54,_55,_51]). fizzbuzz_1('','',Ln,M) :- length([_|Ln],M),!. fizzbuzz_1(_,_,_,''). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- fizzbuzz([_],[_,_],[_,_,_,_],Ln,X), writef('%t',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[B]), fizzbuzz([_|Ln],N,Ln2,[_|L]). fizzbuzz_2(Ln,A,A) :- atom(A). fizzbuzz_2(Ln,A,N) :- length([_|Ln],N). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[A]), fizzbuzz(R1,R2). fizzbuzz([A|R1],[B|R2]) :- atomi(B), writef('%t ',[B]), fizzbuzz(R1,R2). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 'FizzBuzz'(N) :- findall(M,between(1,N,M),L1), 'FizzBuzz置換パターン'(L1,L2), atomic_list_concat(L2,' ',S), writef('%t\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']). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[_nth1]). fizzbuzz_2(_,A) :- atom(A), writef('%t ',[A]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[B])). fizzbuzz_2(A,N,N) :- var(A),!. fizzbuzz_2(A,N,A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[_表示項]), _nth1 = N,!. 表示項の選択(_nth1,_nth1,_nth1) :- !. 表示項の選択(_nth1,A,A). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%t ')). '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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fizzbuzz(N) :- 'fizzbuzzパターンの形成'(N,L1), 変数だけ要素位置番号を埋める(N,L1,L2), forall(member(A,L2),writef('%t ')). '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). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[U])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[_表示値]), 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. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[U])). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 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('%t ',[_表示項]), _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('%t\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('%t ',[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('%t ',[_公]), 校([_|_里],_丈,_料,_勘). 乾(_,建,建,碩,漁,'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('%t',[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('%t',[U]), _nth1=N. 表示選択(_nth1,_nth1). 表示選択(_,U) :- atom(U). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 最小文字数を競ってみよう(現在 147字) % fizzbuzz(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % 述語名fizzbuzzをfにして良いなら 140字 (twitterの1twit限度文字数) % f(N):-between(1,N,M),put(32),g(M,S),write(S),M=N. g(M,'Fizz'):-m(M,3). g(M,'Buzz'):-m(M,5). g(M,M):- \+m(M,3),\+m(M,5). m(M,N):-0=:=M mod N. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % IF/Prolog (for/3,if/3 を使って) % % 述語名fizzbuzzをfにして良いなら 82字 % f(M):-for(1,N,M),nl,if((1>N mod 3,A=fizz;1>N mod 5,A=buzz),write(A),write(N)),MN mod 3,A=fizz;1>N mod 5,A=buzz),write(A))->write(N)),M