2016-03-26 5 views
1

Ich versuche zu lernen, wie Produktionsregeln in Prolog schreiben. Das ist was ich habe.Prolog Grammatik Produktionen

paragraph --> sentence, paragraph ; []. 
sentence --> proper_noun, [ ], verb, [ ], preposition, [ ], article, [ ], noun, period. 
proper_noun --> [Jimmy] ; [Yancy] ; [Clementine] ; [Astrid]. 
verb --> [runs] ; [walks] ; [skips] ; [flies]. 
preposition --> [to] ; [at] ; [around] ; [through]. 
article --> [the] ; [a]. 
noun --> [school] ; [house] ; [car] ; [spaceship]. 
period -->[.]. 

Ich habe versucht, es zu nennen

phrase(sentence, [Jimmy," ",walks," ",to," ",the," ",school], []), atom_codes(Output,[Jimmy," ",walks," ",to," ",the," ",school]). 

mit Es falsch als Ausgabe zurückgegeben. Bitte hilf mir zu verstehen, wo ich falsch gelaufen bin und wie ich bessere Grammatiken schreiben kann.

Antwort

1

Verwenden Sie 'Jimmy' usw. (d. H. Setzen Sie alle Atome beginnend mit Großbuchstaben in Anführungszeichen). Ansonsten werden sie als logische Variablen interpretiert. Sie erhalten viele "Singleton-Variablen" Warnungen.

Sie verpasst haben auch einige Klammern, und machte einige Fehler:

paragraph --> sentence, (paragraph ; []). 
sentence --> proper_noun, verb, preposition, article, noun, period. 
proper_noun --> ['Jimmy'] ; ['Yancy'] ; ['Clementine'] ; ['Astrid']. 
verb --> [runs] ; [walks] ; [skips] ; [flies]. 
preposition --> [to] ; [at] ; [around] ; [through]. 
article --> [the] ; [a]. 
noun --> [school] ; [house] ; [car] ; [spaceship]. 
period -->[.]. 

Testing es:

30 ?- phrase(sentence, ['Jimmy', walks, to, the, school, .], []). 
true ; 
false. 
+0

Hey. Wenn es dir nichts ausmacht, frage ich, wie hilft die Klammer? Und in der Satzproduktion möchte ich auch Räume einbeziehen. Wie würde ich das tun? Und kann ich '|' Anstatt von ';' – InquisitiveCoder

+1

@ BryanD'silva: ja, Klammern erlauben schöne Abkürzungen, Inlining Alternativen. Überlegen Sie, wie elegant der richtige rekursive Absatz // 0 ist. Für die Handhabung von Räumen siehe Bibliothek (dcg/basics). Und du kannst | Anstatt von ; – CapelliC

+0

@CapelliC danke für den Einstieg. :) –