2013-07-20 32 views
5

Sono riuscito a costruire l'albero di analisi per la frase data ed eccolo qui, per la frase: "L'uomo è andato a casa".Come convertire l'albero di analisi prologo in una frase logica

T = s(np(det(the), n(man)), vp(v(went), np(n(home)))) 

1) Come utilizzare frase/2 su questo?

How to translate a sentence in a logical language using prolog? - è simile a quello di cui ho bisogno, ma la soluzione non funziona su di me.

2) Voglio mappare questo con il modello di grammatica e ottenere il tag di parole. Det=the, N(Subject)=man, V=went, N(Object)=home

c'è un modo per mappare questo albero con determinate strutture ad albero set e identificare la grammatica. Come posso usare l'albero di analisi per identificare Soggetto, verbo, oggetto, il modello di grammatica e generare la frase della lingua di arrivo.


modificato in seguito .. Ho provato questo codice e si dà risposta notevole. Qualche suggerimento su questo codice.

sent("(s(np(n(man))) (vp(v(went)) (np(n(home)))))"). 

whitespace --> [X], { char_type(X, white) ; char_type(X, space) }, whitespace. 
whitespace --> []. 

char(C) --> [C], { char_type(C, graph), \+ memberchk(C, "()") }. 

chars([C|Rest]) --> char(C), chars(Rest). 
chars([C]) --> char(C). 

term(T) --> chars(C), { atom_chars(T, C) }. 
term(L) --> list(L). 

list(T) --> "(", terms(T), ")". 

terms([]) --> []. 
terms([T|Terms]) --> term(T), whitespace, !, terms(Terms). 

simplify([s,[np, [n,[Subject]]], [vp,[v,[Verb]],[np,[n,[Object]]]]],Result) :- Result = [Subject,Verb,Object]. 

Grazie Mathée

+0

'phrase/2' fa riferimento a una regola DCG e una lista di input di qualche tipo. Puoi usarlo in entrambe le direzioni, ma se non stai analizzando né generando un elenco probabilmente non è lo strumento giusto per il lavoro. Ha funzionato per me nell'altra risposta perché le espressioni S di Lisp sono inerentemente liste. –

+0

si prega di controllare il codice che ho aggiunto più tardi. Ho seguito il tuo metodo. e ha funzionato nel prologo SWI. Potete per favore suggerire miglioramenti affinché il codice corrisponda a diversi schemi grammaticali e identificare il modello grammaticale per una determinata frase. – Mathee

+0

'white' è tab e spazio; 'spazio' include quelli, quindi hai solo bisogno' spazio' in 'spazio bianco // 0'. Rimuoverei 'Result' da' semplifica/2' e metto l'elenco come secondo argomento e non ho alcun corpo su questa regola. Altrimenti mi sembra buono. Sorprendente, questo non era quello che pensavo stavi chiedendo, ma non mi sembra male. :) –

risposta

3

il modo più semplice per farlo è per mezzo di una visita della struttura, 'hardcoded' sui simboli si è interessati.

Qui è un programma di utilità più generico, che usi (=..)/2 per catturare una parte di nome dell'albero:

part_of(T, S, R) :- T =.. [F|As], 
    ( F = S, 
     R = T 
    ; member(N, As), 
     part_of(N, S, R) 
    ). 

?- part_of(s(np(det(the), n(man)), vp(v(went), np(n(home)))),np,P). 
P = np(det(the), n(man)) ; 
P = np(n(home)) ; 
false. 

E 'una sorta di membro/2, solo per gli alberi. BTW Non capisco la prima parte della tua domanda: perché vuoi usare phrase/2 su un albero di sintassi? Di solito una grammatica (il primo argomento di frase/2) è intesa per build un albero di sintassi da caratteri 'grezzi' stream ...

+0

contento di sapere le cose dalla tua risposta. Ma ho bisogno di confrontare l'albero dato con un modello grammaticale, in cui posso ottenere l'uomo come soggetto e la casa come oggetto. Per questo ho ottenuto l'idea frase da http://stackoverflow.com/questions/14953960/how-to-translate-a-sentence-in-a-alical-lingue-using-prolog/17759505#17759505. – Mathee