【问题标题】:RPAREN EQALOP and unbound variable and constructor errors in SML/MLSML/ML 中的 RPAREN EQALOP 和未绑定的变量和构造函数错误
【发布时间】:2025-12-02 15:00:01
【问题描述】:

说我有 2 个 CNF 逻辑短语 a,b,我的 distrib 函数应该返回 a|b 的 CNF 形式(a OR b)。

替换我的规则是:

1) Replace p|(q&r) by (p|q)&(p|r) 
2) Replace (q&r)|p by (q|p)&(r|p) 

这样定义的道具:

datatype prop = Atom of string | Not of prop | And of prop*prop | Or of prop*prop;

功能:

local
fun doOr(prop1,prop2) = (Or(prop1,prop2))

fun distrib1 (Or(Atom(sName1),Atom(sName2) ) ) = Or(Atom(sName1), Atom(sName2) )
    |distrib1 (Or(Not(Atom(sName1) ),Atom(sName2) ) ) = Or(Not(Atom(sName1) ), Atom(sName2) )
    | distrib1 (Or(Atom(sName1),Not(Atom(sName2) ) ) ) = Or(Atom(sName1), Not(Atom(sName2) ) )
    | distrib1 (Or(Not(Atom(sName1)),Not(Atom(sName2) ) ) ) = Or(Not(Atom(sName1)), Not(Atom(sName2) ) )
    | distrib1 (Or(prop1,And(prop2,prop3) ) ) = And( distrib1(Or(prop1,prop2) ), distrib1(Or(prop1,prop3) ) ) 
    | distrib1 (Or(And(prop1, prop2), prop3) ) ) = And( distrib1(Or(prop1,prop3) ), distrib1(Or(prop2,prop3) ) ) 

in
fun distrib (prop1,prop2) = distrib1(doOr(prop1,prop2) );
end;

好吧,我不知道函数本身是否正确,尽管我刚刚浏览了所有基本选项和替换规则,但是现在当 EQALOP 出现在 distrib1 函数之后并且出现构造函数错误时,我得到了上述错误分配函数。

为什么会出现这些错误?我不确定,但也许我应该使用 let 而不是本地的,但是如何将其转换为 let 结构?

谢谢。

【问题讨论】:

    标签: sml ml


    【解决方案1】:

    distrib1 的最后一种情况下,您总共有 3 个左括号,但有 4 个右括号:

    | distrib1 (Or(And(prop1, prop2), prop3) ) ) =
    

    这就是您收到有关 RPAREN 的语法错误的原因。

    distrib 中出现错误,因为 distrib1 由于语法错误而未定义,因此它是一个未知变量。修复 distrib1 中的语法错误也将解决此问题。

    【讨论】:

      最近更新 更多