stateG(S) :- member(S, [a,b,c,d,e,f,g,h]). nextG(a, b). nextG(a, e). nextG(b, c). nextG(b, d). nextG(d, a). % ciclu nextG(e, d). nextG(e, f). nextG(f, g). nextG(f, h). initialG(a). finalG(g). finalG(h). finalG(c). % dacă știu ce lungime are drumul. e.g are lungime 3 template([_, _, _]). drum(Drum) :- template(Drum), Drum = [X, Y, Z], initialG(X), finalG(Z), nextG(X, Y), nextG(Y, Z). % pe problema generală % perspectivă declarativă: solutie(Drum) :- initialG(Init), drumCatreFinal(Init, Drum). % "Am drum către starea finală de la S, și acel drum este Drum drumCatreFinal(S, Drum) :- finalG(S), Drum = [S]. drumCatreFinal(S, Drum) :- nextG(S, S1), % S1 este o stare următoare din S, astfel încât % am un drum de la S1 la o stare finală drumCatreFinal(S1, DrumS1), % dacă am, atunci drumul de la S la o stare finală este: Drum = [S | DrumS1]. search(Drum) :- initialG(Init), search(Init, Drum). search(S, [S]) :- finalG(S). search(S, Drum) :- % dacă am o stare următoarea din S nextG(S, S1), % caut un drum din S1 search(S1, DrumS1), % dacă am găsit un drum din S1 la final Drum = [S | DrumS1]. searchR(Drum) :- initialG(Init), searchR(Init, [], Drum). searchR(S, _, [S]) :- finalG(S). searchR(S, Vizitat, Drum) :- % dacă am o stare următoarea din S nextG(S, S1), % și starea următoare nu am întâlnit-o deja, % și nu este starea pe care o explorez acum \+ member(S1, [S | Vizitat]), % caut un drum din S1 searchR(S1, [S | Vizitat], DrumS1), % dacă am găsit un drum din S1 la final Drum = [S | DrumS1].