このディレクトリの索引

% テスト述語を一引数述語にまとめた場合の例。

適切なデータを得るまで入力を得る(_テスト述語,_入力行) :-
        get_line(_入力行),
        functor(Q,_テスト述語,1),
        arg(1,Q,_入力行),
        call(Q),!.
適切なデータを得るまで入力を得る(_テスト述語,_入力行) :-
        write('入力条件に反するデータが入力されました。再入力してください : '),
        適切なデータを得るまで入力を得る(_テスト述語,_入力行).


http://pc12.2ch.net/test/read.cgi/tech/1200175247/550
# [1] 授業単元: Ruby演習 [2] 問題文、http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9426.txt
# Rubyの問題がわかりません 助けてください
#
# (1)曜日を表す英語と日本語との対応を表すハッシュwdayを定義しなさい
#
# p wday["sunday"] #=> "日曜日"
# p wday["monday"] #=> "月曜日"
# p wday["saturday"] #=> "土曜日"
#
# (2)ハッシュのメソッドを使って(1)のハッシュwdayのペアの数を数えなさい
#
# (3)eachメソッドと(1)のハッシュwdayを使って以下の文字列を出力させてくださ
い。
# 「sunday」は日曜日のことです。
# 「monday」は月曜日のことです。
#
# (4)ハッシュには配列の%wのようなものがありません。そこで、空白とタブと改行(正
規表現で定義するなら「/\uff3cs+/」)で区切られた文字列をハッシュに変換するメソ
ッドstr2hashを定義してください。
#
# p str2hash("bule 青 white 白\uff3cnred赤");
# #=> {"bule"=>"青", "white"=>"白", "red"=>"赤"} 

:- op(450,xfx,(=>)).

% (1)

wday({ "sunday" => "日曜日","monday" => "月曜日","saturday" #=> "土曜日"}).

% (2)
hash_count(Hashname,Count) :-
    functor(P,Hashname,1),
    call(P),
    arg(1,P,H),
    count(H,Count).

count(','(A,B),Count) :-
    count(B,Count2),
    Count is Count2 + 1.
count(A,1).

% (3)
%  ?- each(wday.A=>B),write_formatted('「%t」は%tのことです。\n',[A,B]),fail;true.
%  

each(Hashname.Key=>Value) :-
    functor(P,Hashname,1),
    arg(1,P,V),
    each(V,Key=>Value).

each(','(Key=>Value,B),Key=>Value).
each(','(_,B),Key=>Value) :-
    each(B,Key=>Value).
each(Key=>Value,Key=>Value).

% (4)

str2hash(Atom,Hash) :-
    split(Atom,[' ','\t','\n'],L),
    findall(U,n個組(2,L,U),L2),
    hashを成長させる(L2,Hash).

hashを成長させる([A,B],{ A=>B }) :- !.
hashを成長させる([[A,B]|R], { (A=>B,R2) }) :-
    hashを成長させる(R,{ R2 }).

n個組(N,L,X) :-
    length(X,N),
    append(X,L2,L3),
    append(L1,L3,L),
    length(L1,Len),
    0 is Len mod N.


http://pc12.2ch.net/test/read.cgi/tech/1247438792/291 
# [1] 授業単元:コンピュータリテラシー 
# [2] 問題文(含コード&リンク):問題文と参考は以下です 
#   http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/9806.txt 
# ・試験の過程を記録 
# 1,番号、得点を入力したあと平均点を計算 
# 2,番号順と得点順に並べ替え(ifを使いどちらか選択できるようにする) 
# 3,番号、得点、平均との差を出力 
# 以上のプログラムを作成 

成績を記録する :-
    write('番号と得点をスペースで区切って一行で入力してください\n'),
    get_line(_行),
    成績を記録する(_行).

成績を記録する(end_of_file) :- !.
成績を記録する(_行) :-
    split(_行,[' '],[_番号,_得点]),
    assertz(成績(_番号,_得点)),
    get_line(_次の行),
    成績を記録する(_次の行).
    
平均点(_平均点) :- findavg(_得点,成績(_,_得点),_平均点).

番号順に並べ直し(_番号順成績ならび) :-
    findall([_番号,_得点],成績(_番号,_得点),_成績ならび),
    quicksort(_成績ならび,_番号順成績ならび).

得点順に並べ直し(_得点順成績ならび) :-
    findall([_得点,番号],成績(_番号,_得点),_得点・番号成績ならび),
    quicksort(_得点・番号成績ならび,_整列した得点・番号ならび),
    項目位置を元に戻す(_整列した得点・番号ならび,_得点順成績ならび).

項目位置を元に戻す([],[]).
項目位置を元に戻す([[A,B]|R1],[[B,A]|R2]) :- 項目位置を元に戻す(R1,R2).

番号、得点、平均との差の出力 :-
    平均点(_平均点),
    write('番号 得点 平均との差\n'),
    成績(_番号,_得点),
    _平均との差 is _得点 - _平均点,
    write_formatted('%t  %t  %t\n',[_番号,_得点,_平均との差]),
    fail.
番号、得点、平均との差の出力.

quicksort([],[]) :- !.
quicksort([X|Xs],Ys) :-
    partition(Xs,X,Littles,Gigs),
    quicksort(Littles,Ls),
    quicksort(Bigs,Bs),
    append(Ls,[X|Bs],Ys).

partition([],Y,[],[]) :- !.
partition([X|Xs],Y,[X|Ls],Bs) :- X @=< Y,partition(Xs,Y,Ls,Bs).
partition([X|Xs],Y,Ls,[X|Bs]) :- X @> Y,partition(Xs,Y,Ls,Bs).


http://pc12.2ch.net/test/read.cgi/tech/1247438792/535 
# [1] C++ 
# [2] 問題文(含コード&リンク): 
# (1) 演算子+,-,*,/と整数と浮動小数点数からなる計算式の文字列から 
# 計算木を作成せよ。計算木は次のようなc_tree構造体を使うとする。 
# 
# struct c_tree 
# { 
# int type; 
# union { int n_value; double d_value; }; 
# c_tree *left, *right; 
# }; 
# typeは、'+', '-', '*', '/', 'n', 'd'のいずれか。 
# 
# (2) 優先順位に注意してc_tree構造体からなる計算木から 
# 計算式の文字列を作成せよ。 

文字列から式の生成(_文字列,_式) :-
    atom_chars(_文字列,Chars),
    語彙の切り出し(Chars,_語彙ならび,OpsX,_),
    結合度評価(OpsX,_語彙ならび,_式).

語彙の切り出し(L,X,OpsX,R) :-
    語彙の切り出しの一(L1,Y,[],OpsX,R),
    数値への変換(Y,X),!.

語彙の切り出しの一([],[],OpsX,OpsX,[]) :- !.
語彙の切り出しの一([')'|L1],[],OpsX,OpsX,L1) :- !.
語彙の切り出しの一(['('|L1],[L2|R2],OpsY,OpsX,R) :-
    括弧構造の解析(L1,L2,OpsY,OpsX1,R1),
    語彙の切り出しの一(R1,R2,OpsX1,OpsX,R).
語彙の切り出しの一(L1,[C|R2],OpsY,OpsX,R) :-
    is_op(A,B,C),
    member([A,B,C],OpsY),
    atom_chars(C,Chars),
    append(Chars,R1,L1),
    語彙の切り出しの一(R1,R2,OpsY,OpsX,R).
語彙の切り出しの一([A|R1],R2,OpsY,OpsX,R) :-
    member(A,[' ','\t','\n']),
    語彙の切り出しの一(R1,R2,OpsY,OpsX,R),!.
語彙の切り出しの一(L1,[C|R2],OpsY,OpsX,R) :-
    is_op(A,B,C),
    not(member([A,B,C],OpsY)),
    atom_chars(C,Chars),
    append(Chars,R1,L1),
    語彙の切り出しの一(R1,R2,[[A,B,C]|OpsY],OpsX,R).
語彙の切り出しの一(L1,[W|R2],OpsY,OpsX,R) :-
    語彙の切り出しの二(L1,G,L2),
    数値表現への変換(G,W),
    語彙の切り出しの一(L2,R2,OpsY,OpsX,R).

語彙の切り出しの二([],[],[]) :- !.
語彙の切り出しの二([')'|R],[],[')'|R]) :- !.
語彙の切り出しの二([' '|R],[],R) :- !.
語彙の切り出しの二(['\t'|R],[],R) :- !.
語彙の切り出しの二(L1,[],L1) :-
    is_op(A,B,C),
    atom_chars(C,Chars),
    append(Chars,R,L1),!.
語彙の切り出しの二([A|R1],[A|R2],R) :-
    語彙の切り出しの二(R1,R2,R).

括弧構造の解析([')'|R],[],OpsX,OpsX,R).
括弧構造の解析(L,L1,OpsY,OpsX,R) :-
    語彙の切り出しの一(L,L1,OpsY,OpsX,R).

結合度評価(_式に現れるop,_語彙ならび,_項) :-
    sort(_式に現れるop,_整列したop),
    reverse(_整列したop,_結合度順op),
    結合度評価の一(_結合度順op,_語彙ならび,_項).

結合度評価の一(_,[A],A) :- atomic(A),!.
結合度評価の一([[_結合度,yfx,Op]|R1],_語彙ならび,P) :-
    append(L1,[Op|L2],_語彙ならび),
    結合度評価の一([[_結合度,yfx,Op]|R1],L1,X1),
    結合度評価の一([[_結合度,yfx,Op]|R1],L2,X2),
    functor(P,Op,2),
    arg(1,P,X1),
    arg(2,P,X2),!.
結合度評価の一([_|R1],_語彙ならび,P) :-
    結合度評価の一(R1,_語彙ならび,P).

数値へ変換(L,_数値,R) :-
    整数生成(L,_数値,R,),!.
数値へ変換(L,_数値,R) :-
    浮動小数点数生成(L,_数値,R),!.

整数生成([A|R],N,R) :-
    atom_chars(A,L),
    length(L,Len),
    整数生成の一(L,_,N),!.

整数生成の一([],1,0) :- !.
整数生成の一([A|R1],U,X) :-
    文字整数変換(A,N),
    整数生成の一(R1,U2,Y),
    U is U2 * 10,
    X is N * U2 + Y,!.

文字整数変換('0',0).
文字整数変換('1',1).
文字整数変換('2',2).
文字整数変換('3',3).
文字整数変換('4',4).
文字整数変換('5',5).
文字整数変換('6',6).
文字整数変換('7',7).
文字整数変換('8',8).
文字整数変換('9',9).

浮動小数点数生成([A,(+),C|R],F,R) :-
    sub_atom(A,_,1,0,e),
    concat_atom([A,(+),C],D),
    atom_chars(D,L),
    浮動小数点数生成の一(L,_F),!.
浮動小数点数生成([A,(-),C|R],F,R) :-
    sub_atom(A,_,1,0,e),
    concat_atom([A,(+),C],D),
    atom_chars(D,L),
    浮動小数点数生成の一(L,_,F),!.
浮動小数点数生成([A|R],F,R) :-
    atom_chars(A,L),
    浮動小数点数生成の一(L,_,F).

浮動小数点数生成の一(L,'e+',F) :-
    append(L1,['e','+'|L2],L),
    append(L11,['.'|L12],L1),
    length(L12,Len1),
    浮動小数点数の一(L1,'.',F1),
    F is F1 * (10 ^ Len1).

浮動小数点数生成の一(L,'e-',L11,L12,L2) :-
    append(L1,['e','+'|L2],L),
    append(L11,['.'|L12],L1),
    length(L12,Len1),
    浮動小数点数の一(L1,'.',F1),
    F is F1 / (10 ^ Len1).
浮動小数点数生成の一(L,'.',F) :-
    append(L1,['.'|L2],L),
    length(L2,Len),
    append(L1,L2,L3),
    整数生成の一(L3,_,N),
    F is N / ( 10 ^ Len),!.


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'),
    write_formatted('オードブル    ...   %t\n',[_オードブル]),
    write_formatted('スープ        ...   %t\n',[_スープ]),
    write_formatted('サラダ        ...   %t\n',[_サラダ]),
    write_formatted('肉料理        ...   %t\n',[_肉料理]),
    write_formatted('魚料理        ...   %t\n',[_魚料理]),
    write_formatted('飲み物        ...   %t\n',[_コーヒー]),
    write_formatted('デザート      ...   %t\n',[_デザート]).

セットメニュー候補(_オードブル,_スープ,_サラダ,_肉料理,_魚料理,_飲み物,_デザート) :-
    肉・魚料理の選択(_肉料理,_魚料理),
    オードブル(_オードブル),
    スープ(_スープ),
    サラダ(_サラダ),
    _飲み物 = エスプレッソ,
    デザート(_デザート).

肉・魚料理の選択(_肉料理,_魚料理) :-
    肉料理(_肉料理),
    魚料理(_魚料理),
    ソースの味が異なる(_肉料理,_魚料理),
    メニュー価格(_肉料理,_肉料理の価格),
    メニュー価格(_魚料理,_魚料理の価格),
    \+(_肉料理の価格 + _魚料理の価格 >= 4000).

ソースの味が異なる(_肉料理,_魚料理) :-
    ソースの味(_肉料理,_肉料理のソースの味),
    ソースの味(_魚料理,_魚料理のソースの味),
    \+(var(_肉料理のソースの味)),
    \+(var(_魚料理のソースの味)),
    !,
    \+(_肉料理のソースの味=_魚料理のソースの味).
ソースの味が異なる(_,_).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
トランプを切るようにならびを切る(0,_要素数,L,L) :- !.
トランプを切るようにならびを切る(N,_要素数,L,X) :-
    M1 is (random mod _要素数) + 1,
    M2 is (random mod _要素数) + 1,
    swap_nth(M1,M2,L,L1),
    N2 is N - 1,
    トランプを切るようにならびを切る(N2,_要素数,L1,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),!.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
:- 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/1255709298/471
#  [1] 授業単元:C++ 
#  [2] 問題文(含コード&リンク):メニューを表示し選択された処理を行なう。各機能ごとに関数にし,各関数へのポインタは配列に格納しておきメニュー選択に応じて動的に呼び出す。 
#  実行例:http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10037.txt
# ** 計算メニュー **
# 
#  1.足し算
#  2.引き算
#  3.掛け算
#  4.割り算
# 
#  5.終了
# 
# 処理を選んでください 1 
# 
# ** 足し算をおこないます **
# 数1?123 
# 数2?321
# 
#   123 + 321 = 444
# 
# ** 計算メニュー **
# 
#  1.足し算
#  2.引き算
#  3.掛け算
#  4.割り算
# 
#  5.終了
# 
# 処理を選んでください 9 
# 
# ** 計算メニュー **
# 
#  1.足し算
#  2.引き算
#  3.掛け算
#  4.割り算
# 
#  5.終了
# 
# 処理を選んでください4  
# 
# ** 割り算をおこないます **
# 
# 数1?111 
# 数2?50   
#   
#   111 ÷ 50 = 2 ... 11
# 
# ** 計算メニュー **
# 
#  1.足し算
#  2.引き算
#  3.掛け算
#  4.割り算
# 
#  5.終了
# 
# 処理を選んでください 5     
# 
# ** 処理を終了します ** 
# 

計算メニュー('** 計算メニュー **').
計算メニュー('').
計算メニュー(' 1.足し算').
計算メニュー(' 2.引き算').
計算メニュー(' 3.掛け算').
計算メニュー(' 4.割り算').
計算メニュー('').
計算メニュー(' 5.終了').
計算メニュー('').

t933 :-
    repeat,
    計算メニュー表示,
    write('処理を選んでください '),get_integer(N),
    演算処理(N),
    N = 5,
    write('** 処理を終了します **\n').

演算処理(1) :- 足し算.
演算処理(2) :- 引き算.
演算処理(3) :- 掛け算.
演算処理(4) :- 割り算.
演算処理(5).

足し算 :-
    write('** 足し算を行います **\n'),
    二数を得る(_数字1,_数字2),
    _答え is _数字1 + _数字2,
    write_formatted('%t + %t = %t\n',[_数字1,+,_数字2]).
引き算 :-
    write('** 引き算を行います **\n'),
    二数を得る(_数字1,_数字2),
    _答え is _数字1 - _数字2,
    write_formatted('%t - %t = %t\n',[_数字1,+,_数字2]).
掛け算 :-
    write('** 掛け算を行います **\n'),
    二数を得る(_数字1,_数字2),
    _答え is _数字1 * _数字2,
    write_formatted('%t × %t = %t\n',[_数字1,+,_数字2]).
割り算 :-
    write('** 割り算を行います **\n'),
    二数を得る(_数字1,_数字2),
    _答え is _数字1 // _数字2,
    write_formatted('%t ÷ %t = %t\n',[_数字1,+,_数字2]).

二数を得る(_数字1,_数字2) :-
    write('数1?'),get_integer(N1),
    write('数2?'),get_integer(N2).

/*
演算処理(1) :- 演算処理(足し算,+,+).
演算処理(2) :- 演算処理(引き算,-,-).
演算処理(3) :- 演算処理(掛け算,*,×).
演算処理(4) :- 演算処理(割り算,/,÷).
演算処理(5).


演算処理(_演算,_関数,_関数表示) :-
    write_formatted('** %tを行います **\n',[_演算]),
    write('数1?'),get_integer(N1),
    write('数2?'),get_integer(N2),
    functor(Q,_関数,2),
    arg(1,N1),
    arg(2,N2),
    S is Q,
    write_formatted('  %t %t %t = %t\n',[N1,_関数表示,N2,S]),!.
*/

:- op(700,xfx,は).

% *** user: 'ABC分析パラメータ' / 3 ***
'ABC分析パラメータ'('A',0.0e+00,0.7).
'ABC分析パラメータ'('B',0.7,0.9).
'ABC分析パラメータ'('C',9.0,1.0).

'ABC分析'(X,A,B,C) :-
    '加算'(X,[_,S]),
    findall([U,L1],(append(L1,L2,X) , '加算'(L1,[_,D]) , U is D / S , U < 0.7),L),
    max(L,A),
    A = [W1,L3],
    append(L3,L4,X),
    findall([V,L5],(append(L5,L6,L4) , '加算'(L5,[_,E]) , V is E / S , V < 0.2),L7),
    max(L7,B),
    B = [W2,L8],
    append(L8,L9,L4),
    W3 is 1 - W1 - W2,
    C = [W3,L9],
    !.

% *** user: 'ABC分析' / 7 ***
'ABC分析'(X,PerA,PerB,PerC,A,B,C) :-
    '加算'(X,[_,S]),
    'ABC分析パラメータ'('A',Ap1,Ap2),
    'ABC分析の二'(X,S,Ap1,Ap2,PerA,A),
    append(A,L2,X),
    'ABC分析パラメータ'('B',Bp1,Bp2),
    'ABC分析の二'(L2,S,0.0e+00,Bp2 - PerA,PerB,B),
    append(B,C,L2),
    PerC is 1 - PerA - PerB,
    !.

% *** user: 'ABC分析の二' / 6 ***
'ABC分析の二'(L,S,Per1,Per2,PerX,X) :-
    findall([U,L1],(append(L1,_,L) , '加算'(L1,[_,D]) , U is D / S , U > Per1 , U =< Per2),L2),
    max(L2,Y),
    Y = [PerX,X],
    !.

% *** 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.0e+00,
    !.
'加算'([],L) :-
    \+(var(L)),
    '加算の変数に零をおく'(L),
    !.
'加算'([L|R],SL) :-
    'ならび'(L),
    m_trans([L|R],L1),
    '加算_2'(L1,SL),
    !.
'加算'(X,S) :-
    '加算_1'(X,0.0e+00,S) .

% *** user: ('は') / 2 ***
_項 'は' (_ネットワーク :: _式) :-
    _ネットワーク :: _項 'は' _式,
    !.
_評価項 'は' N : L :-
    M 'は' N,
    L1 'は' L,
    list_nth(M,L1,_評価項),
    !.
_評価項 'は' prolog(_評価項) :-
    functor(_評価項,F,Arg),
    \+(predicate_type(F,Arg,undefined)),
    !,
    error_protect(_評価項,fail) .
_評価値 'は' [X|{P}] :-
    findall(X,P,_評価値),
    !.
_評価項 'は' ` _値 :-
    !,
    _評価項 = _値,
    !.
_項 'は' _式 :-
    var(_式),
    _項 = _式,
    !.
_項 'は' _式 :-
    error_protect('一時関数定義'(_式,_項),fail) .
_項 'は' _式 :-
    atom(_式),
    member(_式,[minint,maxint,cputtime,time,csize,cused,dbsize,dbused,gsize,gused,noptrs,ptrsued,ssize,sused,tsize,tused]),
    !,
    _項 is _式,
    !.
_項 'は' _式 :-
    '二項組込み関数'(_式),
    '二項組込み関数の評価'(_式,_項) .
_項 'は' _式 :-
    '二項組込み関数'(_式),
    !,
    fail .
_項 'は' _式 :-
    functor(_式,Functor,1),
    arg(1,_式,Arg),
    Y 'は' Arg,
    functor(_式_1,Functor,1),
    arg(1,_式_1,Y),
    member(Functor,[atom,real,integer,var,float,list]),
    !,
    error_protect(_式_1,fail),
    _項 = Y,
    !.
_項 'は' _式 :-
    atom(_式),
    error_protect(get_global(_式,_項),fail),
    !.
_項 'は' _式 :-
    real(_式),
    _項 = _式,
    !.
_項 'は' _式 :-
    real(_式),
    !,
    fail .
_項 'は' _式 :-
    list(_式),
    findall(X,(member(U,_式) , X 'は' U),_項) .
_項 'は' _式 :-
    list(_式),
    !,
    fail .
_項 'は' _erlang_module : _erlang関数 :-
    'erlang関数評価'(_erlang_module : _erlang関数,_項),
    !.
_項 'は' _式 :-
    '関数定義'(_式,_項),
    !.
_項 'は' _式 :-
    functor(_式,_関数,_次数),
    function(_関数,_次数),
    findall(Arg,(for(1,N,_次数) , arg(N,_式,Arg)),L),
    '関数評価に於いて引数部分の関数評価'(L,L2),
    _式の二 =.. [_関数|L2],
    error_protect(_項 is _式の二,fail) .
_項 'は' _評価関数 :-
    error_protect(_項 is _評価関数,fail),
    !.
_評価項 'は' prolog(_評価項) :-
    functor(_評価項,F,Arg),
    \+(predicate_type(F,Arg,undefined)),
    !,
    error_protect(_評価項,fail),
    !.
_項 'は' _評価項 :-
    '述語評価が可能'(_評価項,_関数,_次数,_次数足す一),
    _評価項 =.. _評価項の項分解ならび,
    findall(Arg,(for(1,N,_次数) , arg(N,_評価項,Arg)),L),
    '関数評価に於いて引数部分の関数評価'(L,L2),
    append(L2,[_],_変数を付加した引数ならび),
    _解付き評価項 =.. [_関数|_変数を付加した引数ならび],
    error_protect(_解付き評価項,fail),
    arg(_次数足す一,_解付き評価項,_項) .
_項 'は' _評価項 :-
    \+('述語評価が可能'(_評価項,_関数,_次数,_次数足す一)),
    functor(_評価項,F,Arg),
    \+(predicate_type(F,Arg,undefined)),
    error_protect(_評価項,fail),
    arg(Arg,_評価項,_項) .
_項 'は' _評価項 :-
    \+('述語評価が可能'(_評価項,_関数,_次数,_次数足す一)),
    functor(_評価項,F,Arg),
    \+(predicate_type(F,Arg,undefined)),
    \+(error_protect(_評価項,fail)),
    _評価項 = _項,
    !.
_項 'は' _式 :-
    atomic(_式),
    \+('述語評価が可能'(_式,_関数,_次数,_次数足す一)),
    _項 = _式,
    !.

http://pc12.2ch.net/test/read.cgi/tech/1197620454/543
#  C#の宿題助けてくださしあ><お願いします。 
#  Visual Studio 2005使用です。 
#  問題文などはzipの中に入っています。説明不足等がありましたら補足します。 
#  http://ime.nu/uproda11.2ch-library.com/11213069.zip.shtml
#  DLキーは2chです。 

# 問い1
# ・二次元配列arrayを使ってユーザーのログインページを作りなさい。
# ・ユーザー名、パスワードのエラーメッセージを表示させること
# 問い2
# 問い1のプログラムを応用して、新規ユーザー登録ボタンを作りなさい。kadai_06_02_01ユーザー登録は配列を利用すること
# あらかじめユーザ登録用配列は3ユーザー分の名前とパスワードをセットしておくこと。
# ユーザー登録は10名までとする。10ユーザーを超えた場合はエラーを表示させなさい。
# つまり残り7枠を登録さればよい。
# プログラムはfor、while、do whileのどれかひとつでよい。
# ユーザー名のエラーはフラグを作って表示させたいです。でないと長くなると思うので ・・・。
# デザインは作成済みです。イメージがつかみにくいかもしれませんがよろしくお願いします・・・。
# slnファイルの名前がフォルダ名と違っていますが気にしないでください。
# 配列を使わないユーザー認証ページを作ってみたのでそちらを参考にしていただければと思います。

ttylogin :-
    write('\nlogin: '),
    get_line(_ユーザー名),
    write('password: '),
    system('stty -echo raw'),
    get_char(X),put_char('*'),
    パスワードを得る(X,Password),
    system('stty echo -raw'),
    ユーザ管理(_ユーザー名,Password,_診断),
    assertz(ログイン情報(_ユーザー名,Password,_診断)),
    シェル(_ユーザー名,_診断),
    ttylogin.

パスワードを得る('\r',[]) :- !.
パスワードを得る(C,[C|R]) :-
    get_char(C2),
    put_char('*'),
    パスワードを得る(C2,R).

ユーザ管理(_ユーザー名,Password,ok) :-
    concat_atom(Password,PasswordAtom),
    カエサル暗号(17,PasswordAtom,_暗号文),
    user_password(_ユーザ名,_暗号文),!.
ユーザ管理(_ユーザー名,Password,'UserPassword Error') :-
    user_passwork(_ユーザー名,_),!.
ユーザ管理(_ユーザー名,Password,S) :-
    concat_atom([ユーザー名,_ユーザー名,は登録がありません],S),!.

user_password(tama,'Jrslif').

シェル(_,S) :- \+(S==ok),!.
シェル(_,_) :- system.

adduser :-
    write('username : '),get_line(_ユーザー名),
    rawmode,write('password : '),get_char(Char),put_char(*),
    パスワードを得る(Char,Password),norawmode,
    write('Retype Password : '),get_char(Char2),put_char(*),
    パスワードを得る(Char2,Password2),
    パスワードは一致する(Password,Password2),
    定義枠の限界を越えていない,
    ユーザー登録(_ユーザー名,Password),

パスワードは一致する(A,A) :- !.
パスワードは一致する(A,B) :- \+(A,B),write('タイプされたパスワードは一致しません\n'),fail.

ユーザー登録(_ユーザー名,Password) :-
    concat_atom(Password,PasswordAtom),
    カエサル暗号(17,PasswordAtom,PasswordAtom2),
    assertz(user_password(_ユーザ-名,PasswordAtom2)).

定義枠の限界を越えていない :- 定義数の数(user_password/2,N),N < 10,!.
定義枠の限界を越えていない :- write('登録ユーザーが10を越えています。\n登録できません。\n'),fail.

定義節の数(Functor / Arity,N) :- functor(P,Functor,Arity),findsum(1,clause(P,_),F),N is truncate(F).


http://pc12.2ch.net/test/read.cgi/tech/1260532772/94 
#  [1] 授業単元: 通信プロトコル 
#  [2] 問題文(含コード&リンク): 
#  http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10268.txt 
# tcpを用いて21個石がある中から1〜3個の石をServer、Clientで取り合い、 
# 最後の1つを取った方が負けとなる石取りゲームを作りなさい。 
# server、clientの処理、および使用するポートは自由に決めて構わない。

クライアント一般型(Server,Port,_述語名,_受け取った情報) :-
    socket(internet, stream, Socket),
    socket_connect(Socket, Server : Port),
    open(Socket,read,Input),
    open(Socket,write,Output),
    クライアント一般型_1(Input,Output,_述語名,Line).

クライアント一般型_1(_,Input,Output,_述語名,_受け取った情報) :-
    get_line(Line),
    クライアント一般型_2(Input,Output,Line,_述語名,_受け取った情報).
クライアント一般型_1(Socket,Input,Output,_,_) :-
    close(Input),
    close(Output),
    socket_shutdown(Socket),!.

クライアント一般型_2(Input,Output,_,end_of_file,end_of_file) :- !.
クライアント一般型_2(Input,Output,_,_受け取った情報,_受け取った情報).
クライアント一般型_2(Input,Output,_述語名,Line1,_受け取った情報) :-
    functor(P,_述語名,Arg),
    arg(1,P,Line1),
    arg(2,P,Message),
    call(P),
    write_formatted(Output,%t\n,[Message]),    
    flush_output(Output),
    get_line(Line2),
    クライアント一般型_2(Input,Output,_述語名,Line2,_受け取った情報).


http://pc11.2ch.net/test/read.cgi/db/1252492296/594
#(問) 
# ID | DATE     | DATA 
# --+----------+----- 
# 1 | 2007-11-11 | aaa 
# 2 | 2007-11-11 | bbb 
# 1 | 2007-11-10 | ccc 
# 3 | 2007-11-12 | ddd 
# 3 | 2007-11-11 | eee 
# 4 | 2007-11-10 | fff 
# 1 | 2007-11-12 | ggg 
#
# このようなテーブルから、各idに対して最新の5件だけ抽出しなさい

各idに対して最新の5件だけ抽出する(_テーブル名,L) :-
   functor(Q,_テーブル名,3),
   重複を排除したidならびの抽出(ID,Q,L1),
   整列(L1,L2),
   findall(L3,(member(ID,L1),idに対して最新の5件だけ抽出する(ID,Q,L3)),L).

idに対して最新の5件だけ抽出する(ID,Q,L) :-
   目標Qの第一引数はID(ID,Q),
   idに対して組ならびを抽出する(Q,L3),
   最新の5件だけ抽出する(L3,L).

idに対して組ならびを抽出する(Q,L3) :-
   findall(L1,(call(Q),引数部分だけ抽出する(Q,L1)),L2),
   整列(L2,L3),!.

重複を排除したidならびの抽出(ID,Q,L1) :- setof(ID,Q,L1).

目標Qの第一引数はID(ID,Q) :- arg(1,Q,ID),!.   

引数部分だけ抽出する(Q,L1) :- Q =.. [_|L1].

最新の5件だけ抽出する(L3,L) :-
   length(L,5),
   append(_,L,L3),!.
最新の5件だけ抽出する(L,L) :- !.

http://pc12.2ch.net/test/read.cgi/tech/1274827528/955
#  [1] 授業単元:プログラミング  
#  [2] 問題文(含コード&リンク): 
#  以下のプログラムで、pointを昇順に並び替えるプログラムを作る。ソートの部分のみを書き換え、プログラムを作りなさい。  
#  http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10713.txt 
#  
# struct data {
# int car_num;
# char name[MAX_LEN];
# char cons[MAX_LEN];
# char nationality[MAX_LEN];
# int birth;
# double point;
# };
%
% ここでは単位節で定義された述語データベースの整列について考えよう。
%

f1(1,'Jenson Button','McLaren','British',1980,106).
f1(2,'Lewis Hamilton','McLaren','British',1985,109).
f1(3,'Michael Schumacher','Mercedes GP','German',1969,34).
f1(4,'Nico Rosberg','Mercedes GP','German',1985,74).
f1(5,'Sebastian Vettel','Red Bull','German',1987,90).
f1(6,'Mark Webber','Red Bull','Australian',1976,103).
f1(7,'Felipe Massa','Ferrari','Brazilian',1981,67).
f1(8,'Fernando Alonso','Ferrari','Spanish',1981,94).
f1(9,'Rubens Barrichello','Williams','Brazilian',1972,7).
f1(10,'Nico Hulkenberg','Williams','German',1987,1).
f1(11,'Robert Kubica','Renault','Polish',1984,73).
f1(12,'Vitaly Petrov','Renault','Russian',1984,6).
f1(14,'Adrian Sutil','Force India','German',1983,23).
f1(15,'Vitantonio Liuzzi','Force India','Italian',1981,12).
f1(16,'Sebastien Buemi','Toro Rosso','Swiss',1988,5).
f1(17,'Jaime Alguersuari','Toro Rosso','Spanish',1990,3).
f1(18,'Jarno Trulli','Lotus','Italian',1974,0).
f1(19,'Heikki Kovalainen','Lotus','Finnish',1981,0).
f1(20,'Karun Chandhok','HRT','Indian',1984,0).
f1(21,'Bruno Senna','HRT','Brazilian',1983,0).
f1(22,'Pedro de la Rosa','BMW Sauber','Spanish',1971,0).
f1(23,'Kamui Kobayashi','BMW Sauber','Japanese',1986,1).
f1(24,'Timo Glock','Virgin','German',1982,0).
f1(25,'Lucas di Grassi','Virgin','Brazilian',1984,0).

pointを昇順に並び替える(L) :-
        clause_sort([1],f1/6,L).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

pointを昇順に並び替える(L) :-
        データ構造(f1,_データ構造ならび),
        list_nth(N,_データ構造ならび,[point|_]),
        length(_データ構造ならび,Len),
        length(L0,Len),
        P =.. [f1|L0],
        findall(L0,P,L1),
        findall([_point|L2],(
                    member(L2,L1),
                    list_nth(N,L2,_point)),
                L3),
        sort(L3,L4),
        findall(L5,member([_|L5],L4),L).

データ構造ならび(f1,[[car_num],[name],[cons],[nationality],[birth],[point]]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

pointを昇順に並び替える(X) :-
        データ構造(f1,_データ構造ならび),
        list_nth(M,_データ構造ならび,[point|_]),
        length(_データ構造ならび,Len),
        clause_sort([M],f1/Len,X),

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

clause_sort(_順ならび,_関数 / _引数,X) :-
    functor(_頭部,_関数,_引数),
    findall(U,(clause(_頭部,_本体) , clause_sort_1(_順ならび,_頭部,_本体,U)),L),
    sort(L,L2),
    clause_sort_2(L2,X),!.

clause_sort_1([],_頭部,_本体,[(_頭部 :- _本体)]) :- !.
clause_sort_1([_鍵位置|R1],_頭部,_本体,[A|R2]) :-
    arg(_鍵位置,_頭部,A),
    clause_sort_1(R1,_頭部,_本体,R2).

clause_sort_2([],[]) :-
    !.
clause_sort_2([L|R1],[_頭部|R2]) :-
    last(L,(_頭部 :- true)),
    clause_sort_2(R1,R2),
    !.
clause_sort_2([L|R1],[Q|R2]) :-
    last(L,Q),
    clause_sort_2(R1,R2),!.


http://pc11.2ch.net/test/read.cgi/db/1252492296/609
#  postgres8.4を使ってます。 
#  レコード数が3件以上あるものを取得したいのですが 
#  どう書けばよいでしょうか。 
#   
#  やりたいことのイメージはこんな感じです。 
#  select recordCD from Table where recordCD in (select recordCD from Table where count(recordCD) > 3); 
#   
% これだとrecodCDが件数分出力されてしまうので、一件のみの出力に変更した

recordCDの位置を得る(_引数の数,_位置番号) :-
        'テーブル構造'('Table',_引数の数,_位置番号,recordCD).

レコード数が3件以上あるものを取得する(_recordCD) :-
        recordCDの位置を得る(_引数の数,_位置番号),
        functor(Q,'Table',_引数の数),
        arg(_位置番号,Q,_recordCD),
        findsetof(_recordCD,call(Q),L1),
        member(_recordCD,L1),
        count(Q,Count),
        Count >= 3.

http://pc11.2ch.net/test/read.cgi/db/1252492296/609
#  postgres8.4を使ってます。 
#  レコード数が3件以上あるものを取得したいのですが 
#  どう書けばよいでしょうか。 
#   
#  やりたいことのイメージはこんな感じです。 
#  select recordCD from Table where recordCD in (select recordCD from Table where count(recordCD) > 3); 
#   
% これだとrecodCDが件数分出力されてしまうので、一件のみの出力に変更した

recordCDの位置を得る(_引数の数,_位置番号) :-
        'テーブル構造'('Table',_引数の数,_位置番号,recordCD).

レコード数が3件以上あるものを取得する(_recordCD) :-
        recordCDの位置を得る(_引数の数,_位置番号),
        functor(Q,'Table',_引数の数),
        arg(_位置番号,Q,_recordCD),
        findsetof(_recordCD,call(Q),L1),
        member(_recordCD,L1),
        count(Q,Count),
        Count >= 3.

#  述語 全ての要素についてPである (引数の数は任意) を定義してください。
#  条件 第一引数には リストがきます。このリストの要素を全て満足する目標が
#       最後の引数Pとなります。
%
%  ?- 全ての要素についてPである([1,2,3],_要素,member(_要素,[2,2,4,1,3])).
%  _要素 = _1001
%  true
%  

全ての要素についてPである([],_,_).
全ての要素についてPである([_要素|R],_要素,P) :-
        項複写((_要素,P),(_要素1,P1)),
        call_P(P),
        全ての要素についてPである(R,_要素1,P1).

call_P(P) :- call(P),!.

% *** user: 項複写 / 6 ***

項複写(M,N,P,P1,VarList,VarList) :-
        M > N,!.
項複写(M,N,P,P1,VarList1,VarList2) :-
        arg(M,P,T),
        arg(M,P1,T1),
        項複写(T,T1,VarList1,VarList3),
        M1 is M + 1,
        項複写(M1,N,P,P1,VarList3,VarList2),!.

% *** user: 項複写 / 4 ***

項複写(P,P1,VarList1,VarList2) :-
        struct(P),
        functor(P,F,A),
        functor(P1,F,A),
        項複写(1,A,P,P1,VarList1,VarList2),!.
項複写(P,P1,VarList1,[(P,P1)|Varlist2]) :-
        var(P),
        変数リストの更新(P,P1,VarList1,VarList2),!.
項複写(P,P1,VarList,VarList) :-
        \+(var(P)),
        atom_to_term(P,Q,_),
        \+(P == Q),
        sprintf(%q,[P],P1),!.
項複写(P,P,Varlist,VarList).

% *** user: 項複写 / 2 ***

項複写(_項1,_項2) :-
        項複写(_項1,_項2,[],VarList),!.

% *** user: 変数リストの更新 / 4 ***

変数リストの更新(P1,P2,[],[]) :- !.
変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :-
        V1 == P1,
        V2 = P2,
        変数リストの更新(P1,P2,R3,R4),!.
変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :-
        \+(V1 == P1),
        変数リストの更新(P1,P2,R3,R4),!.

#  述語 項複写/2 を定義してください。第二引数に以下のように複写された項が
#       戻されます。
#  
#       ?- 項複写(p(u,A,B,A),X).
#       X = p(u,_1,_2,_1).
#
#       A が 2つ現れるので、複写された項にも _1 が2つ必要。
#       基本的にはfunctor/3や=../2を使えば構造の複写はできるのですが、
#       最終的に第一引数に現れる共通する変数の関係を第二引数の項に
#       反映しなくてはなりません。
#       これをどうやって定義するか?  

% *** user: 項複写 / 6 ***

項複写(M,N,P,P1,VarList,VarList) :-
        M > N,!.
項複写(M,N,P,P1,VarList1,VarList2) :-
        arg(M,P,T),
        arg(M,P1,T1),
        項複写(T,T1,VarList1,VarList3),
        M1 is M + 1,
        項複写(M1,N,P,P1,VarList3,VarList2),!.

% *** user: 項複写 / 4 ***

項複写(P,P1,VarList1,VarList2) :-
        struct(P),
        functor(P,F,A),
        functor(P1,F,A),
        項複写(1,A,P,P1,VarList1,VarList2),!.
項複写(P,P1,VarList1,[(P,P1)|Varlist2]) :-
        var(P),
        変数リストの更新(P,P1,VarList1,VarList2),!.
項複写(P,P1,VarList,VarList) :-
        \+(var(P)),
        atom_to_term(P,Q,_),
        \+(P == Q),
        sprintf(%q,[P],P1),!.
項複写(P,P,Varlist,VarList).

% *** user: 項複写 / 2 ***

項複写(_項1,_項2) :-
        項複写(_項1,_項2,[],VarList),!.

% *** user: 変数リストの更新 / 4 ***

変数リストの更新(P1,P2,[],[]) :- !.
変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,P2)|R4]) :-
        V1 == P1,
        V2 = P2,
        変数リストの更新(P1,P2,R3,R4),!.
変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :-
        \+(V1 == P1),
        変数リストの更新(P1,P2,R3,R4),!.

#  述語 項複写/2 を定義してください。第二引数に以下のように複写された項が
#       戻されます。
#  
#       ?- 項複写(p(u,A,B,A),X).
#       X = p(u,_1,_2,_1).
#
#       A が 2つ現れるので、複写された項にも _1 が2つ必要。
#       基本的にはfunctor/3や=../2を使えば構造の複写はできるのですが、
#       最終的に第一引数に現れる共通する変数の関係を第二引数の項に
#       反映しなくてはなりません。
#       これをどうやって定義するか?  

% *** user: 項複写 / 6 ***

項複写(M,N,P,P1,VarList,VarList) :-
        M > N,!.
項複写(M,N,P,P1,VarList1,VarList2) :-
        arg(M,P,T),
        arg(M,P1,T1),
        項複写(T,T1,VarList1,VarList3),
        M1 is M + 1,
        項複写(M1,N,P,P1,VarList3,VarList2),!.

% *** user: 項複写 / 4 ***

項複写(P,P1,VarList1,VarList2) :-
        struct(P),
        functor(P,F,A),
        functor(P1,F,A),
        項複写(1,A,P,P1,VarList1,VarList2),!.
項複写(P,P1,VarList1,[(P,P1)|Varlist2]) :-
        var(P),
        変数リストの更新(P,P1,VarList1,VarList2),!.
項複写(P,P1,VarList,VarList) :-
        \+(var(P)),
        atom_to_term(P,Q,_),
        \+(P == Q),
        sprintf(%q,[P],P1),!.
項複写(P,P,Varlist,VarList).

% *** user: 項複写 / 2 ***

項複写(_項1,_項2) :-
        項複写(_項1,_項2,[],VarList),!.

% *** user: 変数リストの更新 / 4 ***

変数リストの更新(P1,P2,[],[]) :- !.
変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,P2)|R4]) :-
        V1 == P1,
        V2 = P2,
        変数リストの更新(P1,P2,R3,R4),!.
変数リストの更新(P1,P2,[(V1,V2)|R3],[(V1,V2)|R4]) :-
        \+(V1 == P1),
        変数リストの更新(P1,P2,R3,R4),!.


http://hibari.2ch.net/test/read.cgi/tech/1308749241/124
#  [1] 授業単元:プログラミング演習 1 
#  [2] 問題文(含コード&リンク) 
#  結果が以下のようになるC言語プログラムを作りなさい。 
#  行列A,Bの各要素はscanf関数を使って標準入力から設定すること 
#   
#  Matrix A 
#      5.0    4.0    3.0 
#      4.0    3.0    2.0 
#      3.0    2.0    1.0 
#   
#  Matrix B 
#      1.0    2.0    3.0 
#      2.0    3.0    4.0 
#      3.0    4.0    5.0 
#   
#  Matrix C = A - B 
#      4.0    2.0    0.0 
#      2.0    0.0   -2.0 
#      0.0   -2.0   -4.0 
#   
#  Matrix D = A * B 
#     22.0   34.0   46.0 
#     16.0   25.0   34.0 
#     10.0   16.0   22.0        
#   
#  [3.1] OS: unix  
#  [3.2] コンパイラ名とバージョン: gcc  
#  [3.3] 言語: C  
#  [4] 期限:6月29日  
#  よろしくお願いします。 
 
'MatrixA'([[5.0,4.0,3.0],
            4.0,3.0,2.0],
            3.0,2.0,1.0]]).

'MatrixB'([[1.0,2.0,3.0],
           [2.0,3.0,4.0],
           [3.0,4.0,5.0]]).
   
'Matrix C = A - B' :-
        'MatrixA'(_行列A),
        'MatrixB'(_行列B),
        行列の差(_行列A,_行列B,_行列C),
        行列表示(_行列C).

行列の差([],[],[]) :- ! .
行列の差([A|R1],[B|R2],[C|R3]) :-
        行列の差の一(A,B,C),
        行列の差(R1,R2,R3),!.

行列の差の一([],[],[]) :- !.
行列の差の一([A|R1],[B|R2],[C|R3]) :-
        C is A - B,
        行列の差の一(R1,R2,R3),!.
行列の積(L1,L2,X) :-
        行列の転置(L2,L4),
        行列の積_1(L1,L4,X).
行列の積_1([],_,[]) :- !.
行列の積_1([A|R1],L,[S1|R3]) :-
        行列の積_2(A,L,S1),
        行列の積_1(R1,L,R3) .

行列の積_2(_,[],[]) :- !.
行列の積_2(A,[B|R2],[C|R3]) :-
         行列の積_3(A,B,C),
         行列の積_2(A,R2,R3).

行列の積_3([],[],0) :- !.
行列の積_3([A|R1],[B|R2],S) :-
        S1 is A * B,
        行列の積_3(R1,R2,S2),
        S is S1 + S2.

行列の転置([],[],[]) :- !.
行列の転置([[A|R]|R1],[A|R2],[R|R3]) :-
        行列の転置(R1,R2,R3).

行列の転置([[]|_],[]) :- !.
行列の転置(L,[B|R1]) :-
        行列の転置(L,B,R2),
        行列の転置(R2,R1),!.

行列表示(_行列) :-
        append(_,[L|R],_行列),
        append(_,[A|R1],L),
        writef('%8r',[A]),
        R1 = [],
        write('\n'),
        R = [],!.