Exerciții Laboratorul 5, Exercițiul 2

breadthfirst/2, solve/2 — BFS pe graf

În cadrul acestui exercițiu, ne dorim să implementăm un algoritm breadth-first search (căutarea în lățimea arborelui). Pentru a face acest lucru:

  • Definiți o bază de cunoștințe cu două predicate, succesor/2 și objective/1, pentru a defini funcția succesor (muchia dintre două noduri) și pentru a defini nodurile-obiectiv.

  • Ne dorim un predicat extend/2, care primește ca intrare un drum parțial și returnează toate drumurile care se pot forma. Important! Drumurile se vor obține în ordine inversă, astfel că Head-ul listei va fi mereu nodul curent. Utilizați findall/3.

    ?- extend([3, 1], L).
    L = [[5, 3, 1], [4, 3, 1]]
    
  • Scrieți un predicat breadthfirst/2 care primește o listă de drumuri și: (a) dacă un drum a ajuns la nodul obiectiv, îl returnează, altfel extinde drumul, îl concatenează la celelalte deja existente și reapelează recursiv.

  • Scrieți un predicat solve/2 care primește un nod de start și returnează toate drumurile (în ordine inversă) până la nodul obiectiv.

    ?- solve(1, R).
    R = [[5, 2, 1], [5, 3, 1]]
    
Te-ai blocat?
editor soluție
?-
Tastează o interogare (ex. father_of(sandra, X).) și apasă Enter — sau apasă pe un caz de test de mai jos.
Cazuri de test (2 — apasă pe unul ca să îl rulezi, sau Verifică pentru toate)
?
extend([3, 1], L). așteptat: L = [[5,3,1],[4,3,1]]
?
solve(1, R). așteptat: R = [[5,2,1],[5,3,1]]