2013-05-16 4 views
1

Je suis en train d'étudier DCG grammaire et Parse arbre en Prolog utilisant livre Ivan Bratko: « Programmation pour l'intelligence artificielle »Certains doutes liés grammaire DCG et parse relation arbre Prolog

Je doute au sujet de mon interprétation de cette grammaire DCG qui génèrent un arbre d'analyse syntaxique:

sentence(Number, sentence(NP, VP)) --> noun_phrase(Number, NP), 
          verb_phrase(Number, VP). 

verb_phrase(Number, verb_phrase(Verb, NP)) --> verb(Number, Verb), 
           noun_phrase(_, NP). 

noun_phrase(Number, noun_phrase(Det, Noun)) --> determiner(Number, Det), 
          noun(Number, Noun). 

determiner(singular, determiner(a)) --> [a]. 
determiner(_,determiner(the)) --> [the]. 

noun(singular, noun(cat)) --> [cat]. 
noun(singular, noun(mouse)) --> [mouse]. 
noun(plural, noun(cats)) --> [cats]. 
noun(plural, noun(mice)) --> [mice]. 

verb(singular, verb(scares)) --> [scares]. 
verb(singular, verb(hates)) --> [hates]. 
verb(plural, verb(scare)) --> [scare]. 
verb(plural, verb(hate)) --> [hate]. 

Ainsi, par exemple, si je peux exécuter la requête suivante:

[debug] ?- sentence(singular, Tree, [a, cat, scares, the, mice],[]). 
Tree = sentence(noun_phrase(determiner(a), noun(cat)), verb_phrase(verb(scares), noun_phrase(determiner(the), noun(mice)))) 

qui est vrai et qui génèrent un Parse arbre ayant phrase en tant que root

Je suis en train de raisonner sur la façon dont l'arbre d'analyse syntaxique est construit en utilisant uniquement la forme de grammaire DCG précédente et non sur la façon dont Prolog traduire cette grammaire dans un ensemble de règles (parce que, pour moi, cette chose est difficile et peut-être parce que je vais ajouter une autre étape)

Est-ce une bonne chose de le lire par la grammaire DCG et non par le automatique converti règles?

Alors je lis ainsi:

Une phrase est composé d'une noun_phrase et par un verb_phrase donc int la première « règle » de la grammaire DCG je précise que phrase est la racine de mon arbre (qui représente une phrase dans mon sous-ensemble du langage naturel) qui ont un noun_phrase comme enfant à gauche et un verb_phrase enfant comme droit

Ensuite noun_phrase est défini comme un déterminateur suivi d'un nom si noun_phrase est la racine d'un autre arbre ayant déterminateur comme enfant à gauche et nom comme droit enfant

Alors déterminateur est- un arbre composé d'un seul noeud: determiner (a) s'il est TRUE que le déterminant trouvé est "a" ou ** determiner (le) s'il est TRUE que le déterminant trouvé est "the"

Même raisonnement pour ma * verb_phrase **

Est-ce correct?

Répondre

2

Tout le but de la forme DCG est que vous n'avez pas besoin de regarder la forme normalisée, c'est tout. Donc, avec DCG, vous obtenez une représentation qui est assez simple à interpréter pour un humain.

Oui, votre interprétation est correcte. Prolog semble être d'accord avec vous, car il vous rend ce que vous attendiez. En supposant que vous ne voyez aucun avertissement, vous devriez être prêt à partir. Peut-être essayer d'analyser certains cas de bord et voir ce qui se passe?

+0

tnx tellement :-) – AndreaNobili