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).
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%