Functional programming 在CafeOBJ中应用关联性
我需要(作为更大证明的一部分)证明a*(b*c)等于(a*b)*c,这是真的,因为*被声明为关联的。 我可以将一个术语与另一个术语进行匹配,但这不是我所需要的,因为我需要在表格中写一个证明分数Functional programming 在CafeOBJ中应用关联性,functional-programming,Functional Programming,我需要(作为更大证明的一部分)证明a*(b*c)等于(a*b)*c,这是真的,因为*被声明为关联的。 我可以将一个术语与另一个术语进行匹配,但这不是我所需要的,因为我需要在表格中写一个证明分数 start ... close 所以我需要用apply之类的 我试图将关联性标记为一条公理: eq [assoc] : x:Elt * (y:Elt * z:Elt) = (x * y) * z . 但我也不能应用它,因为我不能替换多个参数 %MONOID> show term (c * (
start
...
close
所以我需要用apply之类的
我试图将关联性标记为一条公理:
eq [assoc] : x:Elt * (y:Elt * z:Elt) = (x * y) * z .
但我也不能应用它,因为我不能替换多个参数
%MONOID> show term
(c * (a * b)):Elt
%MONOID> apply -.assoc with x = a y = b z = c at term .
[Error] no successful parse
[Error]:
或者可能是因为此规则被标记为无效(应用其他规则时报告的内容):
如何应用关联性以及如何应用具有多个参数的方程式(在文档中找不到)?据我所知,用户无法直接应用已定义为操作属性的关联性。系统似乎会自动应用关联性。作为证明中使用关联性的一个例子,请考虑下面的代码>组< /代码>模块。
组
模块中的公理用于群论规范的左侧部分。关联性被指定为+
的操作签名上的一个属性。假设我们想要证明正确的逆方程成立
mod* GROUP {
[ G ]
op 0 : -> G .
op _+_ : G G -> G { assoc }
op -_ : G -> G
var X : G
eq[left-identity] : 0 + X = X .
eq[left-inverse] : (- X) + X = 0 .
}
从组
我们可以证明,对于所有a
方程a+(-a)=0
成立(右逆)。方程应用于项,如果项与方程匹配,则替换为方程的另一侧
set print mode fancy on
open GROUP .
op a : -> G .
start a + ( - a ) .
apply -.left-identity at (1) .
apply -.left-inverse with X = - a at (1 1) .
apply red at [2 .. 3] . -- Associativity used: see proof output and show module
apply reduce at term .
--> Proof Output
result 0 + a + - a : G
result - (- a) + - a + a + - a : G
result - (- a) + 0 + - a : G
result 0 : G
show
命令显示模块的详细信息
show module
仅考虑公理,show
命令的输出将显示验证分数的当前公理
eq [left-identity]: 0 + X = X .
eq [left-identity_ext_A-m]: A2 + 0 + X + A1 = A2 + X + A1 .
eq [left-identity_ext_A-r]: 0 + X + A1 = X + A1 .
eq [left-identity_ext_A-l]: A1 + 0 + X = A1 + X .
eq [left-inverse]: - X + X = 0 .
我们可以看到,系统已经生成了一组关联公理
涉及身份
结论
apply
命令将重写规则应用于术语。内置的{asscoc}
属性不能直接应用于术语,而是由系统应用关联性。如果将关联性定义为一个等式,用户可以直接应用它,但证明通常较长
如果在变量赋值之间添加逗号,则将解析用户编写的关联性方程的应用程序:
mod* ASSOC{
[Elt]
op _*_ : Elt Elt -> Elt
eq [assoc] : x:Elt * (y:Elt * z:Elt) = (x * y) * z .
}
该方程可直接应用于两个方向。首先将[assoc]
等式的左侧应用于术语
open ASSOC .
ops a b c : -> Elt .
start c * (a * b) .
apply .assoc at term .
close
接下来,将等式的右侧应用于该项
open ASSOC .
ops a b c : -> Elt .
start (a * b) * c .
apply -.assoc with x = a, y = b, z = c at term .
据我所知,用户无法直接应用已定义为操作属性的关联性。系统似乎会自动应用关联性。作为证明中使用关联性的一个例子,请考虑下面的代码>组< /代码>模块。
组
模块中的公理用于群论规范的左侧部分。关联性被指定为+
的操作签名上的一个属性。假设我们想要证明正确的逆方程成立
mod* GROUP {
[ G ]
op 0 : -> G .
op _+_ : G G -> G { assoc }
op -_ : G -> G
var X : G
eq[left-identity] : 0 + X = X .
eq[left-inverse] : (- X) + X = 0 .
}
从组
我们可以证明,对于所有a
方程a+(-a)=0
成立(右逆)。方程应用于项,如果项与方程匹配,则替换为方程的另一侧
set print mode fancy on
open GROUP .
op a : -> G .
start a + ( - a ) .
apply -.left-identity at (1) .
apply -.left-inverse with X = - a at (1 1) .
apply red at [2 .. 3] . -- Associativity used: see proof output and show module
apply reduce at term .
--> Proof Output
result 0 + a + - a : G
result - (- a) + - a + a + - a : G
result - (- a) + 0 + - a : G
result 0 : G
show
命令显示模块的详细信息
show module
仅考虑公理,show
命令的输出将显示验证分数的当前公理
eq [left-identity]: 0 + X = X .
eq [left-identity_ext_A-m]: A2 + 0 + X + A1 = A2 + X + A1 .
eq [left-identity_ext_A-r]: 0 + X + A1 = X + A1 .
eq [left-identity_ext_A-l]: A1 + 0 + X = A1 + X .
eq [left-inverse]: - X + X = 0 .
我们可以看到,系统已经生成了一组关联公理
涉及身份
结论
apply
命令将重写规则应用于术语。内置的{asscoc}
属性不能直接应用于术语,而是由系统应用关联性。如果将关联性定义为一个等式,用户可以直接应用它,但证明通常较长
如果在变量赋值之间添加逗号,则将解析用户编写的关联性方程的应用程序:
mod* ASSOC{
[Elt]
op _*_ : Elt Elt -> Elt
eq [assoc] : x:Elt * (y:Elt * z:Elt) = (x * y) * z .
}
该方程可直接应用于两个方向。首先将[assoc]
等式的左侧应用于术语
open ASSOC .
ops a b c : -> Elt .
start c * (a * b) .
apply .assoc at term .
close
接下来,将等式的右侧应用于该项
open ASSOC .
ops a b c : -> Elt .
start (a * b) * c .
apply -.assoc with x = a, y = b, z = c at term .