SAMENVATTING PROLOG Universiteit van Amsterdam (2020/2021)
Hoorcollege 1:
declaratief programmeren: speciferen wat er berekend moet worden (opdrachten van het specificeren van
het probleem en het oplossen ervan zijn gescheiden).
In een recursie regel roept het predicaat zichzelf weer aan.
Prolog termen zijn variabelen, atomic terms (numbers en atoms) of compound terms.
Compound terms bestaan uit een functor en een aantal argumenten die ingesloten zijn in haakjes (vb.
Bigger(horse, X)).
Ground terms: termen zonder variabelen
De head van een rule klopt als alle goals die in de body van die rule staan ook kloppen.
Matching: twee termen matchen als deze identiek zijn of als deze identiek gemaakt kunnen worden door
instantiatie van variabelen.
Hoorcollege 2:
head: het eerste element van een lijst
tail: de rest van een lijst
De tail moet altijd een lijst zijn, de head moet dat niet, maar het kan wel.
Base case: meest algemene regel/feit.
Bij recursies haal je vaak steeds beetjes weg die je aan het einde een voor een allemaal weer aan elkaar
plakt.
Boek H1:
Een programma bestaat uit clauses (feiten, regels en vragen).
Een procedure is een set van clauses over dezelfde relatie.
Boek H2:
Elke functor is gedefinieerd door naam en arity (aantal argumenten)
De matching operation neemt twee termen en probeert deze identiek te maken.
Conjunction: ,
disconjunction: ;
Built-in predicaten
write/1
append/3 (twee lijsten samenvoegen)
length/2
reverse/2 (een lijst omdraaien)
member/2
fail/0 (faalt altijd)
last/2
select/3 (haalt een element uit de lijst in het tweede argument en het derde argument is de rest van die
lijst)
permutation/2
Hoorcollege 3:
Voor arithmetic (rekenkundig) evaluation gebruk je de built-in is2/ operator. Deze werkt zo dat de term
rechts van de operator geeavalueerd wordt als rekenkundige expressie en vervolgens wordt het nummer
dat hier uit komt gematcht met de term links van de operator.
De term aan de linkerkant is bijna altijd een variabele.
Arithmetical functions:
max/2 () geeft het grootste nummer van twee nummers.
Sqrt/1 (wortel)
, mod/2 (deelt het linkercijfer door het rechtercijfer tot het laatste gehele getal dat het kan geven, het
resultaat is hetgeen dat over blijft). Vb: (47 mod 7) = 5.
// (delen door)
round/1 (van een float naar de dichtsbijzijnde integer)
** (tot de macht van)
arithmetic relations:
=:= arithmetic equality (hiermee wil je de gelijkheid van twee rekenkundige expressies vergelijken)
=\= arithmetic inequality
> greater than >= greater than or equal
< less than =< less than or equal
= kan je gebruiken voor matching
is/2 moet niet gebruikt worden om gelijkheid van twee rekenkundige expressies te checken.
Hoorcollege 4:
Gebruik van operators maken sommige dingen makkelijker voor ons om te lezen.
Precedence (tussen 0 en 1200) zegt iets over hoe bindend een operator is.
Hoe lager de precedence, hoe sterker de operator bindt.
Als de principal functor niet (geschreven als) een operator is of als de term in haakjes is ingesloten, dan is
de precedence 0.
Drie types operators: infix (3 + 5), prefix (-7), postfix (6!).
Een standaard prolog implementatie heeft een associativiteit naar links.
Operator patterns:
• yfx: infix, left-associative (+, -, *)
• xfy: infix, right-associative (,)
• xfx: infix, non-associative (=, is, <)
• fy: prefix, associative (-5)
• fx: prefix, non-associative (?-, :-)
• yf: postfix, associative
• xf: postfix, non-associative
y zegt wat over naar welke kant de associativiteit is.
Met de built-in predicate current_op(Precedence, Associativity, Operator) kan je gegevens van een operator
checken.
:- op(200, fy, small). (zo definieer je een operator)
met =../2 kan je een lijst maken waarvan de head de functor van een term is en de tail zijn de argumenten
ervan.
Een operator is well-defined wanneer er een associativity is.
Wanneer Prolog niet goed weet hoe deze een bepaalde term moet bekijken is er sprake van ambiguity.
Week 3
choice-points: subgoals die op verschillende manieren kunnen slagen.
Wanneer Prolog een bepaald doel wilt laten slagen, houdt deze alle choice-points bij, zodra een subgoal
faalt, gaat Prolog terug naar het meest recente choice-point.
Enforced backtracking: op ; klikken, zodat prolog alternatieve antwoorden geeft.
(Je zegt dan eigenlijk tegen Prolog van doe alsof het vorige antwoord niet klopte en geef me een ander
antwoord)
Voorkom dat Prolog gaat backtracken om foute antwoorden te vermijden en efficientie te verbeteren.