我正在制作一个编译器(用于一种新语言),它通过模式匹配支持 AC 统一。匹配算法已经有效,但是我在函数的逻辑和数学方面以及它的属性方面遇到了麻烦,这将以很好的方式定义语言的设计。我有几个关于函数属性的问题:
关联和交换属性仅适用于二元函数?
例如,如果我声明一个函数 max(a,b),这将是可交换的,因为 max(a,b) = max(b,a) 并且是关联的,因为 max(a,max(b,c)) = max(max (a,b),c),但我想不出任何具有两个以上满足该公理的参数的函数。例如,我可以定义 max(a,b,c) = max(a,max(b,c)) 这将是一个三元函数,但该语言将能够将它与符合它的二进制操作统一起来。
统一通过将诸如 max(a,max(b,c)) 之类的关联函数简化为可变和规范形式 max(a,b,c) 然后在此规范形式上执行模式匹配,所以所有(我认为) 具有超过 3 个参数的此属性的可能函数实际上是相同二元函数的复合
标识元素是否仅适用于二元函数?
解释:可以有一个可变函数 f(a,b,...)(超过 2 个参数),使得存在满足 f(a,b,c,e) = f(a,b,c) 的元素 e ) 对于没有直接二进制父级的函数(例如加法是二进制的,但编译器将加法管理为内部表示的可变函数)
诸如零之类的统一元素仅在语言中通过删除其对函数的 aparences 进行管理,例如 add(1,2,x,0) ,它表示表达式 1+2+x+0 减少为 1+2+x
这些问题对于在定义规则(例如 a+b = b+a)时自动识别函数的此属性的算法设计以及语言设计和将强加于函数声明的约束(可以是,如果这些问题中的任何一个为假,则不合逻辑