Sök…


Anmärkningar

implementeringar

  1. SWI-Prolog (gratis)
    • Implementerad i
  2. SICStus (kommersiell)
  3. YAP (gratis)
  4. GNU Prolog (gratis)
  5. XSB (gratis)
  6. B (kommersiell)
  7. IF (kommersiell)
  8. Ciao (gratis)
  9. Minerva (kommersiell)
  10. ECLiPSe-CLP (gratis)
  11. Jekejeke Prolog (kommersiell)
  12. Prolog IV
  13. Utbyte Prolog (gratis)
  14. Visual Prolog (kommersiellt)

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ör ppa: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 ( _ ). Exempelvis X , 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 och Y är X ett barn till Y om Y är far till X eller Y är mamma till X

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 och Y har relationen child_of mellan X och Y om relationen father_child har mellan Y och X , eller förhållandet mother_child har mellan Y och X

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.



Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow