J'étudie la grammaire DCG dans Prolog en utilisant le livre d'Ivan Bratko: "Programmation pour l'intelligence artificielle" et je trouve un problème pour comprendre comment Prolog convertit automatiquement une grammaire DCG dans un ensemble de règles Prolog.Quelques doutes sur la façon dont Prolog convertit automatiquement les grammaires DCG en un ensemble de règles
Par exemple, j'ai la grammaire DCG suivante:
move --> step.
move --> step, move.
step --> [up].
step --> [down].
Où:
moove est une liste de mooves possibile et étape est un mouvement qui pourrait être jusqu'à ou bas
Donc, il dit qu'une liste de coups peut être un seul mouvement (une étape) ou une liste une liste composée de plusieurs mouvements qui peuvent être considérés comme un seul mouvement (un pas) suivi d'une liste de coups (un coup).
Donc, cette grammaire peut générer phrase comme la liste suivante: [haut, bas, bas, haut, bas] ou comme: [up]
Ceci est assez simple
Puis il montrer comment Prolog automatiquement convertit la grammaire DCG précédente en un ensemble de règles standard Prolog (je l'ai renommé comme Move2 et step2 seulement parce que je l'ai mis ce code dans le même fichier de la grammaire DCG précédente):
/* move2 it is TRUE if the difference from the lists List and Rest is an
acceptable move.
*/
/* BASE CASE: A moves list can be a single move (a step that can be "up" or "down")
It is TRUE that the difference from the lists List and Rest is an acceptable move
if it is TRUE that the head of the list is an acceptable move
*/
move2(List, Rest) :- step2(List, Rest).
/* GENERAL CASE: A moves list can be a single move followed by a list of moves.
The difference of List1 and Rest is a valid move if it is TRUE that:
the difference between List1 and List 2 is a step
the difference between List2 and Rest is a move
*/
move2(List1, Rest) :- step2(List1, List2),
move2(List2, Rest).
/* step predicate extract a single step ("up" or "down") from a list
*/
step2([up|Rest], Rest).
step2([down|Rest], Rest).
J'ai essayé d'interpréter la signification de ces règles comme je l'ai écrit dans le commenter mais je ne suis pas si sûr de mon interpretaion ...
Pouvez-vous me donner quelques conseils pour bien le comprendre?
Tnx
Andrea
Votre 'move // 0' n'est pas équivalent à ce que OP a affiché, car il accepte aussi la liste vide, mais pas la définition d'OP. Aussi 'one_or_more // 2' devrait être appelé' zero_or_more // 2' pour refléter cela. – mat
mmm J'ai un doute concernant cette ligne de code: Rule = .. [R, V] Qu'est-ce que = ..? – AndreaNobili
C'est l'opérateur "univ", et il construit des termes. Essayez-le. –