[PROLOG] Software per generare albero SLDNF

di il
11 risposte

[PROLOG] Software per generare albero SLDNF

Ciao a tutti...non sapevo dove postare la domanda..siete a conoscenza di qualche software che permette di descrivere l'albero sldnf di una determinata query in prolog. Mi spiego meglio. Una volta scritto il programma e interrogato con una determinata query, è possibile tracciare il grafico dell'albero delle chiamate che vengono effettuate con le varie sostituzioni di variabili???

ESEMPIO: http://www.unife.it/ing/lm.infoauto/Fond_IA/domande/sldnf/27-ottobre-2000

11 Risposte

  • Re: [PROLOG] Software per generare albero SLDNF

    Ovviamente non esiste.

    Il motivo e' ovvio: sapere come una query Prolog viene risolta e' una questione interna di quella particolare implementazione del motore di risoluzione che stai utilizzando.

    Trovi abbastanza facilmente libri di testo che spiegano come funziona l'algoritmo di unificazione. Ma questo in teoria. Poi c'e' l'implementazione e qui si possono fare diverse ottimizzazioni.

    Per poter fare quello che richiedi ti serve una cosa fondamentale: trovare come abilitare il trace sulla versione di Prolog che stai utilizzando. Con il trace abilitato, a fronte di una query, dovrebbe venir generato un file con tutti i passi di unificazione che il motore ha fatto per arrivare alla soluzione.

    Partendo da questo file, puoi ricostruire l'albero di risoluzione.

    Queste sono solo speculazioni, pero'.
    Pur avendo programmato in Prolog, non mi sono mai posto il problema di voler vedere effettivamente l'albero di risoluzione .

    Mi pare un po' suicida !
  • Re: [PROLOG] Software per generare albero SLDNF

    Ciao...ti ringrazio per la tua esauriente spiegazione...chiedevo se esisteva semplicemente per verificare degli esercizi d'esame che vengono fatti nella mia universitá...mi sapresti indicare un buon libro per imparare le basi della programmazione im prolog...sto avendo delle difficoltá a capire, dato un semplice problema (ordinare liste etc) , come affrontare il problema. cioè come scrivere i vari predicati...non so se mi sono spiegato bene...
  • Re: [PROLOG] Software per generare albero SLDNF

    Il testo su cui ho studiato e':



    e da quanto mi risulta e' il miglior testo sul linguaggio.

    Ma ce ne sono molti altri.

    Tu posta il codice, cosi' sfrutto l'occasione per ripassarlo anch'io.

    Quindi le domande sorgono spontanee:

    1) quale distribuzione Prolog stai usando (cosi' uso la stessa)
    2) quale algorimto di ordinamento vuoi implementare

    Non saro' velocissimo nelle risposte, pero'!
  • Re: [PROLOG] Software per generare albero SLDNF

    Uso swi prolog...di seguito un esempio di esercizio tipo :

    1) Si definisca un predicato Prolog comprimi(L, N, C) che, prendendo in ingresso una lista L e un intero N, restituisca la
    lista C ottenuta da L sostuendo ogni blocco di N elementi con la loro media.
    Ad esempio ?comprimi( [ 1, 2, 3, 4, 5, 6], 2, C) restituisce C= [1.5, 3.5, 5.5]; ?comprimi( [ 1, 2, 3, 4, 5, 6], 3, C)
    restituisce C= [2,5]; ?comprimi( [ 1, 2, 3, 4, 5, 6], 4, C) restituisce C= [2.5, 5.5]; ?comprimi( [ 1, 2, 3, 4, 5, 6], 5, C)
    restituisce C= [3, 6]; ?comprimi( [ 1, 2, 3, 4, 5, 6], 6, C) restituisce C= [3.5];

    2) Si scriva un programma Prolog che, prendendo in ingresso una lista L, la comprima rimpiazzando gli elementi contigui
    uguali con la coppia elemento e numero di occorrenze. Ad esempio se L = [ a, a, b, b, b, c, a, a] va restituito [a, 2, b, 3,
    c, 1, a, 2].

    non riesco a capire il tipo di ragionamento che bisogna fare per risolvere l'esercizio...
  • Re: [PROLOG] Software per generare albero SLDNF

    Ok, c'e' l'ho!
    E' passato un (moo....oolto bel) po' di tempo, ma le cose semplici le riesco ancora fare.

    Inizia con l'esercizio 2).

    Ricorda che il Prolog e' basato su una serie di concetti fondamentali:

    1) ricorsione
    2) destrutturazione delle strutture dati
    3) passaggio parametri per valore
    4) l'output di un goal deve essere una variabile unbounded!
    5) informazioni di servizio devono essere portate avanti ed indietro tra i goal.

    Al momento ho risolto l'esercizio in 3 passi, in un totale di 6 clausole.

    Il problema lo devi scomporre in problemini piu' semplici:
    a) come generare a lista di coppie (simbolo, contatore) un simbolo alla volta
    b) come generare la lista di coppie (simbolo, contatore) avendo una lista di simboli

    Quindi, inizia con il punto 1):

    hai tre casi:

    1) la lista di coppie e' vuota
    2) la lista contiene gia' il simbolo con il relativo contatore come elementi di testa della lista
    3) in testa alla lista c'e' un simbolo che non e' quello che serve a te

    Inizia ad implementare questo goal, e posta il codice.

    Poi il resto e' semplice.
  • Re: [PROLOG] Software per generare albero SLDNF

    Mi credi che non so dove mettere le mani???
  • Re: [PROLOG] Software per generare albero SLDNF

    Allora iniziamo con qualcosa di piu' semplice:

    Mostra un esempio di codice funzionante (scritto da te, non copia/incolla da Internet).
    Ad esempio: estrai il primo elemeno di una lista.
  • Re: [PROLOG] Software per generare albero SLDNF

    Combinato qualcosa?
  • Re: [PROLOG] Software per generare albero SLDNF

    Ciao e scusami per l'assenza. Non ho pià risposto perchè non ho ricevuto nessuna email di notifica.
    Allora l'idea (forse sbagliata) che mi è venuta in mente per implementare l'esempio da te proposto è il seguente:

    estrai([],[]). -> se ricevo una lista vuota restituisco una lista vuota
    estrai ([X],X). -> se ricevo una lista con un solo elemento restituisco l'elemento contenuto
    estrai ([H|T],H) -> se ricevo una lista formata da una testa e una cosa restituisco l'elemento in testa (ossia il primo elemento)

    è il tipo di ragionamento da adottare che mi blocca un pò
  • Re: [PROLOG] Software per generare albero SLDNF

    Programmare in Prolog richiede proprio imparare a ragionare in modo diverso da quanto si fa con linguaggi procedurali/ad oggetti.

    Per esempio, gia' qui ti sei avvicinato, ma hai fatto un errore: esiste il primo elemento di una lista di lunghezza zero? A me non risulta. Quindi la prima clausola e' sbagliata. Non e' che non serve, perche' essendo presente, viene valutata e quindi un'eventuale goal che cerca un elemento in una lista avrebbe successo. Ed invece DEVE FALLIRE! Quindi la clausola NON ci deve proprio essere!

    Oppure, se proprio vogliamo essere pignoli, avresti dovuto scrivere:

    estrai([],_) :- fail.

    Ok, ma andiamo avanti.

    Secondo passo: hai una lista di coppie [simbolo, contatore]. Devi implementare l'inserimento di un nuovo simbolo.

    Hai tre casi:

    1) il simbolo non e' presente nella lista
    2) il simbolo e' presente nella coppia in testa alla lista
    3) il simbolo non e' presente nella coppia in testa alla lista

    Implementa e posta il codice.

    Se e' ancora troppo complesso, implementa la versione piu' semplice: hai una lista di simboli e devi implementare l'inserimento di un nuovo simbolo, senza duplicazione. I soliti tre casi ...

    Implementa e posta.
  • Re: [PROLOG] Software per generare albero SLDNF

    Si hai proprio ragione...mamma mia quanta pazienza hai cmq provo a dare una soluzione alla versione più semplice:

    1) il simbolo non e' presente nella lista

    di conseguenza devo inserire il simbolo

    ins([],X,[X]). -> se ho una lista vuota e un imbolo X restituisco la lista contenente il simbolo X

    2) il simbolo e' presente in testa alla lista

    se il simbolo è presente semplicemente non devo fare nulla:

    ins([H|T],H,[H|T]). -> se il simbolo è presente ritorno la lista senza alcuna modifica

    3) il simbolo non e' presente in testa alla lista

    ins([H|T],X) :- X!=H, ins(T,X)

    se il simbolo X non è in testa alla lista (H) richiamo la funziona sulla restante lista
Devi accedere o registrarti per scrivere nel forum
11 risposte