Marie Duží

Podobné dokumenty
Úvod do TI - logika Logické programování, PROLOG (10.přednáška) Marie Duží

popel, glum & nepil 16/28

Logika a logické programování

Logické programování I

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

Programování v čistém Prologu

Seminární práce z Teorie ICT

Prolog 1-1. Rodinné vztahy pomocí Prologu:

Výroková a predikátová logika - XII

Logické programování

Výroková a predikátová logika - V

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

Úvod do TI - logika Výroková logika - pokračování (3.přednáška) Marie Duží

Negativní informace. Petr Štěpánek. S použitím materiálu M.Gelfonda a V. Lifschitze. Logické programování 15 1

Přednáška 3. Rekurze 1

Logika. 5. Rezoluční princip. RNDr. Luděk Cienciala, Ph. D.

klauzulí deklarativní (specifikace programu je přímo programem) popel, glum & nepil 1/18

Matematická logika. Miroslav Kolařík

Marie Duží

V každém kroku se a + b zmenší o min(a, b), tedy vždy alespoň o 1. Jestliže jsme na začátku dostali 2

Řešení: PŘENESVĚŽ (N, A, B, C) = přenes N disků z A na B pomocí C

vhodná pro strojové dokazování (Prolog) metoda založená na vyvracení: dokazuje se nesplnitelnost formulí

Slepé prohledávání do šířky Algoritmus prohledávání do šířky Při tomto způsobu prohledávání máme jistotu, že vždy nalezneme koncový stav, musíme ale p

Programovací jazyk Prolog

Logické programování

Marie Duží

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

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Implementace LL(1) překladů

Výroková logika - opakování

Skolemizace. x(x + f(x) = 0). Interpretace f unární funkce, která pro daný

PROGRAMOVACÍ JAZYKY A PŘEKLADAČE LL SYNTAKTICKÁ ANALÝZA DOKONČENÍ, IMPLEMENTACE.

Programovací jazyky. imperativní (procedurální) neimperativní (neprocedurální) assembler (jazyk symbolických instrukcí)

Prohledávání do šířky = algoritmus vlny

Occur-check (Test konfliktu proměnných)

Logické programy Deklarativní interpretace

Základy umělé inteligence

Rekurze. Pavel Töpfer, 2017 Programování 1-8 1

2.5 Rezoluční metoda v predikátové logice

Výroková a predikátová logika - XIII

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 21.

Obsah: Problém osmi dam

Algoritmizace Dynamické programování. Jiří Vyskočil, Marko Genyg-Berezovskyj 2010

Programování: základní konstrukce, příklady, aplikace. IB111 Programování a algoritmizace

Výroková a predikátová logika - III

Výroková a predikátová logika - III

8. Rekurze. doc. Ing. Jiří Vokřínek, Ph.D. Katedra počítačů Fakulta elektrotechnická České vysoké učení technické v Praze

Metody odvozování. matematická východiska: logika, Prolog

Logické programování s omezujícími podmínkami. Constraint Logic Programming: CLP

Časová a prostorová složitost algoritmů

Obsah přednášky. programovacího jazyka. Motivace. Princip denotační sémantiky Sémantické funkce Výrazy Příkazy Vstup a výstup Kontinuace Program

type Obdelnik = array [1..3, 1..4] of integer; var M: Obdelnik;

Částečná korektnost. Petr Štěpánek. S využitím materialu Krysztofa R. Apta

Úvod do TI - logika Predikátová logika 1.řádu (4.přednáška) Marie Duží marie.duzi@vsb.cz

PROBLÉM OSMI DAM II. Problém osmi dam. Obsah:

Metody návrhu algoritmů, příklady. IB111 Programování a algoritmizace

Obecná informatika. Matematicko-fyzikální fakulta Univerzity Karlovy v Praze. Podzim 2012

Klauzulární logika. úvod. Šárka Vavrečková. 20. října Ústav informatiky Filozoficko-Přírodovědecká fakulta Slezské univerzity, Opava

Algoritmy a datové struktury

Programovací jazyk Prolog

Znalosti budeme nejčastěji vyjadřovat v predikátové logice prvního řádu. Metody:

3. přednáška. Obsah: Řídící struktury sekvence, if-else, switch, for, while, do-while. Zpracování posloupnosti

NPRG030 Programování I RNDr.Tomáš Holan, Ph.D. 4.patro, č

Vyhledávání. doc. Mgr. Jiří Dvorský, Ph.D. Katedra informatiky Fakulta elektrotechniky a informatiky VŠB TU Ostrava. Prezentace ke dni 12.

Hanojská věž. T2: prohledávání stavového prostoru. zadání [1 1 1] řešení [3 3 3] dva možné první tahy: [1 1 2] [1 1 3]

Test prvočíselnosti. Úkol: otestovat dané číslo N, zda je prvočíslem

Algoritmizace. 1. Úvod. Algoritmus

Výroková a predikátová logika - II

Úvod do umělé inteligence, jazyk Prolog

Logické operace. Datový typ bool. Relační operátory. Logické operátory. IAJCE Přednáška č. 3. může nabýt hodnot: o true o false

Úvod do umělé inteligence, jazyk Prolog

Úvod do umělé inteligence, jazyk Prolog

1. Implementace funkce počet vrcholů. Předmět: Algoritmizace praktické aplikace (3ALGA)

Úvod do umělé inteligence, jazyk Prolog

Úvod do umělé inteligence, jazyk Prolog

Rekurze. Jan Hnilica Počítačové modelování 12

Usuzování za neurčitosti

MATURITNÍ OTÁZKY ELEKTROTECHNIKA - POČÍTAČOVÉ SYSTÉMY 2003/2004 PROGRAMOVÉ VYBAVENÍ POČÍTAČŮ

Úvod do umělé inteligence, jazyk Prolog

Umělá inteligence I. Roman Barták, KTIML.

Výroková a predikátová logika - X

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

3 Co je algoritmus? Trocha historie Definice algoritmu Vlastnosti algoritmu... 3

Funkce, intuitivní chápání složitosti

SLD-derivace. Petr Štěpánek. S využitím materiálu Krysztofa R. Apta

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

Martin Milata, Pokud je alespoň jeden rozměr čokolády sudý (s výjimkou tabulky velikosti 1x2, která už je od

přednáška 2 Marie Duží

Rozklad problému na podproblémy

Systém přirozené dedukce výrokové logiky

NMIN101 Programování 1 2/2 Z --- NMIN102 Programování /2 Z, Zk

Programovací jazyk Haskell

Zastavování výpočtů (Terminace)

Databázové systémy. * relační kalkuly. Tomáš Skopal. - relační model

Algoritmizace a programování. Ak. rok 2012/2013 vbp 1. ze 44

Rekurzivní algoritmy

1 PRVOCISLA: KRATKY UKAZKOVY PRIKLAD NA DEMONSTRACI BALIKU WEB 1

Rekurze. IB111 Úvod do programování skrze Python

Virtuální počítač. Uživatelský program Překladač programovacího jazyka Operační systém Interpret makroinstrukcí Procesor. PGS K.

Binární soubory (datové, typované)

Transkript:

Marie Duží marie.duzi@vsb.cz

Základy (logika) Prologu Metoda (čistého) logického programování je speciálním případem obecné rezoluční metody. Oproti obecné rezoluční metodě splňuje následující omezení: Pracuje pouze s Hornovými klauzulemi (které mají nanejvýš jeden pozitivní literál). Používá lineární strategii generování rezolvent spolu s tzv. navracením (backtracking). 2

Základy (logika) Prologu V logickém programování používáme následující terminologii: Zápisy: P :- Q 1, Q 2,..,Q n. podmíněné příkazy (pravidla) (což je ekvivalentní: Q 1 Q 2 Q n P, neboli (Q 1 Q 2 Q n ) P ) Zápis P. Zápisy?- Q 1, Q 2,..,Q n. nepodmíněný příkaz (fakt) cíle (cílové klauzule, dotazy (což je ekvivalentní: Q 1 Q 2 Q n ) Zápis, YES: spor (prázdná klauzule) 3

Základy (logika) Prologu Logický program je posloupnost příkazů (procedur) podmíněných (tj. pravidel) i nepodmíněných (tj. faktů). Cílová klauzule zadává otázky, na které má program nalézt odpovědi. Pozn.: Pojem příkazu chápeme ve smyslu předchozí poznámky. Logický program je tedy deklarativní (ne imperativní). Specifikujeme, co se má provést a neurčujeme, jak se to má provést. Cestu, jak odpovědět na dotazy, najde překladač, tj. určí, co vyplývá ze zadané báze znalostí, a jaké hodnoty je nutno substituovat unifikací za proměnné. 4

Základy (logika) Prologu Omezení na Hornovy klauzule však může někdy činit potíže. Viz příklad hádanka Zkuste naformulovat tuto hádanku v Prologu! Problém: Všichni členové klubu jsou lyžaři nebo horolezci: x [SC(x) (SKI(x) CLIMB(x))] x [ SC(x) SKI(x) CLIMB(x)] 5

Příklad, hádanka nanejvýš 1 pozitivní literál! Tom, Peter and John are members of a sport club. Every member of the club is a skier or a climber. No climber likes raining. All skiers like snow. Peter does not like what Tom likes, and does like what Tom does not like. Tom likes snow and raining. Question: Is there in the club a sportsman who is a climber but not a skier? Solution: Knowledge base (+ query 11): 1. SC(t) 2. SC(p) 3. SC(j) 4. x [ SC(x) (SKI(x) CLIMB(x)) ] problém: 2 pozitivní literály. 5. x [ CLIMB(x) LIKE(x,r) ] 6. x [ SKI(x) LIKE(x,s)] 6. x [LIKE(t,x) LIKE(p,x)] 6. x [ LIKE(t,x) LIKE(p,x)] 9. LIKE(t,s) 10. LIKE(t,r) 11.? x [SC(x) CLIMB(x) SKI(x)] 6

Základy (logika) Prologu Shrnutí omezení: nanejvýš jeden pozitivní literál, nemůžeme vyjádřit přímo negativní fakta. Negace = neúspěch při odvozování! V podstatě jsou v Prologu pouze dvě možnosti, jak ovlivnit provádění programu: Pořadí klauzulí a literálů Příkaz! (řez, cut) 7

Příklad Všichni studenti jsou mladší než Petrova matka. Karel a Mirka jsou studenti. Kdo je mladší než Petrova matka? Zápis v PL1: x [St(x) Ml(x, f(a))] St(b) St(c) y Ml(y, f(a))??? Zápis v Prologu: mladsi(x, matka(petr)):- student(x). pravidlo student(karel). fakt student(mirka). fakt?- mladsi(y, matka(petr)). dotaz 8

Základy (logika) Prologu: Příklad Řešení rezolucí v PL1 (a = Petr, b = Karel, c = Mirka): 1. St(x) Ml(x, f(a)) 2. St(b) 3. St(c) 4. ( y) Ml(y, f(a)) negovaný závěr 5. Ml(b, f(a)) rezoluce 1.,2.; x / b 6. spor YES (y / b) 7. Ml(c, f(a)) rezoluce 1.,3.; x / c 8. spor YES (y / c) 9

Příklad Řešení v Prologu: mladsi(x, matka(petr)):- student(x). pravidlo student(karel). fakt student(mirka). fakt?- mladsi(y, matka(petr)). dotaz Překladač provádí unifikaci a rezoluci, lineární strategie řízená cílem: 1) Cíl?- mladsi(y, matka(petr)) unifikuje s mladsi(x, matka(petr)), Y=X; 2) Generuje nový cíl:?- student(y) 3) Unifikuje tento cíl s 2. faktem v databázi: úspěch při Y=karel 4) Vydá odpověď : YES, Y = karel ; Můžeme zadat ; to znamená, že se ptáme a kdo ještě? Vyvolá tzv. backtracking, tj. proces navracení. Vrátí se k poslednímu cíli a pokouší se splnit jej znovu:?- student(y). Teď již nemůže použít 2. klausuli (pamatuje si místo, které již bylo užito), ale může použít 3. klausuli: 5) Vydá odpověď: YES, Y = mirka; NO 10

Příklad mladsi(x, matka(petr)):- student(x). pravidlo student(karel). fakt student(mirka). fakt mladsi(x, matka(petr)):- dite(x, matka(petr)). pravidlo dite(x,y):-y=matka(x). pravidlo?- mladsi(y, matka(petr)). dotaz a) Vydá odpověď : YES, Y = Karel ; b) Vydá odpověď : YES, Y = Mirka ; Jak to bude fungovat dál? Měla by přijít odpověď Y = Petr (Petr je mladší než jeho matka). 11

Navracení (backtracking) mladsi(y,matka(petr)) student(y) dite(y,matka(petr)) Yes Y=karel ; Yes Y=mirka ; matka(y)=matka(petr) Y=petr 12

Základy Prologu mladsi(x, matka(petr)):- student(x). pravidlo student(karel). fakt student(mirka). fakt mladsi(x, matka(petr)):- dite(x, matka(petr)). pravidlo dite(x,y):-y=matka(x). pravidlo?- mladsi(y, matka(petr)). dotaz a) Vydá odpověď : YES, Y = Karel ; b) Vydá odpověď : YES, Y = Mirka ; c) Vydá odpověď : Yes, Y = Petr. (Petr je mladší než jeho matka.) Položíme další dotaz:?- student(petr). Odpověď: NO To ovšem neznamená, že Petr ve skutečnosti není student, nebo že neexistují jiní studenti. Pouze není uveden v dané bázi znalostí: předpoklad uzavřeného světa (platí jen to, co je v bázi znalostí). Negace jako neúspěch při odvozování. Nemůžeme přímo zadat negativní fakta. 13

Prolog - negace Nemůžeme zadat přímo, že např. Marie není student. Můžeme použít predikát not: Not(student(marie)):- call(student(marie)),!, fail. not(student(marie)). not(student(marie)). Pokud z báze znalostí vyplývá, že student(marie), pak selže. Pokud call(student(marie)) selže, pak uspěje. cut! řez: odřízne možnost navracení: nezkoušej to znovu. Negace jako neúspěch při odvozování. 14

Příklad: Euklidův algoritmus 1. nsd X,X,X. 2. nsd X,Y,Z :- X>Y, nsd X-Y,Y,Z. 3. nsd X,Y,Z :- Y>X, nsd X,Y-X,Z. Pozn.: V běžných implementacích Prologu je vestavěna základní aritmetika. 4.?- nsd 4,6,Z. Dotaz: hledáme největšího společného dělitele čísel 4 a 6. Výpočet: 5.?- 4>6, nsd 4-6,6,Z rezoluce: 4.,2. 4.?- nsd 4,6,Z backtracking 5.?- 6>4, nsd 4,6-4,Z rezoluce: 4,3. 6.?- nsd 4,2,Z Výpočet klausule 5., fakt "6>4" 7.?- 4>2, nsd 4-2,2,Z rezoluce: 6.,2. 8.?- nsd 2,2,Z Výpočet klausule 7., fakt "4>2" 9. ano rezoluce: 8.,1.výsledek: Z = 2 15

Příklad: generování přirozených čísel 1. nat 0. 0 je přirozené číslo 2. nat s(x) :-nat(x). následník přirozeného čísla je přirozené číslo 3.?- nat s(x). jaká jsou všechna přirozená čísla? Výpočet: 4.?-nat X rezoluce: 3.,2. 5. YES, X = 0 ; neboť dotaz 3 je splněn pro X=0 3.?- nat s(x) backtracking 4.?-nat(X) rezoluce: 3.,5. 6. YES, X = s(0) ; neboť otázka 3. je splněna pro X=s(0) 7. YES, X = s(s(0))... Pozn.: srovnej Přednáška 8 - příklad na matematickou indukci. 16

Lineární strategie Pořadí klauzulí může ovlivnit provádění programu ( jak? ) Program A: 1.rodic(rudolf, marie). 2.rodic(kveta,marie). 3.potomek(X,Y):- predek(y,x). 4.dite(X,Y):- rodic(y,x). 5.predek(X,Y):- potomek(y,x). 6.potomek(X,Y):- dite(x,y). 7.potomek(X,Y):- dite(x,z), potomek(z,y). 8.?- potomek(marie,x). Pozn. Přejmenování proměnných provádí rovněž Prolog sám. 17

Strom výpočtu 3 6 predek(x,marie) 5 4 potomek(marie,x) 3 1 predek(x,marie) potomek(marie,x) dite(marie,x) X=rudolf; rodic(x,marie) X=marie (kl.2) atd.... Náš program nevydá odpověď, ačkoliv řešení existuje;první pomoc: dej (nedořešené) klauzule 3, 5 dozadu, a odřízni je pomocí cut! dořešíš později 18

První pomoc (opatrně): cut Program! B: 1. rodic(rudolf, marie). 2. rodic(kveta,marie). 3. potomek(x,y):- dite(x,y). 4. potomek(x,y):- dite(x,z), potomek(z,y). 5. dite(x,y):- rodic(y,x). 6. potomek(x,y):-!, predek(y,x). 7. predek(x,y):-!, potomek(y,x). 8.?- potomek(marie,x). Odřízneme nedodělané větve, tj. klauzule 6, 7 a umístíme je nakonec. 19

Pořadí klauzulí a literálů jak? 1. rodic(rudolf, marie). 2. rodic(kveta,marie). 3. potomek(x,y):- dite(x,y). 4. potomek(x,y):- potomek(x,z), dite(z,y). 5. dite(x,y):- rodic(y,x). 6.?- potomek(marie,w). Výpočet:?- dite(marie,w),?-rodic(w,marie), W=rudolf; W=kveta;????? Po druhém středníku se zacyklí:?-rodic(w,marie),?- dite(marie,w),?- potomek(marie,w),?-potomek(marie,z),?- dite(z,z),?- potomek(marie,z ),?- dite(z,z ),?- dite(z,z ), Stačí zde přehodit literály ve 4. klauzuli. 20

Po přehození, správně: 1. rodic(rudolf, marie). 2. rodic(kveta,marie). 3. potomek(x,y):- dite(x,y). 4. potomek(x,y):- dite(x,z), potomek(z,y). 5. dite(x,y):- rodic(y,x). 6.?- potomek(marie,w). Pomocná zásada: v programu uvádějte nejprve fakta, pak pravidla. V rekurzivních pravidlech rekurzivní predikát až nakonec. Rekurzivní pravidla (obdoba cyklu v imperativních programovacích jazycích): predikát konsekventu (hlava pravidla) se opakuje v antecedentu (tělo pravidla) 21

Typický příklad: rekurze Výpočet funkce faktoriál: x! = x. x 1.. 1, 0! = 1 fact(0, Factorial, Factorial). fact(pocet,pomocna,factorial) :- P1 is Pocet 1, I1 is Pomocna * Počet, fact(p1,i1,factorial).?- fact(3,1,x). Výpočet: fact(3,1,factorial) pomocná proměnná = 1 fact(2,3,factorial) fact(1,6,factorial) fact(0,6,factorial) YES, Factorial = 6 22

Lineární strategie řízená cílem + backtracking (navrácení) - shrnutí Interpret Prologu prohledává strom výpočtu programu zleva doprava a do hloubky (prohledávání do šířky by byla strategie korektní a úplná, ale vyžadovala by při implementaci více zásobníků). Tato lineární strategie není úplná, nemusí vydat řešení, i když existuje, pokud program uvízne v nekonečné větvi, která pořadím klauzulí předchází větvi se správným řešením. 23

Algoritmus (lineární strategie řízená cílem) interpretace logického programu 1. Za aktuální cílovou klauzuli vezmi výchozí cílovou klauzuli (dotaz). 2. Je-li aktuální cílová klauzule prázdná, ukonči výpočet s odpovědí "ano" na otázky položenou výchozí cílovou klauzulí. (Byly-li ve výchozí cílové klausuli volné proměnné, pak poslední substituce termů za tyto proměnné je řešením součást odpovědi.) Není-li aktuální cílová klauzule prázdná, přejdi k bodu 3. 3. Vezmi nejlevější cíl v aktuální cílové klauzuli a hledej v programu příkaz se stejným jménem, který dosud nebyl s tímto cílem konfrontován neúspěšně. Při hledání tohoto cíle postupuj v programu shora dolů podle pořadí příkazů. Nenalezneš-li takový příkaz, ukonči výpočet s odpovědí "ne" na otázku položenou aktuální cílovou klauzulí. Nalezneš-li, přejdi k bodu 4. 4. Pokus se unifikovat hlavu vybraného cíle s hlavou nalezeného stejnojmenného příkazu. Jestliže unifikace neexistuje, vrať se k bodu 3. Jestliže existuje, vezmi za novou aktuální cílovou klauzuli rezolventu dosavadní cílové klauzule s tělem nalezeného příkazu při užití nejobcnější unifikace hlavy cíle a hlavy příkazu. Přejdi k bodu 2. 24

Program: 1. A:- E. 2. A:- B. 3. B:- C. 4. E:- D. 5. C. 6. D:- E. 7.?- A. Lineární strategie řízená cílem + backtracking (navracení) příklad neúplnost Procedura A má dvě možnosti (větve) výpočtu. První pomoc: přehodit větve, tj. klauzule 1 a 2. Druhá pomoc odříznout nekonečnou větev 1 pomocí Cut! 25

Klauzule řez:! obdoba go Kontroluje to a omezuje navracení. Odřízne nepotřebné větve. Tento cíl je splněn jen jednou, při pokusu o návrat na cíl! vrací program až na cíl, který předcházel proceduře, která řez obsahuje (procedura je množina pravidel a faktů se stejnou hlavou = konsekvent). Červený řez změní deklarativní sémantiku programu (špatná programátorská praxe). Zelený řez nemění deklarativní sémantiku, pouze (pokud možno) zefektivní program: a) Realizace if, then, else (vylučující se nebo) b) Zpracování výjimek (chyb) c) Omezení prohledávání velkých databází (po určitém počtu průchodů a úspěšném nalezení) 26

Realizace if, then, else, cyklu pomocí fail Opakovaně prováděj: Je-li teplota vysoká (více než 30%), pak vypni topení, jinak je-li teplota nízká (méně než 15%), pak zapni topení, jinak nedělej nic. termostat(akce) :- teplota(x), akce(x,akce), write( Proved:, Akce), nl, fail. % selže, tedy vyvolá se navracení (backtraching). akce(x, zapni topeni ) :- X < 15,!. akce(x, vypni topeni ) :- X > 30,!. akce(_, nedelej nic ).?- termostat(x). 27

Realizace if, then, else, cyklu pomocí fail termostat(akce) :- teplota(x), akce(x,akce), write( Proved:, Akce), nl, fail. % selže, tedy vyvolá se navracení (backtraching). akce(x, zapni topeni ) :- X < 15,!. akce(x, vypni topeni ) :- X > 30,!. akce(_, nedelej nic ). Podtržení _ je anonymní proměnná, nepotřebuji její hodnotu.?- termostat(x). Výpočet, možné výpisy: zapni topeni, vypni topeni, nedelej nic. Kdybychom nezařadili řez za každý test, vypisovalo by se vždy: zapni topeni, nedelej nic, vypni topeni, nedelej nic, nedelej nic, 28

Realizace if, then, else, řešení bez řezu akce(x, zapni topeni ) :- X < 15. akce(x, vypni topeni ) :- X > 30. akce(x, nedelej nic ) :- not(x < 15), not(x > 30). Méně efektivní řešení, zbytečně znovu testujeme na platnost obou (již testovaných) podmínek. 29

Zpracování výjimek, chyb test(x) :- X = chyba,!, fail. test(x) :- write( platne:, X). Pokud dojde k chybě, pak řez způsobí průchod na fail, test selže, ale návrat na druhou klauzuli (pokus o znovu-splnění cíle test(x)) se již neuskuteční, vrátí se až na klauzuli předcházející test. Ekvivalentní, ale mnohem přehlednější program: test(x) :- not(x = chyba), write( platne:, X). 30

Datová struktura Seznam potenciálně nekonečná uspořádaná n-tice. Např. [ryba, želva, krab, chobotnice, ] Zadání tvaru [Hlava Telo], kde Hlava je prvek seznamu a Tělo je opět seznam. Prázdný seznam [ ]. Procedura member (většinou je vestavěna) testuje zda první argument je prvek druhého argumentu (seznamu) member(x,[x _]). je prvkem, pokud = 1. member(x,[_ Y]) :- member(x,y). jinak testuj tělo Procedura append (spojuje dva seznamy) append([ ],L,L). append([h,t],l,[h,t1]) :- append(t,l,t1). 31