このディレクトリの索引

http://pc12.2ch.net/test/read.cgi/tech/1247636661/669
# ちょっと質問
# レシピリスト
#  オムレツ:卵 バター
#  オムライス:卵 バター ご飯 玉葱 人参 ベーコン
#  カレー:じゃがいも 人参 玉葱 牛肉 ルー
#  ・・・
# 在庫リスト
# 豚肉 バター じゃがいも トマト 牛乳・・・
#
# というリストがあり、今の在庫でどんなものが出来るか、
# どんなものが出来そうか?を優先順位つけたい場合
# どういうやり方がスマートでしょう?
# レシピリストを頭から順に、在庫リストと総当たりで比較?
# 逆に在庫リストにあるものを1個ずつ拾ってレシピリストと比較?
#
# こういうプログラムってどっかにあるかなぁ 

作ることのできるお勧め料理は(_料理ならび) :-
    料理種別を選択してもらう(_種別),
    現在の材料で作ることのできる料理を探す(_料理ならびの一),
    確信度が高い順に並べ直す(_種別,_料理ならびの一,_料理ならび).

現在の材料で作ることのできる料理を探す([_料理|R]) :-
    レシピ(_料理,_材料ならび),
    すべての材料が在庫としてある(_材料ならび),
    現在の材料で作ることのできる料理を探す(R).
現在の材料で作ることのできる料理を探す([]).

すべての材料が在庫としてある([]) :- !.
すべての材料が在庫としてある([_材料|R]) :-
    在庫(_材料),
    すべての材料が在庫としてある(R).

料理種別を選択してもらう(_種別) :-
    write('どんな種類の料理をお望みですか\n'),
    get_line(_文),
    料理種別を選択してもらう(_文,_種別).

料理種別を選択してもらう(_文,_種別) :-
    文を解析して種別を得る(_文,_種別),
    member(_種別,[肉料理,魚料理,卵料理]),!.
料理種別を選択してもらう(_,_種別) :-
    write('申し訳ございませんが現在ご用意できるのは'),
    可能な料理種別を列挙する,
    write('しかございません。この中からお選びください\n'),
    get_line(_文),
    料理種別を選択してもらう(_文,_種別).

可能な料理種別を列挙する :-
    concat_atom([肉料理,魚料理,卵料理],と,_列挙文字列),
    write_formatted('%t',[_列挙文字列]).

確信度が高い順に並べ直す(_種別,_料理ならびの一,_料理ならび) :-
    料理ならびに確信度を付加(_種別,_料理ならびの一,_確信度が先頭に付いた料理ならび),
    rsort(_確信度が先頭に付いた料理ならび,_確信度が先頭に付いた料理ならびの二),
    先頭の確信度を外す(_確信度が先頭に付いた料理ならびの二,_料理ならび).

料理ならびに確信度を付加(_,[],[]) :- !.
料理ならびに確信度を付加(_種別,[_料理|R1],[[_確信度,_料理]|R2]) :-
    分類確信度(_種別,_料理,_確信度),
    料理ならびに確信度を付加(_種別,R1,R2),!.
料理ならびに確信度を付加(_種別,[_料理|R1],[[0,_料理]|R2]) :-
    料理ならびに確信度を付加(_種別,R1,R2),!.

先頭の確信度を外す([],[]) :- !.
先頭の確信度を外す([[_|_料理]|R1],[_料理|R2]) :-
    先頭の確信度を外す(R1,R2).

レシピ(オムレツ,[卵,バター]).
レシピ(オムライス,[卵,バター,ご飯,玉葱,人参,ベーコン]).
レシピ(カレー,[じゃがいも,人参,玉葱,牛肉,ルー]).

在庫(豚肉).
在庫(バター).
在庫(じゃがいも).
在庫(トマト).
在庫(牛乳).
在庫(卵).
在庫(人参).

分類確信度(肉料理,オムレツ,20).
分類確信度(肉料理,カレー,50).
分類確信度(肉料理,ターンシチュー,90).
分類確信度(肉料理,ビーフステーキ,100).
分類確信度(卵料理,ボイルドエッグ,100).
分類確信度(卵料理,ベーコンスクランブル,80).
分類確信度(卵料理,茶碗蒸し,70).
分類確信度(卵料理,オムレツ,60).
分類確信度(魚料理,シュリンプカレー,80).

文を解析して料理種別を得る(_文,_種別) :-
    atom_chars(_文,_文字ならび),
    料理種別を解析して得る(_文字ならび,R,_種別).

料理種別を解析して得る(_文,_残りの文,_種別) :-
    料理種別(_文,_残りの文の一,_種別),
    料理種別の後置詞(_残りの文の一,_残りの文),
    料理種別の述部(_残りの文の二,_残りの文).
料理種別を解析して得る(_文,_残りの文,_種別) :-
    料理種別(_文,_残りの文の一,_種別),
    料理種別の後置詞(_残りの文の一,_残りの文),!.
料理種別を解析して得る(_文,_残りの文,_種別) :-
    料理種別(_文,[],_種別),!.

料理種別([肉,料,理|R],R,肉料理).
料理種別([卵,料,理|R],R,卵料理).
料理種別([魚,料,理|R],R,魚料理).
料理種別([す,っ,ぽ,ん,料,理|R],R,すっぽん料理).

料理種別の後置詞([を|R],R).
料理種別の後置詞([が|R],R).

料理種別の述部([食,べ,た,い|R],R).
料理種別の述部([く,だ,さ,い|R],R).

rsort(L1,L2) :- sort(L1,L3),reverse(L3,L2).