logo

Prolog-program

Att använda de inbyggda predikaten, sekvensen av mål, eller ange ett mål vid systemprompten skulle vara av lite värde i sig. För att skriva ett Prolog-program måste användaren först skriva ett program som är skrivet på Prolog-språket, ladda det programmet och sedan ange en sekvens av ett eller flera mål vid prompten.

För att skapa ett program i Prolog är det enkla sättet att skriva in det i textredigeraren och sedan spara det som en textfil som t.ex. prolog1.pl .

Följande exempel visar ett enkelt program för Prolog. Programmet innehåller tre komponenter, som kallas klausuler. Varje klausul avslutas med ett punkt.

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

Använda det inbyggda predikatet ' rådfråga' , kan ovanstående program laddas i Prolog-systemet.

?-consult('prolog1.pl').

Detta visar att filen prolog1.pl existerar och att prologprogrammet är systemiskt korrekt, vilket betyder att det har giltiga klausuler, målet kommer att lyckas, och för att bekräfta att programmet har lästs korrekt, producerar det en eller flera utdatarader. t.ex.,

?-
# 0,00 sekunder att konsultera prolog1.pl
?-

abstrakt klass vs gränssnitt

Alternativet till 'konsultera' är 'Ladda', som kommer att finnas i menyalternativet om Prolog-systemet har ett grafiskt användargränssnitt.

När programmet är laddat kommer satsen att placeras i ett lagringsområde, och det lagringsområdet är känt som Prolog-databasen. Som svar på systemuppmaningen, ange en sekvens av mål, så kommer Prolog att söka efter och använda de satser som krävs för att utvärdera målen.

Terminologi

I följande program visar tre rader klausulerna.

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

Med hjälp av punkten kommer varje klausul att avslutas. Prolog-program har en sekvens av satser. Fakta eller regler beskrivs i dessa klausuler.

Exempel av fakta är hund (rottweiler) och katt (munchkin) . De menar att' rottweiler är en hund' och ' munchkin är en katt'.

Hund kallas ett predikat. Hund innehåller ett argument. Ordet ' rottweiler' inom parentes( ). Rottweiler kallas en atom.

Exempel på regel är den sista raden i programmet.

 animal(A) :- dog(A). 

Kolontecknet(:-) läses som 'om'. Här är A en variabel, och den representerar vilket värde som helst. På ett naturligt sätt kan regeln läsas som 'Om A är ett djur, så är A en hund'.

Ovanstående klausul visar att rottweiler är ett djur. Sådant avdrag kan också göras av Prolog:

?- djur(rottweiler).
ja

För att antyda det munchkin är ett djur, det finns inga bevis för detta.

?- djur(munchkin).
Nej

Mer terminologi

Att utvärdera en målterm avgör om den är uppfylld eller inte. Det betyder också att målet utvärderas till sant eller falskt.

Observera att när en användare anger ett mål kan det ibland tolkas som ett kommando. Till exempel,

?- stanna. 'Det används för att avsluta Prolog-systemet.'

Ibland kan det ses som en fråga som,

?- djur(rottweiler). & 'Är rottweiler ett djur?'

Följande program visar ett annat exempel om djur. Den består av åtta klausuler. Kommentaren visas av all text mellan /* och */.

 /* 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.*/ 

Predikatet hund och predikatet katt har båda fyra satser. Antag att i en textfil 'animal.pl' har programmet sparats, och utdata genereras genom att ladda programmet och vid systemprompten anger vi en sekvens av mål enligt följande:

?- consult('animals1.pl'). Systemuppmaning
# 0,01 sekunder att konsultera animals.pl animals.pl laddas med hjälp av konsult

?- hund(rottweiler).
ja

?- hund(boxare).
Nej

?- hund(A).
A = rottweiler pauser- returtangenten trycks ned av användaren

?- hund(B).
B = rottweiler; pauser? användaren trycker på ;
B = pudel; pauser? användaren trycker på ;
B = bulldog; pauser? användaren trycker på ;
B = dobermann Ingen paus ? Det går vidare till nästa rad

?-katt(A). A = sfinx; pausa? användarpressar;
A = Bengal pauser? användaren trycker på retur

?- lyssnar(hund). Den kommer att lista alla satser som definierar predikat hund

/* hund/1 */

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

I det här exemplet introduceras olika nya funktioner i Prolog. Frågan är som följer:

?- hund(A).

Det betyder att hitta A:s värde, och det blir namnet på hunden. Svaret från Prolog är följande:

A = rottweiler

Andra möjliga svar av A är följande, pudel, bulldog, dobermann. Det kommer att orsaka Prolog-pausen, och på grund av detta måste vi vänta på att användaren trycker på 'retur'-tangenten innan den matar ut systemprompten ?-.

Vi kan skriva in nästa fråga enligt följande:

?- hund(B).

Denna fråga är densamma som tidigare. Ovanstående fråga betyder att 'hitta B:s värde och det blir namnet på en hund'. Svaret från Prolog är följande:

B = rottweiler

jämför med java

Prolog kommer igen att pausa. Den här gången trycks semikolon (;) ned av användaren. Nu kommer Prolog att hitta ett alternativt värde på B som uppfyller målhunden(B). Den kommer att svara enligt följande:

B = pudel

Prolog kommer igen att pausa. Semikolon (;)-tangenten trycks igen av användaren. Prolog producerar ytterligare en lösning enligt följande:

B = bulldog

Prolog kommer igen att pausa. Semikolon (;)-tangenten trycks igen av användaren. Prolog producerar ytterligare en lösning enligt följande:

B = dobermann

Prolog känner igen att det inte finns någon mer tillgänglig lösning genom att inte pausa, men systemet uppmanar ?- genom att omedelbart gå vidare till utgången.

Ett nytt inbyggt predikat introduceras i detta exempel. Att specificera målet

?- listning (hund)

I ovanstående mål kommer Prolog att lista alla fyra satserna som definierar predikathunden. De kommer att definieras i samma ordning som de laddade in i databasen.

analysera sträng till int

Användningen av variabler i frågan visas i följande exempel. Målsekvensen är som följer:

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

Detta kommer att ge oss alla möjliga kombinationer av en katt och en hund.

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

A = sfinx,
B = pudel;

A = sfinx,
B = bulldog;

A = sfinx,
B = dobermann;

etc.

Däremot är målsekvensen följande:

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

Detta kommer att ge alla djur som är både en katt och en hund (i databasen finns inget sådant djur). Här är A 'vilket värde som helst' i både katt(A) och hund(A), men båda måste ha samma värde.

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