Functional programming 在CafeOBJ中应用关联性

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 * (

我需要(作为更大证明的一部分)证明a*(b*c)等于(a*b)*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  .