RPAREN EQALOP和SML / ML中的未绑定变量和构造函数错误

说我有2个CNF逻辑短语a,b,我的发布函数应该返回a | b(a OR b)的CNF形式。 替换我所获得的规则是:
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函数之后,构造函数错误出现了distrib函数。 为什么我会收到这些错误?我不确定但也许我应该使用let而不是local,但是我怎样才能将它转换为let结构? 谢谢。     
已邀请:
distrib1
的最后一个案例中,你总共有3个开括号,但是4个结束:
| distrib1 (Or(And(prop1, prop2), prop3) ) ) =
这就是为什么你得到关于RPAREN的语法错误。 您在
distrib
中收到错误,因为由于语法错误而未定义
distrib1
,因此它是一个未知变量。修复
distrib1
中的语法错误也可以解决这个问题。     

要回复问题请先登录注册