このディレクトリの索引

% 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数,[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- _シャッフルした1からnのn個の連続した整数=[_,_|_2個をとりのぞいたのこりの数]. 'のこりの数からとりのぞいた2個の数を求める。'(_1からnのn個の連続した整数,_2個をとりのぞいたのこりの数,X) :- sort(_2個をとりのぞいたのこりの数,_整列した2個をとりのぞいたのこりの数), 欠番を2個求める(_1からnのn個の連続した整数,_整列した2個をとりのぞいたのこりの数,[],X). 欠番を2個求める(_,_,[X1,X2],[X1,X2]) :- !. 欠番を2個求める(L1,L2,Y,X) :- 欠番を2個見つけるまで探索する(L1,L2,Y,X). 欠番を2個見つけるまで探索する([A|R1],[A|R2],Y,X) :- 欠番を2個求める(R1,R2,Y,X). 欠番を2個見つけるまで探索する([A|R1],[B|R2],Y,X) :- A\==B, 欠番を2個求める(R1,[B|R2],[A|Y],X). % 以下のサイトは % 非決定性 シャッフルして一枚取り出す/4 シャッフルして一枚取り出す(_札,_既に取り出した札,_取り出す札,_残り札) :- シャッフル(_札,_シャッフルした札), append(_既に取り出した札,[_取り出す札|_残り札],_シャッフルした札). % 決定性 シャッフル/2 シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い(L,_乱数), 一個ずつ取り出して行く(L,_乱数,A,R2). 位置を示す乱数を使い(L,_乱数) :- length(L,Len), _乱数 is random(Len). 一個ずつ取り出して行く(L,_乱数,A,R2) :- 取り出して行く(L,_乱数,A,R1), シャッフル(R1,R2). 取り出して行く(L,_乱数,A,R1) :- nth0(_乱数,L,A), select(A,L,R1). % 以下のサイトは 切ったトランプを用意する(_切ったトランプ) :- '52枚の整列したカード'(_52枚の整列したカード), シャッフル(_52枚の整列したカード,_切ったトランプ). '52枚の整列したカード'(_52枚の整列したカード) :- findall([_数,_スート], 'カードを数・スート順に生成する'(_数,_スート),_52枚の整列したカード). 'カードを数・スート順に生成する'(_数,_スート) :- between(1,13,_数), member(_スート,[スペード,ハート,ダイヤ,クラブ]). シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一枚ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一枚ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一枚ずつ取り出して行く(L1,A,R2):- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは シャッフル([],[]) :- !. シャッフル(L,[A|R2]) :- 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2). 位置を示す乱数を使い一個ずつ取り出して行くことによりシャッフルする(L,A,R2) :- 位置を示す乱数を使い一個ずつ取り出して行く(L,A,R2), select(A,L,R1), シャッフル(R1,R2). 位置を示す乱数を使い一個ずつ取り出して行く(L1,A,R2) :- length(L1,Len), _乱数 is random(Len), nth0(_乱数,L1,A). % 以下のサイトは シャッフル(L1,L2) :- length(L1,Len), findall(N,between(1,Len,N),L), シャッフル(Len,L,L1,L2). シャッフル(0,_,_,[]) :- !. シャッフル(Len,L,L1,[_値|R]) :- 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R). 'L1からランダムに取り出して新たなリストを構成する'(Len,L,L1,_値,R) :- 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値), succ(Len_1,Len), シャッフル(Len_1,L_1,L1,R). 得られた乱数の位置にあるL1の値を取り出す(Len,L,L1,L_1,_値) :- 得られた乱数の位置にある(Len,L,M), 'L1の値を取り出す'(L,L1,M,L_1,_値). 得られた乱数の位置にある(Len,L,M) :- N is random(Len) + 1, nth1(N,L,M). 'L1の値を取り出す'(L,L1,M,L_1,_値) :- nth1(M,L1,_値), select(M,L,L_1). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- _シャッフルした1からnのn個の連続した整数=[_,_|_2個をとりのぞいたのこりの数]. 'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :- length(L,2),!. 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- select(_n,L1,L1_2),!, _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L). 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L). % 以下のサイトは # 出題場所 :: http://toro.2ch.net/test/read.cgi/tech/1390525149/282 # お題:1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 # のこりの数からとりのぞいた2個の数を求める。 # 例 # 3,1,2,6 -> 4,5 # # '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。 のこりの数からとりのぞいた2個の数を求める。'(_n,_とりのぞいた数_1,_とりのぞいた数_2) :- '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数), 'のこりの数からとりのぞいた2個の数を求める。'(1,_2個をとりのぞいたのこりの数,[],[_とりのぞいた数_1,_とりのぞいた数_2]). '1からnのn個の連続した整数をシャッフルして適当に選んだ2個をとりのぞく。'(_n,_2個をとりのぞいたのこりの数) :- '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数), シャッフルして(_n,_1からnのn個の連続した整数,_シャッフルした1からnのn個の連続した整数), '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). '1からnのn個の連続した整数を'(_n,_1からnのn個の連続した整数) :- findall(M,between(1,_n,M),_1からnのn個の連続した整数). シャッフルして(_n,L1,L2) :- シャッフルして(1000,_n,L1,L2),!. シャッフルして(0,_,L,L). シャッフルして(M,_n,L1,L) :- R is random(_n) + 1, select(R,L1,L2), M_1 is M - 1, シャッフルして(M_1,_n,[R|L2],L). '適当に選んだ2個をとりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[],[_数_1,_数_2]), 'とりのぞく。'(_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数). 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[A,B],[A,B]) :- !. 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,L1,L) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), 適当に選んだ2個を(_シャッフルした1からnのn個の連続した整数,[_適当に選んだ数|L1],L). 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- length(_シャッフルした1からnのn個の連続した整数,Len), R1 is random(Len), nth0(R1,_シャッフルした1からnのn個の連続した整数,_適当に選んだ数), \+(member(_適当に選んだ数,L1)),!. 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数) :- 適当に選んだ(_シャッフルした1からnのn個の連続した整数,_適当に選んだ数). 'とりのぞく。'(_数_1,_数_2,_シャッフルした1からnのn個の連続した整数,_2個をとりのぞいたのこりの数) :- select(_数_1,_シャッフルした1からnのn個の連続した整数,L1), select(_数_2,L1,_2個をとりのぞいたのこりの数). 'のこりの数からとりのぞいた2個の数を求める。'(_,_,L,L) :- length(L,2),!. 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- select(_n,L1,L1_2),!, _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1_2,L2,L). 'のこりの数からとりのぞいた2個の数を求める。'(_n,L1,L2,L) :- _n_2 is _n + 1, 'のこりの数からとりのぞいた2個の数を求める。'(_n_2,L1,[_n|L2],L). % 以下のサイトは # 出典:: http://toro.2ch.net/test/read.cgi/tech/1342966104/466 # # # [1] 授業単元:C言語 # [2] 問題文:プレイフェア暗号の作成 #       参考:http://ime.nu/www.tamagaki.com/math/PlayfairCipher.html # # #  プレイフェア暗号(Playfair cipher) # # プレイフェア暗号はイギリス人サー・チャールズ・ホイートストン(Sir Charles Wheatstone)により開発されライアン・プレイフェア(Lyon Playfair)が普及させました。プレイフェア暗号を用いて暗号化するとき、まずキーワードまたはキーフレーズをあらかじめ決めておきます。仮にキーワードをPlayfairとします。次にこのキーワードをアルファベットが重複することなく下の5×5の表に入れていきます。 # # ここで残りのセルに余ったアルファベットを挿入していくわけですが、アルファベットは26文字あって5×5では一字余ります。そこで I と J は同じセルに入れるとあらかじめ決めておきます。そこで新たに作られた表が下のようになります。 # # 準備ができたところで、次のメッセージを暗号化してみましょう。 # # メッセージ Abandon hope, all ye who enter here. # # このメッセージをまず二文字ずつ区切っていきます。 # # Ab-an-do-nh-op-ea-ll-ye-wh-oe-nt-er-he-re # # ここで7番目に ll と同じ文字が重複しているので間に x を入れます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-e # # そうすると最後に e が一つ余ります。ここにもやはり x を入れておきます。 # # Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # まず最初の二文字 ab を暗号化してみましょう。ab は先ほど作った表では同じ列にあります。このときは ab の列のすぐ下の文字で置き換えます。 # # つまり ab は BH に変わります。ただし一番下の文字例えば w は一番上の文字 A に変換されます。 # # 同様に同じ行に入る二文字も出てきたとします。例えば ap などは右隣の文字に置き換えます。 # # つまり ap は YL になるわけですね。この場合も一番右の文字例えば f は一番左の文字 p に変換されます。 # # 最後に行も列も違う二文字が出てきた場合は次のようにします。例えば an を考えます。下の表のように a n それぞれの行および列を塗り分け、その交点となる文字を見ます。この場合、P と Q になります。 # # そこで a は、a h と同じ行の P に、n は、n と同じ行の Q に変換します。つまり、 # # do → RT # # nh → QE # # op → NL # # となるわけです。このルールに従って、先ほどのメッセージを暗号化すると、 # # 平文  Ab-an-do-nh-op-ea-lx-ly-ew-ho-en-te-rh-er-ex # # 暗号文 BH PQ RT QE NL HP YV AF HU GQ NU NM BG GI KU # # これでプレイフェア暗号による暗号化が終了したわけです。 # # この暗号はイギリスがボーア戦争(ブール戦争 BoreWar)で使用したといわれています。 プレイフェア暗号表の作成(_鍵文,_暗号表) :- 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字以外の変数ならび), 'Jを除いたA-Zならびを切る'(_Jを除いたA_Zならび), 変数を埋める(_Jを除いたA_Zならび,Chars,_鍵文字以外の変数ならび), 'N個組'(5,_25要素のならび,_暗号表). 鍵文を25要素のならびに拡張して(_鍵文,_25要素ならび,_鍵文字ならび,_鍵文字以外の変数ならび) :- length(_25要素ならび,25), atom_chars(_鍵文,_鍵文字ならび), append(_鍵文字ならび,_鍵文字以外の変数ならび,_25要素ならび). 'A-Zならびを切る'(_Jを除いたA_Zならび) :- _切る回数 is random(113) + 1, トランプを切るようにならびを切る(_切る回数,25,['A','B','C','D','E','F','G','H','I','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'],_Jを除いたA_Zならび). 変数を埋める(_,_,[]). 変数を埋める(L_1,Chars,[V|R]) :- select(V,L_1,L_R), \+(member(V,Chars)), 変数を埋める(L_R,Chars,R). プレイフェア暗号による暗号化(_平文,_暗号文) :- メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび), atomic_list_concat(_暗号文字ならび,_暗号文). メッセージをまず二文字ずつ区切っていきます(_平文,_二文字ずつに区切られたならび) :- atom_chars(_平文,Chars), すべての文字を大文字に変換(Chars,_大文字の文字ならび), メッセージをまず二文字ずつ区切っていきます(_大文字の文字ならび,_二文字ずつに区切られたならび). メッセージをまず二文字ずつ区切っていきます([],[]). メッセージをまず二文字ずつ区切っていきます(['J'|R1],[['J','J']|R2]) :- メッセージをまず二文字ずつ区切っていきます(R1,R2). メッセージをまず二文字ずつ区切っていきます([A],[[A,'X']]). メッセージをまず二文字ずつ区切っていきます([A,A|R1],[[A,'X']|R2]) :- メッセージをまず二文字ずつ区切っていきます([A|R1],R2). メッセージをまず二文字ずつ区切っていきます([A,B|R1],[[A,B]|R2]) :- \+(A=B), メッセージをまず二文字ずつ区切っていきます(R1,R2). プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号文字ならび) :- 暗号表(_暗号表), 転置(_暗号表,_転置された暗号表), プレイフェア暗号化(_二文字ずつに区切られたならび,_暗号表,_転置された暗号表,_暗号文字ならび). プレイフェア暗号化([],_,_,[]). プレイフェア暗号化([['J','J']|R1],_暗号表,_転置された暗号表,['J'|R2]) :- プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). プレイフェア暗号化([[A,B]|R1],_暗号表,_転置された暗号表,[C,D|R2]) :- 暗号に変換(A,B,_暗号表,C,D), プレイフェア暗号化(R1,_暗号表,_転置された暗号表,R2). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_転置された暗号表), 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- member(L,_暗号表), 'A,Bが暗号表の同一行にある'(A,B,L,C,D). 暗号に変換(A,B,_暗号表,_転置された暗号表,C,D) :- 暗号コードは矩形を仮想した時の他の二角(A,B,_暗号表,C,D). 'A,Bが暗号表の同一行または列にある'(A,B,L,C,D) :- member(A,L), member(B,L), 'A,Bの次の要素'(L,A,C), 'A,Bの次の要素'(L,B,D). 'A,Bの次の要素'(L,X,Y) :- append([Y|_],[X],L). 'A,Bの次の要素'(L,X,Y) :- append(_,[X,Y|_],L). 暗号コードは矩形を仮想した時の他の二角(A,B,_表,C,D) :- 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B), nth1(_列_B,L_1,C), nth1(_列_A,L_2,D). 'A,Bの行と列位置を得る'(A,B,_表,L_1,_列_A,L_2,_列_B) :- nth1(_行_A,_表,L_1), nth1(_列_A,L_1,A), nth1(_行_B,_表,L_2), nth1(_列_B,L_2,B). % 以下のサイトは # # 与えたリストをシャッフルするshuffle/2を実装してください。 # # ?- shuffle([a,b,c], X). # X = [b,a,c]; # false # shuffle(_カードの束,_切られたカードの束) :- length(_カードの束,_カードの枚数), _カードの枚数 > 2, M is _カードの枚数 // 12 + 3, _乱数値 is random(M), length(L0,_乱数値), append(L0,L1,_カードの束), shuffle(L1,_カードの束_2), append(_カードの束_2,L0,_切られたカードの束),!. shuffle(_カードの束,_カードの束). % 以下のサイトは # # 与えたリストをシャッフルするshuffle/2を実装してください。 # # ?- shuffle([a,b,c], X). # X = [b,a,c]; # false # shuffle(_カードの束,_切られたカードの束) :- shuffle([_,_,_,_,_],_カードの束,_切られたカードの束). shuffle([],_カードの束,_カードの束) :- !. shuffle([_|Ln],_カードの束,_切られたカードの束) :- 概ね分割する(_カードの束,_カードの束_1,_カードの束_2), カードを雑に併合(1,_カードの束_1,_カードの束_2,_カードの束_3), shuffle(Ln,_カードの束_3,_切られたカードの束). 概ね分割する(_カードの束,_カードの束_1,_カードの束_2) :- _分割数1 is random(7) + 22, length(_カードの束_1,_分割数1), append(_カードの束_1,_カードの束_2,_カードの束), カードを雑に併合(_カードの束_1,_カードの束_2,_カードの束_3), カードを雑に併合(1,_カードの束_1,_カードの束_2,_カードの束) :- _重なる枚数 is truncate(random(4) * 0.4 + 1), length(L,_重なる枚数), append(L,R,_カードの束_1), カードを雑に併合(2,R,_カードの束_2,_カードの束_3), append(L,_カードの束_3,_カードの束),!. カードを雑に併合(2,_カードの束_1,_カードの束_2,_カードの束_3) :- _重なる枚数 is truncate(random(4) * 0.4 + 1), length(L,_重なる枚数), append(L,R2,_カードの束2), カードを雑に併合(1,_カードの束_1,R,_カードの束_3), append(L,_カードの束_3,_カードの束),!. カードを雑に併合(_,_カードの束_1,_カードの束_2,_カードの束) :- append(_カードの束_1,_カードの束2,_カードの束),!. % 以下のサイトは # # 与えたリストをシャッフルするshuffle/2を実装してください。 # # ?- shuffle([a,b,c], X). # X = [b,a,c]; # false # shuffle_n(0,_,_リスト,_リスト) :- !. shuffle_n(_n,_カードの枚数,_入力リスト,_出力リスト) :- shuffle(_入力リスト,_切られたリスト), _n_1 is _n - 1, shuffle_n(_n_1,_カードの枚数,_切られたリスト,_出力リスト). shuffle(_カードの枚数,_入力リスト,_出力リスト) :- _乱数値1 is random(_カードの枚数) + 1, _乱数値2 is random(_カードの枚数) + 1, 交換(1,[_乱数値1,_乱数値2],V1,V2,_入力リスト,_出力リスト). 交換(N,_交換位置リスト,V1,V2,[A|R1],[A|R2]) :- \+(member(N,_交換位置リスト)), N2 is N + 1, 交換(N2,_交換位置リスト,V1,V2,R1,R2),!. 交換(N,_交換位置リスト,V1,V2,[A|R1],[V2|R2]) :- var(V1), V1 = A, N2 is N + 1, 交換(N2,_交換位置リスト,V1,V2,R1,R2),!. 交換(_,_,V1,V2,[A|R],[V1|R]) :- var(V2), V2 = A,!. % 以下のサイトは # # 与えたリストをシャッフルするshuffle/2を実装してください。 # # ?- shuffle([a,b,c], X). # X = [b,a,c]; # false # % 一回ずつ非決定性述語仕様で切っていくには、 shuffle(_元のカードの束,_切られたカードの束) :- length(_元のカードの束,_カードの枚数), _乱数値 is random(_カードの枚数), length(L0,_乱数値), shuffle(L0,_元のカードの束,_切られたカードの束). shuffle(L0,_元のカードの束,_切られたカードの束) :- append(L0,L1,_元のカードの束), append(L1,L0,_切られたカードの束). shuffle(L0,_元のカードの束,_切られたカードの束) :- append(L0,L1,_元のカードの束), append(L1,L0,_切られたカードの束1), shuffle(_切られたカードの束1,_切られたカードの束). % 以下のサイトは # # 与えたリストをシャッフルするshuffle/2を実装してください。 # # ?- shuffle([a,b,c], X). # X = [b,a,c]; # false # shuffle(_元のカードの束,_切られたカードの束) :- length(_元のカードの束,_カードの枚数), length(Ln,100), shuffle(Ln,_カードの枚数,_元のカードの束,_切られたカードの束). shuffle([],_,_カードの束,_カードの束) :- !. shuffle([_|Ln],_カードの枚数,_カードの束1,_カードの束) :- shuffle(_カードの枚数,_カードの束1,_カードの束2), shuffle(Ln,_カードの枚数,_カードの束2,_カードの束). shuffle(_カードの枚数,_カードの束1,_カードの束2) :- _乱数値 is random(_カードの枚数), length(L0,_乱数値), append(L0,L1,_カードの束1), append(L1,L0,_カードの束2). % 以下のサイトは 出典::C/C++の宿題片付けます 146代目 #535 # すいません、ペペロンチーノの作り方を教えてください # # :- op(600,xf,cc). :- op(600,xf,片). :- op(600,xf,枚分). :- op(600,xf,個). ペペロンチーノの作り方 :- ペペロンチーノの材料表示, ペペロンチーノの作り方表示. ペペロンチーノの材料表示 :- write('ペペロンチーノの材料\n'), レシピ(ペペロンチーノ,材料,A,B 人前,C), writef('%t %t 人前 %t\n',[A,B,C]), fail. ペペロンチーノの材料表示. ペペロンチーノの作り方表示 :- write('\nペペロンチーノの作り方\n'), レシピ(ペペロンチーノ,作り方,_順序,_作り方), writef('%t. %t\n',[_順序,_作り方]), fail. ペペロンチーノの作り方表示. レシピ(ペペロンチーノ,材料,'塩,コショウ',6 人前,適量). レシピ(ペペロンチーノ,材料,'オリーブ油',6 人前,200 cc). レシピ(ペペロンチーノ,材料,'にんにく(つぶしたもの)',6 人前,3-4 片). レシピ(ペペロンチーノ,材料,'赤とうがらし',6 人前,1 個). レシピ(ペペロンチーノ,材料,'パセリのみじん切り',6 人前,2-3 枚 分). レシピ(ペペロンチーノ,作り方,1,'にんにくを細かく刻む'). レシピ(ペペロンチーノ,作り方,2,'スパゲッティをやわらかくなるまでゆでる'). レシピ(ペペロンチーノ,作り方,3,'刻んだにんにくと赤とうがらしをオリーブ油で十分に炒める'). レシピ(ペペロンチーノ,作り方,4,'ゆで上がったスパゲッティの水気を切り、深い皿に入れる'). レシピ(ペペロンチーノ,作り方,5,'にんにくを炒めた鍋からオリーブ油を直接皿に注ぐ'). レシピ(ペペロンチーノ,作り方,6,'黒コショウを振りかけてよく混ぜる'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% にんにくを細かく刻む(_にんにく,_刻まれたにんにく) :- にんにく(_にんにく), 刻む(_にんにく,_刻まれたにんにく). スパゲッティをやわらかくなるまでゆでる(_鍋,_スパゲッティ,_ゆであがったスパゲッティ) :- 鍋(_鍋), スパゲッティ(_スパゲッティ), 鍋の湯を沸騰させる(_鍋,_鍋の中の沸騰した湯), 注ぐ(_鍋の中の沸騰した湯,_スパゲッティ,_湯で煮られるスパゲッティ), やわらかくなる(_湯で煮られるスパゲッティ,_ゆであがったスパゲッティ). 刻んだにんにくと赤とうがらしを十分に炒める(_小鍋,_刻んだにんにく,_赤とうがらし,_オリーブ油,_炒めたにんにく,_炒めた赤とうがらし,_にんにくと赤とうがらしの味の滲みでたオリーブ油) :- 小鍋(_小鍋), 赤とうがらし(_赤とうがらし), オリーブ油(_オリーブ油), 中に入れる(_小鍋,_刻んだにんにく,_赤とうがらし,_オリーブ油,_具の入った小鍋), 十分に炒める(_具の入った小鍋,_炒めたにんにく,_炒めた赤とうがらし,_にんにくと赤とうがらしの味の滲みでたオリーブ油). 'ゆであがったスパゲッティの水気を切り、深い皿に入れる(_ゆであがったスパゲッティ,_水気の切れたスパゲッティを入れた深い皿) :- 水気を切る(_ゆであがったスパゲッティ,_水気のきれたスパゲッテイ), 深い皿に入れる(_深い皿,_水気の切れたスパゲッティ,_水気の切れたスパゲッティを入れた深い皿). % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1263824755/683 # # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): http://ime.nu/ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10530.zip # ポーカープログラム # # 1,二つのクラス(Card,Deck)が与えられていて、 # game1.hとgame1.cppのプラグラムを書け。 # このプログラムはデッキから5枚配る事を1回とし、 # その中に何回ペアまたはフラッシュ(同じ手札に同じマークが5枚揃う事)が # あるかの10000回の統計であり、以下を表示させること # # 何回の統計か # そのうち何個の手札がペアを持つか # そのうち何個の手札がフラッシュを持つか # ペアは全体の何%か # フラッシュは全体の何%か # # 無作為化する為に以下を必ず含める事 # stand(unsigned)time(NULL); # # #2,新しいクラスhand(hand.hとhand.cpp)と、これを実行させる為の # game2.hとgame2.cppを書け。 # これはカードの配布、ペア・フラッシュの確認、そしてデッキにカードを戻す為の # プログラムである。 # ペアまたはフラッシュの出現度数(_回数,_ペアの度数,_フラッシュの度数) :- findsum([M1,M2],(for(1,N,_回数),トランプの準備([A,B,C,D,E|R]),役([A,B,C,D,E],M1,M2)),[_ペアの度数,_フラッシュの度数]). 役(L,1,0) :- sort(L,L1),ペア(L1),!. 役([A|R],0,1) :- sub_atom(A,1,1,_,_種類),フラッシュ(_種類,R),!. ペア([A,B]) :- sub_atom(A,0,1,_,C),sub_atom(B,0,1,_,C),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),sub_atom(C,0,1,_,E),ペア(R),!. ペア([A,B,C|R]) :- sub_atom(A,0,1,_,E),sub_atom(B,0,1,_,E),\+(sub_atom(C,0,1,_,E)),!. ペア([A|R]) :- ペア(R). フラッシュ(_,[]) :- !. フラッシュ(A,[B|R]) :- sub_atom(B,1,1,_,A),フラッシュ(A,R). トランプの準備(X) :- findall(U,(for(1,N,52),一枚のカードを作る(N,U)),_整列したカード), トランプを切るようにならびを切る(41,53,_整列したカード,X),!. 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), concat_atom([U1,U2],U),!. 数字カード・絵カード(1,'A') :- !. 数字カード・絵カード(10,'T') :- !. 数字カード・絵カード(11,'J') :- !. 数字カード・絵カード(12,'Q') :- !. 数字カード・絵カード(0,'K') :- !. 数字カード・絵カード(N,N). カードの種類(0,s) :- !. カードの種類(1,h) :- !. カードの種類(2,d) :- !. カードの種類(3,c) :- !. トランプを切るようにならびを切る(0,_要素数,L,L) :- !. トランプを切るようにならびを切る(N,_要素数,L,X) :- M1 is (random mod _要素数) + 1, M2 is (random mod _要素数) + 1, \+(M1=M2), swap_nth(M1,M2,L,L1), N2 is N - 1, トランプを切るようにならびを切る(N2,_要素数,L1,X),!. トランプを切るようにならびを切る(N,_要素数,L,X) :- トランプを切るようにならびを切る(N,_要素数,L,X),!. swap_nth(M,N,L1,L2) :- list_nth(M,L1,A), list_nth(N,L1,B), swap(A,B,L1,L2),!. swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1248012902/434 # # 【 課題 】http://ime.nu/www1.axfc.net/uploader/Sc/so/49653 # レストランのメニューを表示するクラス # レベル1: 6点満点メニューを表示するだけ。ただし、各フィールドやメソッドに # 適切なコメントを記述すること。 # レベル2:7点満点キーボード入力でデザートを切り替える機能を追加。 # レベル3: 8点満点キーボード入力された値が無効な場合と有効な場合で実行結果を切り替える機能を追加。 # レベル4: 9点満点RestaurantMenu2.java という名前で、RtaurantMenu.javaの # コピーを作る。RestaurantMenu2.javaでは、mainDish, dessertという配列を # 廃止し、2次元配列menuでそれらと同等の文字列を管理する。その上で各メソッドを # 改造し、レベル3と同じ機能を持つようにする。実行結果もレベル3と同じ。 # レベル5: 10点満点メインディッシュとデザートの組み合わせからなる # セットメニューを表示するためのメソッド、showSetMenu を追加し、 # それを用いて下記の実行結果を得る。プログラム内のデザート番号入力及び # メニュー表示部分は消さずにコメントアウトしておく。 'レストラン「ピエモンテ」のメニュー表示' :- メニュー表紙表示, メニュー分類(_分類), 分類項目の表示(_分類), fail. 'レストラン「ピエモンテ」のメニュー表示'. メニュー表紙表示. 分類項目の表示(_分類) :- functor(Q,メニュー分類,1), findall(_料理名,(call(Q),arg(1,Q,_料理名)),_料理名ならび), \+(_料理名ならび=[]), length(_料理名ならび,_分類項目の料理数), _切る回数 is random mod 10, トランプを切るようにならびを切る(_切る回数,_分類項目の料理数,_料理名ならび,_切られた料理名ならび), write_formatted('\n\n\n       %t\n\n',[_分類]), 最大品数(_分類,_最大品数), メニュー明細の表示(_料理名ならび,_切られた料理名ならび,_最大品数),!. 分類項目の表示(_). メニュー明細の表示(_料理名ならび,_切られた料理名ならび,_最大品数) :- メニューに載せる料理名(_料理名ならび,_切られた料理名ならび,_最大品数,_メニューに載せる料理名), メニュー価格(_メニューに載せる料理名,_価格), write_formatted(' %-32s .... %7d 円\n',[_メニューに載せる料理名,_価格]), fail. メニュー明細の表示(_,_,_). メニューに載せる料理名(_料理名ならび,_切られた料理名ならび,_最大品数,_メニューに載せる料理名) :- member(_メニューに載せる料理名,_料理名ならび), append(L,[_メニューに載せる料理名|_],_切られた料理名ならび), length(L,Len), Len < _最大品数. メニュー価格('チーズ・トースト・ピエモンテ風',250). メニュー価格('フォンデュ・ピエモンテ風',2800). メニュー価格('チーズ入りポレンタがゆのプディング',1200). メニュー価格('ニョッキ・ピエモンテ風',600). メニュー価格('チーズ入りじゃがいものニョッキ',600). メニュー価格('アニォロッティまたはラヴィオリ・ピエモンテ風',800). メニュー価格('トリュフ入りリゾット',1400). % メニュー価格('グリーン・ソース・ピエモンテ風',_). % メニュー価格('ソース・ピエモンテーゼ',). % メニュー価格('ニンニクとアンチョビー入りソース・ピエモンテ風'). メニュー価格('チキン・コンソメのチキン・ロワイヤル入り',650). メニュー価格('野菜スープ・アスティ風',750). メニュー価格('仔牛の胃のスープ',900). メニュー価格('パンとチーズのスープ',550). メニュー価格('牛の背肉のバローロ・ワイン煮',2300). メニュー価格('仔牛肉のマレンゴ風',2200). メニュー価格('トゥルネード・フィナンシエール風',2500). メニュー価格('牛の尾肉煮込み・カヴェール風',2000). メニュー価格('カエルの足のシチュー',1600). メニュー価格('鶏肉のムース',1000). メニュー価格('鶏肉のトマトと白ブドウ酒煮',1300). メニュー価格('七面鳥の胸肉・マルサラソース',1300). メニュー価格('野うさぎ・ピエモンテ風',1400). メニュー価格('野うさぎの煮込み・マレンゴ風',1700). メニュー価格('雌雉子・シャンピニョン添え',1600). メニュー価格('雉子のトリュフ詰め',2000). メニュー価格('鳩のカブール風',1400). メニュー価格('うずらの蒸し焼き・白トリュフ添え',2000). メニュー価格('ますのピエモンテ風',1800). メニュー価格('セージ入りすずきのフライ',1800). メニュー価格('こいのマリネード',1400). メニュー価格('すずきの白ブドウ酒入り蒸し焼き',2000). メニュー価格('トリュフ入りレタスとセロリのサラダ',750). メニュー価格('トリュフ入りセロリのサラダ',700). メニュー価格('ピーマンとフンティーナ・チーズのサラダ',450). メニュー価格('バーニャ・カウダ・ソース入りピーマン',450). メニュー価格('小玉ねぎのイヴレア風',450). メニュー価格('アスパラガスのタルタル・ソースかけ',550). メニュー価格('ほうれんそうのピエモンテ風',400). メニュー価格('くりのシチュー',500). メニュー価格('クレープ・ピエモンテ風',550). メニュー価格('オムレツの白トリュフ入り、ピエモンテ風',850). メニュー価格('フォンティーナ・チーズのフライ・エッグのせ',650). メニュー価格('卵・トリノ風',450). メニュー価格('トリュフのピエモンテ風',750). メニュー価格('サクランボのバローロ・ワイン煮',400). メニュー価格('冷やしたプディング・ジアンダ風',400). メニュー価格('ベルヴェデーレ・クリーム',400). メニュー価格('ももの詰めもの・ピエモンテ風',550). % メニュー価格('サバイオーネ'). メニュー価格('コロンビアメデリンスプレモの浅炒り',450). メニュー価格('コロンビアメデリンスプレモの中炒り',450). メニュー価格('やぎのミルクを加えたカプチーノ',450). メニュー価格(' Vietti Barbera d'Asti Tre Vigne 2006',4500). メニュー価格('Gattinara 2004 Antoniolo',4500). メニュー価格('Ghemme 2003 / Antichi Vigneti di Cantalup',3800). メニュー価格('Barbaresco',3500). メニュー価格('Dekcetto d''Alba',3500). メニュー価格('Delcetto delle Langhe',2800). メニュー価格(_,100). メニュー分類(オードブル). メニュー分類(スープ). メニュー分類(パスタ). メニュー分類(ピザ). メニュー分類(サラダ). メニュー分類(米料理). メニュー分類(魚料理). メニュー分類(肉料理). メニュー分類(デザート). メニュー分類(ワイン). メニュー分類(コーヒー). 最大品数(オードブル,6). 最大品数(パスタ,8). 最大品数(サラダ,3). 最大品数(米料理,3). 最大品数(魚料理,6). 最大品数(肉料理,8). 最大品数(デザート,4). 最大品数(飲み物,6). 最大品数(コーヒー,2). 最大品数(ワイン,8). % お出しできる料理・・メニューに加える料理は一旦この述語節として定義し、後に分類する(同時に複数に分類されることもある) お出しできる料理('チーズ・トースト・ピエモンテ風'). お出しできる料理('フォンデュ・ピエモンテ風'). お出しできる料理('チーズ入りポレンタがゆのプディング'). お出しできる料理('ニョッキ・ピエモンテ風'). お出しできる料理('チーズ入りじゃがいものニョッキ'). お出しできる料理('アニォロッティまたはラヴィオリ・ピエモンテ風'). お出しできる料理('トリュフ入りリゾット'). お出しできる料理('グリーン・ソース・ピエモンテ風'). お出しできる料理('ソース・ピエモンテーゼ'). お出しできる料理('ニンニクとアンチョビー入りソース・ピエモンテ風'). お出しできる料理('チキン・コンソメのチキン・ロワイヤル入り'). お出しできる料理('野菜スープ・アスティ風'). お出しできる料理('仔牛の胃のスープ'). お出しできる料理('パンとチーズのスープ'). お出しできる料理('牛の背肉のバローロ・ワイン煮'). お出しできる料理('仔牛肉のマレンゴ風'). お出しできる料理('トゥルネード・フィナンシエール風'). お出しできる料理('牛の尾肉煮込み・カヴェール風'). お出しできる料理('カエルの足のシチュー'). お出しできる料理('鶏肉のムース'). お出しできる料理('鶏肉のトマトと白ブドウ酒煮'). お出しできる料理('七面鳥の胸肉・マルサラソース'). お出しできる料理('野うさぎ・ピエモンテ風'). お出しできる料理('野うさぎの煮込み・マレンゴ風'). お出しできる料理('雌雉子・シャンピニョン添え'). お出しできる料理('雉子のトリュフ詰め'). お出しできる料理('鳩のカブール風'). お出しできる料理('うずらの蒸し焼き・白トリュフ添え'). お出しできる料理('ますのピエモンテ風'). お出しできる料理('セージ入りすずきのフライ'). お出しできる料理('こいのマリネード'). お出しできる料理('すずきの白ブドウ酒入り蒸し焼き'). お出しできる料理('トリュフ入りレタスとセロリのサラダ'). お出しできる料理('トリュフ入りセロリのサラダ'). お出しできる料理('ピーマンとフンティーナ・チーズのサラダ'). お出しできる料理('バーニャ・カウダ・ソース入りピーマン'). お出しできる料理('小玉ねぎのイヴレア風'). お出しできる料理('アスパラガスのタルタル・ソースかけ'). お出しできる料理('ほうれんそうのピエモンテ風'). お出しできる料理('くりのシチュー'). お出しできる料理('クレープ・ピエモンテ風'). お出しできる料理('オムレツの白トリュフ入り、ピエモンテ風'). お出しできる料理('フォンティーナ・チーズのフライ・エッグのせ'). お出しできる料理('卵・トリノ風'). お出しできる料理('トリュフのピエモンテ風'). お出しできる料理('サクランボのバローロ・ワイン煮'). お出しできる料理('冷やしたプディング・ジアンダ風'). お出しできる料理('ベルヴェデーレ・クリーム'). お出しできる料理('ももの詰めもの・ピエモンテ風'). お出しできる料理('サバイオーネ'). オードブル('チーズ・トースト・ピエモンテ風'). オードブル('フォンデュ・ピエモンテ風'). オードブル('チーズ入りポレンタがゆのプディング'). オードブル('ニョッキ・ピエモンテ風'). オードブル('チーズ入りじゃがいものニョッキ'). オードブル('アニォロッティまたはラヴィオリ・ピエモンテ風'). サラダ('トリュフ入りレタスとセロリのサラダ'). サラダ('トリュフ入りセロリのサラダ'). サラダ('ピーマンとフンティーナ・チーズのサラダ'). スープ('チキン・コンソメのチキン・ロワイヤル入り'). スープ('野菜スープ・アスティ風'). スープ('仔牛の胃のスープ'). スープ('パンとチーズのスープ'). 米料理('トリュフ入りリゾット'). 肉料理('牛の背肉のバローロ・ワイン煮'). 肉料理('仔牛肉のマレンゴ風'). 肉料理('トゥルネード・フィナンシエール風'). 肉料理('牛の尾肉煮込み・カヴェール風'). 肉料理('カエルの足のシチュー'). 肉料理('鶏肉のムース'). 肉料理('鶏肉のトマトと白ブドウ酒煮'). 肉料理('七面鳥の胸肉・マルサラソース'). 肉料理('野うさぎ・ピエモンテ風'). 肉料理('野うさぎの煮込み・マレンゴ風'). 肉料理('雌雉子・シャンピニョン添え'). 肉料理('雉子のトリュフ詰め'). 肉料理('鳩のカブール風'). 肉料理('うずらの蒸し焼き・白トリュフ添え'). 魚料理('ますのピエモンテ風'). 魚料理('セージ入りすずきのフライ'). 魚料理('こいのマリネード'). 魚料理('すずきの白ブドウ酒入り蒸し焼き'). 野菜料理('バーニャ・カウダ・ソース入りピーマン'). 野菜料理('小玉ねぎのイヴレア風'). 野菜料理('アスパラガスのタルタル・ソースかけ'). 野菜料理('ほうれんそうのピエモンテ風'). 野菜料理('くりのシチュー'). デザート('サクランボのバローロ・ワイン煮'). デザート('冷やしたプディング・ジアンダ風'). デザート('ベルヴェデーレ・クリーム'). デザート('ももの詰めもの・ピエモンテ風'). コーヒー('コロンビアメデリンスプレモの浅炒り'). コーヒー('コロンビアメデリンスプレモの中炒り'). コーヒー('やぎのミルクを加えたカプチーノ'). コーヒー('エスプレッソ'). ワイン(' Vietti Barbera d'Asti Tre Vigne 2006'). ワイン('Gattinara 2004 Antoniolo'). ワイン('Ghemme 2003 / Antichi Vigneti di Cantalup'). ワイン('Barbaresco'). ワイン('Dekcetto d''Alba'). ワイン('Delcetto delle Langhe'). /* ワイン('Lessone'). ワイン('Mottalciata'). ワイン('Barbaresco'). ワイン('Delcetto delle Langhe'). ワイン('Freisa'). ワイン('Coretese'). ワイン('Muscatel'). */ ソースの味('ますのピエモンテ風',白ブドウ酒煮込み). ソースの味('すずきの白ブドウ酒入り蒸し焼き',白ブドウ酒煮込み). ソースの味('野うさぎ・ピエモンテ風',白ブドウ酒煮込み). ソースの味('牛の尾肉煮込み・カヴェール風',トマト). ソースの味('鶏肉のトマトと白ブドウ酒煮',トマト). % セットメニューに選択時に指定料理がある場合は引数に直接指定する(その料理だけは固定できる,他はあくまで候補) セットメニュー分類項目の表示(_オードブル,_スープ,_サラダ,_肉料理,_魚料理,_飲み物,_デザート) :- セットメニュー候補(_オードブル,_スープ,_サラダ,_肉料理,_魚料理,_飲み物,_デザート), write(' ピエモンテシェフとっておきのコース料理 ... 5500円\n\n'), writef('オードブル ... %t\n',[_オードブル]), writef('スープ ... %t\n',[_スープ]), writef('サラダ ... %t\n',[_サラダ]), writef('肉料理 ... %t\n',[_肉料理]), writef('魚料理 ... %t\n',[_魚料理]), writef('飲み物 ... %t\n',[_コーヒー]), writef('デザート ... %t\n',[_デザート]). セットメニュー候補(_オードブル,_スープ,_サラダ,_肉料理,_魚料理,_飲み物,_デザート) :- 肉・魚料理の選択(_肉料理,_魚料理), オードブル(_オードブル), スープ(_スープ), サラダ(_サラダ), _飲み物 = エスプレッソ, デザート(_デザート). 肉・魚料理の選択(_肉料理,_魚料理) :- 肉料理(_肉料理), 魚料理(_魚料理), ソースの味が異なる(_肉料理,_魚料理), メニュー価格(_肉料理,_肉料理の価格), メニュー価格(_魚料理,_魚料理の価格), \+(_肉料理の価格 + _魚料理の価格 >= 4000). ソースの味が異なる(_肉料理,_魚料理) :- ソースの味(_肉料理,_肉料理のソースの味), ソースの味(_魚料理,_魚料理のソースの味), \+(var(_肉料理のソースの味)), \+(var(_魚料理のソースの味)), !, \+(_肉料理のソースの味=_魚料理のソースの味). ソースの味が異なる(_,_). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% トランプを切るようにならびを切る(0,_要素数,L,L) :- !. トランプを切るようにならびを切る(N,_要素数,L,X) :- M1 is random(_要素数), M2 is random(_要素数), swap_nth(M1,M2,L,L1), N2 is N - 1, トランプを切るようにならびを切る(N2,_要素数,L1,X). swap_nth(M,N,L1,L2) :- nth0(M,L1,A), nth0(N,L1,B), swap(A,B,L1,L2). swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(250,xf,g). :- op(250,xf,kg). :- op(250,xf,cc). :- op(250,xf,羽). :- op(250,xf,個). :- op(250,xf,個分). :- op(250,xf,本分). :- op(250,xf,尾). :- op(250,xf,枚). :- op(250,xf,リットル). :- op(250,xf,串). :- op(250,xf,欠片). :- op(250,xf,切れ). :- op(250,xf,瓶). :- op(250,xf,カップ). :- op(300,fx,大匙). :- op(300,fx,小匙). :- op(250,xf,杯). :- op(250,xf,人前). レシピ(すずきの白ブドウ酒入り蒸し焼き,'海すずき(1.1kg)',6 人前,1 尾). レシピ(すずきの白ブドウ酒入り蒸し焼き,塩,6 人前,少量). レシピ(すずきの白ブドウ酒入り蒸し焼き,辛口白ブドウ酒,6 人前,400 cc). レシピ(すずきの白ブドウ酒入り蒸し焼き,バター,6 人前,25 g). レシピ(トゥルネード・フィナンシエール風,仔牛の胸腺肉,6 人前,225 g). レシピ(トゥルネード・フィナンシエール風,'塩・コショウ',6 人前,少々). レシピ(トゥルネード・フィナンシエール風,仔牛の骨の髄,6 人前,75 g). レシピ(トゥルネード・フィナンシエール風,ワインビネガー,6 人前,15 cc). レシピ(トゥルネード・フィナンシエール風,'玉ねぎのみじん切り(小)',6 人前,1 個分). レシピ(トゥルネード・フィナンシエール風,'にんじんのみじん切り',6 人前,1 本分). レシピ(トゥルネード・フィナンシエール風,'セロリのみじん切り',6 人前,1 本分). レシピ(トゥルネード・フィナンシエール風,'バター',6 人前,140 g). レシピ(トゥルネード・フィナンシエール風,'マデラ酒',6 人前,100 cc). レシピ(トゥルネード・フィナンシエール風,'酢漬けシャンピニョンの角切り',6 人前,110 g). レシピ(トゥルネード・フィナンシエール風,'キュウリのピクルスの角切り',6 人前,55 g). レシピ(トゥルネード・フィナンシエール風,'仔牛の脚から切り取った角切り',6 人前,6 切れ). レシピ(トゥルネード・フィナンシエール風,'小麦粉',6 人前,8 g). 作り方(すずきの白ブドウ酒入り蒸し焼き,1,'皮に傷をつけないように下ごしらえする。魚はきざみ目をつけて内側に塩をする。'). 作り方(すずきの白ブドウ酒入り蒸し焼き,2,'鍋にブドウ酒、バター、塩少量を入れて魚を入れ、蓋をして中火のオープンで約20分間魚がやわらかくなるまで蒸し焼きにする。'). 作り方(すずきの白ブドウ酒入り蒸し焼き,3,'魚を皿に盛り魚の背中に2~3つの切り目をつけ、上から濾した煮汁をかけてすぐ供する。'). ?- % 以下のサイトは # 出典:: http://pc12.2ch.net/test/read.cgi/tech/1245853701/244 # # 〔1〕授業単元:C言語 # 〔2〕問題文:http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9601.txt # ・2つの整数型の変数を入れ替える関数 swapを定義して、それを用いて配列中の数字をランダムに入れ替えるプログラムを作りなさい。 # 1から52までの数が順番に入った配列を用意し、十分に入れ替えた結果を表示すること。 # これができた人は、次のように表示を変更しなさい。 # ・ 52個の数字を1〜13、14〜26、27〜39、40〜52の4組に分けて考える # ・ それぞれ1番目から13番目の数字を、A、2、3、4、5、6、7、8、9、T、J、Q、K と表示する(TはTenのT) # 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,2,0,21,22,… # ↓ # A,2,3,4,5,6,7,8,9,T,J,Q,K,A,2,3,4,5,6,7,8,9,T,… # ?これができた人は、次のように表示を変更しなさい。 # ・トランプの4つのスートをアルファベットで表示することにする(スペードは s, ハート #  はh、ダイヤはd、 クラブはc) # ・ 1〜13はスペード(s)、14〜26はハート(h)、27〜39はダイヤ(d)、40〜52はクラブ(c)とする # ・ それぞれの数字をA〜Kとshdcの組合せで表示する # ・ 例:1ならAs(スペードのA)、52ならKc(クラブのK) # As,2s,…..,Ks,Ah,2h,……,Kh,Ad,2d,……,Kd,Ac,2c,…..,Kc swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. t319_2(X) :- findall(U,( between(1,52,N), t319_2_1(N,U)),X). t319_2_1(N,U) :- M is N mod 13, '数字カード・絵カード'(M,U). '数字カード・絵カード'(1,'A') :- !. '数字カード・絵カード'(10,'T') :- !. '数字カード・絵カード'(11,'J') :- !. '数字カード・絵カード'(12,'Q') :- !. '数字カード・絵カード'(0,'K') :- !. '数字カード・絵カード'(N,N). トランプの準備(X) :- findall(U,( between(1,52,N), 一枚のカードを作る(N,U)),_整列したカード), トランプを切る(100,_整列したカード,X). 一枚のカードを作る(N,U) :- M is N mod 13, M2 is (N - 1) // 13, 数字カード・絵カード(M,U1), カードの種類(M2,U2), atom_concat(U1,U2,U). カードの種類(0,s). カードの種類(1,h). カードの種類(2,d). カードの種類(3,c). トランプを切る(0,L,L) :- !. トランプを切る(N,L,X) :- M1 is random(52) + 1, M2 is random(52) + 1, swap_nth(M1,M2,L,L1), N2 is N - 1,!, トランプを切る(N2,L1,X). swap_nth(M,N,L1,L2) :- nth1(M,L1,A), nth1(N,L1,B), swap(A,B,L1,L2),!. swap(A,B,L,LX) :- append(L1,[A|L2],[B|L3],L), append(L1,[B|L2],[A|L3],LX),!. swap(A,B,L,LX) :- append(L1,[B|L2],[A|L3],L), append(L1,[A|L2],[B|L3],LX),!. append([],L2,L3,L4) :- append(L2,L3,L4). append([U|L1],L2,L3,[U|L4]) :- append(L1,L2,L3,L4).