非二元函数的关联,可交换属性和标识元素

时间:2013-12-27 21:20:38

标签: language-agnostic pattern-matching logic associativity unification

我正在制作一个编译器(用于新语言),它通过模式匹配支持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,语言设计和将强加给函数声明的约束,如果对任何这些问题都是假的,那么可能是不合逻辑的

1 个答案:

答案 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等支持某种“匹配模”的系统,在引擎盖下使用这种一致性:它们将二元运算符与理论映射到内部数据结构,如列表,集合,通过压缩递归应用程序,排序和消除重复数据等来打包。