20 elemente de compilare }i dezvoltarea programelor mari

20 elemente de compilare }i dezvoltarea programelor mari 20 elemente de compilare }i dezvoltarea programelor mari

28.04.2013 Views

190 Practica program[rii logice ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ ⎯ De]i stanga, dreapta sunt ambele simboluri, argumentele predicatelor langa ]i la_dreapta sunt tratate diferit ("teama de semnifica\ii diferite..."). O solu\ie posibil[ este schimbarea declara\iei predicatului langa (vezi ]i cap. 2): sau langa(symbol,symbol) langa(stanga,dreapta) langa(dreapta,stanga) Prezent[m mai jos un program care ilustreaz[ rolul hot[r`tor al ordinei declara\iilor unui acela]i predicat: predicates produs(integer,real,real) produs(real,integer,real) produs(integer,integer,integer) produs(real,real,real) clauses produs(X,Y,Z):-bound(X),bound(Y),Z=X*Y. produs(X,Y,Z):-bound(X),bound(Z),Y=Z/X. produs(X,Y,Z):-bound(Z),bound(Y),X=Z/Y. Exemplul 20.6. Ordinea declara\iilor. La scopul extern produs(2.4,0.5,X) se furnizeaz[ solu\ia X=1 ceea ce este evident o eroare de semnifica\ie a predicatului (care nici nu este depistat[ @n faza de compilare !). O solu\ie pentru @nl[turarea acestei situa\ii este scrierea ultimei declara\ii a lui produs pe prima pozi\ie (vezi conversii de tip). C. Conversii de tip O variabil[, @ntr-o regul[, nu poate fi legat[ la valori de tipuri diferite dec`t @n cazul unor conversii de tip recunoscute de compilator. Dac[ tipurile nu pot fi convertite compilatorul semnaleaz[: 505 Type error: Illegal variable for this position 510 Objects from these domains cannot be compared Conversia de tip intervine deasemenea ]i @ntr-o punere @n coresponden\[ a unei variabile legate cu o valoare de tip diferit. Tip 1 Tip 2 Compatibilitate Observa\ii

Elemente de compilare 191 ⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯ ⎯ string char nu 510 sau 505 string integer nu 510 sau 505 string real nu 510 sau 505 string symbol da defini\ie char integer da char real da char symbol nu 510 sau 505 integer real da integer symbol nu 510 sau 505 real symbol nu 510 sau 505 Tabelul 20.1. Conversii de tipuri. Remarc[: Compatibilitatea lui char cu integer ]i real se refer[ la plaja de numere @ntregi care sunt coduri ASCII pentru caractere. predicates go clauses go:-X=122,X='z'. Exemplul 20.7. Compatibilitate de tip. Cu toate acestea, exemplul urm[tor demonstreaz[ c[ exist[ o diferen\[ @ntre compatibilitatea domeniilor ]i semnifica\ia predicatelor din program: predicates egal(integer,real) egal(char,integer) egal(symbol,string) egal(real,char) clauses egal(X,X). goal egal(1.1,V),write(1.1,"=",V). Exemplul 20.8. Este egalitatea corect[ ?

190 Practica program[rii logice<br />

⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯⎯<br />

⎯<br />

De]i stanga, dreapta sunt ambele simboluri, argumentele<br />

predicatelor langa ]i la_dreapta sunt tratate diferit ("teama <strong>de</strong><br />

semnifica\ii diferite..."). O solu\ie posibil[ este schimbarea <strong>de</strong>clara\iei<br />

predicatului langa (vezi ]i cap. 2):<br />

sau<br />

langa(symbol,symbol)<br />

langa(stanga,dreapta)<br />

langa(dreapta,stanga)<br />

Prezent[m mai jos un program care ilustreaz[ rolul hot[r`tor al<br />

ordinei <strong>de</strong>clara\iilor unui acela]i predicat:<br />

predicates<br />

produs(integer,real,real)<br />

produs(real,integer,real)<br />

produs(integer,integer,integer)<br />

produs(real,real,real)<br />

clauses<br />

produs(X,Y,Z):-bound(X),bound(Y),Z=X*Y.<br />

produs(X,Y,Z):-bound(X),bound(Z),Y=Z/X.<br />

produs(X,Y,Z):-bound(Z),bound(Y),X=Z/Y.<br />

Exemplul <strong>20</strong>.6. Ordinea <strong>de</strong>clara\iilor.<br />

La scopul extern produs(2.4,0.5,X) se furnizeaz[ solu\ia X=1<br />

ceea ce este evi<strong>de</strong>nt o eroare <strong>de</strong> semnifica\ie a predicatului (care nici nu<br />

este <strong>de</strong>pistat[ @n faza <strong>de</strong> <strong>compilare</strong> !). O solu\ie pentru @nl[turarea acestei<br />

situa\ii este scrierea ultimei <strong>de</strong>clara\ii a lui produs pe prima pozi\ie (vezi<br />

conversii <strong>de</strong> tip).<br />

C. Conversii <strong>de</strong> tip<br />

O variabil[, @ntr-o regul[, nu poate fi legat[ la valori <strong>de</strong> tipuri<br />

diferite <strong>de</strong>c`t @n cazul unor conversii <strong>de</strong> tip recunoscute <strong>de</strong> compilator.<br />

Dac[ tipurile nu pot fi convertite compilatorul semnaleaz[:<br />

505 Type error: Illegal variable for this position<br />

510 Objects from these domains cannot be compared<br />

Conversia <strong>de</strong> tip intervine <strong>de</strong>asemenea ]i @ntr-o punere @n<br />

corespon<strong>de</strong>n\[ a unei variabile legate cu o valoare <strong>de</strong> tip diferit.<br />

Tip 1 Tip 2 Compatibilitate Observa\ii

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!