ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA PROVOZNĚ EKONOMICKÁ FAKULTA KATEDRA INFORMAČNÍHO INŽENÝRSTVÍ



Podobné dokumenty
Seminární práce z Teorie ICT


Prolog PROgramming in LOGic část predikátové logiky prvního řádu rozvoj začíná po roce 1970 Robert Kowalski teoretické základy Alain Colmerauer, David

Domény. Petr Štěpánek. S využitím materialu Krysztofa R. Apta

III/2 Inovace a zkvalitnění výuky prostřednictvím ICT

Logika a logické programování

PLNÉ ZAPNUTÍ / ZASTŘEŽENÍ SYSTÉMU

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

2N NetSpeaker IP Audio Systém

Programovací jazyk Prolog

Elektronická dokumentace - LATEX. Maticové operace

DIGITÁLNÍ ARCHIV VZDĚLÁVACÍCH MATERIÁLŮ

Zapisovač nemá síťový vypínač a zapne se připojením síťové šnůry na zdroj napájení.

Podrobný postup stažení, vyplnění a odeslání elektronické žádosti

Střední odborné učiliště Domažlice,Prokopa Velikého 640, Domažlice, MPV Stod, Plzeňská 322 Charakteristika výukového materiálu: VY_52_INOVACE_01.

ENERGETICKÝ DISPEČINK. základní informace o službě

NPRG030 Programování I 3/2 Z --- NPRG031 Programování II --- 2/2 Z, Zk

Intervalové stromy. Představme si, že máme posloupnost celých čísel p 0, p 1,... p N 1, se kterou budeme. 1. Změna jednoho čísla v posloupnosti.

Jak začít pracovat s programem BetOptim.exe?

ZÁPADOČESKÁ UNIVERZITA V PLZNI FAKULTA PEDAGOGICKÁ KATEDRA TECHNICKÉ VÝCHOVY

1 Prolog. 1.1 Histroie. 1.2 Základní rysy Prologu. 1.3 Databáze Prologu

Databázový systém Matylda

Metodický pokyn k vypracování absolventské práce

ISTAV - INFORMAČNÍ SERVIS VE STAVEBNICTVÍ

ISPOP 2016 MANUÁL K VYPLNĚNÍ FORMULÁŘŮ PRO OHLAŠOVÁNÍ ÚDAJŮ PRO VODNÍ BILANCI

Jak připravit žákům trenažer pro cvičení jednoduchých dovedností

Logické programování

Základy programování (IZP)

MQL4 COURSE. By Coders guru -5 Smyčky & Rozhodnutí Část 2

[APLIKACE PRO PŘEHRÁVÁNÍ VIDEA - PROJEKT MIAMI]

Logické programování

1. Problematika účetních výkazů a jejich aktualizace

POZOR!!! NESMÍ SE POUŽÍT KONVENIENCÍ A JINÝCH POLOTOVARŮ. VYUŽITÍ HOTOVÉHO VÝVARU K PŘÍPRAVĚ POKRMŮ PO KONZULTACI S PANÍ SLUKOVOU.

KVANTIFIKACE RIZIK VYBRANÝCH NEŽÁDOUCÍCH STAVŮ VE VODÁRENSKÝCH DISTRIBUČNÍCH SYSTÉMECH

POSTUP KRAJSKÉHO ÚŘADU ZLÍNSKÉHO KRAJE PRO NASTAVENÍ OPTIMÁLNÍHO NÁVRHU DOTACE MPSV PRO ROK 2013

2. přednáška. Databázový přístup k datům (SŘBD) Možnost počítání v dekadické aritmetice - potřeba přesných výpočtů, např.

FAKULTA EKONOMICKÁ ZČU PLZEŇ. Katedra ekonomie a financí. Mikroekonomie cvičení 8

AKUSTIKA. Základy práce s aplikací. Verze 1.0.0

DIGITÁLNÍ ARCHIV VZDĚLÁVACÍCH MATERIÁLŮ

Programovací jazyk Haskell

ELEKTRONICKÁ PORODNÍ KNIHA POPIS APLIKACE Michal Huptych, Petr Janků, Lenka Lhotská

Lineární programování

Interpret jazyka IFJ2011

Maturitní témata ústní zkoušky profilové části : VÝROBA A ODBYT. Obor: L/01 Gastronomie

Hotelová škola, Obchodní akademie a Střední průmyslová škola Teplice,Benešovo náměstí 1, příspěvková organizace

VY_32_INOVACE_08_2_04_PR

Návod k obsluze CICLOPuls CP12C

Programovací í jazyk Haskell

Návod na používání elektronické žákovské knížky

ë ohlášení čekajícího volání zapnuté

Korozní mapy ČR. Uživatelský manuál. Kateřina Kreislová, Lukáš Pacák, Jaroslav Skořepa, Hana Geiplová, Zdeněk Barták

2.1 Podmínka typu case Cykly Cyklus s podmínkou na začátku Cyklus s podmínkou na konci... 5


Bilaterální fond na programové úrovni opatření B. Hana Pátrová Ministerstvo financí Odd. realizace, monitorování a hodnocení CZP

Parametrizace, harmonogram

Dodatek k návodu k obsluze a instalaci kotlů BENEKOV. Regulátor RKU 1.5

Mediálně komunikační vzdělávání

PROVOZNÍ INSTRUKCE. Osvětlení pro kameru. Barevná kamera s čelní čočkou. CCIR CCIR (EIA-volitelný) 1,5 0,2 1 ± 0,15 FUNKCE

OBJECT DEFINITION LANGUAGE. Jonáš Klimeš NDBI001 Dotazovací Jazyky I 2013

3. Vlastnická struktura domů a právní důvody užívání bytů

Jazyk matematiky Matematická logika Množinové operace Zobrazení Rozšířená číslená osa

ANOTACE K VÝUKOVÉ SADĚ

Maturitní témata ústní zkoušky profilové části: Výroba a odbyt povinná zkouška. Obor: L/01Gastronomie ŠVP : Gastronomie

Příležitosti nového zákona o zadávání veřejných zakázek pro soutěžení energeticky úsporných a šetrných budov

Základní nápověda pro práci s informační bránou UHK

Č. j.: VZ/S30/03-151/1384/03-če V Brně dne 27. března 2003

1 Test 1 naivní vs standardní

1 Knihovní funkce Skupina funkcí bool Skupina funkcí String Testovací program ELDEC Interface X.XX Example...

popel, glum & nepil 16/28

NEXIS 32 rel Generátor fází výstavby TDA mikro

Nerovnice s neznámou pod odmocninou

Informační manuál GROUPWISE - DISTRIBUČNÍ LISTY FŽP

Jarníkův algoritmus. Obsah. Popis

Inovace a zkvalitnění výuky prostřednictvím ICT Databázové systémy MS Access propojení relací s formuláři a sestavami Ing.

Úvod do databázových systémů

Tematický celek 03 - Cvičné příklady

PŘÍLOHA Č. 3. Integrace ve výuce

Úvod. Programovací paradigmata

1.1 Struktura programu v Pascalu Vstup a výstup Operátory a některé matematické funkce 5

Návod instalaci a obsluze software SPW-01

Univerzita Pardubice

DIGITÁLNÍ UČEBNÍ MATERIÁL. Název školy SOUpotravinářské, Jílové u Prahy, Šenflukova 220

KOMPLEXNÍ VZDĚLÁVÁNÍ KATEDRA STROJNÍ SPŠSE a VOŠ LIBEREC

Mikroekonomie. 1. Opakování příklad 1. Opakování - Příklad 2. Řešení. Řešení. Opakování příklad

Kritéria pro hodnocení 1. výzvy k programu podpory OP PIK ICT a sdílené služby aktivita Zřizování a provoz center sdílených služeb

1. VYMEZENÍ ODBORNÉ STÁŽE

Složené výroky Jsou tvořeny dvěma nebo více výroky jednoduššími. V : Číslo 8 je liché. V : 0,1 N. V : Paříž je hl. město Španělska.

European Energy Award

Příloha č. 1 Přehled vzdělávacích modulů a kurzů Aktivita Počet hodin Forma vzdělání. Jak napsat projektovou žádost 4 prezenční

4IT218 Databáze. 4IT218 Databáze

2HCS Fakturace 3 - přechod na nový rok - - převod dat do nového roku - - změna sazby DPH -

Odborná škola výroby a služeb, Plzeň, Vejprnická 56, Plzeň. Název školy. Název projektu. Číslo materiálu 41. Mgr. Bc.

Zasedání FCI komise pro pracovní kynologii , Nova Goriza, Slovinsko

ZÁKLADY PRÁCE S PROHLÍŽEČEM

Basic256 - úvod do programování Příklady. ing. petr polách

Numerické řešení rovnice f(x) = 0

Maturitní práce témata pro obor vzdělání Hotelnictví a turismus Školní rok

STANOVENÍ SPALNÉHO TEPLA A VÝPOČET VÝHŘEVNOSTI PALIVA

KIV/PIA Semestrální práce

4. Lineární nerovnice a jejich soustavy

Transkript:

ČESKÁ ZEMĚDĚLSKÁ UNIVERZITA PROVOZNĚ EKONOMICKÁ FAKULTA KATEDRA INFORMAČNÍHO INŽENÝRSTVÍ Teorie ICT Zápočtová práce Jídelní lístek Zdeněk Styblík 1. ročník INFONK

Obsah Obsah...2 Popis zvoleného problému...3 Teorie...3 Analýza problému...3 Implementace...3 Vysvětlení programu...7 Očekávaný vstup...7 Metody...8 Ukázka trasování...8 Použité zdroje...10

Popis zvoleného problému Máme nabídku předkrmů polévek hlavních jídel a moučníků. Každý pokrm má cenu a kalorickou hodnotu. Úkolem je sestavit nabídku menu podle různých kritérií např. minimální kalorická hodnota minimální cena minimální kalorická hodnota při nepřekročení zadané ceny atd. Teorie Prolog byl vyvinut v sedmdesátých letech minulého století Alainem Colmerauerem ve Francii a Robertem Kowalskim ve Velké Británii. Prolog je zkratkou od "programování v logice" a na rozdíl jiných programovacích jazyků je deklarativní. To znamená že programátor pouze stanoví cíl a jeho dosažení je ponecháno na Prologu. Naopak v procedurálním programovacím jazyce musí programátor detailně specifikovat co a jak se má provést. Programování: deklarací faktů popisujících explicitní vztahy mezi objekty a vlastnostmi které mohou mít definicí pravidel implicitních vztahů mezi objekty a pravidly definující implicitní vlastnosti objektů a potom na základě kladení dotazů ohledně těchto vztahů Datové typy v Prologu jsou: term struktura jednoduchý term proměnná konstanta číslo atom Analýza problému Data bude nejlepší(nejsnažší) nadeklarovat jako fakta(term). Pro sestavení menu a výpočty bude nejvhodnější napsat metody které nám jednak zabrání duplicitě kódu a zárověň ušetří spoustu psaní resp. kopírování stejných řádek kódu/výroků. Implementace % fakta - predkrmy predkrm(kruti_rolka 70 595). predkrm(carpaccio_de_ternera 60 665). predkrm(krevetovy_koktejl100 591). predkrm(morsky_koktejl 90 328). predkrm(zadny 0 0). % fakta - polevky

polevka(borsc 20 185). polevka(bramboracka_s_houbami 22 750). polevka(cibulova_se_syrem 25 3155). polevka(cesnekova 24 500). polevka(cinska_instantni_slepici 15 915). polevka(cockova 25 637). polevka(brokolicova 20 247). polevka(fazolova 20 775). polevka(gaspacho 25 350). polevka(gulasova 23 440). polevka(hrachova 22 135). polevka(kapustova 21 652). polevka(zadny 0 0). % fakta - hlavni jidla hjidlo(sladke_knedliky 99 1066). hjidlo(bavorske_vdolky 90 2160). hjidlo(bolonske_lasagne 115 975). hjidlo(bramboraky_4ks 88 2922). hjidlo(svickova_na_smetane_knedlik 100 1860). hjidlo(gulas_s_hovezim_masem_a_fazolemi 95 295). hjidlo(hovezi_gulas_s_knedliky 85 967). hjidlo(steak_z_tunaka 120 2347). hjidlo(kureci_rizek_bramborova_kase 90 798). hjidlo(hovezi_rostena 100 772). hjidlo(sekana_pecene 93 2020). hjidlo(veprova_pecene 85 1177). hjidlo(veprove_rizoto_se_zeleninou_syrem 85 816). hjidlo(zadny 0 0). % fakta - moucniky moucnik(vetrnik 30 552). moucnik(marokanka 15 215). moucnik(kremrole_se_slehackou 20 756). moucnik(bananek_v_cokolade 12 793). moucnik(cokoladova_rolada 40 1472). moucnik(indian 23 688). moucnik(konakova_spicka 25 837). moucnik(zadny 0 0). % menu limitovane cenou shora. hlavni jidlo musi byt vzdy a bezpodminecne % zahrnuto v menu. % ocekavane parametry jsou C ~ Cena. menu_cena_max(c) :- predkrm(pr C_PR _) polevka(po C_PO _) hjidlo(hj C_HJ _) moucnik(mo C_MO _) C_HJ > 0 (C_HJ + C_PR + C_PO + C_MO) =< C write('# Nazev cena') nl write('predkrm: ') write(pr) write(' ') write(c_pr) nl

write('polevka: ') write(po) write(' ') write(c_po) nl write('hlavni jidlo: ') write(hj) write(' ') write(c_hj) nl write('moucnik: ') write(mo) write(' ') write(c_mo) nl % menu limitovane cenou zdola. hlavni jidlo musi byt vzdy a bezpodminecne % zahrnuto v menu. % ocekavane parametry jsou C ~ Cena. menu_cena_min(c) :- predkrm(pr C_PR _) polevka(po C_PO _) hjidlo(hj C_HJ _) moucnik(mo C_MO _) C_HJ > 0 (C_HJ + C_PR + C_PO + C_MO) >= C write('# Nazev cena') nl write('predkrm: ') write(pr) write(' ') write(c_pr) nl write('polevka: ') write(po) write(' ') write(c_po) nl write('hlavni jidlo: ') write(hj) write(' ') write(c_hj) nl write('moucnik: ') write(mo) write(' ') write(c_mo) nl % menu limitovane pouze cenou shora tzn. je mozne vybrat cokoliv. % ocekavane parametry jsou C ~ Cena. menu_free_cena_max(c) :- predkrm(pr C_PR _) polevka(po C_PO _) hjidlo(hj C_HJ _) moucnik(mo C_MO _) (C_PR + C_PO + C_HJ + C_MO) =< C write('# Nazev cena') nl write('predkrm: ') write(pr) write(' ') write(c_pr) nl write('polevka: ') write(po) write(' ') write(c_po) nl write('hlavni jidlo: ') write(hj) write(' ') write(c_hj) nl write('moucnik: ') write(mo) write(' ') write(c_mo) nl % menu limitovane poctem kalorii shora. hlavni jidlo musi byt vzdy a % bezpodminecne zahrnuto v menu. % ocekavane parametry jsou K ~ Kalorie. menu_kalorie_max(k) :- predkrm(pr _ K_PR) polevka(po _ K_PO) hjidlo(hj _ K_HJ) moucnik(mo _ K_MO) K_HJ > 0 (K_HJ + K_PR + K_PO + K_MO) =< K write('# Nazev kcal') nl write('predkrm: ') write(pr) write(' ') write(k_pr) nl write('polevka: ') write(po) write(' ') write(k_po) nl write('hlavni jidlo: ') write(hj) write(' ') write(k_hj) nl write('moucnik: ') write(mo) write(' ') write(k_mo) nl % menu limitovane poctem kalorii zdola. hlavni jidlo musi byt vzdy a

% bezpodminecne zahrnuto v menu. % ocekavane parametry jsou K ~ Kalorie. menu_kalorie_min(k) :- predkrm(pr _ K_PR) polevka(po _ K_PO) hjidlo(hj _ K_HJ) moucnik(mo _ K_MO) K_HJ > 0 (K_HJ + K_PR + K_PO + K_MO) >= K write('# Nazev kcal') nl write('predkrm: ') write(pr) write(' ') write(k_pr) nl write('polevka: ') write(po) write(' ') write(k_po) nl write('hlavni jidlo: ') write(hj) write(' ') write(k_hj) nl write('moucnik: ') write(mo) write(' ') write(k_mo) nl % menu limitovane poctem kalorii a cenou shora. % ocekavane parametry jsou K ~ Kalorie C ~ Cena. menu_kalorie_max_cena_max(k C) :- predkrm(pr C_PR K_PR) polevka(po C_PO K_PO) hjidlo(hj C_HJ K_HJ) moucnik(mo C_MO K_MO) K_HJ > 0 (K_HJ + K_PR + K_PO + K_MO) =< K (C_PR + C_PO + C_HJ + C_MO) =< C write('# Nazev cena kcal') nl write('predkrm: ') write(pr) write(' ') write(c_pr) write(' ') write(k_pr) nl write('polevka: ') write(po) write(' ') write(c_po) write(' ') write(k_po) nl write('hlavni jidlo: ') write(hj) write(' ') write(c_hj) write(' ') write(k_hj) nl write('moucnik: ') write(mo) write(' ') write(c_mo) write(' ') write(k_mo) nl % menu limitovane poctem kalorii zdola a cenou shora. % ocekavane parametry jsou K ~ Kalorie C ~ Cena. menu_kalorie_min_cena_max(k C) :- predkrm(pr C_PR K_PR) polevka(po C_PO K_PO) hjidlo(hj C_HJ K_HJ) moucnik(mo C_MO K_MO) K_HJ > 0 (K_HJ + K_PR + K_PO + K_MO) >= K (C_PR + C_PO + C_HJ + C_MO) =< C write('# Nazev cena kcal') nl write('predkrm: ') write(pr) write(' ') write(c_pr) write(' ') write(k_pr) nl write('polevka: ') write(po) write(' ') write(c_po) write(' ') write(k_po) nl write('hlavni jidlo: ') write(c_hj) write(' ') write(hj) write(' ') write(k_hj) nl

write('moucnik: ') write(mo) write(' ') write(c_mo) write(' ') write(k_mo) nl % vypise Hlavni Jidla vypis_hlavni_jidla :- write('seznam hlavnich jidel - nazev cena kcal:') nl hjidlo(hj C_HJ K_HJ) write(hj) write(' ') write(c_hj) write(' ') write(k_hj) nl fail. % vypise Moucniky vypis_moucniky :- write('seznam moucniku - nazev cena kcal:') nl moucnik(mo C_MO K_MO) write(mo) write(' ') write(c_mo) write(' ') write(k_mo) nl fail. % vypise Polevky vypis_polevky :- write('seznam polevek - nazev cena kcal:') nl polevka(po C_PO K_PO) write(po) write(' ') write(c_po) write(' ') write(k_po) nl fail. % vypise Predkrmy vypis_predkrmy :- write('seznam predkrmu - nazev cena kcal:') nl predkrm(pr C_PR K_PR) write(pr) write(' ') write(c_pr) write(' ') write(k_pr) nl fail. Vysvětlení programu Očekávaný vstup Očekává se že uživatel bude volat požadované metody ručně. Očekávaným vstupem jsou tedy názvy předem deklarovaných metod a jejich parametry. Následuje krátká ukázka takového volaní: 151?- consult('e:/xstyz101_jidelni_listek.pl'). % e:/xstyz101_jidelni_listek.pl compiled 0.01 sec 1 clauses % Pozn.: nacteme Prolog soubor ktery deklaruje data a metody true. 152?- vypis_predkrmy. % Pozn.: vypise seznam predkrmu resp. znamych faktu Seznam predkrmu - nazev cena kcal: kruti_rolka 70 595 carpaccio_de_ternera 60 665 krevetovy_koktejl 100 591 morsky_koktejl 90 328 zadny 0 0 false. 153?- menu_kalorie_max(2000). % Pozn.: vypise mozne kombinace jidel ktere maji soucet kalorii mensi nez 2000. # Nazev kcal Predkrm: kruti_rolka 595

Polevka: borsc 185 Hlavni jidlo: sladke_knedliky 1066 Moucnik: zadny 0 --- true. Metody menu_cena_max(<cena_max>) menu_cena_min(<cena_min>) menu_free_cena_max(<cena_max>) menu_kalorie_max(<kcal_max>) menu_kalorie_min(<kcal_min>) menu_kalorie_max_cena_max(<kcal_max> <CENA_MAX>) menu_kalorie_min_cena_max(<kcal_min> <CENA_MAX>) vypis_hlavni_jidla() vypis_moucniky() vypis_polevky() vypis_predkrmy() Ukázka trasování Ukázka trasování metody menu_free_cena_max() při zavolání s parametrem 210: % zapne trasovani prikazů [trace] [2] 6?- trace. true. % zavoláme danou metodu a předáme jí parametr 210 [trace] [2] 6?- menu_free_cena_max(210). Call: (18) menu_free_cena_max(210)? creep Call: (19) predkrm(_g2088 _G2089 _G2090)? creep Exit: (19) predkrm(kruti_rolka 70 595)? creep Call: (19) polevka(_g2088 _G2089 _G2090)? creep Exit: (19) polevka(borsc 20 185)? creep Call: (19) hjidlo(_g2088 _G2089 _G2090)? creep Exit: (19) hjidlo(sladke_knedliky 99 1066)? creep Call: (19) moucnik(_g2088 _G2089 _G2090)? creep Exit: (19) moucnik(vetrnik 30 552)? creep Call: (19) 70+20+99+30=<210? creep Fail: (19) 70+20+99+30=<210? creep Redo: (19) moucnik(_g2088 _G2089 _G2090)? creep Exit: (19) moucnik(marokanka 15 215)? creep % ověření podmínky dle zadaného parametru Call: (19) 70+20+99+15=<210? creep Exit: (19) 70+20+99+15=<210? creep

% podmínka je splněna následuje vypsání výstupu Call: (19) write('# Nazev cena')? creep # Nazev cena Exit: (19) write('# Nazev cena')? creep Call: (19) write('predkrm: ')? creep Predkrm: Exit: (19) write('predkrm: ')? creep Call: (19) write(kruti_rolka)? creep kruti_rolka Exit: (19) write(kruti_rolka)? creep Call: (19) write(' ')? creep Exit: (19) write(' ')? creep Call: (19) write(70)? creep 70 Exit: (19) write(70)? creep Call: (19) write('polevka: ')? creep Polevka: Exit: (19) write('polevka: ')? creep Call: (19) write(borsc)? creep borsc Exit: (19) write(borsc)? creep Call: (19) write(' ')? creep Exit: (19) write(' ')? creep Call: (19) write(20)? creep 20 Exit: (19) write(20)? creep Call: (19) write('hlavni jidlo: ')? creep Hlavni jidlo: Exit: (19) write('hlavni jidlo: ')? creep Call: (19) write(sladke_knedliky)? creep sladke_knedliky Exit: (19) write(sladke_knedliky)? creep Call: (19) write(' ')? creep Exit: (19) write(' ')? creep Call: (19) write(99)? creep 99 Exit: (19) write(99)? creep Call: (19) write('moucnik: ')? creep Moucnik: Exit: (19) write('moucnik: ')? creep Call: (19) write(marokanka)? creep marokanka Exit: (19) write(marokanka)? creep Call: (19) write(' ')? creep Exit: (19) write(' ')? creep Call: (19) write(15)? creep

15 Exit: (19) write(15)? creep Call: (19) write(---)? creep --- Exit: (19) write(---)? creep Exit: (18) menu_free_cena_max(210)? creep true. Call: (7) fail? creep Fail: (7) fail? creep % Prolog hledá další alternativní řešení Redo: (7) predkrm(_g513 _G514 _G515)? creep Exit: (7) predkrm(carpaccio_de_ternera 60 665)? creep Call: (7) write(carpaccio_de_ternera)? creep carpaccio_de_ternera Exit: (7) write(carpaccio_de_ternera)? creep Call: (7) write(' ')? creep Exit: (7) write(' ')? creep Call: (7) write(60)? creep 60 Exit: (7) write(60)? creep Call: (7) write(' ')? creep Exit: (7) write(' ')? creep Call: (7) write(665)? creep 665 Exit: (7) write(665)? creep Call: (7) fail? creep Fail: (7) fail? creep......... % Pokračuje dokud nejsou nalezena/vypsána všechna řešení Použité zdroje 1. https://cs.wikipedia.org/wiki/prolog_%28programovac%c3%ad_jazyk %29#Oper.C3.A1tory 2. http://www.kaloricketabulky.cz 3. http://cs.union.edu/~striegnk/courses/esslli04prolog/index.php 4. http://www.swi-prolog.org/faq/ 5. http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/contents.html 6. http://jmvanel.free.fr/ai/prolog-getting-started.html 7. http://cs.union.edu/~striegnk/courses/esslli04prolog/practical.day2.php? s=practical.day2.node2