% NUTRIMINE: A Micro-Nutrient Knowledge Base (Source) 06-Aug-98 % ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ % http://www.dfki.uni-kl.de/~vega/relfun+/nutrimine.rfp (eg *.script) % http://www.dfki.uni-kl.de/~vega/relfun+/nutrimine.rfp.html (eg *.script.html) % [the *.html versions produced by a txt2html adaptation have active URLs etc.] % Harold Boley DFKI/Univ. Kaiserslautern % boley@informatik.uni-kl.de % The micro nutrients to be included into the NUTRIMINE knowledge base (KB) % encompass certain vitamins, provitamins, and minerals. NUTRIMINE extends % earlier work on Web-released materials KBs running in RELFUN (ELEMENTS and % RTPLAST, see http://www.dfki.uni-kl.de/~vega/relfun.html). % The knowledge formalized below is being used primarily for KB research. It % is not currently intended to provide any dietary or medical recommendation. % But NUTRIMINE may encourage readers/users to search for more information % and form their own opinions. Thus, we do not go into the debate about % nutritional supplements: yes/no? for which individuals? when? what doses? % (e.g., may Beta-Carotene pills be harmful for some groups such as smokers? % for CARET Study see http://www.thorne.com/townsend/may/blandmay96.html). % Some future NUTRIMINE could provide a KB as one basis for (pro or cons) % arguments for such debates. The author welcomes any feedback, especially % concerning a possible collaborative, WWW-distributed KB development of % NUTRIMINE. Two specific caveats: some of the current algorithms provide % only first approximations (e.g. dose ranges are reduced to their means), % and the basic data are quite uncertain (e.g. freshness and micro-nutrient % content of raw food may vary). % While this NUTRIMINE version uses a mostly functional RELFUN style, it is % transformable into a purely relational RELFUN style via the relationalize % command (as shown in nutrimine.script); except for NUTRIMINE's higher-order % aspects, this amounts to Horn logic or -- via the rfp2pl transformation -- % to PROLOG. The relational-style NUTRIMINE version thus contains an initial % nucleus of the first-order (Horn-logic) KBs discussed in our concept paper % "Knowledge Bases in the World Wide Web: A Challenge for Logic Programming" % (see URL http://www.dfki.uni-kl.de/~boley/lpwww/lpwww-emem.ps). % Towards the end of the below KB, early results of a collaborative effort % with the Univ. Twente are integrated. We start the KB with links to pages % from the Univ. Koeln. % Chemical Structure and Pharmaceutical "ACE" Info by Bad Heilbrunner % The following bookmarks link to the "ACE" pages of the Bad Heilbrunner % Selbstmedikationsdatenbank (http://www.tee.org/), constructed, in German, % under the leadership of Klaus Klein by the Forschungsstelle fuer % Gesundheitserziehung, Univ. Koeln. bmark(vitamin-a) :- "Mostly discusses Vitamin-A rather than Beta-Carotene" & "http://www.tee.org/BHSD/bhsd159.html". bmark(vitamin-c) :& "http://www.tee.org/BHSD/bhsd164.html". bmark(vitamin-e) :& "http://www.tee.org/BHSD/bhsd166.html". % How Much (mg per kg) of which Nutrients is Contained in Some Food? nutramount(Food) :& tupof(Amount .= nutrifood(Nutrient,Food), [Nutrient,Amount]). % How Much (mg) of which Nutrients is Contained in Some Portion (kg) of Food? nutraport(Food,Portion) :& map[multsecond[Portion]](nutramount(Food)). % What Nutrients are Contained in Some Meal (Set-as-List of Portioned Foods)? nutraddup([]) :& []. nutraddup([[Food,Portion]|Mealrest]) :& compunion[add-measures](nutraport(Food,Portion),nutraddup(Mealrest)). % How Much Would I Have to Eat of Some Food for a Recommended Nutrient Dose? nutreat(Nutrient,Food,Individual,Recommender) :- % foodnutrients mg / 1 kg = dosenutrients mg/d / eat kg/d % eat kg/d = (dosenutrients mg/d * 1 kg) / foodnutrients mg mg/kg[Nutrifood] .= nutrifood(Nutrient,Food), mg/d[Nutridose] .= nutridose(Nutrient,Individual,Recommender), Eat .= /(meanrange(Nutridose), % replace possible range by its mean *(Nutrifood,1.0)) & % enforce floating-point number [Individual,for,mg/d[Nutridose],Nutrient,following,Recommender, eat,kg/d[Eat],of,mg/kg[Nutrifood],Food]. % Compute Set-as-List Union While Applying Operation to Second Pair Elements compunion[Operation]([],M) :& M. compunion[Operation]([P|R],M) :& compinsert[Operation](P,compunion[Operation](R,M)). compinsert[Operation]([Element,Weight],[]) :& [[Element,Weight]]. compinsert[Operation]([Element,Weight1],[[Element,Weight2]|S]) !& tup(tup(Element,Operation(Weight1,Weight2))|S). compinsert[Operation]([Element1,Weight1],[[Element2,Weight2]|S]) :& tup([Element2,Weight2]| compinsert[Operation]([Element1,Weight1],S)). % Transform a Range (Interval) Term into the Mean of its Two Boundaries meanrange(X) :- numberp(X) & X. meanrange(range[From,To]) :& /(+(From,To),2). % Arithmetics over Unit-Measured Magnitudes add-measures(U[M1],U[M2]) :- unit(U), S .= +(M1,M2) & U[S]. multsecond[kg[Factor]]([Nutrient,mg/kg[Magnitude]]) :- Prod .= *(Factor,Magnitude) & [Nutrient,mg[Prod]]. % Food Examples Containing Micro Nutrients such as (Pro)Vitamins % nutrifood gives the mg/kg amount of a nutrient in some (fresh raw) food % Fruits+Vegetables Containing Beta Carotene (to be Extended) nutrifood(beta-carotene,strawberry) :& mg/kg[0.3]. nutrifood(beta-carotene,spinach) :& mg/kg[8.0]. nutrifood(beta-carotene,carrot) :& mg/kg[11.3]. % Fruits+Vegetables Containing Vitamin C (to be Extended) nutrifood(vitamin-c,strawberry) :& mg/kg[620]. nutrifood(vitamin-c,acerola) :& mg/kg[13000]. nutrifood(vitamin-c,broccoli) :& mg/kg[1100]. % Fruits+Vegetables Containing Vitamin E (to be Extended) nutrifood(vitamin-e,pea) :& mg/kg[30]. nutrifood(vitamin-e,hazelnut) :& mg/kg[210]. % Recommended Daily Doses (Four Opinions: Consult Your Doctor to Form Your Own) % DGE: Recommendation of the Deutsche Gesellschaft fuer Ernaehrung % (http://www.vitalstoffe.de/zufuhrempfehlung.shtml) % (US)RDA: (United States) Recommended Dietary Allowance % (http://www.mediconsult.com/noframes/vitamins/shareware/rdirda/) % BS: Prophylactic Recommendation of Wolfgang Bayer and Karlheinz Schmidt % COOPER: Antioxidant Recommendation of Kenneth H. Cooper % nutridose gives the mg/d of a nutrient for an individual as by a recommender % Beta-Carotene Dose nutridose(beta-carotene,I,dge) :- man(I) & mg/d[1]. nutridose(beta-carotene,I,usrda) :- woman(I) & mg/d[2.4]. nutridose(beta-carotene,I,usrda) :- man(I) & mg/d[3]. nutridose(beta-carotene,I,usrda) :- child(I) & mg/d[1.5]. nutridose(beta-carotene,_,bs) :& mg/d[range[5,15]]. nutridose(beta-carotene,_,cooper) :& mg/d[range[6,30]]. % Vitamin-C Dose nutridose(vitamin-c,I,dge) :- man(I) & mg/d[75]. nutridose(vitamin-c,I,usrda) :- adult(I) & mg/d[30]. nutridose(vitamin-c,I,usrda) :- child(I) & mg/d[45]. nutridose(vitamin-c,_,bs) :& mg/d[range[50,200]]. nutridose(vitamin-c,_,cooper) :& mg/d[range[500,3000]]. % Vitamin-E Dose nutridose(vitamin-e,I,dge) :- man(I) & mg/d[12]. nutridose(vitamin-e,I,usrda) :- woman(I) & mg/d[12]. nutridose(vitamin-e,I,usrda) :- man(I) & mg/d[15]. nutridose(vitamin-e,I,usrda) :- child(I) & mg/d[7]. nutridose(vitamin-e,_,bs) :& mg/d[range[10,100]]. nutridose(vitamin-e,_,cooper) :& mg/d[range[200,1200]]. % Sort Predicates and Individual Applications adult(I) :- woman(I). adult(I) :- man(I). man(linus). unit(mg). unit(kg). % Self-Normalizing Data Structures g(N) :- D .= /(N,1000.0) & kg[D]. lb(N) :- D .= /(N,2.0) & kg[D]. % Utilities to be Preloaded from prelude.rfp map[Fct]([]) :- & []. map[Fct]([H|T]) :- & tup(Fct(H)|map[Fct](T)). % Molecule Representation of "ACE" Nutrients Generated by Paul van der Vet % Paul van der Vet (http://wwwis.cs.utwente.nl:8080/~vet/), Univ. Twente, % has produced a program and this docu part that let users prepare molecule % representations by drawing the molecules like a chemist would. He uses % the ChemDraw (registered trademark of CambridgeSoft Corporation) program % to reproduce the drawing plus a file in connection table format. Paul has % implemented a DCG-style Prolog program to convert the connection table % into a list of atoms and bonds. This information is written to a file in % the form of a fact: % molecule( Name, Format, ListOfAtoms, ListOfBonds ). % where: % - Name is some atom to name the thing. He used ascorbic_acid % (vitamin C), beta_carotene (a precursor of vitamin A) and % alpha_tocopherol (one of the vitamin E group). By the way, the files % have the same base names. % - Format is introduced because chemists almost always leave out the % hydrogen atoms. As long as certain precautions are observed, this % causes no ambiguities. Paul's program produces both the representation % without H's (Format = mol) and that with all H-atoms and bonds to % H-atoms inserted (Format = molh). Both versions are present in each of % the files. % At a later stage, he also wants to introduce a third format, radical, to % be able to specify molecules with variant parts like alpha-, beta-, % gamma-, and delta-tocopherol. % - ListOfAtoms is a list with members of the form % Prolog: atom( Label, AtNr ) Relfun: atom[ Label, AtNr ] % Label is a unique label within the molecule, and AtNr is the element's % atomic number. The constructor "atom" is used purely for readability. % - ListOfBonds is a list with members of the form % Prolog: bond( Label1, Label2, Order ) Relfun: bond[ Label1, Label2, Order ] % Label1 and Label2 are, as you guessed, the labels of the atoms connected % by the bond. Order is the bond order as defined by a chemist, i.e., "1" % for a single bond, "2" for a double bond, and "3" for a triple bond. % The bond order of aromatic bonds ought to be "1.5", but following % chemical custom we model aromatic bonds as alternating single and double % bonds. Like for the atoms, the constructor "bond" serves readability. % Markus Perling (perling@dfki.uni-kl.de), DFKI/Univ. Kaiserslautern, did % the transcription of the PROLOG form into the final RELFUN form below % (only the molh version will be given). He also adapted the txt2html tool % for HTMLizing the original text form of NUTRIMINE. % Beta-Carotene molecule(beta_carotene, molh, [ atom[1,6], atom[2,6], atom[3,6], atom[4,6], atom[5,6], atom[6,6], atom[7,6], atom[8,6], atom[9,6], atom[10,6], atom[11,6], atom[12,6], atom[13,6], atom[14,6], atom[15,6], atom[16,6], atom[17,6], atom[18,6], atom[19,6], atom[20,6], atom[21,6], atom[22,6], atom[23,6], atom[24,6], atom[25,6], atom[26,6], atom[27,6], atom[28,6], atom[29,6], atom[30,6], atom[31,6], atom[32,6], atom[33,6], atom[34,6], atom[35,6], atom[36,6], atom[37,6], atom[38,6], atom[39,6], atom[40,6], atom[41,1], atom[42,1], atom[43,1], atom[44,1], atom[45,1], atom[46,1], atom[47,1], atom[48,1], atom[49,1], atom[50,1], atom[51,1], atom[52,1], atom[53,1], atom[54,1], atom[55,1], atom[56,1], atom[57,1], atom[58,1], atom[59,1], atom[60,1], atom[61,1], atom[62,1], atom[63,1], atom[64,1], atom[65,1], atom[66,1], atom[67,1], atom[68,1], atom[69,1], atom[70,1], atom[71,1], atom[72,1], atom[73,1], atom[74,1], atom[75,1], atom[76,1], atom[77,1], atom[78,1], atom[79,1], atom[80,1], atom[81,1], atom[82,1], atom[83,1], atom[84,1], atom[85,1], atom[86,1], atom[87,1], atom[88,1], atom[89,1], atom[90,1], atom[91,1], atom[92,1], atom[93,1], atom[94,1], atom[95,1], atom[96,1] ], [ bond[1,2,1], bond[2,3,1], bond[3,4,1], bond[4,5,2], bond[5,6,1], bond[1,6,1], bond[6,7,1], bond[6,8,1], bond[4,9,1], bond[5,10,1], bond[10,11,2], bond[11,12,1], bond[12,13,2], bond[12,14,1], bond[13,15,1], bond[15,16,2], bond[16,17,1], bond[17,18,2], bond[17,19,1], bond[18,20,1], bond[20,21,2], bond[21,22,1], bond[22,23,2], bond[23,24,1], bond[23,25,1], bond[24,26,2], bond[26,27,1], bond[27,28,2], bond[28,29,1], bond[28,30,1], bond[29,31,2], bond[31,32,1], bond[32,33,1], bond[33,34,1], bond[34,35,1], bond[35,36,1], bond[36,37,1], bond[32,37,2], bond[37,38,1], bond[33,39,1], bond[33,40,1], bond[1,41,1], bond[1,42,1], bond[2,43,1], bond[2,44,1], bond[3,45,1], bond[3,46,1], bond[7,47,1], bond[7,48,1], bond[7,49,1], bond[8,50,1], bond[8,51,1], bond[8,52,1], bond[9,53,1], bond[9,54,1], bond[9,55,1], bond[10,56,1], bond[11,57,1], bond[13,58,1], bond[14,59,1], bond[14,60,1], bond[14,61,1], bond[15,62,1], bond[16,63,1], bond[18,64,1], bond[19,65,1], bond[19,66,1], bond[19,67,1], bond[20,68,1], bond[21,69,1], bond[22,70,1], bond[24,71,1], bond[25,72,1], bond[25,73,1], bond[25,74,1], bond[26,75,1], bond[27,76,1], bond[29,77,1], bond[30,78,1], bond[30,79,1], bond[30,80,1], bond[31,81,1], bond[34,82,1], bond[34,83,1], bond[35,84,1], bond[35,85,1], bond[36,86,1], bond[36,87,1], bond[38,88,1], bond[38,89,1], bond[38,90,1], bond[39,91,1], bond[39,92,1], bond[39,93,1], bond[40,94,1], bond[40,95,1], bond[40,96,1] ] ). % Vitamin-C molecule(ascorbic_acid, molh, [ atom[1,6], atom[2,6], atom[3,6], atom[4,8], atom[5,6], atom[6,6], atom[7,8], atom[8,8], atom[9,8], atom[10,6], atom[11,8], atom[12,8], atom[13,1], atom[14,1], atom[15,1], atom[16,1], atom[17,1], atom[18,1], atom[19,1], atom[20,1] ], [ bond[1,2,2], bond[2,3,1], bond[3,4,1], bond[4,5,1], bond[1,5,1], bond[3,6,1], bond[1,7,1], bond[2,8,1], bond[5,9,2], bond[6,10,1], bond[6,11,1], bond[10,12,1], bond[3,13,1], bond[6,14,1], bond[7,15,1], bond[8,16,1], bond[10,17,1], bond[10,18,1], bond[11,19,1], bond[12,20,1] ] ). % Vitamin-E molecule(alpha_tocopherol, molh, [ atom[1,6], atom[2,6], atom[3,6], atom[4,6], atom[5,6], atom[6,6], atom[7,8], atom[8,6], atom[9,6], atom[10,6], atom[11,6], atom[12,6], atom[13,6], atom[14,6], atom[15,6], atom[16,6], atom[17,6], atom[18,6], atom[19,6], atom[20,6], atom[21,6], atom[22,6], atom[23,6], atom[24,6], atom[25,6], atom[26,6], atom[27,6], atom[28,6], atom[29,6], atom[30,6], atom[31,8], atom[32,1], atom[33,1], atom[34,1], atom[35,1], atom[36,1], atom[37,1], atom[38,1], atom[39,1], atom[40,1], atom[41,1], atom[42,1], atom[43,1], atom[44,1], atom[45,1], atom[46,1], atom[47,1], atom[48,1], atom[49,1], atom[50,1], atom[51,1], atom[52,1], atom[53,1], atom[54,1], atom[55,1], atom[56,1], atom[57,1], atom[58,1], atom[59,1], atom[60,1], atom[61,1], atom[62,1], atom[63,1], atom[64,1], atom[65,1], atom[66,1], atom[67,1], atom[68,1], atom[69,1], atom[70,1], atom[71,1], atom[72,1], atom[73,1], atom[74,1], atom[75,1], atom[76,1], atom[77,1], atom[78,1], atom[79,1], atom[80,1], atom[81,1] ], [ bond[1,2,2], bond[2,3,1], bond[3,4,2], bond[4,5,1], bond[5,6,2], bond[1,6,1], bond[4,7,1], bond[7,8,1], bond[8,9,1], bond[9,10,1], bond[5,10,1], bond[6,11,1], bond[2,12,1], bond[3,13,1], bond[8,14,1], bond[8,15,1], bond[15,16,1], bond[16,17,1], bond[17,18,1], bond[18,19,1], bond[18,20,1], bond[19,21,1], bond[21,22,1], bond[22,23,1], bond[23,24,1], bond[23,25,1], bond[24,26,1], bond[26,27,1], bond[27,28,1], bond[28,29,1], bond[28,30,1], bond[1,31,1], bond[9,32,1], bond[9,33,1], bond[10,34,1], bond[10,35,1], bond[11,36,1], bond[11,37,1], bond[11,38,1], bond[12,39,1], bond[12,40,1], bond[12,41,1], bond[13,42,1], bond[13,43,1], bond[13,44,1], bond[14,45,1], bond[14,46,1], bond[14,47,1], bond[15,48,1], bond[15,49,1], bond[16,50,1], bond[16,51,1], bond[17,52,1], bond[17,53,1], bond[18,54,1], bond[19,55,1], bond[19,56,1], bond[20,57,1], bond[20,58,1], bond[20,59,1], bond[21,60,1], bond[21,61,1], bond[22,62,1], bond[22,63,1], bond[23,64,1], bond[24,65,1], bond[24,66,1], bond[25,67,1], bond[25,68,1], bond[25,69,1], bond[26,70,1], bond[26,71,1], bond[27,72,1], bond[27,73,1], bond[28,74,1], bond[29,75,1], bond[29,76,1], bond[29,77,1], bond[30,78,1], bond[30,79,1], bond[30,80,1], bond[31,81,1] ] ). % For easier reading let us convert molecules so that AtNr becomes the % usual chemical symbol spelled as a lower-case constant (e.g. 1 -> H -> h). % The number-to-symbol-mapping function nosymb is in/accesses the ELEMENTS KB: % http://www.dfki.uni-kl.de/~vega/relfun+/elements.rfp % http://www.dfki.uni-kl.de/~vega/relfun+/elements.rfp.html conv-atom-list([]) :& []. conv-atom-list([atom[Label,AtNr]|MoreAtoms]) :- AtSy .= nosymb(AtNr) & tup(atom[Label,AtSy]|conv-atom-list(MoreAtoms)). % When browsing the *.html version, readers may now see a dialog script ... % http://www.dfki.uni-kl.de/~vega/relfun+/nutrimine.script.html % ... or conduct a semi-automatic dialog by using this CGI script: % http://serv-302.dfki.uni-kl.de:8000/~ueben/cgi-bin/rfi % Prior to CGI click, copy this line (without "%") and paste into Query window: % exec "/home/boley/relfun/nutrimine/nutrimine.unpacked/nutrimine1" % Then paste the following Result line before the first Query, changing 1 to 2: % consult "/home/boley/relfun/nutrimine/nutrimine.rfp" % exec "/home/boley/relfun/nutrimine/nutrimine.unpacked/nutrimine2" % Now change 2 to 3 through 6, or "%"-passivate exec and pose your own queries: % consult "/home/boley/relfun/nutrimine/nutrimine.rfp" % %exec "/home/boley/relfun/nutrimine/nutrimine.unpacked/nutrimine2" % tupof(tup(Food,nutrifood(vitamin-e,Food)))