Sintaksa prologa

Iz E-študij, proste zakladnice študentskega znanja

Skoči na: navigacija, iskanje

Prolog nima določenega standarda sintakse, razširjena pa je edinburška sintaksa.

Vsebina

Dejstva

otrok(tea,lili).  % Tea je lilin otrok (vse za procentom je komentar)
enaka(X,X).
X = X.
leto([jan,feb,mar,...,dec]).
/*leto je sestavljeno iz mesecev v tem zaporedju */
peter je zdravnik.    % pomeni enako kot:  je(peter,zdravnik).
moc([],0).
trace_on.

Pravila

Mokro je, ko dežuje.

mokro :- dezuje.

Lepo je, ko je sončno IN brez vetra.

lepo :-
  soncno,
  brez_vetra.

Roditelj je X od Y takrat, ko je Y otrok od X.

roditelj (X,Y) :-
  otrok (Y,X).

Fant ima rad dekle, ko je lepa ALI bogata ALI pametna.

ima_rad(Fant,Dekle) :-
  lep(Dekle);
  bogat(Dekle);
  pameten(Dekle).

Mešanje konjunkcije in disjunkcije

Oboje zmešano v istem pravilu, nelinearno in težko razumljivo za bralca.

stara_mama(X,Y):-
  mama(X,Z),
  (mama(Z,Y);
   oce(Z,Y)).
premagal(X,Y) :-
  predal(Y,X);
  (točke(X,Tx),
   točke(Y,Ty),
   Tx>Ty).

Trudimo se izogibati nelinearnemu načinu razmišljanja zato, da so programi berljivo napisani. V takšnih programih lažje odkrijemo napake oz. do napak sploh ne pride.

Izognemo se tako, da ločimo konjunkcijo in disjunkcijo:

stara_mama(X,Y) :-
  mama(X,Z),
  roditelj(Z,Y).

roditelj(X,Y) :-
  mama(X,Y);
  oce(X,Y).
premagal(X,Y) :-
  predal(Y,X).

premagal(X,Y) :-
  točke(X,Tx),
  točke(Y,Ty),
  Tx>Ty.

Ukazi

Ukaz je stavek, ki ni interaktiven in se izvede takoj.


Takoj prične brati drugo datoteko.

:- consult('moja.dat').

Ko prolog bere program iz datoteke izpiše dober dan.

:- write('Dober dan!').

Ukaz start na koncu datoteke požene celoten program.

:- start

Vprašanja

Ali dežuje?

?- dezuje.

Ali dežuje IN je sončno?

?- dezuje, soncno.

Ali je tea otrok od lili?

?- otrok(tea,lili).

Čigav otrok je tea?

?- otrok(tea,X).

Kdo je čigav otrok?

?- otrok(X,Y).

Ali je leo starejši od 10 let?

?- star(leo,X),X>10

Ali ima "tine rad teo" ALI "bine rad teo"?

?- ima_rad(tine,tea);ima_rad(bine,tea).


Seznami, nizi

  .
 / \
a   .
   / \         [a,b,c]
  b   .
     / \
    c  []


Seznam Glava Rep
[tine,tone,metka] tine [tone,metka]
[1,2,3,5,7,11|X] 1 [2,3,5,7,11|X]
[X|Y] X Y
[[1],[2],[1,2],[]] [1] [[2],[1,2],[]]
[ime(lili),priimek(zonka)] ime(lili) priimek(zonka)
[f(mesto,[1,2,3])] f(mesto,[1,2,3]) []


Poudarjanje posebnega položaja glave:

[G|R]


[a,b,c] = [a,b|[c]] = [a,b,c|[]] = [a|[b,c|[]]] = [a,b|[c|[]]]


Nizi so seznami celih števil:

"Prolog" = [80,114,111,108,111,103]
?- name('Uvod v prolog',X).
X = [85,118,111,100,32,118,32,112,114,111|...]
?- name(X,"Uvod v prolog"). 
X = 'Uvod v prolog'
?- name(X,[112,114,111,108,111,103]).
X = prolog
Osebna orodja
Imenski prostori
Različice
Dejanja
navigacija

Tiskanje/izvoz
orodja