logo

Prolog-programmer

Å bruke de innebygde predikatene, vil rekkefølgen av mål, eller spesifisere et mål ved systemprompten, være av liten verdi i seg selv. For å skrive et Prolog-program må brukeren først skrive et program som er skrevet på Prolog-språket, laste det programmet og deretter spesifisere en sekvens med ett eller flere mål ved ledeteksten.

For å lage et program i Prolog, er den enkle måten å skrive det inn i teksteditoren og deretter lagre det som en tekstfil som f.eks. prolog1.pl .

Følgende eksempel viser et enkelt program av Prolog. Programmet inneholder tre komponenter, som er kjent som klausuler. Hver klausul avsluttes med punktum.

 dog(rottweiler). cat(munchkin). animal(A) :- cat(A). 

Bruke det innebygde predikatet ' rådføre' , kan programmet ovenfor lastes inn i Prolog-systemet.

?-consult('prolog1.pl').

Dette viser at prolog1.pl-filen eksisterer, og prolog-programmet er systemisk korrekt, noe som betyr at det har gyldige klausuler, målet vil lykkes, og for å bekrefte at programmet er korrekt lest, produserer det en eller flere utdatalinjer. f.eks.

?-
# 0,00 sekunder for å konsultere prolog1.pl
?-

string.format

Alternativet til 'konsult' er 'Load', som vil eksistere på menyvalget dersom Prolog-systemet har et grafisk brukergrensesnitt.

Når programmet er lastet, vil klausulen bli plassert i et lagringsområde, og det lagringsområdet er kjent som Prolog-databasen. Som svar på systemmeldingen, spesifiser en sekvens av mål, og det vil få Prolog til å søke etter og bruke klausulene som er nødvendige for å evaluere målene.

Terminologi

I det følgende programmet viser tre linjer leddene.

 dog(rottweiler). cat(munchkin). animal(A) :- cat(A). 

Ved å bruke punktum vil hver klausul bli avsluttet. Prolog-programmer har en sekvens av klausuler. Fakta eller regler er beskrevet i disse klausulene.

Eksempel av fakta er hund (rottweiler) og katt (munchkin) . De mener at ' rottweiler er en hund' og ' munchkin er en katt'.

Hund kalles et predikat. Dog inneholder ett argument. Ordet ' rottweiler' vedlagt i parentes( ). Rottweiler kalles et atom.

Eksempel på regel er den siste linjen i programmet.

 animal(A) :- dog(A). 

Kolontegnet (:-) vil bli lest som 'hvis'. Her er A en variabel, og den representerer en hvilken som helst verdi. På en naturlig måte kan regelen leses som 'Hvis A er et dyr, så er A en hund'.

Ovennevnte klausul viser at rottweiler er et dyr. Slik fradrag kan også gjøres av Prolog:

?- dyr(rottweiler).
ja

For å antyde det munchkin er et dyr, er det ingen bevis for dette.

?- dyr (munchkin).
Nei

Mer terminologi

Evaluering av et målbegrep avgjør om det er oppfylt eller ikke. Det betyr også at målet vurderes til sant eller usant.

Merk at når en bruker skriver inn et mål, kan det noen ganger tolkes som en kommando. For eksempel,

?- stopp. 'Den brukes til å avslutte Prolog-systemet.'

Noen ganger kan det betraktes som et spørsmål som,

?- dyr(rottweiler). & 'Er rottweiler et dyr?'

Følgende program viser et annet eksempel om dyr. Den består av åtte klausuler. Kommentaren vises av all teksten mellom /* og */.

 /* Another Program of Animal */ Dog(rottweiler). cat(sphynx). dog(poodle). dog(bulldog). cat(bengal). dog(dobermann). cat(himalayan). cat(singapura). /* This Prolog program consists of various clauses. It is always terminated using the full stop.*/ 

Predikat hund og predikat katt har begge fire ledd. Anta at i en tekstfil 'animal.pl' har programmet blitt lagret, og utdata genereres ved å laste programmet og ved systemledeteksten, legger vi inn en sekvens med mål som følger:

?- consult('animals1.pl'). Systemmelding
# 0,01 sekunder for å konsultere animals.pl animals.pl lastet med konsultasjonen

?- hund(rottweiler).
ja

?- hund(bokser).
Nei

?- hund(A).
A = rottweiler pauser - returtasten trykkes av brukeren

?- hund(B).
B = rottweiler; pauser? bruker trykker på ;
B = puddel; pauser? bruker trykker på ;
B = bulldog; pauser? bruker trykker på ;
B = dobermann Ingen pause? Den går videre til neste linje

?- kat(A). A = sfinks; pause? bruker trykker;
A = Bengal pauser ? bruker trykker på retur

?- lytter(hund). Den vil liste opp alle leddene som definerer predikatet hund

/* hund/1 */

hund (rottweiler).
hund (puddel).
hund (bulldog).
hund (dobermann).
ja
?-

I dette eksemplet introduseres ulike nye funksjoner i Prolog. Spørsmålet er som følger:

?- hund(A).

Det betyr at du finner A-verdien, og det vil være navnet på hunden. Svaret til Prolog er som følger:

A = rottweiler

Andre mulige svar på A er som følger, puddel, bulldog, dobermann. Det vil føre til prolog-pause, og på grunn av dette må vi vente på at brukeren trykker på 'retur'-tasten før den sender ut systemmeldingen ?-.

Vi kan legge inn neste spørring som følger:

?- hund(B).

Denne spørringen er den samme som før. Spørringen ovenfor betyr at 'finn B-verdien, og det vil være navnet på en hund'. Svaret til Prolog er som følger:

B = rottweiler

streng av array i c

Prolog stopper igjen. Denne gangen trykkes semikolon (;)-tasten av brukeren. Nå vil Prolog finne en alternativ verdi av B som tilfredsstiller målhunden(B). Den vil svare som følger:

B = puddel

Prolog stopper igjen. Semikolon-tasten (;) trykkes igjen av brukeren. Prolog produserer en ytterligere løsning som følger:

B = bulldog

Prolog stopper igjen. Semikolon-tasten (;) trykkes igjen av brukeren. Prolog produserer en ytterligere løsning som følger:

B = dobermann

Prolog gjenkjenner at det ikke er flere tilgjengelige løsninger ved ikke å sette på pause, men systemet spør ?- ved umiddelbart å gå videre til utgangen.

Et nytt innebygd predikat er introdusert i dette eksemplet. Spesifisere målet

?- oppføring (hund)

I målet ovenfor vil Prolog liste opp alle fire setningene som definerer predikathunden. De vil definere i samme rekkefølge som de lastet inn i databasen.

Bruken av variabler i spørringen vises i følgende eksempel. Målsekvensen er som følger:

?-katt(A),hund(B).

Dette vil gi oss alle mulige kombinasjoner av katt og hund.

?-katt(A),hund(B).
A = sfinks,
B = rottweiler;

A = sfinks,
B = puddel;

A = sfinks,
B = bulldog;

A = sfinks,
B = dobermann;

etc.

I motsetning til dette er målsekvensen som følger:

?-katt(A), hund(A).

gimp fjern vannmerke

Dette vil gi alle dyr som er både en katt og en hund (i databasen er det ikke noe slikt dyr). Her er A 'en hvilken som helst verdi' i både katt(A) og hund(A), men begge må ha samme verdi.

?-katt(A),hund(A).
Nei