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

SML/ML中的RPAREN EQALOP和未绑定变量及构造函数错误,sml,ml,Sml,Ml,说我有两个CNF逻辑短语a,b,我的distrib函数应该返回a | b(a或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

说我有两个CNF逻辑短语a,b,我的distrib函数应该返回a | b(a或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结构


谢谢。

在发行版1的最后一个案例中,您总共有3个左括号,但有4个右括号:

| distrib1 (Or(And(prop1, prop2), prop3) ) ) =
这就是为什么会出现关于RPAREN的语法错误

您在
distrib
中遇到错误,因为由于语法错误,
distrib1
尚未定义,因此它是一个未知变量。修复
distrib1
中的语法错误也将修复此问题