2012-01-31 7 views
2

Dans le tutoriel suivant: http://www.csupomona.edu/~jrfisher/www/prolog_tutorial/7_3.htmlprédicat Prolog appelant

Il y a la partie:

test_parser :- repeat, 
       write('?? '), 
       read_line(X), 
       (c(F,X,[]) | q(F,X,[]) ), 
       nl, write(X), nl, write(F), nl, fail. 

Maintenant, je suis extrêmement confus au sujet de la c (F, X, []) et q (F, X, []) part car il ne semble correspondre à rien de ce que j'ai vu, c ne prend qu'un paramètre de ce que je peux dire et ces paramètres ne semblent pas avoir de sens pour q. S'il vous plaît aidez-moi à comprendre ce qui se passe ici.

Répondre

2

c est défini avec -->, ce qui ajoute en fait deux arguments cachés à elle. Le premier d'entre eux est une liste à analyser par la règle de grammaire; la seconde est "ce qui reste" après l'analyse. c(F,X,[]) appelle c sur la liste X pour obtenir un résultat F, en supposant que [] reste, c'est-à-dire que l'analyseur doit consommer toute la liste X.

6

c // 1 et q // 1 sont des points d'entrée (aka haut de production de niveau) des clauses Definite grammaire définies ci-dessous, où vous trouverez

c(F) --> .... 
q(F) --> .... 

Ce style de 'appel' sur un point d'entrée DCG est déconseillée, est généralement préférable d'invoquer l'expression (grammaire, TextToAnalyze, TextAfterAnalysis), dans ce cas phrase((c(F) ; q(F)), "some text", "")...

l'opérateur --> est généralement rewritte n ajoutant 2 arguments, qui sont la cause de votre inquiétude.

EDIT

à savoir c(L) --> lead_in,arrange(L),end.

est réécrite à

c(L,X,Y) :- lead_in(X,X1),arrange(L,X1,X2),end(X2,Y).

+0

Cela ne m'a pas vraiment aidé à comprendre le point d'avoir q (F, X, []). Y a-t-il un autre moyen d'expliquer ce que vous essayez de dire? – csteifel

Questions connexes