Documente Academic
Documente Profesional
Documente Cultură
1. Problema labirintului
Se cere existenta a cel putin un modul separat pentru algoritmii de cautare informata.
Solutie completa 2.
Se considera M blocuri si N spatii de depozitare. Intr-un spatiu de depozitare se pot pune blocuri
suprapuse. Se cere asezarea blocurilor in spatiile de depozitare. Pentru aceasta. se pot muta doar
blocurile aflate in varfurile stivelor de depozitare (modelul stivei).
Exp. Pentru M=4 si N=3, consideram configuratia initiala: [ [d], [a, b], [c] ].
Program Prolog:
s(L,Lr):- membru(X,L),
% initiale L
X=[Varf|_],
% X trebuie sa aiba cel putin un element
det_poz_el(L,N,X),
stergn(L,Li,N),
membru(Y,L),
det_poz_el(L,N1,Y),
N\==N1,
adaugn(Varf,Li,Lr,N1),
not(permutare(L,Lr)).
%---------------------------------------------------------------------
det_poz_el([H|_],1,H).
%---------------------------------------------------------------------
stergn([[_|T]|L],[T|L],1).
% Sterg head-ul listei de pe pozitia 1 din L (prima lista)
%---------------------------------------------------------------------
adaugn(Varf,[H|T],[[Varf|H]|T],1).
adaugn(Varf,[H|T],[H|T1],N):-N>1,N1 is N-1,adaugn(Varf,T,T1,N1).
%------------------------------------------------------------------
%Cautare BF
breadthfirst(NodInitial,Solutie):- bf([[NodInitial]],Solutie).
bf([[Nod|Drum]|_],[Nod|Drum]):- scop(Nod).
bf([Drum|Drumuri],Solutie):- extind(Drum,DrumNoi),
conc(Drumuri,DrumNoi,Drumuri1),
bf(Drumuri1,Solutie).
extind([Nod|Drum],DrumNoi):- bagof([NodNou,Nod|Drum],
(s(Nod,NodNou),not(membru(NodNou,[Nod|Drum]))),DrumNoi),!.
extind(_,[]).
%---------------------------------------------------------------------
problema:- tell('D:\\blocuri.txt'),
initial(S),
breadthfirst(S,Solutie),
afisare(Solutie),
told.
%---------------------------------------------------------------------
lung([],0).
max(A,_,A).
max_lung([],0).
max_lung([H|T],N):- max_lung(T,N1),lung(H,N2),max(N1,N2,N).
% Afisam configuratiile
arata(L):- nl,max_lung(L,N),afis(L,N,N).
% Det cea mai mare lungime a unei stive din L si afisam nivel cu nivel
% incepand de la ultimul, blocurile din listele (locurile de
depozitare) din L
afis(L1,_,0):- af(L1).
af([]):- write(==).
af([_|T]):- write(===),af(T).
afis2([],_,_).
afis2([H|T],N,K):- lung(H,L),
(L>=K,L1 is L-K+1,det_el_n(H,L1,R),write(R);
L<K,tab(1)),
tab(2),afis2(T,N,K).
det_el_n([H|_],1,H).
sterg_el(X,[X|L],L).
sterg_el(X,[Y|L],[Y|L1]):- sterg_el(X,L,L1).
permutare([],[]).
permutare([H|T],L):- permutare(T,T1),sterg_el(H,L,T1).
membru(X,[X|_]).
membru(X,[_|L]):- membru(X,L).
conc([H|T],L,[H|T1]):- conc(T,L,T1).
conc([],L,L).
afisare([]).
afisare([H|T]):- afisare(T),arata(H),nl.