我正在制作一个编译器(用于新语言),它通过模式匹配支持AC统一。 匹配算法已经有效,但是我在函数的逻辑和数学方面遇到了问题,而且它的属性,将以很好的方式定义语言的设计。我有几个关于函数属性的问题:
关联和交换属性仅适用于二元函数?
例如,如果我声明一个函数max(a,b),这将是可交换的,因为max(a,b)= max(b,a)和associative,因为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个参数的属性的可行函数实际上是具有相同二元函数的复合函数
身份元素是否仅适用于二元函数?
Explanaition: 可以存在变化函数f(a,b,...)(多于2个参数),使得存在满足f(a,b,c,e)= f(a,b,c)的元素e没有立即二进制父级的函数(例如,加法是二进制的,但编译器将加法管理为内部表示的变量函数)
除了零以外的单位元素仅通过删除其对函数的依赖来管理语言,例如add(1,2,x,0)表示表达式1 + 2 + x + 0减少为1 + 2 + X
这个问题对于算法的设计是决定性的,这些算法在定义规则时自动识别函数上的这些属性,例如a + b = b + a,语言设计和将强加给函数声明的约束,如果对任何这些问题都是假的,那么可能是不合逻辑的
答案 0 :(得分:1)
查看AC和varyadic函数的一种方法是查看列表,包和集的cons
函数:
cons(a, cons(b, nil)) // depicts a binary tree, a list or a set?
cons
没有公理,那么它就是二叉树现在,各种各样的函数就像cons
的更好的符号:
set(1,2,3,4)
是cons
的“更好的符号”,即ACI。list(1,2,3,4,1,2,3,4)
代表A bag(1,1,2,2,3,3,4,4)
for AC ELAN,Maude,Tom,ASF + SDF等支持某种“匹配模”的系统,在引擎盖下使用这种一致性:它们将二元运算符与理论映射到内部数据结构,如列表,集合,通过压缩递归应用程序,排序和消除重复数据等来打包。