根據 AIMA(Russell & Norvig,2010),這是 FOL 與平等的 BNF 語法:

如何將其轉換為百靈語法?具體來說,我如何使用 lark 語法表示 n 元謂詞?
uj5u.com熱心網友回復:
我將把這個問題看作是詢問如何指定將識別符號應用到帶括號、逗號分隔的術語串列的語法。
在句法方面,這與 JSON 串列語法非常相似,值得查看Lark 檔案站點中的第一個示例語法(針對 JSON) 。FOL 語法中的函式和謂詞與 JSON 串列不同:它們使用圓括號 ( ()) 而不是方括號 ( []) 并且它們需要額外指定函式或謂詞的名稱,但 JSON 語法顯示了如何撰寫逗號分隔的事物串列,我們可以輕松地應用完全相同的語法語法:
AtomicSentence
: Predicate ['(' Term (',' Term)* ')']
| Term '=' Term
Term: Function '(' Term (',' Term)* ')'
| Constant
| Variable
(我省略了所提供語法的其余部分,因為它與有關謂詞的問題無關。)
在該語法句法中,括號用于分組,*是表示 Kleene 星號的后綴運算子;也就是說,“運算元的任何重復次數,包括零次”。方括號 ( []) 用于括起一個可選的句法序列。
那不是 BNF,因為 BNF 沒有語法運算子,例如可選性或Kleene Star。這是通常稱為“擴展 BNF”(EBNF) 的示例,它有大量的變體,語法略有不同。但它可以機械脫糖成BNF;上面的一個 BNF 等價物是:
AtomicSentence
: Predicate '(' TermList ')'
| Predicate
| Term '=' Term
Term: Function '(' TermList ')'
| Constant
| Variable
TermList
: Term
| TermList ',' Term
該語法沒有提供一種方法來指定每個函式和謂詞的元數(即引數的數量),因此會生成無效的句子。抽象 FOL 語法沒有明顯的方式來定義新的謂詞或函式,大概是因為函式和謂詞不是一階物件。所以每個函式、謂詞和常量都必須以某種語法外的方式單獨定義。因此,該文法可能被認為是一類更具體的文法的簡寫形式,每個文法都有一組相關聯的已定義符號。這些定義大概指定了每個符號的元數,以及指示哪些是謂詞,哪些是函式。
為了使具體語法將其自身限制為以正確的元數(即具有正確數量的引數)撰寫的謂詞和函式,需要根據模型對其進行修改(對于謂詞和函式的每個特定集合)像這樣:
AtomicSentence
: Predicate/0
| Predicate/1 '(' TermList/1 ')'
| Predicate/2 '(' TermList/2 ')'
| Predicate/3 '(' TermList/3 ')'
| Predicate/4 '(' TermList/4 ')'
...
| Term '=' Term
Term: Constant
| Function/1 '(' TermList/1 ')'
| Function/2 '(' TermList/2 ')'
| Function/3 '(' TermList/3 ')'
| Function/4 '(' TermList/4 ')'
...
| Variable
TermList/1 : Term
TermList/2 : TermList/1 ',' Term
TermList/3 : TermList/2 ',' Term
TermList/4 : TermList/3 ',' Term
...
Predicate/0 : "True" | "False"
Predicate/2 : "After" | "Loves"
...
Function/1 : "Mother" | "LeftLeg"
Function/2 : "Sum" | "Product"
...
(/n后綴是個別名稱的一部分;它們的語意意義在語法之外。我從 Prolog 中采用了特定的分類約定;Erlang 和一些 ML 派生詞也使用了它。)省略號表示其他具體定義,我沒有這樣做碰巧寫出來;它們不應被視為任意長度的串列。語法實際定義的元數的數量將限于特定函式和謂詞實際使用的元數,具體語法為其定義。因此,根據該模型生成的每個具體語法都將具有有限數量的產品。
請注意,除非有預先指定的最大數量,否則背景關系無關文法無法準確地表示一種語言,在這種語言中,函式是用特定的數量定義的,而在其他地方僅使用完全相同的數量。這種形式的語法一致性(與使用符號的強制宣告一樣)需要背景關系相關的語法形式主義。
這個答案故意不討論運算子優先級(對于 ComplexSentence 中定義的運算子),因為它不是原始問題的一部分。沒有那個規范,語法是不明確的,但肯定有一個運算子系結優先級層次結構,大概是在圍繞 FOL 語法的敘述中定義的。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/533372.html
