Sintaksa prologa
Iz E-študij, proste zakladnice študentskega znanja
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