Prolog Language Handledning
Komma igång med Prolog Language
Sök…
Anmärkningar
implementeringar
- SWI-Prolog (gratis) swi-prolog
- Implementerad i c
- SICStus (kommersiell) sicstus-prolog
- YAP (gratis) yap
- GNU Prolog (gratis) gnu-prolog
- XSB (gratis) xsb
- B (kommersiell) b-prolog
- IF (kommersiell)
- Ciao (gratis)
- Minerva (kommersiell)
- ECLiPSe-CLP (gratis) eclipse-clp
- Jekejeke Prolog (kommersiell)
- Prolog IV
- Utbyte Prolog (gratis)
- Implementerad i c # , javascript och phyton
- Visual Prolog (kommersiellt) visual-prolog
Installation eller installation
SWI-Prolog
Windows och Mac:
- Ladda ner SWI-Prolog på den officiella webbplatsen
- Installera helt enkelt genom att följa installationsinstruktionerna.
Linux (PPA):
Lägg till PPA
ppa:swi-prolog/stable
i systemets programvarukällor (utvecklare kan välja förppa:swi-prolog/devel
):Öppna en terminal (Ctrl + Alt + T) och skriv:
sudo add-apt-repository ppa:swi-prolog/stable
Uppdatera sedan paketinformationen:
sudo apt-get update
Installera nu SWI-Prolog genom pakethanteraren:
sudo apt-get install swi-prolog
Du kan nu starta SWI-Prolog genom kommandoraden med kommandot
swipl
append / 3
append([], Bs, Bs).
append([A|As], Bs, [A|Cs]) :-
append(As, Bs, Cs).
append/3
är en av de mest kända Prolog-relationerna. Det definierar en relation mellan tre argument och är sant om det tredje argumentet är en lista som anger sammanlänkningen av listorna som anges i det första och det andra argumentet.
Notera, och som är typiskt för bra Prolog-kod, kan append/3
användas i flera riktningar : Den kan användas för att:
lägg till två helt eller delvis instanserade listor:
?- A = [1, 2, 3], B=[4, 5, 6], append(A, B, Y) Output: A = [1, 2, 3], B = [4, 5, 6], Y = [1, 2, 3, 4, 5, 6].
kontrollera om förhållandet är sant för tre fullständigt instanserade listor:
?- A = [1, 2, 3], B = [4, 5], C = [1, 2, 3, 4, 5, 6], append(A, B, C) Output: false
generera alla möjliga sätt att lägga till två listor till en given lista:
?- append(A, B, [1, 2, 3, 4]). Output: A = [], B = [1, 2, 3, 4] ; A = [1], B = [2, 3, 4] ; A = [1, 2], B = [3, 4] ; A = [1, 2, 3], B = [4] ; A = [1, 2, 3, 4], B = [] ; false.
CLP (FD) Begränsningar
CLP (FD) begränsningar tillhandahålls av alla allvarliga Prolog-implementationer. De tillåter oss att resonera om heltal på ett rent sätt.
?- X #= 1 + 2.
X = 3.
?- 5 #= Y + 2.
Y = 3.
Databasprogrammering
Prolog kategoriserar allt i:
- Atomer - Alla sekvenser med tecken som inte börjar med ett stort alfabet. Till exempel -
a
,b
,okay
- Nummer - Det finns ingen speciell syntax för siffror, ingen deklaration krävs. Exempelvis
1
,22
,35.8
- Variabler - En sträng som börjar med ett stort tecken eller understreck (
_
). ExempelvisX
,Y
,Abc
,AA
- Komplexa termer - De är gjorda av en funktor och en sekvens av argument . Namnet på en komplex term är alltid en atom, medan argument antingen kan vara atomer eller variabler. Exempelvis
father(john,doe)
,relative(a)
,mother(X,Y)
.
En logikdatabas innehåller en uppsättning fakta och regler .
En komplex term med endast atomer som argument kallas ett faktum, medan en komplex term med variabler som argument kallas en regel.
Exempel på fakta i Prolog:
father_child(fred, susan).
mother_child(hillary, joe).
Exempel på en regel i Prolog:
child_of(X,Y):-
father_child(Y,X)
;
mother_child(Y,X).
Observera att ;
här är som den or
operatör i andra språk.
Prolog är ett deklarativt språk och du kan läsa denna databas på följande sätt:
fred är far till susan
hillary är mor till joe.
För alla
X
ochY
ärX
ett barn tillY
omY
är far tillX
ellerY
är mamma tillX
Faktum är att en begränsad uppsättning fakta och / eller regler utgör ett logiskt program .
Användningen av ett sådant program visas genom att göra frågor . Med frågor kan du hämta information från ett logikprogram.
För att ladda databasen i tolkaren (förutsatt att du har sparat databasen i den katalogen du kör tolkaren i) anger du bara:
?- [nameofdatabase].
ersätta nameofdatabase
med det verkliga filnamnet (notera att vi här utesluter filnamnstillägget .pl
till filnamnet).
Exempel på frågor i tolk för programmet ovan och resultaten:
?- child_of(susan,fred).
true
?- child_of(joe,hillary).
true
?- child_of(fred,susan).
false
?- child_of(susan,hillary).
false
?- child_of(susan,X).
X = fred
?- child_of(X,Y).
X = susan,
Y = fred ;
X = joe,
Y = hillary.
Frågorna ovan och deras svar kan läsas enligt följande:
är susan ett barn av fred? - Sann
är joe ett barn av Hillary? - Sann
är fred ett barn av susan? - falskt
är Susan ett barn av Hillary? - falskt
vem är susan ett barn av? - fred
Så här programmerar vi logik i Prolog. Ett logikprogram är mer formellt: en uppsättning axiomer, eller regler, som definierar relationer (aka predicates) mellan objekt. Ett alternativt sätt att tolka databasen ovan på ett mer formellt logiskt sätt är:
Förhållandet
father_child
har mellan fred och susan
Förhållandet
mother_child
har mellan Hillary och Joe
För alla
X
ochY
har relationenchild_of
mellanX
ochY
om relationenfather_child
har mellanY
ochX
, eller förhållandetmother_child
har mellanY
ochX
Hej världen
Hej, Värld i den interaktiva tolk
För att skriva ut "Hej, världen!" i Prolog-tolkaren (här använder vi swipl
, skalet för SWI Prolog):
$ swipl
<...banner...>
?- write('Hello, World!'), nl.
?-
är systemmeddelandet: det indikerar att systemet är redo för användaren att ange en sekvens av mål (dvs. en fråga ) som måste avslutas med a .
(punkt).
Här write('Hello World!'), nl
frågan write('Hello World!'), nl
har två mål:
-
write('Hello World!')
:'Hello World!'
måste visas och (,
) - en ny rad (
nl
) måste följa.
write/1
( /1
används för att indikera att predikatet tar ett argument) och nl/0
är inbyggda predikat (definitionen tillhandahålls i förväg av Prolog-systemet). Inbyggda predikat erbjuder faciliteter som inte kan erhållas genom ren Prolog-definition eller för att rädda programmeraren från att behöva definiera dem.
Utgången:
Hej världen!
ja
slutar med yes
betyder att frågan har lyckats. I vissa system skrivs true
ut istället för yes
.
Hej, världen från en fil
Öppna en ny fil som heter hello_world.pl
och sätt in följande text:
:- initialization hello_world, halt.
hello_world :-
write('Hello, World!'), nl.
initialization
anger att målet hello_world, halt
ska kallas när filen laddas. halt
avslutar programmet.
Denna fil kan sedan köras av din Prolog-körbara. De exakta flaggorna beror på Prolog-systemet. Om du använder SWI Prolog:
$ swipl -q -l hello_world.pl
Detta kommer att producera Hello, World!
. Flaggan -q
undertrycker bannern som vanligtvis visas när du ringer kör swipl
. Den -l
anger en fil som ska laddas.