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ă, definită de predicatele initial, final, și next % perspectivă declarativă: solutie(Drum) :- initialG(Init), drumCatreFinal(Init, Drum). % "Am drum din S către starea, și acel drum este Drum drumCatreFinal(S, Drum) :- finalG(S), Drum = [S]. drumCatreFinal(S, Drum) :- nextG(S, SNext), % SNext este o stare următoare din S, astfel încât % am un drum de la SNext la o stare finală drumCatreFinal(SNext, DrumNext), % dacă am, atunci drumul de la S la o stare finală este: Drum = [S | DrumNext]. % perspectivă algoritmică % Predicat care "caută" drumul către starea finală % dintr-o stare curentă și întoarce drumul găsit search(Drum) :- initialG(SI), search(SI, Drum). search(Current, [Current]) :- finalG(Current). search(Current, Drum) :- % dacă am o stare următoare Next din Current nextG(Current, Next), % caut un drum din Next search(Next, DrumNext), % dacă am găsit un drum din Next către final Drum = [Current | DrumNext]. searchR(Drum) :- initialG(Init), searchR(Init, [], Drum). searchR(Current, _, [Current]) :- finalG(Current). searchR(Current, Vizitat, Drum) :- % dacă am o stare următoare Next din Current nextG(Current, Next), % și starea următoare nu am întâlnit-o deja, % și nu este starea pe care o explorez acum \+ member(Next, [Current | Vizitat]), % caut un drum din Next searchR(Next, [Current | Vizitat], DrumNext), % dacă am găsit un drum din Next la final Drum = [Current | DrumNext].