Prolog - facts og regler

Oprettet 28. januar 2008
Rettet 28. januar 2008

Facts

Et prolog program består typisk af to forskellige typer sætninger: facts og regler. Disse facts og regler udgør tilsammen Prolog programmets database eller videnbase.

Facts bruges i Prolog til repræsentation af basal viden - kendsgerninger, som øvrige slutninger vil blive baseret på. Viden består i Prolog af logiske udsagn, som alle kan reduceres til en af de to sandhedsværdier sand eller falsk.

Facts repræsenteres som logiske sætninger (prædikatslogik) i Prolog programmet. Ved design af løsningen og opbygningen af programmet skal man overveje, hvordan denne logik skal udformes. Nogle eksempler kan måske kaste lys over mulighederne:

Hvis vi ønsker at repræsentere nogle oplysninger som f.eks. "John er et menneske" og "Lise er et menneske", kan det gøres på flere måder. En måde ville være at udforme et prædikat med betegnelsen "er_et_menneske" og så skabe relationer mellem dette prædikat og de navne, man ønsker at knytte til prædikatet. I Prolog nævnes prædikatet først:

er_et_menneske(john).
er_et_menneske(lise).

Den præcise udformning af prædikatet afhænger af, hvad man vil anvende det til. De samme oplysninger kunne være repræsenteret således:

egenskab(john, menneske).
egenskab(lise, menneske).

denne udformning er mindre præcis; men åbner til gengæld muligheder for flere anvendelsesmuligheder. F.eks.:

egenskab(sofus, hamster).
egenskab(viggo, kat).

Et andet eksempel. Vi ønsker at repræsentere nogle oplysninger om forskellige lande: "Paris er hovedstad i Frankrig" og "København er hovedstad i Danmark". Disse facts vil i Prolog typisk kunne repræsenteres således:

har_hovedstad('Frankrig', 'Paris').
har_hovedstad('Danmark', 'København').

Næste eksempel viser opbygning af data fra en anetavle for en familie:

man(bjarne).
man(rune).
man(frederik).
man(lars).
man(edvard).
man(eli).
man(niels).
man(palle).
man(arne).
man(martin).
woman(laura).
woman(gjertrud).
woman(julie).
woman(ruth).
woman(mary).
woman(gerda).
woman(karin).
woman(lone).
woman(pia).
woman(maj).
woman(stine).
woman(tine).
woman(annika).
parent(edvard, ruth).
parent(edvard, eli).
parent(laura, ruth).
parent(laura, eli).
parent(niels, lars).
parent(gjertrud, lars).
parent(lars, mary).
parent(lars, gerda).
parent(lars, frederik).
parent(julie, mary).
parent(julie, gerda).
parent(julie, frederik).
parent(frederik, bjarne).
parent(frederik, karin).
parent(frederik, palle).
parent(ruth, bjarne).
parent(ruth, karin).
parent(ruth, palle).
parent(bjarne, pia).
parent(bjarne, maj).
parent(bjarne, rune).
parent(lone, pia).
parent(lone, maj).
parent(lone, rune).
parent(arne, stine).
parent(arne, martin).
parent(karin, stine).
parent(karin, martin).
parent(palle, annika).
parent(tine, annika).

Hvis man har lyst til at lege med denne lille videnbase, kan teksten hentes her.

Regler

Regler er sætninger, hvor man på grundlag af eksisterende viden skaber ny viden. I forhold til ovennævnte anetavle, kunne der skabes en regel, der kan afgøre, om en person er far til en anden person:

father(Far,Barn) :- parent(Far,Barn), man(Far).

Ved opbygningen af regler bemærker man, at der nu anvendes begreber skrevet med stort begyndelsesbogstav. Når noget er med stort begyndelsesbogstav er det en variabel, og Prolog vil se det som sin opgave at forsøge at knytte en værdi til variablen, hvis den fra starten ikke har nogen konkret værdi, eller at afgøre om de opgivne værdier kan indsættes i de efterfølgende sætninger på en sådan måde, at udtrykket kan blive sandt.

Hvis vi f.eks. udfører følgende forespørgsel, ses det at Prolog svarer Yes som bekræftelse på, at symbolerne bjarne og rune kan indsættes i de efterfølgende prædikater på en sådan måde, at resultatet er sandt. Den logiske slutning som følge heraf er altså, at det er korrekt at bjarne er far til rune.

1 ?- father(bjarne, rune).
Yes