SUPERTIPURI in Prolog

TIPUL LISTA COMPOZITA in Prolog

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % SUPERTIPURI in Prolog % TIPUL LISTA COMPOZITA in Prolog %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Modelarea unei LISTE care sa contina ca elemente % atat numere reale cat si liste de numere reale. % Problema propusa de studentul % Paul Mateescu (2009-2010, III-ZI, Informatica) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % Problema modelarii unei LISTE care sa contina atat % reali cat si liste_de_reali, ca in exemplul: % [1,[1,2],2,3,[1,2,3,4],5], % revine la a defini un supertip pentru tipurile "real" % si "rl" (lista de reali). % % CONSTRUCTIE: % Tipul de date al listei date spre modelare in exemplul % de mai sus este asumat a fi o lista de itemi % (litem=item*) % unde "item" este supertipul cautat. % % Se asuma ipotetic existenta a doua incluziuni % canonice (functorii "r" si "lr") care scufunda % tipurile initiale ("real" si "rl") in % supertipul "item". % % PE SCURT: % In exemplul curent, "item" este un gen special de % domeniu definit prin disjunctie si numit SUPERTIP. % Vom numi lista compozita o lista cu elemente % dintr-un supertip. O astfel de lista este usor de % recunoscut dupa natura neomogena a elementelor sale. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Nicolaie Popescu-Bodorin, 2009 % http://fmi.spiruharet.ro/bodorin/ %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% DOMAINS %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % un exemplu de supertip: "item" % un exemplu de tip lista compozita: "litem" rl=real* % rl este lista de reali item=r(real);lr(rl) % item este supertipul tipurilor % initiale ("real" si "rl"). % Sau, altfel spus: "item" este sau % real encodat functorial, adica % r(real), sau lista de reali % encodata functorial, adica % lr(rl), si nimic altceva. litem=item* % "litem" este lista de elemente din supertipul item %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Generare de liste compozite - Exemplul 1 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PREDICATES run(real,integer,litem) run(real,integer,integer,litem,litem) CLAUSES % exemple de interogare: % run(10,3,R) % run(10,1,R) run(V,N,R):-N2=2*N,run(V,N,N2,[],R). run(V,N,N2,Ri,R):-N2>N,N2a=N2-1,run(V,N,N2a,[r(V)|Ri],R),!. run(_,_,0,Ri,Ri):-!. run(V,N,N2,Ri,R):-N2<=N,N2a=N2-1,run(V,N,N2a,[lr([V])|Ri],R). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Generare de liste compozite - Exemplul 2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% PREDICATES run2(real,integer,litem) run2(real,integer,litem,litem) toreal(litem,rl) CLAUSES % exemple de interogare: % run2(10,3,R) % run2(10,1,R) run2(V,N,R):- N2=N+1,run2(V,N2,[],R). run2(V,N,Ri,R):-N>1,Na=N-1,run2(V,Na,[r(V)|Ri],R),!. run2(V,1,Ri,R):-toreal(Ri,Rir),run2(V,0,[lr(Rir)|Ri],R),!. run2(_,0,Ri,Ri):-!. % usage: (i,o): toreal( [r(2),r(3)] , [2,3] ) toreal([],[]). toreal([r(X)|T],[X|RT]):-toreal(T,RT). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%