このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1284632294/944
#  [1] 授業単元:基礎プログラミング  
#  [2] 問題文(含コード&リンク)  
#  下記の様に、料理名の入力や材料名をキーボードより入力して、人数分の料理のレシピを計算して表示するプログラムを作成しなさい. 
#  今日の料理名は何ですか:(料理名) 
#  
材料名は何ですか:( 材料)
 
#  ( 材料) は一人当たり何グラム必要ですか:(分量) 
#  
何人分の料理を作りますか:(人数) 
#  
==レシピ== 
#  今日は、(料理名)を作りましょう。 
#  
「(料理名)を(人数)人分作るには,(改行) 
#  
( 材料) が ( 分量×人数 ) グラム必要です」
 
#  *()内の料理名や材料には自分の好きな名前を考えてください。
* 人数、分量はキーボードから入力した値を使用してください。
 
#  printf 関数内で%sや%dを使用して、文字列(料理名・材料名)や整数値(人数・分量)を表示すること。 
#  

:- 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(300,fx,大匙).
:- op(300,fx,小匙).
:- op(250,xf,杯).

レシピの作成 :-
        write('今日の料理名は何ですか: '),
        get_line(_料理名),
        材料を入力(_材料ならび),
        write('何人前のレシピを作りますか : '),
        get_integer(_何人前),
        レシピの作成(_料理名,_何人前,_材料ならび),
        作り方の入力(1,_作り方ならび),
        作り方の定義(_料理名,_作り方ならび).

材料を入力([[_材料,_一人当たりの分量]|R]) :-
        write('どんな材料を使いますか : '),
        get_line(_材料),
        \+(_材料 = ''),
        write('一人当たりの分量を入力してください : '),
        get_line(_一人当たりの分量),
        atom_to_term(Line,_一人当たりの分量,_),
        材料を入力(R).
材料を入力([]).

レシピの作成(_料理名,_何人前,[]) :- !.
レシピの作成(_料理名,_何人前,[[_材料,_分量]|R]) :-
        量の換算(_一人当たりの分量,_何人前,_分量),
        assertz(レシピ(_料理名,_材料,_何人前,_分量)),
        レシピの作成(_料理名,_何人前,R).

量の換算(A,M-N,B) :-
        _何人前 is (M+N) // 2,
        量の換算(A,_何人前,B),!.
量の換算(少々,_,少々) :- !.
量の換算(少量,_,少量) :- !.
量の換算(適量,_,適量) :- !.
量の換算(N g,_何人前,M g) :- M is truncate(N * _何人前),!. 
量の換算(N kg,_何人前,M g) :- M is truncate(1000 * N * _何人前),!. 
量の換算(N cc,_何人前,M cc) :- M is truncate(N * _何人前),!. 
量の換算(N 羽,_何人前,M 羽) :- M is truncate(N * _何人前),!. 
量の換算(N1-N2 個,_何人前,M1-M2 個) :- M1 is truncate(N1 * _何人前),M2 is truncate(N2 * _何人前),!. 
量の換算(N 個,_何人前,M 個分) :- M is truncate(N * _何人前),!. 
量の換算(N 個,_何人前,M 個) :- M is truncate(N * _何人前),!. 
量の換算(N 尾,_何人前,M 尾) :- M is truncate(N * _何人前),!. 
量の換算(N1-N2 枚,_何人前,M1-M2 枚) :- M1 is truncate(N1 * _何人前),M2 is truncate(N2 * _何人前),!. 
量の換算(N 枚,_何人前,M 枚) :- M is truncate(N * _何人前),!. 
量の換算(N リットル,_何人前,M cc) :- M is truncate(1000 * N * _何人前),!. 
量の換算(N 串,_何人前,M 串) :- M is truncate(N * _何人前),!. 
量の換算(N 欠片,_何人前,M 欠片) :- M is truncate(N * _何人前),!. 
量の換算(N 瓶,_何人前,M 瓶) :- M is truncate(N * _何人前),!. 
量の換算(N カップ,_何人前,M カップ) :- M is truncate(N * _何人前),!. 
量の換算(大匙 N 杯,_何人前,大匙 M 杯) :- M is truncate(N * _何人前),!. 
量の換算(小匙 N 杯,_何人前,小匙 M 杯) :- M is truncate(N * _何人前),!. 

レシピの保存(_料理名) :-
        concat_atom([レシピ,'/',_料理名,'.pro'],_保存ファイル名),
        tell(_保存ファイル名),
        listing(レシピ/4),
        told.

作り方の入力(N,[[N,_作業]|R]) :-
        get_line(_作業),
        \+(_作業 = ''),
        N2 is N + 1,
        作り方の入力(N2,R).
作り方の入力(_,[]).

作り方の定義(_料理名,[]) :- !.
作り方の定義(_料理名,[[_手順番号,_手順]|R]) :-
        assertz(作り方(_料理名,_手順番号,_手順)),
        作り方の定義(_料理名,R).

作り方の保存(_料理名) :-
        concat_atom([作り方,'/',_料理名,'.pro'],_保存ファイル名),
        tell(_保存ファイル名),
        listing(作り方/3),
        told.

/*

レシピ(カエルのバターとブドウ酒の煮込み,皮を剥いだカエルの足,6,900 g).
レシピ(カエルのバターとブドウ酒の煮込み,辛口の白ブドウ酒,6,200 cc).
レシピ(カエルのバターとブドウ酒の煮込み,小麦粉,6,3 g).
レシピ(カエルのバターとブドウ酒の煮込み,塩,6,少々).
レシピ(カエルのバターとブドウ酒の煮込み,パセリのみじん切り,6,2-3 枚).
レシピ(カエルのバターとブドウ酒の煮込み,レモン,6,1 個).

レシピ(すずきの白ブドウ酒入り蒸し焼き,'海すずき(1.1kg)',6,1 尾).
レシピ(すずきの白ブドウ酒入り蒸し焼き,塩,6,少量).
レシピ(すずきの白ブドウ酒入り蒸し焼き,辛口白ブドウ酒,6,400 cc).
レシピ(すずきの白ブドウ酒入り蒸し焼き,バター,6,25 g).

作り方(カエルのバターとブドウ酒の煮込み,1,'マリネのためにブドウ酒を使ってカエルの足を浸す').
作り方(カエルのバターとブドウ酒の煮込み,2,'バターを深底のフライパンに溶かす').
作り方(カエルのバターとブドウ酒の煮込み,3,'マリネからカエルの足を取り出したおく').
作り方(カエルのバターとブドウ酒の煮込み,4,'フライパンにブドウ酒をそそぎ、バターとよく混ぜ合わせ、足を加える').
作り方(カエルのバターとブドウ酒の煮込み,5,'ブドウ酒が半量煮つまるまで、中火で煮る').
作り方(カエルのバターとブドウ酒の煮込み,6,'小麦粉、塩少々、パセリ、水 30ccを混ぜ合わせる').
作り方(カエルのバターとブドウ酒の煮込み,7,'フライパンに入れて混ぜ合わせる').
作り方(カエルのバターとブドウ酒の煮込み,8,'中火でさらに15分火を通し続ける').
作り方(カエルのバターとブドウ酒の煮込み,9,'供する前に、カエルの足にレモン汁をふりかけて、供する').

作り方(すずきの白ブドウ酒入り蒸し焼き,1,'皮に傷をつけないように下ごしらえする。魚はきざみ目をつけて内側に塩をする。').
作り方(すずきの白ブドウ酒入り蒸し焼き,2,'鍋にブドウ酒、バター、塩少量を入れて魚を入れ、蓋をして中火のオープンで約20分間魚がやわらかくなるまで蒸し焼きにする。').
作り方(すずきの白ブドウ酒入り蒸し焼き,3,'魚を皿に盛り魚の背中に2~3つの切り目をつけ、上から濾した煮汁をかけてすぐ供する。').

*/