Dado que el alfabeto del lenguaje incluye algunos símbolos terminales que coinciden con símbolos del metalenguaje BNF (como «[» y «]» ), seguimos aquí el convenio de entrecomillar a todos los símbolos terminales.
<programa> ::= <clausula>{<clausula>}
<clausula> ::= <hecho>|<regla>|<consulta> <hecho> ::= <cabeza>"." <regla> ::= <cabeza> ":-"<cuerpo>"." <consulta> ::= <cuerpo>"." <cabeza> ::= <predicado> <cuerpo> ::= <literal>{","<literal>} <predicado> ::= <nombre>"("<termino>{","<termino>}")" <literal> ::= <predicado>| "not" <predicado> <funcion> ::= <nombre>"("<termino>{","<termino>}")" <termino> ::= <atomo>|<estructura> <atomo> ::= <cte_num>|<cte_simb>|<variable> <estructura> ::= <funcion>|<lista> <lista> ::= "[""]"|"["<atomo>{","<atomo>}"]"| ".""("<atomo>","<lista>")"| "["<atomo>{","<atomo>}"|"<lista>"]" <cte_num> ::= ["+"|"-"]<num> <num> ::= <entero>|<real> <entero> ::= <digito>{<digito>} <real> ::= <entero>"."<entero> <digito> ::= "0"|"1"|"2"|"3"|"4"|"5"|"6"|"7"|"8"|"9" <cte_simb> ::= <nombre>|""’<caracteres>""’ <nombre> ::= <min>|{<alfanum>} <variable> ::= <may>{<alfanum>}|"_"{<alfanum>} <alfanum> ::= "_"|<min>|<may>|<digito> <caracteres> ::= <alfanum>|","|";"|"$"|... <min> ::= "a"|"b"|"c"|....|"z" <may> ::= "A"|"B"|"C"|....|"Z" |
Hemos definido separadamente «<predicado>» y «<función>» porque, como ya sabemos, semánticamente son diferentes, pero como aquí estamos definiendo la sintaxis hubiera sido más correcto definirlas con una sola regla (y un nombre único), ya que sintácticamente son la misma categoría.