Sunteți pe pagina 1din 55

SISTEME EXPERT

Universitatea din Oradea

Prof. Dr. Cornelia Győrödi

Sisteme Expert - (cgyorodi@uoradea.ro) 1


Evaluare
Medie ponderată:
2 verificări pe parcurs din materia de curs,
și laborator - Examen scris: 66 %
 Laborator: 34 %
Condiția de promovare: media 4.50
Cerințe
 Prezența la laborator: minimum 8 ședințe de laborator
 Rezolvarea problemelor de la laborator
 Parcurgerea materialelor obligatorii de curs și
laborator
prof. dr. ing. Cornelia Gyorodi 2
Curs 3
Principiile programării logice în limbajul
Visual Prolog

 Caracteristicile limbajului Visual Prolog

 Concepte de bază

 Secțiunile unui program în Visual Prolog

prof. dr. ing. Cornelia Gyorodi 3


Principiile programării logice în
limbajul Visual Prolog
Limbajul Prolog este un limbaj de generaţia a cincea.
dezvoltat pentru prima oară la începutul anilor ’70 la
Universitatea din Marseilles de Alain Colmerauer.
limbaj declarativ, conceput ca un instrument de
programare logică
în Prolog programatorul nu este responsabil de rezolvarea
problemei; el pur şi simplu descrie problema cât mai exact
şi cât mai complet (sub forma declarativă), lăsând ca
sistemul însuşi să caute şi să ofere soluţii.
din limbajul Prolog, au derivat unele versiuni de limbaje de
programare logică cum ar fi Visual Prolog 7.2, 7.3, 7.5

prof. dr. ing. Cornelia Gyorodi 4


Visual Prolog

Visual Prolog este un mediu de programare complex,


ce conține:
 o interfață graficã IDE (Graphical Integrated Development
Environment),
 un compilator – care creează fișiere obiect, fișiere
executabile, biblioteci, validează predicatele, verificã tipurile
de date, ințializările, etc.
 un linkeditor – utilizează fisiere *.LIB și creează fișiere
*.EXE și *.DLL
 un debugger (depanator) pentru execuție pas cu pas a
programului

prof. dr. ing. Cornelia Gyorodi 5


Caracteristicile limbajului Visual Prolog

este o extensie orientată pe obiecte a limbajului Prolog


foloseşte concepte de programare logică (clauze Horn,
backtracking)
foloseşte tipuri de date algebrice
suportă soluţii avansate client-server şi three-tier
(multi-strat)
realizează gestiunea automată a memoriei
conţine interpretorul PIE (Prolog Interpretation
Engine),care permite scrierea programelor clasice
Prolog (fără componente vizuale, fără obiecte, clase,
tipuri, etc.)
prof. dr. ing. Cornelia Gyorodi 6
Caracteristicile limbajului Visual Prolog

Clauza logică Horn = un sistem formal de


raționament despre lucruri și despre modul de
relaționare a acestora.
În orice problemă dată avem fapte ce caracterizează :
- obiecte(date);
- proprietăţi ale obiectelor;
- relaţii între obiecte
Pe lângă aceste fapte avem reguli de deducţie pe
baza cărora putem infera noi relaţii din faptele date,
relaţii care nu au fost date factual.
prof. dr. ing. Cornelia Gyorodi 7
Caracteristicile limbajului Visual Prolog

Partea declarativă se realizează cu ajutorul


predicatelor.
nume_predicat(arg1,arg2,…,argn)

Soluţia căutată se găseşte fie declarată ca un fapt, fie


poate fi dedusă din aceste fapte.

prof. dr. ing. Cornelia Gyorodi 8


Fapte și reguli de deducție

Un program în Visual Prolog conține :


 o mulțime de fapte și reguli de deducție
 un goal (un scop urmărit la care se caută răspunsuri

prin evaluarea faptelor și interpretarea regulilor)


 Faptele: sunt declaraţii de predicate în care toate
argumentele sunt obiecte cunoscute (nu conţin variabile);
 Faptele se referă:
 caracteristicile obiectelor,

 la relaţiile dintre mai multe obiecte,

 Faptele se reprezintă astfel:


nume_predicat(arg1, arg2,…,argn).

prof. dr. ing. Cornelia Gyorodi 9


Fapte
Exemplu. În limbajul natural, un fapt se poate
formula astfel:
Ion iubeşte cărţile şi vinul.
Ion este prietenul lui Vlad.
Anei îi plac merele.
Faptele sunt: likes(“ion”, “books ”).
likes(“ion”, “wine” ).
likes(“ana”, “apple”).
friend(“ion, “vlad”).

prof. dr. ing. Cornelia Gyorodi 10


Reguli

Sunt predicate definite condiţional în care pot apare


argumente variabile şi au forma:
nume_predicat(arg1,arg2,…,argn) if
nume_predicat(argi,argi2,…,argim) [and
nume_predicat(argj,argj2,…,argjk)….]
[or
nume_predicat(arg1,arg2,…,argt)
nume_predicat(argp,argp2,…,argpr) [and
nume_predicat(argq,argq2,…,argqsn)…..]
or …..
]
nume_predicat(arg1,arg2,…,argt)
nume_predicat(argp,argp2,…,argpr) [and
prof. dr. ing. Cornelia Gyorodi 11
Reguli
Un predicat este adevărat dacă sunt îndeplinite
simultan una sau mai multe condiţii sau dacă se
verifică alt(alte) set(uri) de condiţii.
Predicatul e definit prin clauzele ce urmează după
if .
Variabila este iniţial fără valoare (nelegată) dar în
procesul evaluării predicatului, variabila poate lua
valori, astfel devine legată.
Valoarea variabilei este valabilă în interiorul unei
evaluări.

prof. dr. ing. Cornelia Gyorodi 12


Reguli - Predicate

Predicatele pot conţine variabile


O regulă poate da mai multe variante de evaluare
legate prin or sau “;“, iar variantele sunt în mod
obligatoriu grupate.
In cadrul aceleiaşi variante condiţiile ce trebuiesc
îndeplinite simultan sunt legate prin and sau “,”.
Regula se termina cu “.”

prof. dr. ing. Cornelia Gyorodi 13


Exemplu
Lui Vlad îi place tot ce îi place prietenului său.
Regula :
likes(“vlad”, X) if friend(Y, “vlad”) and likes(Y, X).
Faptele sunt: likes(“ion”, “books ”).
likes(“ion”, “wine” ).
likes(“ana”, “apple”).
friend(“ion, “vlad”).

Exemple de interogări:
1. Cine e prietenul lui Vlad?
friend(X, “vlad”) X ia valoarea ion;
2. Este Ion prietenul lui Vlad?
friend(“ion”, “vlad”) Raspunsul este Yes.
prof. dr. ing. Cornelia Gyorodi 14
Partea declarativă

Partea declarativă trebuie să conţină:


 faptele;
 regulile de deducţie;

 (interogările).

prof. dr. ing. Cornelia Gyorodi 15


Variabile
O variabilă începe obligatoriu cu literă mare sau “_”;
Variabila este iniţial fără valoare (nelegată);
In procesul evaluării predicatului, variabila poate lua
valori, astfel devine legată;
Valoarea variabilei este valabila în interiorul unei
evaluări;
Predicatele pot conţine variabile;
Regula poate da mai multe variante de evaluare legate prin
or sau “:-“ ; variantele sunt în mod obligatoriu grupate ;
In cadrul aceleiaşi variante condiţiile ce trebuiesc
îndeplinite simultan sunt legate prin and sau “,” ;
Regula se termina cu “.”
prof. dr. ing. Cornelia Gyorodi 16
Secţiunile unui program PROLOG

Secţiunile unui program PROLOG


sunt:
- domains
- constants

- predicates
- clauses;
- goal;
- databases.

prof. dr. ing. Cornelia Gyorodi 17


Exemplu
domains
termen, factor = integer.
class predicates
sum : (termen,termen,termen).
clauses
sum(X,Y,Z):- Z=X+Y.
class predicates
produs: (factor,factor,factor).
clauses
produs(X,Y,Z):-Z=X*Y.

prof. dr. ing. Cornelia Gyorodi 18


Secţiunea Domains
Domains: este definit astfel :
<domainName> = <typeExpression>.
unde:
<domainName> - numele noului domeniu.
<typeExpression> - este un tip standard sau un tip definit deja anterior de utilizator.
Cele mai utilizate tipuri standard sunt:
char -tip caracter (un caracter între apostroafe simple ; de exemplu: ’a’);
‘/n’ înseamnă newline;
‘/t’ înseamnă tabulare;

integer -întregi între –32768 si 32768;


real -număr real format din cifre şi punct zecimal, precedat eventual de
semn, şi urmat de parte exponenţială reprezentată de “e” urmat de semn şi un
întreg (de exemplu: -123.456e-5, +1223.7666e-3);
string -şir de caractere între apostroafe duble de maxim 255 caractere;
symbol - şir de litere, cifre şi “_” având primul caracter o litera mică;
- sau şir asemănător string-ului când simbolul trebuie să conţină şi
spaţii

prof. dr. ing. Cornelia Gyorodi 19


Secţiunea Domains
Exemplu: Declarăm un nou domeniu de întregi
astfel:
domains
myDomain = integer.

După “integer” putem specifica doi parametri,


<sizeDescription> și <rangeDescription>.
domains
<domainName> = <typeExpression>
<sizeDescription> <rangeDescription>.
Exemplu:
domains
newDomain = integer bitsize 8 [0..10].
prof. dr. ing. Cornelia Gyorodi 20
Definirea unui tip de date

Sintaxa de definire a unui tip de date este:


domains
<domainName> = <aPreviousDeclaredDomain>
sau
domains
myNewDomain = anotherClass::myOld Domain.

In acest ultim caz “myNewDomain” va fi un subtip


al lui “myOldDomain”

prof. dr. ing. Cornelia Gyorodi 21


Obiecte compuse
Necesitatea de introducere a unui obiect structurat
este impusă de faptul că în general obiectele nu
sunt unităţi indivizibile, ele fiind formate la rândul
lor din alte unităţi.
Un obiect compus definit astfel:
domeniu = alternativa1(D1, D2, ....,);
alternativa2(D1, D2, ....,);
alternativa3(D1, D2, ....,);
..........
alternativak(D1, D2, ....,).

prof. dr. ing. Cornelia Gyorodi 22


Exemplu
domains
titlu = symbol.
autor = symbol.
nume = symbol.
tip = symbol.
obiect = carte(titlu, autor) ; calculator(tip).
class predicates
are:(nume,obiect) nondeterm anyflow.
clauses
are("Dan", carte ("N.T.", "U.E")).
are("Dan", calculator("AT 486")).
clauses
run() :-
console::init(),
are("Dan", Y),
stdIO::writef("Dan are %\n", Y),
fail.
run().
end implement main
prof. dr. ing. Cornelia Gyorodi 23
Constante
Constants: permite declararea unor constante.
Secţiunea poate să apară oriunde în program cu
condiţia să fie declarată constantă înainte de
utilizarea ei. Constanta e vizibilă în toate clauzele.
Forma generală:
constants
nume_constanta=valoare.

Numele constantei poate fi scris fie cu litere mari


fie mici ele referind aceeaşi constantă iar valoarea
atribuită poate fi orice obiect de orice tip definit.

prof. dr. ing. Cornelia Gyorodi 24


Constante

Exemplu:
constants
Titlu=”Sisteme Expert”.
Expr=1+7*(45-4).
computer=“macintosh”.
three = 3.
domains
subint = integer [0..three].

prof. dr. ing. Cornelia Gyorodi 25


Secțiunea Facts

Un fapt descrie valorile pentru unul sau mai multe


atribute ale unui obiect sau a unei clase.
Faptele în Prolog sunt stocate într-o bază de date.
Fiecare fapt are propria bază de date.
Există două tipuri de fapte
 “factVariable” – reprezintă valoarea unui singur atribut
 “factFunctor” – descrie valoarea a două sau mai multe
atribute
O declarație fapte începe cu cuvântul
facts

prof. dr. ing. Cornelia Gyorodi 26


Fapte de tipul factVariable
Sintaxa generală de declarare a unui fapt (de tipul
factVariable ):
<factVariableName> : <factType> :=
<initialValue>
unde
<factVariableName> - este un identificator (este
scris cu literă mică)
<factType> - este orice domeniu declarat
<initialValue> - o valoare sau o experesie
Exemplu:
facts
myFact : integer := 0
prof. dr. ing. Cornelia Gyorodi 27
Fapte de tipul factFunctor
Sintaxa generală de declarare a unui fapt (de tipul
factFunctor ):
<factFunctorName> : (<argumentlist>)
<factFunctorMode>
unde:
<factFunctorName> - este un identificator (este
scris cu literă mică)
<argumentlist> - conține o listă de argumente(poate
să conțină și variabile opționale)
<factFunctorMode> - este opțional, indică numărul
de fapte din baza de date
prof. dr. ing. Cornelia Gyorodi 28
Facts

Modul poate fi: determ, nondeterm or single.


factFunctorMode – single ; faptul poate avea numai
o singură valoare, dacă se adaugă un nou fapt în baza
de date vechea valoare va fi suprascrisă, va returna
întotdeauna succes.
factFunctorMode – determ ; faptul poate avea zero
sau doar o singură valoare, poate returna fail (când nu
sunt fapte) sau succes.
factFunctorMode – nondeterm ; faptul poate avea
zero, una sau mai mai multe valori, poate returna fail,
succes, sau mai multe valori printr-un backpoint
prof. dr. ing. Cornelia Gyorodi 29
Exemplu – Definire de fapte
Un factFunctor este inițializat în secțiunea clauses
Exemplu:
facts
person : (string, integer) /* definim un factFunctor cu două argumente*/
sau
person : (string Name, integer Length)
/* Compilatorul neglijează numele variabilelor.*/

În secțiunea clauses va putea conține o clauză:


person(“John”, 182).

prof. dr. ing. Cornelia Gyorodi 30


Secțiunea class facts

Secțiunea “class facts” este sintactic identică cu


secțiunea “facts”.
“class facts” poate să conțină factVariables și
factFunctors.

Faptele pot fi declarate în implementarea unei


clase într-un fișier cu numele
“<className>.pro”)

prof. dr. ing. Cornelia Gyorodi 31


Predicate

Numele unui predicat începe obligatoriu cu literă


mică urmat de cifre, litere sau “_”;
Numele obiectelor încep cu literă mică urmat de
cifre, litere sau “_”;
Predicatul este urmat de “.” ;
Pentru o mai mare claritate a programului e bine
ca predicatele cu nume identic sa fie grupate
împreună (nu e obligatoriu).

prof. dr. ing. Cornelia Gyorodi 32


Secțiunea Predicates

Sintaxa generală de declarare a unui predicat:


<predicateName> : (<argumentlist>)
unde:
<predicateName> - este un identificator (este scris
cu literă mică)
<argumentlist> - precizează tipurile de argumente.
Exemplu:
myPredicate : (integer, real, string).
myPredicate : (integer FirstNumber, real SecondNumber, string
TheString). /* același predicat dar utilizăm variabile */

prof. dr. ing. Cornelia Gyorodi 33


Secțiunea Predicates
Există mai multe opțiuni care pot (și, uneori,
trebuie să) se adauge la declarația unui predicat:
 tipul de dată returnat în cazul în care predicatul este o
funcție
 modul predicatului

 tiparul de flux (flow pattern)

Sintaxa generală când aceste opțiuni sunt precizate:


<predicateName> : (<argumentlist>) ->
<returnArgument> <predicateMode> <predicateFlow>
Când <predicateMode > sau <predicateFlow>
sunt omise, compilatorul determină valorile acestora.

prof. dr. ing. Cornelia Gyorodi 34


Secțiunea Predicates
Când apelați un predicat, unele dintre argumentele
pot fi folosite ca argumente de ieșire.
O funcție este un tip special de predicat. Returnează
o valoare pur și simplu la apel, fără a folosi o ieșire
explicit ca și argument.
predicates
squarePred : (integer InputV, integer OutputS) procedure (i,o).
clauses
squarePred(InputN, OutputS) :-
OutputS = InputN * InputN.
Putem apela astfel: squarePred(2, S) și va returna S=4
prof. dr. ing. Cornelia Gyorodi 35
Secțiunea Predicates
Un predicat definit ca și funcție
predicates
squareFunc : (integer InputV) -> integer OutputS procedure (i).
clauses
squareFunc(InputN) = OutputS :-
OutputS = InputN * InputN.

Apelul:
Square = squareFunc(3),
indică faptul că acest predicat este o funcție care va returna
valoarea variabilei OutputS.

prof. dr. ing. Cornelia Gyorodi 36


Opțiunea <predicateMode>
Opțiunea <predicateMode> indică comportamentul
predicatului. Va indica compilatorului dacă
predicatul poate eșua, poate avea succes sau poate
realiza backtracking-ul (sau ambele sau toate cele
trei opțiuni)
 <predicateMode> = fail – indică faptul că predicatul va
eșua întotdeauna. Există un predicat standard care are acest
mod , predicatul fail/0.
 <predicateMode> = procedure - indică faptul că
predicatul va reuși întotdeauna și că va avea o singură
soluție. Nu sunt posibile soluții alternative, nu va permite
backtracking-ul
prof. dr. ing. Cornelia Gyorodi 37
Opțiunea <predicateMode> (continuare)
 <predicateMode> = determ - indică faptul că predicatul va
eșua sau va reuși dar nu permite backtrackpoint. Va avea cel
mult o soluție.
 <predicateMode> = multi - indică faptul că predicatul nu va
eșua niciodată, va reuși întotdeauna și aceasta poate reveni cu
un backtrackpoint, astfel un apel la acest predicat poate duce
la soluții multiple.
 <predicateMode> = nondeterm - indică faptul că predicatul
poate eșua, sau poate reuși sau poate reveni cu un
backtrackpoint.
 <predicateMode> = erroneous – indică o excepție. O
excepție este o deviație a unui program de la execuția sa
normală.(un fișier nu poate fi găsit, sau depășire de memorie.
prof. dr. ing. Cornelia Gyorodi 38
Opțiunea <predicateMode> (continuare)
Când este omisă opțiunea <predicateMode>,
atunci compilatorul presupune că predicatul este
în modul “procedure”.
predicate mode succeeds or # solutions backtrackpoint?
fails
fail always fails none no

procedure always succeeds One no


determ can fail or none or one no
succeed
multi always succeeds one or more yes
nondeterm can fail or none, one or more yes
succeed

prof. dr. ing. Cornelia Gyorodi 39


Secțiunea Predicates

O declarație predicat poate lua forma:


myPredicate : (string Title, integer NrOfPages) procedure
(i,o).
fact: (nr Num, nr Rez) nondeterm (i,o).

father : (string Person, string Father) nondeterm anyflow.

ancestor : (string Person, string Ancestor) nondeterm (i,o).

prof. dr. ing. Cornelia Gyorodi 40


Exemple de predicate
domains
person_name= symbol.

Class predicates
male : (person_name).
age : (person_name, integer).
father : (person_name, person_name).
brother : (person_name, person_name).

prof. dr. ing. Cornelia Gyorodi 41


Secțiunea Predicates
Fiecare predicat în clauze, cand e citat, trebuie să
respecte numele şi argumentele unui predicat
descris în predicates; în caz contrar se obţin erori.
Se admite totuşi ca două nume de predicat identice
să aibă un număr diferit de argumente. În acest caz
cele două declaraţii trebuie să fie declarate una
după alta atât în secţiunea predicates cât şi în
clauses.
În cazul în care două predicate au acelaşi nume dar
aritate diferită, prolog va considera că e vorba de
predicate diferite cu nume identic.
Exemplu:
father(X).
father(X,Y).
prof. dr. ing. Cornelia Gyorodi 42
Secțiunea Clauses
Clauses: conţine fapte şi reguli. Argumentele unei clauze sunt în ordine bine
definită, fiecare argument având un anume tip.
Se respectă următoarele reguli:
- faptele nu conţin variabile;
- faptele se termină cu punct.
Clauzele sunt urmate de reguli care respectă forma:
cap_clauza if sir_de_clauze.
sau
cap_clauza if sir1_de_clauze;
cap_clauza if sir2_de_clauze;

cap_clauza if sirn_de_clauze.
Unde:
- clauzele pot conţine argumente variabile (anonime sau nu);
- sir_de_clauze este un şir de clauze legate prin and (,);
- liniile separate prin “;” sunt variante pentru aceeaşi clauză: lista variantelor
se termină cu punct.

prof. dr. ing. Cornelia Gyorodi 43


Secțiunea Clauses
Clauzele sunt folosite pentru a defini predicate.
Un singur predicat este definit de una sau mai multe
clauze.
Fiecare clauză este executată la rândul său, până când nu
mai există clauze pentru a fi executate. În cazul în care nici
o clauză nu a fost executată cu succes predicatul eșuează.
Exemplu de clauză:
person(“John”, 185).

Este o declarație care este necondiționat adevărată. De aceea


ea se mai numește un fapt.

prof. dr. ing. Cornelia Gyorodi 44


Secțiunea Clauses
 O clauză conține un cap și opțional corp.
 Capul clauzei este separat de corp prin semnul “:-“ care
este IF logic.
 O clauză care conține un corp ce conține apeluri la alte
predicate.
Exemplu:
grandFather(GrandChild, GrandFather) :-
parent(GrandChild, Person),
father(person, GrandFather).

prof. dr. ing. Cornelia Gyorodi 45


Secțiunea Goal
Secțiunea Goal definește punctul de intrare principal într-
un program Visual Prolog.
Aceasta sectiune cuprinde un predicat "run" special care
este utilizat fără argumente.
goal
mainExe::run(main::run).

Secțiunea Goal indică ca motorul de inferență Visual


Prolog să se uite pentru predicatul „run" în clasa „main".
Visual Prolog împarte codul programului în părți separate,
fiecare parte definind o clasă.

prof. dr. ing. Cornelia Gyorodi 46


Secțiunea Goal
Goal-ul este demonstrat dacă toate subgoal-urile
sunt demonstrate.

Dându-se fapte, reguli şi unul sau mai multe goal-


uri PROLOG, pentru fiecare goal (scop):
- îl caută printre fapte;
- dacă nu-l găseşte ca fapt, caută pentru el
regula de deducţie şi verifică condiţiile reguli,
luând pe rând variantele posibile;
- fiecare condiţie devine un subscop.

prof. dr. ing. Cornelia Gyorodi 47


Secțiunea Goal - Exemplu
clauses
run() :-
console::init(),
stdIO::write("Cine este sora cui:"),
sister(X, Y),
stdIO::writef("% este sora %\n", X, Y),
fail.
run().

end implement main

prof. dr. ing. Cornelia Gyorodi 48


Funcții și predicate pentru operațiile de
intrare/ieșire - Clasa stdIO
In Visual Prolog există o clasă pentru operațiile de intrare
/ieșire standard și anume : stdIO
Utilizăm “stdIO::write(...)” – pentru afișarea unui mesaj.
Câteva metode ale clasei stdIO :
 stdIO::write("\nInput Name (<Enter> '0' to stop): ") /* afișăm
un mesaj sau valorile unor variabile*/
 X=stdIO::readchar(). /* citim un caracter*/
 Term = stdIO::readline(). /* citim o linie */
 stdio::read(). /* citește un termen specificat din stream-ul de
intrare */
 stdio::readString (NumberOfChars) /* citește NumberOfChars din
stream-ul de intrare */

prof. dr. ing. Cornelia Gyorodi 49


Operațiile de intrare/ieșire - Clasa stdIO
 stdio::ungetChar. /* întoarce ultimul caracter citit înapoi
la stream-ul de intrare curent */
 stdio::nl (). /* trece la o linie nouă*/
 stdIO::setoutputstream(DBFile). /* schimbăm ieșirea
standard*/
 X= stdio::getInputStream(). /* returnează stream-ul curent de
intrare*/
 stdio::setInputStream (inputStream Stream). /* setează
streamul de intrare */
 stdIO::writef(<format string>, <list_of_variables>).
 /* scrie într-un format specificat valoarea variabilelor din lista de
variabile */

prof. dr. ing. Cornelia Gyorodi 50


Operațiile de intrare/ieșire - Clasa stdIO

 stdIO::writef(<format string>, <list_of_variables>).


 Pentru fiecare variabilă din <list_of_variables> trebuie să
se precizeze un format
 <format string> - este un string care conține unul sau mai
multe <format field> -uri
 Sintaxa generală a unui <format string> este:
%<-><0><width><.precision><type>
în care:
- indică alinierea la stânga a câmpului, implicit este aliniat
la dreapta.

width – specifică dimensiunea câmpului, numărul de


poziţii pe care se încadrează o variabilă de tip symbol sau
integer.
prof. dr. ing. Cornelia Gyorodi 51
.precision - indică scrierea unei variabile de tip real în
care precision reprezintă mărimea părţii fracţionare
<type> - specifică formatul variabilei, care poate fi:
f real în zecimal fixat;
e real în notaţie exponenţială (ex. 12.5e-6)
g real scurt (implicit);
d sau D caracter sau întreg cu semn;
u sau U caracter sau întreg fără semn;
x sau X caracter sau număr hexazecimal;
c caracter sau întreg dat prin cod ASCII;
R referinţă la baza de date;
s string sau symbol.
Pot exista caractere speciale precum :
\\ - reprezintă \
\n – new line
\r – carriage return
prof. dr. ing. Cornelia Gyorodi 52
Exemplu
Exemplu 2.1. Considerăm următoarele propoziții în limbaj natural:

Ion iubeşte cărţile şi vinul.


Ion este prietenul lui Vlad.
Lui Vlad îi place tot ce îi place prietenului său.
Anei îi plac merele.

Faptele sunt definite astfel:


likes("ion", "books").
likes("ion", "wine" ).
likes("ana", "apple").
friend("ion", "vlad").
Regula este:
likes(Z,X):-friend(Y, Z),likes(Y,X).
prof. dr. ing. Cornelia Gyorodi 53
Exemplu 2.1 scris în Visual Prolog
implement main
open core
domains
nume = symbol.
obiect = symbol.
class predicates
friend:(nume,nume) nondeterm anyflow.

clauses
friend("ion", "vlad").
class predicates
likes:(nume,obiect) nondeterm anyflow.

prof. dr. ing. Cornelia Gyorodi 54


Exemplu 2.1 scris în Visual Prolog (continuare)
clauses
likes("ion", "books").
likes("ion", "wine" ).
likes("ana", "apple").
likes(Z,X):-friend(Y, Z),likes(Y,X).

clauses
run() :-
console::init(),
likes("vlad", X),
stdIO::writef("Vlad likes: %\n", X),
fail.
run().

end implement main


goal
console::runUtf8(main::run).
prof. dr. ing. Cornelia Gyorodi 55

S-ar putea să vă placă și

  • IT Mar05
    IT Mar05
    Document3 pagini
    IT Mar05
    livialst
    Încă nu există evaluări
  • Managementul Resurselor Umane Referat
    Managementul Resurselor Umane Referat
    Document25 pagini
    Managementul Resurselor Umane Referat
    Mihaela Morosan
    Încă nu există evaluări
  • Plan
    Plan
    Document6 pagini
    Plan
    Mihaela Morosan
    Încă nu există evaluări
  • 2subiecte Retele 2020
    2subiecte Retele 2020
    Document36 pagini
    2subiecte Retele 2020
    Mihaela Morosan
    Încă nu există evaluări
  • 2subiecte Retele 2020
    2subiecte Retele 2020
    Document36 pagini
    2subiecte Retele 2020
    Mihaela Morosan
    Încă nu există evaluări
  • Managementul Resurselor Umane Referat
    Managementul Resurselor Umane Referat
    Document25 pagini
    Managementul Resurselor Umane Referat
    Mihaela Morosan
    Încă nu există evaluări
  • Curs 6
    Curs 6
    Document29 pagini
    Curs 6
    Mihaela Morosan
    Încă nu există evaluări
  • Referat
    Referat
    Document13 pagini
    Referat
    Andrei Roșcan
    Încă nu există evaluări
  • Curs 10 PDF
    Curs 10 PDF
    Document27 pagini
    Curs 10 PDF
    Mihaela Morosan
    Încă nu există evaluări
  • Curs 7
    Curs 7
    Document19 pagini
    Curs 7
    Mihaela Morosan
    Încă nu există evaluări
  • Curs 4
    Curs 4
    Document27 pagini
    Curs 4
    Mihaela Morosan
    Încă nu există evaluări
  • Curs 10 PDF
    Curs 10 PDF
    Document27 pagini
    Curs 10 PDF
    Mihaela Morosan
    Încă nu există evaluări
  • Curs 8
    Curs 8
    Document19 pagini
    Curs 8
    Mihaela Morosan
    Încă nu există evaluări
  • Rezumat
    Rezumat
    Document10 pagini
    Rezumat
    Mihaela Morosan
    Încă nu există evaluări
  • Curs 9
    Curs 9
    Document15 pagini
    Curs 9
    Mihaela Morosan
    Încă nu există evaluări
  • Calea Culorii
    Calea Culorii
    Document12 pagini
    Calea Culorii
    Mihaela Morosan
    Încă nu există evaluări
  • Calea Culorii
    Calea Culorii
    Document12 pagini
    Calea Culorii
    Mihaela Morosan
    Încă nu există evaluări
  • Referat IP
    Referat IP
    Document6 pagini
    Referat IP
    Mihaela Morosan
    Încă nu există evaluări
  • Imprimanat
    Imprimanat
    Document19 pagini
    Imprimanat
    Mihaela Morosan
    Încă nu există evaluări
  • Arduino
    Arduino
    Document15 pagini
    Arduino
    Mihaela Morosan
    100% (2)
  • Otl Oradea
    Otl Oradea
    Document6 pagini
    Otl Oradea
    Iulian
    Încă nu există evaluări
  • Curricula - Anul 4
    Curricula - Anul 4
    Document1 pagină
    Curricula - Anul 4
    Mihaela Morosan
    Încă nu există evaluări
  • Imprimanat
    Imprimanat
    Document19 pagini
    Imprimanat
    Mihaela Morosan
    Încă nu există evaluări
  • Touch Screen
    Touch Screen
    Document12 pagini
    Touch Screen
    Mihaela Morosan
    Încă nu există evaluări
  • Touch Screen
    Touch Screen
    Document12 pagini
    Touch Screen
    Mihaela Morosan
    Încă nu există evaluări