|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
[PROLOG]Chiarimenti e piccolo problema
Invia un messaggio MSN a D4rkAng3l
PROLOG, ricerca connessione su un grafo ed ecco quà i primi dubbietti su questo astruso sistema. Allora col prolgo è facile rappresentare i grafi...basta rappresentare le connessioni tra i vari nodi quindi magari potrei avere un coso del genere nella dichiarazione dei fatti: Codice:
arco(a, g). arco(a, b). arco(b, c). arco(b, f). arco(c, d). arco(c, e). Poi nella dichiarazione delle regole dichiaro due regole che mi dicono se un certo nodo è connesso ad un altro nodo connesso(Iniziale, Finale):- arco(Iniziale, Finale). connesso(Iniziale, Finale):- arco(Iniziale, Intermedio), arco(Intermedio, Finale). Il secondo caso invece presuppone che ci siano una serie di nodi intermedi e si usala ricorsione per cercare un cammino...ma non mi torna del tutto e ho dei dubbi. Ma il meccanismo di ricorsione è implementato direttamente nel prolog? (cioè tipo in C dovrei scrivere io in modo tale che ci sia una ricorsione....) Sull'esempio che ho che fa riferimento a quel grafo fà il caso che voglio scoprire se c'è un cammino a partire dal nodo A che mi porta nel nodo E e c'è scritto: si chiede se A è direttamente connesso con E e la prima regola fallisce (ok...) Allora prova con G come nodo intermedio ma fallisce (fallisce perchè G è foglia?) allora prova ad usare B come nodo intermedio ma B non è connesso direttamente con E quindi considera C che è connesso con E e può dire che esiste un percorso tra A ed E Ma questo meccanismo di ricorsione in pratica come cavolo funziona? La mia ipotesi è che per esempio: prova a connettere A e C usando come nodo intermdio B ma C non è il nodo finale, allora B diventa (ricorsivamente) il nodo iniziale, C quello intermedio e C è connesso ad E. Se il cammino non portava ad un nodo finale tornava indietro e provava un altro cammino...funziona così la ricorsione in PROLOG o mi manca qualcosa? mmm se non stò dicendo minchiate mi viene da supporre che abbia nativo un meccanismo di ricorsione e back tracking o sbaglio? Altra cosa che non mi funziona a livelli pratico: se nell'interprete lancio il comando: connesso(a,e). mi dice di NO anche se è connesso ed in teoria dovrebbe funzionare...why? Grazie Andrea |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Jul 2006
Città: Tristram
Messaggi: 517
|
Provo a risponderti cercando di rispolverare qualche antico neurone sopito.
Hai intuito bene; senza addentrarmi nei dettagli, il Prolog crea a runtime degli alberi and-or su cui va a cercare tutte le soluzioni, facendo back-tracking nel caso in cui un ramo dell'albero fallisca e continuando a cercarne sugli altri rami. In sostanza, nel tuo programma (che mi sembra corretto concettualmente) la ricorsione è già implementata nell'istruzione Codice:
connesso(Iniziale, Finale):- arco(Iniziale, Intermedio), arco(Intermedio, Finale). Codice:
? connesso(a,e)
__________________
Il sole è giallo |
![]() |
![]() |
![]() |
#3 | ||||
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Per renderlo generico devi farlo effettivamente ricorsivo, qualcosa del tipo Codice:
connesso(Iniziale, Finale):- arco(Iniziale, Finale). connesso(Iniziale, Finale):- arco(Iniziale, Intermedio), connesso(Intermedio, Finale). Quote:
Quote:
Codice:
connesso(Iniziale, Finale):- arco(Iniziale, Finale). Quote:
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
||||
![]() |
![]() |
![]() |
#4 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
ah è vero che deficiente che sono...grazie della correzione e delle chiarificazioni...solo una cosa mi potresti chiarire il concetto di unificazione?
Grazie Andrea |
![]() |
![]() |
![]() |
#5 | |
Senior Member
Iscritto dal: Dec 2005
Città: Istanbul
Messaggi: 1817
|
Quote:
Ad esempio se io cerco di unificare i predicati arco(a,B) e arco(C,d) ottengo che devo sostituire la variabile C con a e la B con d, ottenendo arco(a,d) Ovviamente se invece di variabili ho da entrambi i lati qualcosa che non sia una variabile, l'unico modo perche' questo possa accadere e' che i due termini siano uguali. Posso fare tutti i salti mortali che voglio, ma non riusciro' mai ad unificare arco(a,B) con arco(c,D) perche' a e c sono atomi diversi.
__________________
One of the conclusions that we reached was that the "object" need not be a primitive notion in a programming language; one can build objects and their behaviour from little more than assignable value cells and good old lambda expressions. —Guy Steele |
|
![]() |
![]() |
![]() |
#6 |
Bannato
Iscritto dal: Mar 2004
Città: Roma
Messaggi: 2682
|
Grazie,
spiegazione perfetta :-) ora ho capito, si lo aveva detto anche il professore...mannaggia a me che mi rivedo gli appunti con una settimana di ritardo e poi mi sfuggono alcune cose |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:30.