首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何将运算符优先添加到FOL的lark语法中?

如何将运算符优先添加到FOL的lark语法中?
EN

Stack Overflow用户
提问于 2022-11-20 10:32:07
回答 1查看 105关注 0票数 0

如何修改这个语法,使其与更远的圆括号相匹配?

代码语言:javascript
运行
复制
?wff: compound_wff
?compound_wff: biconditional_wff
?biconditional_wff: conditional_wff (SPACE? BICONDITIONAL_SYMBOL SPACE? biconditional_wff)*
?conditional_wff: disjunctive_wff (SPACE? CONDITIONAL_SYMBOL SPACE? conditional_wff)*
?disjunctive_wff: conjunctive_wff (SPACE? DISJUNCTION_SYMBOL SPACE? disjunctive_wff)*
?conjunctive_wff: negated_wff (SPACE? CONJUNCTION_SYMBOL SPACE? conjunctive_wff)*
?negated_wff: (NEGATION_SYMBOL SPACE)* atomic_wff
?atomic_wff: predicate
           | term EQUAL_TO term
           | quantified_wff* LEFT_PARENTHESIS SPACE? wff SPACE? RIGHT_PARENTHESIS
?term: function
    | NAME
    | VARIABLE
?predicate: PREDICATE_NAME [LEFT_PARENTHESIS term (COMMA term)* RIGHT_PARENTHESIS]
?function: FUNCTION_NAME LEFT_PARENTHESIS term (COMMA SPACE? term)* RIGHT_PARENTHESIS
?quantified_wff: curly_quantifiers | quantifiers
?curly_quantifiers: quantifier_symbol LEFT_CURLY_BRACE VARIABLE (COMMA SPACE? VARIABLE)* RIGHT_CURLY_BRACE SPACE?
?quantifiers: quantifier_symbol SPACE? VARIABLE (COMMA SPACE? VARIABLE)* SPACE?

SPACE: /\s+/
COMMA: ","
EQUAL_TO: "="
LEFT_PARENTHESIS: "("
RIGHT_PARENTHESIS: ")"
LEFT_CURLY_BRACE: "{"
RIGHT_CURLY_BRACE: "}"
quantifier_symbol: UNIVERSAL_QUANTIFIER_SYMBOL | EXISTENTIAL_QUANTIFIER_SYMBOL
UNIVERSAL_QUANTIFIER_SYMBOL: "\\forall" | "∀"
EXISTENTIAL_QUANTIFIER_SYMBOL: "\\exists" | "∃"
NAME: /[a-t]/ | /[a-t]_[1-9]\d*/
VARIABLE: /[u-z]/ | /[u-z]_[1-9]\d*/
PREDICATE_NAME: /[A-HJ-Z]/ | /[A-HJ-Z]_[1-9]\d*/
FUNCTION_NAME: /[a-z]/ | /[a-z]_[1-9]\d*/
NEGATION_SYMBOL: "\\neg" | "\\lnot" | "¬"
CONJUNCTION_SYMBOL: "\\wedge" | "\\land" | "∧"
DISJUNCTION_SYMBOL: "\\vee" | "\\lor" | "∨"
CONDITIONAL_SYMBOL: "\\rightarrow" | "\\Rightarrow" | "\\Longrightarrow" | "\\implies" | "→" | "⇒"
BICONDITIONAL_SYMBOL: "\\leftrightarrow" | "\\iff" | "↔" | "⇔"

我正试图用我的语法来解析这一点:

LaTeX中的内容是:

代码语言:javascript
运行
复制
\exists{x} \forall{y} (P(f(x, y)) \vee \forall{z}(V(z) \iff \neg R(a) \wedge B(a)))

我遵循计算器实例并修改了我的原始语法以添加操作符优先级,这导致了这一点。但它不再接受输入字符串。

我得到了一个错误:

代码语言:javascript
运行
复制
lark.exceptions.UnexpectedCharacters: No terminal matches '\' in the current parser context, at line 1 col 35

\exists{x} \forall{y} (P(f(x, y)) \vee \forall{z}(V(z) \iff \neg R(a) \wed
                                  ^
Expected one of: 
    * RIGHT_PARENTHESIS

理想情况下,我希望在可能的情况下强制使用括号,除非是在没有括号的否定atomic_wff前面。这是为了确保即使在显式歧义设置下也只生成一个解析树。我如何解决这个问题?

编辑1

我想澄清的是,对于相同的运算符,运算符的优先级应该是正确的关联。所以P(a) ∧ Q(a) ∧ R(a)将解析为P(a) ∧ (Q(a) ∧ R(a))

编辑2

我已经使云雀语法更容易调试使用适当的终端。它现在解析长乳胶方程,但对于更简单的输入,比如产生两个解析树的P(a) ∧ Q(a) ∧ R(a),仍然模棱两可。我还是不知道我做错了什么。语法正在执行正确的递归,仍然无法生成单个解析树。

编辑3

除了给予否定更高的优先级外,我最近尝试的解决方案在每一种情况下都有效。有什么想法吗?

代码语言:javascript
运行
复制
?wff: compound_wff
compound_wff: biconditional_wff
biconditional_wff: conditional_wff (SPACE? BICONDITIONAL_SYMBOL SPACE? conditional_wff)*
conditional_wff: disjunctive_wff (SPACE? CONDITIONAL_SYMBOL SPACE? disjunctive_wff)*
disjunctive_wff: conjunctive_wff (SPACE? DISJUNCTION_SYMBOL SPACE? conjunctive_wff)*
conjunctive_wff: negated_wff (SPACE? CONJUNCTION_SYMBOL SPACE? negated_wff)*
negated_wff: (NEGATION_SYMBOL SPACE?)* atomic_wff
atomic_wff: predicate
          | term EQUAL_TO term
          | quantified_wff* LEFT_PARENTHESIS SPACE? wff SPACE? RIGHT_PARENTHESIS
term: function
    | NAME
    | VARIABLE
predicate: PREDICATE_NAME [LEFT_PARENTHESIS term (COMMA term)* RIGHT_PARENTHESIS]
function: FUNCTION_NAME LEFT_PARENTHESIS term (COMMA term)* RIGHT_PARENTHESIS
quantified_wff: curly_quantifiers | quantifiers
curly_quantifiers: quantifier_symbol LEFT_CURLY_BRACE VARIABLE (COMMA SPACE? VARIABLE)* RIGHT_CURLY_BRACE SPACE?
quantifiers: quantifier_symbol SPACE? VARIABLE (COMMA SPACE? VARIABLE)* SPACE?

SPACE: /\s+/
COMMA: /,\s*/
EQUAL_TO: /\s*=\s*/
LEFT_PARENTHESIS: "("
RIGHT_PARENTHESIS: ")"
LEFT_CURLY_BRACE: "{"
RIGHT_CURLY_BRACE: "}"
quantifier_symbol: UNIVERSAL_QUANTIFIER_SYMBOL | EXISTENTIAL_QUANTIFIER_SYMBOL
UNIVERSAL_QUANTIFIER_SYMBOL: "\\forall" | "∀"
EXISTENTIAL_QUANTIFIER_SYMBOL: "\\exists" | "∃"
NAME: /[a-t]/ | /[a-t]_[1-9]\d*/
VARIABLE: /[u-z]/ | /[u-z]_[1-9]\d*/
PREDICATE_NAME: /[A-HJ-Z]/ | /[A-HJ-Z]_[1-9]\d*/
FUNCTION_NAME: /[a-z]/ | /[a-z]_[1-9]\d*/
NEGATION_SYMBOL: "\\neg" | "\\lnot" | "¬"
CONJUNCTION_SYMBOL: "\\wedge" | "\\land" | "∧"
DISJUNCTION_SYMBOL: "\\vee" | "\\lor" | "∨"
CONDITIONAL_SYMBOL: "\\rightarrow" | "\\Rightarrow" | "\\Longrightarrow" | "\\implies" | "→" | "⇒"
BICONDITIONAL_SYMBOL: "\\leftrightarrow" | "\\iff" | "↔" | "⇔"

%ignore SPACE
%ignore COMMA
%ignore LEFT_CURLY_BRACE
%ignore RIGHT_CURLY_BRACE

因此,它无法为¬P(a) ∧ Q(b)生成一个解析树。

EN

回答 1

Stack Overflow用户

发布于 2022-11-20 15:49:38

这个语法有几个问题。

1.空格处理错误

在级联优先规则中,每条规则都要求在最左边的符号后面附加一个SPACE,即使重复为null。因此,在级联中,这些SPACE加起来是因为每个级联级别都添加了自己的SPACE。(这是不可满足的,因为您的SPACE令牌匹配任意数量的连续空格。)

因此,与其:

代码语言:javascript
运行
复制
?biconditional: conditional SPACE (biconditional_symbol SPACE conditional)*
?conditional: disjunction SPACE (conditional_symbol SPACE disjunction)*
?disjunction: conjunction SPACE (disjunction_symbol SPACE conjunction)*
?conjunction: negation SPACE (conjunction_symbol SPACE negation)*

您需要将SPACE移动到重复组中:

代码语言:javascript
运行
复制
?biconditional: conditional (SPACE biconditional_symbol SPACE conditional)*
?conditional: disjunction (SPACE conditional_symbol SPACE disjunction)*
?disjunction: conjunction (SPACE disjunction_symbol SPACE conjunction)*
?conjunction: negation (SPACE conjunction_symbol SPACE negation)*

(我对前两条规则有一些疑问。与析取和连接不同的是,蕴涵不是关联的,因此包含两个蕴涵运算符P \implies Q \implies R的公式需要用括号或优先规则来消除歧义。\iff是联想的,但我认为P \iff Q \iff R也有点可疑。就我个人而言,在这两个规则中,我都会将重复操作符更改为可选操作符。)

但是,坦率地说,我认为您最好忽略空白,就像您声称基于此语法的计算器示例中的那样,删除所有SPACE标记并添加:

代码语言:javascript
运行
复制
%import common.WS
%ignore WS

(如果您希望语法将换行符视为有意义的,则使用WS_INLINE。)

2.语法要求在不需要括号的地方使用括号。

(等待执行部分澄清)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74507340

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档