Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Browse files

init

  • Loading branch information...
commit 85288a2a1e83497cdbf612055422ae990f4324db 0 parents
Simon Kaltenbacher authored
Showing with 1,319 additions and 0 deletions.
  1. +5 −0 README
  2. +136 −0 interface.pl
  3. +204 −0 lambda.pl
  4. +11 −0 rdf.pl
  5. +881 −0 recipes.pl
  6. +82 −0 util.pl
5 README
@@ -0,0 +1,5 @@
+%----------------------------------------------------------------------------
+% README
+%----------------------------------------------------------------------------
+
+This is a recipe collection in Prolog.
136 interface.pl
@@ -0,0 +1,136 @@
+:- module(interface, [printRecipe/2, listRecipes/0, optRep/2, listIngId/1]).
+
+:- use_module(library(lists)).
+:- use_module(library(apply)).
+:- use_module(lambda).
+:- use_module(rdf).
+:- use_module(recipes).
+:- use_module(util).
+
+% roundNot0(+Value, +N, ?RValue)
+roundNot0(0, _, 0) :- !.
+roundNot0(Value, N, RValue) :- round(Value, N, RValue), RValue > 0, !.
+roundNot0(Value, N1, RValue) :- N2 is N1 + 1, roundNot0(Value, N2, RValue).
+
+% Computes the optimal representation of a value with a unit.
+% optRep((+Value, +Unit), (?OptValue, ?OptUnit))
+optRep((Value, unit:Unit), (OptValue, unit:OptUnit)) :-
+ translation(unit:RefUnit, Factor1, unit:Unit),
+ findall((OptValue, OptUnit),
+ (translation(unit:RefUnit, Factor2, unit:OptUnit), OptValue is Value * Factor1 / Factor2, OptValue >= 1),
+ Reps),
+ sort(Reps, [(OptValue, OptUnit)|_]), !.
+optRep((Value, unit:Unit), (Value, unit:Unit)).
+
+prettify((Value, unit:Unit), (PValue, unit:PUnit)) :-
+ optRep((Value, unit:Unit), (OptValue, unit:PUnit)),
+ (p(unit:PUnit, precision, Precision) ->
+ roundNot0(OptValue, Precision, PValue)
+ ;
+ PValue = OptValue
+ ).
+
+% resolveName(+Quantity, +Id, ?Name)
+resolveName(Quantity, Id, Name) :-
+ Quantity =:= 1,
+ p(Id, singular, Name)
+ ;
+ Quantity =\= 1,
+ p(Id, plural, Name)
+ ;
+ p(Id, name, Name).
+
+% listIngId(+SearchTerm)
+listIngId(SearchTerm) :-
+ findall(
+ (ingredient:Id, Name),
+ (
+ member(Prop, [name, singular, plural]),
+ getId(SearchTerm, ingredient:Id, Prop, _, Name)
+ ),
+ IdNames
+ ),
+ (IdNames = [] ->
+ writeln('Die Suchanfrage lieferte keine Ergebnisse.')
+ ;
+ sort(IdNames, SIdNames),
+ group(SIdNames, IdGroups),
+ forall(
+ nth1(N, IdGroups, (Id, Names)),
+ (
+ write(N), write('. '),
+ atomic_list_concat(Names, ', ', Str),
+ writeln(Str),
+ write(' '), write(Id), nl
+ )
+ )
+ ).
+
+% printIng(+Statement, +Persons)
+% i
+printIng(i(ingredient:Ingredient), _) :-
+ p(ingredient:Ingredient, name, Name),
+ write(Name).
+% qi
+printIng(qi(Quantity1, ingredient:Ingredient), Factor) :-
+ Quantity2 is Quantity1 * Factor,
+ (
+ p(ingredient:Ingredient, precision, Precision), !
+ ;
+ Precision = 0
+ ),
+ roundNot0(Quantity2, Precision, RQuantity),
+ resolveName(RQuantity, ingredient:Ingredient, Name),
+ write(RQuantity), write(' '), write(Name).
+% qui
+printIng(qui(Quantity1, unit:Unit, ingredient:Ingredient), Factor) :-
+ Quantity2 is Quantity1 * Factor,
+ prettify((Quantity2, unit:Unit), (PQuantity, unit:PUnit)),
+ (
+ p(ingredient:Ingredient, name, IngredientName)
+ ;
+ p(ingredient:Ingredient, plural, IngredientName)
+ ),
+ resolveName(PQuantity, unit:PUnit, UnitName),
+ write(PQuantity), write(' '), write(UnitName), write(' '), write(IngredientName).
+
+% printPreparation
+printPreparation(recipe:Id) :-
+ p(recipe:Id, preparation, Text),
+ write(Text), nl.
+
+% printRecipe(+SearchTerm, ?Persons)
+printRecipe(SearchTerm, Persons) :-
+ setof((Start, L) - (Id, Name), (getId(SearchTerm, recipe:Id, name, Start, Name), atom_length(Name, L)), StartLengthIds),
+ (
+ StartLengthIds = [_ - (Id, _)], !
+ ;
+ StartLengthIds = [_|_],
+ keysort(StartLengthIds, SortedStartLengthIds),
+ nl, write('Folgende Rezepte wurden zu deiner Suchanfrage gefunden:'), nl, nl,
+ forall(nth1(Nth, SortedStartLengthIds, _ - (Id, Name)), (write(Nth), write('. '), write(Name), nl)), nl,
+ write('Auswahl: '), read(Sel),
+ nth1(Sel, SortedStartLengthIds, _ - (Id, _))
+ ),
+ printRecipe_aux(recipe:Id, Persons, 1).
+
+% printRecipe_aux
+printRecipe_aux(recipe:Id1, Persons, Factor1) :-
+ Persons > 0,
+ p(recipe:Id1, name, RecipeName),
+ nl, writeln('%--------------------------------------------------------------'),
+ write('% '), write(RecipeName), nl,
+ writeln('%--------------------------------------------------------------'), nl,
+ write('% Zutaten für '), write(Persons), (Persons > 1 -> write(' Personen'); write(' Person')), nl, nl,
+ printIngs(recipe:Id1, Persons, Factor1), nl,
+ writeln('% Zubereitung'), nl,
+ printPreparation(recipe:Id1),
+ forall(p(recipe:Id1, ref, (Factor2, recipe:Id2)), (Factor3 is Factor1 * Factor2, printRecipe_aux(recipe:Id2, Persons, Factor3))).
+
+% printIngs(+Id, ?Persons)
+printIngs(recipe:Id, Persons1, Factor) :-
+ p(recipe:Id, persons, Persons2),
+ forall(p(recipe:Id, ingredient, S), (printIng(S, Persons1 / Persons2 * Factor), nl)).
+
+% listRecipes
+listRecipes :- listEntities(recipe, '% Rezepte').
204 lambda.pl
@@ -0,0 +1,204 @@
+/*
+ Author: Ulrich Neumerkel
+ E-mail: ulrich@complang.tuwien.ac.at
+ Copyright (C): 2009 Ulrich Neumerkel. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY Ulrich Neumerkel ``AS IS'' AND ANY
+EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Ulrich Neumerkel OR
+CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
+EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
+PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
+PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+The views and conclusions contained in the software and documentation
+are those of the authors and should not be interpreted as representing
+official policies, either expressed or implied, of Ulrich Neumerkel.
+
+
+
+*/
+
+:- module(lambda, [
+ (^)/3, (^)/4, (^)/5, (^)/6, (^)/7, (^)/8, (^)/9,
+ (\)/1, (\)/2, (\)/3, (\)/4, (\)/5, (\)/6, (\)/7,
+ (+\)/2, (+\)/3, (+\)/4, (+\)/5, (+\)/6, (+\)/7,
+ op(201,xfx,+\)]).
+
+/** <module> Lambda expressions
+
+This library provides lambda expressions to simplify higher order
+programming based on call/N.
+
+Lambda expressions are represented by ordinary Prolog terms.
+There are two kinds of lambda expressions:
+
+ Free+\X1^X2^ ..^XN^Goal
+
+ \X1^X2^ ..^XN^Goal
+
+The second is a shorthand for t+\X1^X2^..^XN^Goal.
+
+Xi are the parameters.
+
+Goal is a goal or continuation. Syntax note: Operators within Goal
+require parentheses due to the low precedence of the ^ operator.
+
+Free contains variables that are valid outside the scope of the lambda
+expression. They are thus free variables within.
+
+All other variables of Goal are considered local variables. They must
+not appear outside the lambda expression. This restriction is
+currently not checked. Violations may lead to unexpected bindings.
+
+In the following example the parentheses around X>3 are necessary.
+
+==
+?- use_module(library(lambda)).
+?- use_module(library(apply)).
+
+?- maplist(\X^(X>3),[4,5,9]).
+true.
+==
+
+In the following X is a variable that is shared by both instances of
+the lambda expression. The second query illustrates the cooperation of
+continuations and lambdas. The lambda expression is in this case a
+continuation expecting a further argument.
+
+==
+?- Xs = [A,B], maplist(X+\Y^dif(X,Y), Xs).
+Xs = [A, B],
+dif(X, A),
+dif(X, B).
+
+?- Xs = [A,B], maplist(X+\dif(X), Xs).
+Xs = [A, B],
+dif(X, A),
+dif(X, B).
+==
+
+The following queries are all equivalent. To see this, use
+the fact f(x,y).
+==
+?- call(f,A1,A2).
+?- call(\X^f(X),A1,A2).
+?- call(\X^Y^f(X,Y), A1,A2).
+?- call(\X^(X+\Y^f(X,Y)), A1,A2).
+?- call(call(f, A1),A2).
+?- call(f(A1),A2).
+?- f(A1,A2).
+A1 = x,
+A2 = y.
+==
+
+Further discussions
+http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord
+
+@tbd Static expansion similar to apply_macros.
+@author Ulrich Neumerkel
+*/
+
+:- meta_predicate no_hat_call(0).
+
+:- meta_predicate
+ ^(?,0,?),
+ ^(?,1,?,?),
+ ^(?,2,?,?,?),
+ ^(?,3,?,?,?,?),
+ ^(?,4,?,?,?,?,?).
+
+^(V1,Goal,V1) :-
+ no_hat_call(Goal).
+^(V1,Goal,V1,V2) :-
+ call(Goal,V2).
+^(V1,Goal,V1,V2,V3) :-
+ call(Goal,V2,V3).
+^(V1,Goal,V1,V2,V3,V4) :-
+ call(Goal,V2,V3,V4).
+^(V1,Goal,V1,V2,V3,V4,V5) :-
+ call(Goal,V2,V3,V4,V5).
+^(V1,Goal,V1,V2,V3,V4,V5,V6) :-
+ call(Goal,V2,V3,V4,V5,V6).
+^(V1,Goal,V1,V2,V3,V4,V5,V6,V7) :-
+ call(Goal,V2,V3,V4,V5,V6,V7).
+
+:- meta_predicate
+ \(0),
+ \(1,?),
+ \(2,?,?),
+ \(3,?,?,?),
+ \(4,?,?,?,?),
+ \(5,?,?,?,?,?),
+ \(6,?,?,?,?,?,?).
+
+\(FC) :-
+ copy_term_nat(FC,C),no_hat_call(C).
+\(FC,V1) :-
+ copy_term_nat(FC,C),call(C,V1).
+\(FC,V1,V2) :-
+ copy_term_nat(FC,C),call(C,V1,V2).
+\(FC,V1,V2,V3) :-
+ copy_term_nat(FC,C),call(C,V1,V2,V3).
+\(FC,V1,V2,V3,V4) :-
+ copy_term_nat(FC,C),call(C,V1,V2,V3,V4).
+\(FC,V1,V2,V3,V4,V5) :-
+ copy_term_nat(FC,C),call(C,V1,V2,V3,V4,V5).
+\(FC,V1,V2,V3,V4,V5,V6) :-
+ copy_term_nat(FC,C),call(C,V1,V2,V3,V4,V5,V6).
+
+:- meta_predicate
+ +\(?,0),
+ +\(?,1,?),
+ +\(?,2,?,?),
+ +\(?,3,?,?,?),
+ +\(?,4,?,?,?,?),
+ +\(?,5,?,?,?,?,?),
+ +\(?,6,?,?,?,?,?,?).
+
++\(GV,FC) :-
+ copy_term_nat(GV+FC,GV+C),no_hat_call(C).
++\(GV,FC,V1) :-
+ copy_term_nat(GV+FC,GV+C),call(C,V1).
++\(GV,FC,V1,V2) :-
+ copy_term_nat(GV+FC,GV+C),call(C,V1,V2).
++\(GV,FC,V1,V2,V3) :-
+ copy_term_nat(GV+FC,GV+C),call(C,V1,V2,V3).
++\(GV,FC,V1,V2,V3,V4) :-
+ copy_term_nat(GV+FC,GV+C),call(C,V1,V2,V3,V4).
++\(GV,FC,V1,V2,V3,V4,V5) :-
+ copy_term_nat(GV+FC,GV+C),call(C,V1,V2,V3,V4,V5).
++\(GV,FC,V1,V2,V3,V4,V5,V6) :-
+ copy_term_nat(GV+FC,GV+C),call(C,V1,V2,V3,V4,V5,V6).
+
+
+%% no_hat_call(:Goal)
+%
+% Like call, but issues an error for a goal (^)/2. Such goals are
+% likely the result of an insufficient number of arguments.
+
+no_hat_call(MGoal) :-
+ strip_module(MGoal, _, Goal),
+ ( nonvar(Goal),
+ Goal = (_^_)
+ -> throw(error(existence_error(lambda_parameters,Goal),_))
+ ; call(MGoal)
+ ).
+
+% I would like to replace this by:
+% V1^Goal :- throw(error(existence_error(lambda_parameters,V1^Goal),_)).
11 rdf.pl
@@ -0,0 +1,11 @@
+:- module(rdf,[getId/5]).
+
+:- use_module(recipes).
+:- use_module(util).
+
+% getId(+SearchTerm, ?Id, ?Prop, ?Start, ?Name)
+getId(SearchTerm, Ns:Id, Prop, Start, Name) :-
+ p(Ns:Id, Prop, Name),
+ downcase_atom(SearchTerm, DSearchTerm),
+ downcase_atom(Name, DName),
+ once(sub_atom(DName, Start, _, _, DSearchTerm)).
881 recipes.pl
@@ -0,0 +1,881 @@
+:- module(recipes, [translation/3, p/3]).
+
+:- style_check(-atom).
+:- set_prolog_flag(encoding, utf8).
+
+% TODO Mengenangaben im Fließtext umrechnen!
+
+%---------------------------------------------------------------
+% Einheitensystem
+%---------------------------------------------------------------
+
+%---------------------------------------------------------------
+% Umrechnung
+%---------------------------------------------------------------
+
+translation(unit:g, 1, unit:g).
+translation(unit:g, 1000, unit:kg).
+translation(unit:g, 1000000, unit:t).
+translation(unit:ml, 1, unit:ml).
+translation(unit:ml, 1000, unit:l).
+
+%---------------------------------------------------------------
+% Maßeinheiten
+%---------------------------------------------------------------
+
+% Bund
+p(unit:bunch, name, 'Bund').
+p(unit:bunch, precision, 1).
+
+% Eßlöffel
+p(unit:tablespoon, name, 'EL').
+p(unit:tablespoon, precision, 1).
+
+% Gramm
+p(unit:g, name, 'g').
+p(unit:g, precision, 0).
+
+% Kilogramm
+p(unit:kg, name, 'kg').
+p(unit:kg, precision, 1).
+
+% Liter
+p(unit:l, name, 'l').
+p(unit:l, precision, 1).
+
+% Mililiter
+p(unit:ml, name, 'ml').
+p(unit:ml, precision, 0).
+
+% Tasse
+p(unit:cup, singular, 'Tasse').
+p(unit:cup, plural, 'Tassen').
+p(unit:cup, precision, 1).
+
+% Teelöffel
+p(unit:teaspoon, name, 'TL').
+p(unit:teaspoon, precision, 1).
+
+%---------------------------------------------------------------
+% Zutaten
+%---------------------------------------------------------------
+
+%---------------------------------------------------------------
+% Alkoholhaltige Zutaten
+%---------------------------------------------------------------
+
+% Sherry
+p(ingredient:alcohols:sherry, name, 'Sherry').
+
+% Wein, rot
+p(ingredient:alcohols:wine:red, name, 'Rotwein').
+
+% Wein, rot, Marsala
+p(ingredient:alcohols:wine:red:marsala, name, 'Marsala').
+
+% Wein, weiß
+p(ingredient:alcohols:wine:white, name, 'Weißwein').
+
+%---------------------------------------------------------------
+% Fleischprodukte
+%---------------------------------------------------------------
+
+% Fisch, Lachs
+p(ingredient:animalProducts:fish:salmon, name, 'Lachs').
+
+% Hähnchen, Filet
+p(ingredient:animalProducts:chicken:filet, name, 'Hähnchenfilet').
+
+% Hack
+p(ingredient:animalProducts:mince, name, 'Hackfleisch').
+
+% Kalb
+p(ingredient:animalProducts:veal, name, 'Kalbfleisch').
+
+% Pute, Brust, halbiert
+p(ingredient:animalProducts:turkey:breast:halfed, singular, 'Putenbrust, halbiert').
+p(ingredient:animalProducts:turkey:breast:halfed, plural, 'Putenbrüste, halbiert').
+
+% Pute, Brust, Filet
+p(ingredient:animalProducts:turkey:breast:filet, name, 'Putenbrustfilet').
+
+% Schinken, Parma-
+p(ingredient:animalProducts:ham:parma:slivered, singular, 'Scheibe Parma Schinken').
+p(ingredient:animalProducts:ham:parma:slivered, plural, 'Scheiben Parma Schinken').
+
+% Speck, gewürfelt
+p(ingredient:animalProducts:bacon:diced, name, 'Speck, gewürfelt').
+
+% Speck, geräuchert, gewürfelt
+p(ingredient:animalProducts:bacon:smoked:diced, name, 'geräuchterter Speck, gewürfelt').
+
+%---------------------------------------------------------------
+% Gemüse
+%---------------------------------------------------------------
+
+% Aubergine
+p(ingredient:vegetables:aubergine, singular, 'Aubergine').
+p(ingredient:vegetables:aubergine, plural, 'Auberginen').
+p(ingredient:vegetables:aubergine, precision, 1).
+
+% Lauchstangen
+p(ingredient:vegetables:leeks:stalk, singular, 'Lauchstange').
+p(ingredient:vegetables:leeks:stalk, plural, 'Lauchstangen').
+
+% Möhre
+p(ingredient:vegetables:carrot, singular, 'Möhre').
+p(ingredient:vegetables:carrot, plural, 'Möhren').
+
+% Paprika
+p(ingredient:vegetables:paprika, singular, 'Paprika').
+p(ingredient:vegetables:paprika, plural, 'Paprikas').
+
+% Pepperoni
+p(ingredient:vegetables:hotPepper:red, singular, 'Peperoni').
+p(ingredient:vegetables:hotPepper:red , plural, 'Peperonis').
+
+% Sellerieknolle
+p(ingredient:vegetables:celery:bulb, singular, 'Sellerieknolle').
+p(ingredient:vegetables:celery:bulb, plural, 'Sellerieknollen').
+
+% Tomate
+p(ingredient:vegetables:tomato:fresh, singular, 'Tomate').
+p(ingredient:vegetables:tomato:fresh, plural, 'Tomaten').
+
+% Tomaten, geschält
+p(ingredient:vegetables:tomato:peeled, singular, 'geschälte Tomate').
+p(ingredient:vegetables:tomato:peeled, plural, 'geschälte Tomaten').
+
+% Tomaten, stückige
+p(ingredient:vegetables:tomato:chopped, name, 'stückige Tomaten').
+
+% Tomaten, passiert
+p(ingredient:vegetables:tomato:passed, name, 'passierte Tomaten').
+
+% Tomatenmark
+p(ingredient:vegetables:tomato:puree, name, 'Tomatenmark').
+
+% Zitrone, Saft
+p(ingredient:vegetables:lemon:juice, name, 'Zitronensaft').
+
+% Zucchini
+p(ingredient:vegetables:courgette, singular, 'Zucchini').
+p(ingredient:vegetables:courgette, plural, 'Zucchinis').
+p(ingredient:vegetables:courgette, precision, 1).
+
+%---------------------------------------------------------------
+% Gewürze
+%---------------------------------------------------------------
+
+% Cayennepfeffer
+p(ingredient:condiment:cayennePepper, name, 'Cayennepfeffer').
+
+% Chili, Pulver
+p(ingredient:condiment:powder, name, 'Chilipulver').
+
+% Chili, Schote, getrocknet
+p(ingredient:condiment:chili:peppers:dried, singular, 'getrocknete Chilischote').
+p(ingredient:condiment:chili:peppers:dried, plural, 'getrocknete Chilischoten').
+
+% Chili, Soße
+p(ingredient:condiment:chili:sauce, name, 'Chilisoße').
+
+% Curry
+p(ingredient:condiment:curry, name, 'Curry').
+
+% Gewürzmischung, Paprika-Rahm Schnitzel, Knorr
+p(ingredient:mixedSpices:paprikaRahmSchnitzel:package:knorr, singular, 'Packung Paprika-Rahm Schnitzel Gewürzmischung von Knorr').
+p(ingredient:mixedSpices:paprikaRahmSchnitzel:package:knorr, plural, 'Packungen Paprika-Rahm Schnitzel Gewürzmischung von Knorr').
+
+% Ingwer, frisch
+p(ingredient:condiment:ginger:fresh, name, 'frischer Ingwer').
+
+% Lorbeerblatt
+p(ingredient:condiment:bay:leaf, singular, 'Lorbeerblatt').
+p(ingredient:condiment:bay:leaf, plural, 'Lorbeerblätter').
+
+% Muskat
+p(ingredient:condiment:nutmeg, name, 'Muskat').
+
+% Pfeffer
+p(ingredient:condiment:pepper:black:grain, singular, 'Pfefferkorn').
+p(ingredient:condiment:pepper:black:grain, plural, 'Pfefferkörner').
+
+% Salbei, Blatt
+p(ingredient:condiment:sage:leaf, singular, 'Salbeiblatt').
+p(ingredient:condiment:sage:leaf, plural, 'Salbeiblätter').
+
+% Sambal oelec
+p(ingredient:condiment:sambalOelec, name, 'Sambal Oelec').
+
+% Salz
+p(ingredient:condiment:salt, name, 'Salz').
+
+% Zimt
+p(ingredient:condiment:cinnamon, name, 'Zimt').
+
+%---------------------------------------------------------------
+% Kräuter
+%---------------------------------------------------------------
+
+% italienisch
+p(ingredient:herbs:italian, name, 'italienische Kräuter').
+
+% Petersilie
+p(ingredient:herbs:parsley, name, 'Petersilie').
+
+% Petersilie, frisch
+p(ingredient:herbs:parsley:fresh, name, 'frische Petersilie').
+
+% Petersilie, gehackt
+p(ingredient:herbs:parsley:minced, name, 'gehackte Petersilie').
+
+% Rosmarin
+p(ingredient:herbs:rosemary, name, 'Rosmarin').
+
+% Thymian
+p(ingredient:herbs:thyme, name, 'Thymian').
+
+%---------------------------------------------------------------
+% Milchprodukte
+%---------------------------------------------------------------
+
+% Butter
+p(ingredient:milk:butter, name, 'Butter').
+
+% Käse
+p(ingredient:milk:cheese, name, 'Käse').
+
+% Käse, gerieben
+p(ingredient:milk:cheese:grated, name, 'geriebener Käse').
+
+% Käse, Gouda, gerieben
+p(ingredient:milk:cheese:gouda:grated, name, 'geriebener Gouda').
+
+% Käse, Mascarpone
+p(ingredient:milk:cheese:mascarpone, name, 'Mascarpone').
+
+% Käse, Parmesan
+p(ingredient:milk:cheese:parmesan, name, 'Parmesan').
+
+% Milch
+p(ingredient:milk, name, 'Milch').
+
+% Sahne, Saure-
+p(ingredient:milk:cream:sour, name, 'Saure Sahne').
+
+% Sahne, Crème fraîche
+p(ingredient:milk:cream:cremeFraiche, name, 'Crème fraîche').
+
+% Sahne, Schlag-
+p(ingredient:milk:cream:whipping, name, 'Schlagsahne').
+
+%---------------------------------------------------------------
+% Obst
+%---------------------------------------------------------------
+
+% Ananas
+p(ingredient:fruits:pineapple, name, 'Ananas').
+
+% Apfel
+p(ingredient:fruits:apple, singular, 'Apfel').
+p(ingredient:fruits:apple, plural, 'Äpfel').
+
+% Kokosmilch
+p(ingredient:fruits:coconutMilk, name, 'Kokosmilch').
+
+% Mango
+p(ingredient:fruits:mango, singular, 'Mango').
+p(ingredient:fruits:mango, plural, 'Mangos').
+
+% Orange, Saft
+p(ingredient:fruits:orange:juice, name, 'Orangensaft').
+
+% Pfirsich
+p(ingredient:fruits:peach, singular, 'Pfirsich').
+p(ingredient:fruits:peach, plural, 'Pfirsiche').
+
+%---------------------------------------------------------------
+% Getreideprodukte
+%---------------------------------------------------------------
+
+% Lasagneplatten
+p(ingredient:corn:pasta:lasagnaSheets, singular, 'Lasagneplatte').
+p(ingredient:corn:pasta:lasagnaSheets, plural, 'Lasagneplatten').
+
+% Mehl
+p(ingredient:corn:flour, name, 'Mehl').
+
+% Nachos
+p(ingredient:corn:nachos, name, 'Nachos').
+
+% Nudeln, Band
+p(ingredient:corn:pasta:ribbon, name, 'Bandnudeln').
+
+% Nudeln, Maccheroni
+p(ingredient:corn:pasta:maccheroni, name, 'Maccheroni').
+
+% Nudeln, Spaghetti
+p(ingredient:corn:pasta:spaghetti, name, 'Spaghetti').
+
+% Reis
+p(ingredient:corn:rice, name, 'Reis').
+
+% Reis, Basmati
+p(ingredient:corn:rice:basmati, name, 'Basmatireis').
+
+%---------------------------------------------------------------
+% Sonstiges
+%---------------------------------------------------------------
+
+% Brühe, Gemüse
+p(ingredient:broth:vegetable, name, 'Gemüsebrühe').
+
+% Eier
+p(ingredient:egg, singular, 'Ei').
+p(ingredient:egg, plural, 'Eier').
+
+% Hefe, frisch
+p(ingredient:yeast:fresh, name, 'frische Hefe').
+
+% Knoblauch
+p(ingredient:garlic:clove, singular, 'Knoblauchzehe').
+p(ingredient:garlic:clove, plural, 'Knoblauchzehen').
+p(ingredient:garlic:clove, precision, 0).
+
+% Nuss, Wal-
+p(ingredient:nut:walnut, singular, 'Walnuss').
+p(ingredient:nut:walnut, plural, 'Walnüsse').
+
+% Öl
+p(ingredient:oil, name, 'Öl').
+
+% Olivenöl
+p(ingredient:oil:olive, name, 'Olivenöl').
+
+% Pilz, Champignon, frisch
+p(ingredient:mushroom:champignon:fresh, name, 'frische Champignons').
+
+% Pilz, Stein-, frisch
+p(ingredient:mushroom:porcini:fresh, singular, 'Steinpilz').
+p(ingredient:mushroom:porcini:fresh, plural, 'Steinpilze').
+
+% Salsa
+p(ingredient:salsa, name, 'Salsa').
+
+% Schalotte
+p(ingredient:shallot, singular, 'Schalotte').
+p(ingredient:shallot, plural, 'Schalottem').
+
+% Sirup, Ahorn
+p(ingredient:syrup:maple, name, 'Ahornsirup').
+
+% Sojasauce
+p(ingredient:soyaSauce, name, 'Sojasauce').
+
+% Wasser
+p(ingredient:water, name, 'Wasser').
+
+% Zucker
+p(ingredient:sugar, name, 'Zucker').
+
+% Zucker, Puder-
+p(ingredient:sugar:powdered, name, 'Puderzucker').
+
+% Zwiebel
+p(ingredient:onion, singular, 'Zwiebel').
+p(ingredient:onion, plural, 'Zwiebeln').
+
+%---------------------------------------------------------------
+% Gerichte
+%---------------------------------------------------------------
+
+%---------------------------------------------------------------
+% Statements ::=
+% | i(Ingredient)
+% | qi(Quantity, Ingredient)
+% | qui(Quantity, Unit, Ingredient)
+%---------------------------------------------------------------
+
+%---------------------------------------------------------------
+% Adjapsandali a la Chatuna
+%---------------------------------------------------------------
+
+% Name
+p(recipe:adjapsandaliALaChatuna, name, 'Adjapsandali a la Chatuna').
+
+% Personenanzahl
+p(recipe:adjapsandaliALaChatuna, persons, 6).
+
+% Zutaten
+p(recipe:adjapsandaliALaChatuna, ingredient, qi(2, ingredient:vegetables:aubergine)).
+p(recipe:adjapsandaliALaChatuna, ingredient, qi(3, ingredient:vegetables:paprika)).
+p(recipe:adjapsandaliALaChatuna, ingredient, qi(2, ingredient:vegetables:courgette)).
+p(recipe:adjapsandaliALaChatuna, ingredient, qi(5, ingredient:vegetables:tomato:fresh)).
+p(recipe:adjapsandaliALaChatuna, ingredient, qi(2, ingredient:onion)).
+p(recipe:adjapsandaliALaChatuna, ingredient, qui(2, unit:tablespoon, ingredient:condiment:sambalOelec)).
+p(recipe:adjapsandaliALaChatuna, ingredient, i(ingredient:herbs:italian)).
+
+% Zubereitung
+p(recipe:adjapsandaliALaChatuna, preparation, 'Auberginen in Scheiben schneiden, halbieren, salzen, einige Zeit stehen lassen, ausdrücken, in Mehl wenden, in heißem Öl braun braten. Die fertigen Auberginen in eine Schüssel geben.
+
+Die Paprika in Scheiben schneiden, in Mehl wenden und in Öl anbraten. Die fertigen Paprika auf die Auberginen geben.
+
+Die Zucchini in Scheiben schneiden, in Mehl wenden und in Öl einzeln braten, über die Paprika geben.
+
+Die Zwiebeln und Tomaaten in Stückchen schneiden und in Öl braten bis eine dicke Soße entsteht. Mit Sambal Oelec würzen und über das geschichtete Gemüse geben.
+
+Zur Dekoration die Kräuter oben auf geben.
+
+Tipp: Man kann Adjapsandali sehr gut schon morgens zubereiten, wenn man abends Gäste erwartet. Es hält sich mehrere Tage. Es hält sich mehrere Tage.
+
+Serviervorschlag: Man kann es warm zu allen möglichen Gerichten servieren oder kalt mit Baguette als Vorspeise. Es eignet sich auch gut fürs kalte Buffet.').
+
+%---------------------------------------------------------------
+% Béchamel Sauce
+%---------------------------------------------------------------
+
+% Name
+p(recipe:bechamelSauce, name, 'Béchamel Sauce').
+
+% Personenanzahl
+p(recipe:bechamelSauce, persons, 4).
+
+% Zutaten
+p(recipe:bechamelSauce, ingredient, qui(75, unit:g, ingredient:corn:flour)).
+p(recipe:bechamelSauce, ingredient, qui(75, unit:g, ingredient:milk:butter)).
+p(recipe:bechamelSauce, ingredient, qi(1, ingredient:condiment:bay:leaf)).
+p(recipe:bechamelSauce, ingredient, qi(5, ingredient:condiment:pepper:black:grain)).
+p(recipe:bechamelSauce, ingredient, qui(750, unit:ml, ingredient:milk)).
+p(recipe:bechamelSauce, ingredient, i(ingredient:condiment:nutmeg)).
+p(recipe:bechamelSauce, ingredient, i(ingredient:condiment:cayennePepper)).
+
+% Zubereitung
+p(recipe:bechamelSauce, preparation, 'Für die Mehlschwitze das Mehl in einem Topf in der Butter mit einem Lorbeerblatt und den Pfefferkörnern bei milder Hitze sanft andünsten. Die Milch oder Fond nach und nach hineinrühren und unter weiterem Rühren bei kleiner Hitze etwa 5 Minuten köcheln lassen.
+Mit Salz, Cayennepfeffer, Muskat abschmecken, und durch ein feines Sieb passieren.
+
+Die Béchamel bekommt einen noch besseren Geschmack, wenn man beim Andünsten ein Stück Speck oder Schinkenschwarte und etwas Zwiebeln dazu gibt.').
+
+%---------------------------------------------------------------
+% Chinesische Geflügelpfanne
+%---------------------------------------------------------------
+
+% Name
+p(recipe:chineseChickenPan, name, 'Chinesische Geflügelpfanne').
+
+% Personenanzahl
+p(recipe:chineseChickenPan, persons, 8).
+
+% Zutaten
+p(recipe:chineseChickenPan, ingredient, qi(3, ingredient:onion)).
+p(recipe:chineseChickenPan, ingredient, qi(3, ingredient:garlic:clove)).
+p(recipe:chineseChickenPan, ingredient, qui(100, unit:g, ingredient:condiment:ginger:fresh)).
+p(recipe:chineseChickenPan, ingredient, qui(500, unit:g, ingredient:animalProducts:chicken:filet)).
+p(recipe:chineseChickenPan, ingredient, qui(1, unit:kg, ingredient:vegetables:carrot)).
+p(recipe:chineseChickenPan, ingredient, qi(3, ingredient:vegetables:courgette)).
+p(recipe:chineseChickenPan, ingredient, qi(3, ingredient:vegetables:leeks:stalk)).
+p(recipe:chineseChickenPan, ingredient, qi(2, ingredient:vegetables:paprika)).
+p(recipe:chineseChickenPan, ingredient, qui(200, unit:g, ingredient:fruits:pineapple)).
+p(recipe:chineseChickenPan, ingredient, qui(200, unit:ml, ingredient:fruits:coconutMilk)).
+p(recipe:chineseChickenPan, ingredient, qi(6, ingredient:chiliPeppers)).
+p(recipe:chineseChickenPan, ingredient, qui(250, unit:ml, ingredient:soyaSauce)).
+p(recipe:chineseChickenPan, ingredient, qui(1, unit:kg, ingredient:corn:rice:basmati)).
+
+% Zubereitung
+p(recipe:chineseChickenPan, preparation, 'Fleisch in kleine Stücke schneiden. Zwiebeln, Knoblauch und Ingwer klein hacken und zusammen mit Fleisch anbraten. Möhren, Zucchini und Lauch klein schneiden. Erst Möhren (10 min), etwas später Zucchini und Lauch anbraten. Ananas mit Soße, Sojasauce und Kokosmilch beigeben, verrühren und noch etwas dünsten lassen. Am Ende mit Salz, Pfeffer und Chili abschmecken.
+
+Gleichzeitig den Reis kochen!').
+
+%---------------------------------------------------------------
+% Flammkuchen
+%---------------------------------------------------------------
+
+% Name
+p(recipe:tarteFlambee, name, 'Flammkuchen').
+
+% Link
+p(recipe:tarteFlambee, link, 'http://www.chefkoch.de/rezepte/1286071233998045/Flammkuchen.html').
+
+% Personenanzahl
+p(recipe:tarteFlambee, persons, 4).
+
+% Zutaten
+p(recipe:tarteFlambee, ingredient, qui(250, unit:g, ingredient:corn:flour)).
+p(recipe:tarteFlambee, ingredient, qui(2, unit:teaspoon, ingredient:oil:olive)).
+p(recipe:tarteFlambee, ingredient, qui(150, unit:ml, ingredient:water)).
+p(recipe:tarteFlambee, ingredient, qui(1, unit:teaspoon, ingredient:condiment:salt)).
+p(recipe:tarteFlambee, ingredient, qui(200, unit:g, ingredient:milk:cream:cremeFraiche)).
+p(recipe:tarteFlambee, ingredient, qui(150, unit:g, ingredient:animalProducts:bacon:diced)).
+p(recipe:tarteFlambee, ingredient, qui(150, unit:g, ingredient:milk:cheese:grated)).
+p(recipe:tarteFlambee, ingredient, qi(1, ingredient:onion)).
+
+% Zubereitung
+p(recipe:tarteFlambee, preparation, 'Mehl, Salz, Öl und Wasser zu einem glatten Teig verkneten, den Teig einige Zeit ruhen lassen.
+
+Danach in vier kleine runde Ballen formen und jeweils sehr dünn ausrollen. Den ausgerollten Teig auf mit Backpapier ausgelegte Bleche legen und mit Crème fraîche bestreichen. Dann mit etwas Käse bestreuen und mit Speck und Zwiebeln belegen.
+
+Im Ofen bei ca. 260 Grad backen bis die Flammkuchen leicht knusprig sind.').
+
+%---------------------------------------------------------------
+% Lachspasta
+%---------------------------------------------------------------
+
+% Name
+p(recipe:salmonPasta, name, 'Lachspasta').
+
+% Personenanzahl
+p(recipe:salmonPasta, persons, 4).
+
+% Zutaten
+p(recipe:salmonPasta, ingredient, qui(250, unit:g, ingredient:animalProducts:fish:salmon)).
+p(recipe:salmonPasta, ingredient, qi(2, ingredient:onion)).
+p(recipe:salmonPasta, ingredient, qi(2, ingredient:garlic:clove)).
+p(recipe:salmonPasta, ingredient, qui(4, unit:tablespoon, ingredient:alcohols:wine:white)).
+p(recipe:salmonPasta, ingredient, qui(1, unit:mug, ingredient:milk:cream:whipping)).
+p(recipe:salmonPasta, ingredient, qui(500, unit:g, ingredient:corn:pasta:ribbon)).
+
+% Zubereitung
+p(recipe:salmonPasta, preparation, 'Die Zwiebel und den Knoblauch fein hacken und andünsten. Den geräucherten Lachs in kleine Stücke schneiden und mit anbraten. Das ganze mit dem Weißwein ablöschen und mit der Sahne andicken. Danach nach Geschmack würzen (auf keinen Fall salzen!!!).
+
+Die Bandnudeln unter die Sauce mischen und servieren.').
+
+%---------------------------------------------------------------
+% Lasagne
+%---------------------------------------------------------------
+
+% Name
+p(recipe:lasagna, name, 'Lasagne').
+
+% Personenanzahl
+p(recipe:lasagna, persons, 4).
+
+% Zutaten
+p(recipe:lasagna, ingredient, qui(500, unit:g, ingredient:animalProducts:mince)).
+p(recipe:lasagna, ingredient, qi(1, ingredient:onion)).
+p(recipe:lasagna, ingredient, qi(2, ingredient:garlic:clove)).
+p(recipe:lasagna, ingredient, i(ingredient:herbs:parsley)).
+p(recipe:lasagna, ingredient, qui(1, unit:tablespoon, ingredient:vegetables:tomato:puree)).
+p(recipe:lasagna, ingredient, qui(400, unit:g, ingredient:vegetables:tomato:peeled)).
+p(recipe:lasagna, ingredient, i(ingredient:oil:olive)).
+p(recipe:lasagna, ingredient, qui(300, unit:g, ingredient:corn:pasta:lasagnaSheets)).
+p(recipe:lasagna, ingredient, i(ingredient:condiment:nutmeg)).
+p(recipe:lasagna, ingredient, i(ingredient:alcohols:wine:red)).
+p(recipe:lasagna, ingredient, i(ingredient:milk:cheese:grated)).
+
+% Zubereitung
+p(recipe:lasagna, preparation, 'Ragout Bolognese:
+In einem Topf das Olivenöl erhitzen, das Hackfleisch darin rundherum anbraten und die gehackten Zwiebeln und die Petersilie dazugeben. Knoblauchscheiben und Tomatenmark dazu rühren und mitbraten. Mit den Dosentomaten aufgießen, salzen und pfeffern. Rotwein nach Belieben beifügen. Das Ragout mindestens eine halbe Stunde lang bei geöffnetem Topf einkochen lassen.
+
+Zubereitung der Lasagne:
+In einer gebutterten, feuerfesten Form etwas Ragout Bolognese verteilen, eine Schicht Lasagnenudeln darauf legen, die Nudelschicht wieder mit Ragout und dann mit einer Bechamelsaucenschicht bedecken. Anschließend wieder eine Schicht Nudeln, Ragout und Bechamel. So Schicht für Schicht die Form füllen.
+Die letzte Schicht sollte die Bechamelsauce bilden. Dick mit geriebenen Käse bestreuen, Butterflöckchen darauf setzen . Die Lasagne bei 180°C im Ofen überbacken, bis die Kruste goldbraun ist.
+
+Die Lasagne kann man auch gut einen Tag vorher vorbereiten und im Kühlschrank ziehen lassen!').
+
+% Dazugehörige Rezepte
+p(recipe:lasagna, ref, (1, recipe:bechamelSauce)).
+
+%---------------------------------------------------------------
+% Mango-Curry Hähnchen
+%---------------------------------------------------------------
+
+% Name
+p(recipe:mangoCurryChicken, name, 'Mango-Curry Hähnchen').
+
+% Personenanzahl
+p(recipe:mangoCurryChicken, persons, 4).
+
+% Zutaten
+p(recipe:mangoCurryChicken, ingredient, qui(500, unit:g, ingredient:fruits:mango)).
+p(recipe:mangoCurryChicken, ingredient, qui(500, unit:g, ingredient:fruits:peach)).
+p(recipe:mangoCurryChicken, ingredient, i(ingredient:condiment:cinnamon)).
+p(recipe:mangoCurryChicken, ingredient, i(ingredient:condiment:curry)).
+p(recipe:mangoCurryChicken, ingredient, qui(2, unit:cup, ingredient:alcohols:sherry)).
+p(recipe:mangoCurryChicken, ingredient, qui(1, unit:cup, ingredient:fruits:orange:juice)).
+p(recipe:mangoCurryChicken, ingredient, qui(200, unit:g, ingredient:milk:cream:whipping)).
+p(recipe:mangoCurryChicken, ingredient, qui(500, unit:g, ingredient:animalProducts:chicken:filet)).
+p(recipe:mangoCurryChicken, ingredient, qui(250, unit:g, ingredient:corn:rice:basmati)).
+
+% Zubereitung
+p(recipe:mangoCurryChicken, preparation, 'Vorbereitung:
+1. Das Hähnchenfilet in Würfel schneiden, mit Curry einreiben und mit Salz und Pfeffer würzen.
+2. Dosen öffnen.
+
+Kochen: Reis aufsetzen(salzen nicht vergessen!). Pfirsiche und Mangos weich kochen. Mit dem Sherry ablöschen und dann den Orangensaft und etwas Mangosaft(aus der Dose) hinzufügen. Das ganze noch ein paar Minuten auf mittlerer Stufe köcheln lassen. Anschließend die Masse zu einem Brei pürieren. Mit Zimt, Curry, Salz und Pfeffer würzen.
+
+Währenddessen das Fleisch mit etwas Öl in einer Pfanne anbraten. Danach die Soße zum angebratenen Fleisch dazugeben.
+').
+
+%---------------------------------------------------------------
+% Maccheroni mit Steinpilzen und Zucchini
+%---------------------------------------------------------------
+
+% Name
+p(recipe:maccheroniPorciniCourgette, name, 'Maccheroni mit Steinpilzen und Zucchini').
+
+% Personenanzahl
+p(recipe:maccheroniPorciniCourgette, persons, 4).
+
+% Zutaten
+p(recipe:maccheroniPorciniCourgette, ingredient, qui(400, unit:g, ingredient:corn:pasta:maccheroni)).
+p(recipe:maccheroniPorciniCourgette, ingredient, qui(200, unit:g, ingredient:mushroom:porcini:fresh)).
+p(recipe:maccheroniPorciniCourgette, ingredient, qi(2, ingredient:vegetables:courgette)).
+p(recipe:maccheroniPorciniCourgette, ingredient, qui(200, unit:g, ingredient:vegetables:tomato:passed)).
+p(recipe:maccheroniPorciniCourgette, ingredient, qui(70, unit:ml, ingredient:milk)).
+p(recipe:maccheroniPorciniCourgette, ingredient, qui(50, unit:g, ingredient:milk:cheese:parmesan)).
+p(recipe:maccheroniPorciniCourgette, ingredient, qui(2, unit:tablespoon, ingredient:oil:olive)).
+p(recipe:maccheroniPorciniCourgette, ingredient, qui(1, unit:tablespoon, ingredient:herbs:parsley:minced)).
+p(recipe:maccheroniPorciniCourgette, ingredient, qi(1, ingredient:shallot)).
+
+% Zubereitung
+p(recipe:maccheroniPorciniCourgette, preparation, 'Schalotte in Öl andünsten, in Streifen geschnittene Pilze, Zucchini, Milch, Salz und Pfeffer dazugeben und etwas kochen lassen.
+
+In einer weiteren Pfanne das Tomatenfruchtfleisch mit Salz, Pfeffer und Zucker abschmecken und ca. 5 min köcheln lassen. Maccheroni "al dente" kochen, abgießen und mit der Pilz-Zucchinisauce und dem Parmesan vermischen.
+
+Die Toamtencreme als Saucenspiegel auf die Teller geben und die Pasta darauf anrichten. Mit Petersilie bestreuen.').
+
+%---------------------------------------------------------------
+% Mexikanischer Feuertopf
+%---------------------------------------------------------------
+
+% Name
+p(recipe:mexicanFirePot, name, 'Mexikanischer Feuertopf').
+
+% Personenanzahl
+p(recipe:mexicanFirePot, persons, 4).
+
+% Zutaten
+p(recipe:mexicanFirePot, ingredient, qui(250, unit:g, ingredient:corn:nachos)).
+p(recipe:mexicanFirePot, ingredient, qui(500, unit:g, ingredient:animalProducts:mince)).
+p(recipe:mexicanFirePot, ingredient, qi(2, ingredient:vegetables:paprika)).
+p(recipe:mexicanFirePot, ingredient, qi(4, ingredient:onion)).
+p(recipe:mexicanFirePot, ingredient, qi(2, ingredient:vegetables:hotPepper:red)).
+p(recipe:mexicanFirePot, ingredient, qui(300, unit:ml, ingredient:salsa)).
+p(recipe:mexicanFirePot, ingredient, i(ingredient:condiment:chili:sauce)).
+p(recipe:mexicanFirePot, ingredient, qui(400, unit:g, ingredient:milk:cheese:gouda:grated)).
+p(recipe:mexicanFirePot, ingredient, qui(200, unit:g, ingredient:milk:cream:sour)).
+p(recipe:mexicanFirePot, ingredient, qi(4, ingredient:condiment:chili:peppers:dried)).
+p(recipe:mexicanFirePot, ingredient, i(ingredient:oil)).
+
+% Zubereitung
+p(recipe:mexicanFirePot, preparation, 'Die Zwiebeln häuten und in kleine Würfel schneiden. Die Paprika und Peperoni waschen, trocknen und in Würfel schneiden.
+
+Die Zwiebeln glasig anbraten. Das Hackfleisch dazu geben und alles krümelig anbraten lassen. Anschließend die klein geschnittene Paprika sowie die Peperoni dazu geben und alles noch weitere 5 Minuten dünsten lassen. Mit Salz, Pfeffer und Chili-Pulver abschmecken. Anschließend die Texikana-Salsa Sauce dazu geben und bei mittlerer Hitze 3 bis 5 Minuten köcheln lassen. Mit der Chilisauce abschmecken.
+
+Die Nachos auf einer feuerfesten Platte anrichten und die Hackfleischsauce darüber verteilen. Anschließend den geriebenen Käse darüber geben und alles im Backofen 10 Minuten lang überbacken.
+
+Den Sauerrahm Klecksweise auf die überbackenen Nachos geben und fertig ist es.').
+
+%---------------------------------------------------------------
+% Paprika-Rahm Schnitzel
+%---------------------------------------------------------------
+
+% Name
+p(recipe:paprikaCreamCutlet, name, 'Paprika-Rahm Schnitzel').
+
+% Personenanzahl
+p(recipe:paprikaCreamCutlet, persons, 4).
+
+p(recipe:paprikaCreamCutlet, ingredient, qi(4, ingredient:garlic:clove)).
+p(recipe:paprikaCreamCutlet, ingredient, qui(500, unit:g, ingredient:animalProducts:turkey:breast:filet)).
+p(recipe:paprikaCreamCutlet, ingredient, qui(200, unit:g, ingredient:milk:cream:whipping)).
+p(recipe:paprikaCreamCutlet, ingredient, qi(3, ingredient:vegetables:paprika)).
+p(recipe:paprikaCreamCutlet, ingredient, qui(400, unit:g, ingredient:vegetables:tomato:chopped)).
+p(recipe:paprikaCreamCutlet, ingredient, qi(5, ingredient:condiment:chili:peppers:dried)).
+p(recipe:paprikaCreamCutlet, ingredient, qi(1, ingredient:mixedSpices:paprikaRahmSchnitzel:package:knorr)).
+p(recipe:paprikaCreamCutlet, ingredient, qui(400, unit:g, ingredient:corn:rice)).
+
+% Zubereitung
+p(recipe:paprikaCreamCutlet, preparation, 'Vorbereitung: Das Putenbrustfilet und die Paprika in Würfel schneiden. Die Chilischoten zerkleinern.
+
+Kochen: Den Reis aufsetzen(salzen nicht vergessen!). Das Putenbrustfilet in einer Pfanne anbraten. Wenig später die Paprika hinzufügen.
+
+Nach ca. 5 min die gestückelten Tomaten, die Chilischoten und das Paprika-Gewürz beigeben. Anschließend die Schlagsahne hinzufügen. Bei geschlossenem Deckel ca. 10 min bei geringer Hitze köcheln lassen.').
+
+%---------------------------------------------------------------
+% Pizza
+%---------------------------------------------------------------
+
+% Name
+p(recipe:pizza, name, 'Pizza').
+
+% Personenanzahl
+p(recipe:pizza, persons, 4).
+
+% Zutaten
+p(recipe:pizza, ingredient, qui(50, unit:g, ingredient:yeast:fresh)).
+p(recipe:pizza, ingredient, qui(500, unit:g, ingredient:corn:flour)).
+p(recipe:pizza, ingredient, qui(1, unit:teaspoon, ingredient:condiment:salt)).
+p(recipe:pizza, ingredient, qui(300, unit:ml, ingredient:water)).
+p(recipe:pizza, ingredient, qi(2, ingredient:garlic:clove)).
+p(recipe:pizza, ingredient, qi(2, ingredient:onion)).
+p(recipe:pizza, ingredient, qui(400, unit:g, ingredient:vegetables:tomato:passed)).
+p(recipe:pizza, ingredient, qui(400, unit:g, ingredient:vegetables:tomato:chopped)).
+p(recipe:pizza, ingredient, i(ingredient:herbs:italian)).
+p(recipe:pizza, ingredient, qui(500, unit:g, ingredient:milk:cheese:gouda:grated)).
+
+% Zubereitung
+p(recipe:pizza, preparation, 'TODO: Zubereitung eintragen!').
+
+%---------------------------------------------------------------
+% Pute Saltimbocca
+%---------------------------------------------------------------
+
+% Name
+p(recipe:turkeySaltimbocca, name, 'Pute Saltimbocca').
+
+% Link
+p(recipe:turkeySaltimbocca, link, 'http://www.chefkoch.de/rezepte/1115831217668181/Haehnchen-Saltimbocca.html').
+
+% Personenanzahl
+p(recipe:turkeySaltimbocca, persons, 2).
+
+% Zutaten
+p(recipe:turkeySaltimbocca, ingredient, qi(2, ingredient:animalProducts:turkey:breast:halfed)).
+p(recipe:turkeySaltimbocca, ingredient, qi(4, ingredient:animalProducts:ham:parma:slivered)).
+p(recipe:turkeySaltimbocca, ingredient, qi(12, ingredient:condiment:sage:leaf)).
+p(recipe:turkeySaltimbocca, ingredient, qui(2, unit:tablespoon, ingredient:milk:butter)).
+p(recipe:turkeySaltimbocca, ingredient, qui(100, unit:ml, ingredient:alcohols:wine:red:marsala)).
+p(recipe:turkeySaltimbocca, ingredient, qui(1, unit:cup, ingredient:corn:rice)).
+p(recipe:turkeySaltimbocca, ingredient, qi(1, ingredient:vegetables:courgette)).
+p(recipe:turkeySaltimbocca, ingredient, qui(1, unit:teaspoon, ingredient:broth:vegetable)).
+p(recipe:turkeySaltimbocca, ingredient, qui(1, unit:tablespoon, ingredient:syrup:maple)).
+p(recipe:turkeySaltimbocca, ingredient, i(ingredient:oil)).
+
+% Zubereitung
+p(recipe:turkeySaltimbocca, preparation, 'Den Reis wie gewohnt zubereiten.
+
+Die Brusthälften der Länge nach halbieren, zwischen zwei Plastikfolien legen und leicht klopfen. Auf beiden Seiten mit Salz und Pfeffer würzen. Je drei Salbeiblättchen auflegen, je eine Scheibe Parmaschinken um die Brustfilets wickeln und mit Zahnstochern feststecken.
+
+Butter in einer beschichteten Pfanne erhitzen und die Schnitzelchen von beiden Seiten goldbraun anbraten. Marsala hinzugeben und auf sehr kleiner Hitze 15-20 Minuten gar ziehen lassen.
+
+Zucchini in feine Scheiben schneiden oder hobeln. Öl in einer Pfanne erhitzen und die Scheiben leicht anbraten, dann ein wenig Brühe angießen. Mit Salz und Pfeffer würzen und den Ahornsirup hinzufügen. Deckel auflegen und ungefähr 10 Minuten auf kleiner Stufe garen lassen.
+
+Nach Ende der Garzeit drei bis vier EL von dem Zucchinisud in die Hähnchenpfanne geben und unterrühren. Wenn man möchte, kann man die Marsalasoße mit ganz wenig Mehl leicht binden. Schmeckt aber ungebunden auch hervorragend.
+
+Mit dem Reis und den Zucchini servieren.').
+
+%---------------------------------------------------------------
+% Selleriesuppe mit Zimt-Apfel und Walnüssen
+%---------------------------------------------------------------
+
+% Name
+p(recipe:celerySoup, name, 'Selleriesuppe mit Zimt-Apfel und Walnüssen').
+
+% Personenanzahl
+p(recipe:celerySoup, persons, 4).
+
+% Zutaten
+p(recipe:celerySoup, ingredient, qi(1, ingredient:vegetables:celery:bulb)).
+p(recipe:celerySoup, ingredient, qui(1, unit:l, ingredient:broth:vegetable)).
+p(recipe:celerySoup, ingredient, qui(200, unit:g, ingredient:milk:cream:whipping)).
+p(recipe:celerySoup, ingredient, qui(50, unit:g, ingredient:milk:butter)).
+p(recipe:celerySoup, ingredient, i(ingredient:condiment:powder)).
+
+% Zubereitung
+p(recipe:celerySoup, preparation, 'Für die Suppe den Sellerie putzen, schälen und in Würfel schneiden. Das Gemüse dann in einem Topf mit der Brühe knapp unter dem Siedepunkt etwa 20 Minuten weich garen. Die Sahne und die kalte Butter hinzufügen und alles mit dem Stabmixer pürieren.
+
+Mit Salz, Pfeffer und Chilipulver würzen.').
+
+% Dazugehörige Rezepte
+p(recipe:celerySoup, ref, (0.25, recipe:cinnamonApple)).
+
+%---------------------------------------------------------------
+% Spaghetti Arrabiata
+%---------------------------------------------------------------
+
+% Name
+p(recipe:spaghettiArrabiata, name, 'Spaghetti Arrabiata').
+
+% Link
+p(recipe:spaghettiArrabiata, link, 'http://www.chefkoch.de/rezept-anzeige.php?ID=979411203499119').
+
+% Personenanzahl
+p(recipe:spaghettiArrabiata, persons, 4).
+
+% Zutaten
+p(recipe:spaghettiArrabiata, ingredient, qi(3, ingredient:onion)).
+p(recipe:spaghettiArrabiata, ingredient, qi(4, ingredient:garlic:clove)).
+p(recipe:spaghettiArrabiata, ingredient, qui(2, unit:teaspoon, ingredient:herbs:rosemary)).
+p(recipe:spaghettiArrabiata, ingredient, qui(2, unit:teaspoon, ingredient:herbs:thyme)).
+p(recipe:spaghettiArrabiata, ingredient, qui(1, unit:bunch, ingredient:herbs:parsley:fresh)).
+p(recipe:spaghettiArrabiata, ingredient, qi(4, ingredient:condiment:chili:peppers:dried)).
+p(recipe:spaghettiArrabiata, ingredient, qui(1, unit:tablespoon, ingredient:sugar)).
+p(recipe:spaghettiArrabiata, ingredient, qui(800, unit:g, ingredient:vegetables:tomato:chopped)).
+p(recipe:spaghettiArrabiata, ingredient, qui(1, unit:tablespoon, ingredient:vegetables:tomato:puree)).
+p(recipe:spaghettiArrabiata, ingredient, qui(200, unit:ml, ingredient:alcohols:wine:red)).
+
+% Zubereitung
+p(recipe:spaghettiArrabiata, preparation, 'Zwiebeln klein schneiden und zusammen mit dem Knoblauch andünsten. Anschließend Tomatenstücke, Rosmarin, Thymian, Salz, Tomatenmark und Zucker dazu. Etwas zerstampfen und aufkochen lassen. Zum Schluss den Rotwein, die Petersilie und die zerkleinerte Chilischote untermengen.
+
+Die Soße für die Nudelkochzeit auf kleiner Flamme lassen.').
+
+%---------------------------------------------------------------
+% Spaghetti Carbonara
+%---------------------------------------------------------------
+
+% Name
+p(recipe:spaghettiCarbonara, name, 'Spaghetti Carbonara').
+
+% Personenanzahl
+p(recipe:spaghettiCarbonara, persons, 4).
+
+% Zutaten
+p(recipe:spaghettiCarbonara, ingredient, qui(250, unit:g, ingredient:milk:cheese:mascarpone)).
+p(recipe:spaghettiCarbonara, ingredient, qui(100, unit:g, ingredient:animalProducts:bacon:smoked:diced)).
+p(recipe:spaghettiCarbonara, ingredient, qui(500, unit:g, ingredient:corn:pasta:spaghetti)).
+p(recipe:spaghettiCarbonara, ingredient, qi(3, ingredient:egg)).
+p(recipe:spaghettiCarbonara, ingredient, i(ingredient:milk:cheese:parmesan)).
+p(recipe:spaghettiCarbonara, ingredient, i(ingredient:herbs:italian)).
+
+% Zubereitung
+p(recipe:spaghettiCarbonara, preparation, 'Eier Mascarpone verrühren, bis sich eine cremige Masse ergibt. Salz, Pfeffer und Parmesan hinzugeben. Den Speck in Würfelchen schneiden und mit wenig Butter in der Pfanne anbraten, damit er schön knusprig wird. Die gekochten Spaghetti darüberschütten. Dann die cremige Mascarponemasse vorsichtig mit einem Holzlöffel unterrühren. Sofort servieren.').
+
+%---------------------------------------------------------------
+% -- Zimt-Apfel
+%---------------------------------------------------------------
+
+% Name
+p(recipe:cinnamonApple, name, 'Zimt-Apfel').
+
+% Persons
+p(recipe:cinnamonApple, persons, 1).
+
+% Zutaten
+p(recipe:cinnamonApple, ingredient, qi(1, ingredient:fruits:apple)).
+p(recipe:cinnamonApple, ingredient, qui(1, unit:tablespoon, ingredient:milk:butter)).
+p(recipe:cinnamonApple, ingredient, i(ingredient:condiment:cinnamon)).
+p(recipe:cinnamonApple, ingredient, qui(2, unit:tablespoon, ingredient:nut:walnut)).
+p(recipe:cinnamonApple, ingredient, qui(2, unit:teaspoon, ingredient:sugar:powdered)).
+
+% Zubereitung
+p(recipe:cinnamonApple, preparation, 'Den Apfel waschen, vierteln, entkernen und in Spalten schneiden. Den Puderzucker in einer Pfanne bei mittlerer Hitze hell karamellisieren. Die Apfelspalten auf beiden Seiten darin andünsten, die Butter dazugeben, zerlassen und mit Zimt würzen.').
+
+%---------------------------------------------------------------
+% Zürcher Geschnetzeltes
+%---------------------------------------------------------------
+
+% Name
+p(recipe:zurcherMeatCutIntoStrips, name, 'Zürcher Geschnetzeltes').
+
+% Personenanzahl
+p(recipe:zurcherMeatCutIntoStrips, persons, 4).
+
+% Zutaten
+p(recipe:zurcherMeatCutIntoStrips, ingredient, qui(500, unit:g, ingredient:animalProducts:veal)).
+p(recipe:zurcherMeatCutIntoStrips, ingredient, qui(250, unit:g, ingredient:mushroom:champignon)).
+p(recipe:zurcherMeatCutIntoStrips, ingredient, qi(2, ingredient:onion)).
+p(recipe:zurcherMeatCutIntoStrips, ingredient, qui(50, unit:g, ingredient:milk:butter)).
+p(recipe:zurcherMeatCutIntoStrips, ingredient, qui(200, unit:ml, ingredient:alcohols:wine:white)).
+p(recipe:zurcherMeatCutIntoStrips, ingredient, qui(200, unit:g, ingredient:milk:cream:whipping)).
+p(recipe:zurcherMeatCutIntoStrips, ingredient, qui(2, unit:teaspoon, ingredient:vegetables:lemon:juice)).
+p(recipe:zurcherMeatCutIntoStrips, ingredient, qui(2, unit:teaspoon, ingredient:herbs:parsley)).
+
+% Zubereitung
+p(recipe:zurcherMeatCutIntoStrips, preparation, 'Das Kalbfleisch in dünne Streifen schnetzeln. Die Champignons putzen und in feine Scheiben schneiden, Zwiebel hacken.
+
+Einen flachen Topf oder Pfanne erhitzen, die Butter darin zerlaufen lassen und die Kalbfleischstreifen einlegen. Hell anbräunen und dann herausnehmen und warm stellen.
+
+Jetzt die Champignons unter Wenden einige Min. anbraten, dann die Zwiebel zugeben und goldgelb werden lassen. Mit Weißwein ablöschen und die Hitze reduzieren. Zugedeckt 5 Min. dünsten.
+
+In der Zeit die Sahne halbsteif schlagen. Das Fleisch wieder in den Topf geben, die Energiezufuhr etwas erhöhen, dann die Sahne unterziehen und die Gewürze zugeben und abschmecken. Zugedeckt noch 2-3 Min. durchziehen lassen und sofort servieren.').
82 util.pl
@@ -0,0 +1,82 @@
+:- module(util, [suffix/2, subList/2, round/3, group/2, groupByFirstLetter/2, printGroups/1, listEntities/2, subset0/2]).
+
+:- set_prolog_flag(optimise, true).
+
+:- use_module(recipes).
+:- use_module(library(lists)).
+:- use_module(library(apply)).
+
+% suffix(?X, ?L)
+suffix(X, L) :- append(_, X, L).
+
+% subList(?X, ?L)
+subList(X, L) :- suffix(S, L), prefix(X, S).
+
+% round Value to N signficant digits.
+% round(+Value, +N, -RValue)
+round(Value, N, RValue) :-
+ N >= 0,
+ F is 10 ** N,
+ RValue is truncate(Value * F + 0.5) / F.
+
+% foldl(+F, +Acc, +L, -Res)
+foldl(_, Acc, [], Acc).
+foldl(F, Acc1, [X|Xs], Res) :-
+ G =.. [F, Acc1, X, Acc2],
+ call(G),
+ foldl(F, Acc2, Xs, Res).
+
+% findall((X, Y), (between(1, 20, X), between(1, 100, Y)), Pairs), group(Pairs, Group).
+
+% group(+Pairs, ?Groups)
+group([], []).
+group([(K, V)|Ps], [(K, Vs)|Gs]) :-
+ % statistics(localused, Local), writeln(Local),
+ span([(K, V)|Ps], K, Vs, RPs),
+ group(RPs, Gs).
+
+% span(+Pairs, +Key, ?Values, ?RestPairs)
+span([], _, [], []).
+span([(Key, V)|Ps], GroupKey, Vs1, RPs) :-
+ % statistics(localused, Local), writeln(Local),
+ (Key = GroupKey ->
+ Vs1 = [V|Vs2],
+ span(Ps, GroupKey, Vs2 , RPs)
+ ;
+ Vs1 = [],
+ RPs = [(Key, V)|Ps]
+ ).
+
+first_letters(Ls, (K, Ls)) :-
+ atom_chars(Ls, [Fst|_]),
+ atom_concat('# ', Fst, K).
+
+% groupByFirstLetter(+Names, -Groups)
+groupByFirstLetter([], []).
+groupByFirstLetter(Ns, Gs) :-
+ maplist(first_letters, Ns, Ps),
+ group(Ps, Gs).
+
+% printGroups(+Groups)
+printGroups([]).
+printGroups([(K, Vs)|Gs]) :-
+ writeln(K),
+ forall(member(V, Vs), writeln(V)), nl,
+ printGroups(Gs).
+
+% listEntities(+Namespace, +Heading)
+listEntities(Ns, H) :-
+ findall(Name, p(Ns:_, name, Name), Names),
+ sort(Names, SNs),
+ length(Names, Count),
+ nl, write(H), write('('), write(Count), write(')'), nl, nl,
+ groupByFirstLetter(SNs, Gs),
+ printGroups(Gs).
+
+% findall((1, X), between(1, 100, X), Pairs), span(Pairs, 1, Vs, Rps).
+
+% Sub and Super are assumed to be ordered.
+% subset0(?Sub, ?Super)
+subset0([], []).
+subset0([X|Xs], [X|Ys]):- subset0(Xs, Ys).
+subset0(Xs, [_|Ys]) :- subset0(Xs, Ys).
Please sign in to comment.
Something went wrong with that request. Please try again.