Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types 我们如何在Agda中定义一种对称二进制操作?_Types_Agda - Fatal编程技术网

Types 我们如何在Agda中定义一种对称二进制操作?

Types 我们如何在Agda中定义一种对称二进制操作?,types,agda,Types,Agda,我不明白我们如何在Agda中定义一种“对称二元关系”。想象一下我有这样的东西: {- 首先,我们定义一个多态idenity -} 数据{A:Set}(A:A):A→ 设定地点 idenity的定义:a==a 中缀30_==_ {- 接下来我们定义有限集Ω={A,B,C} -} 数据:设置位置 A、B、C:Ω {- 我们添加了一个类型“二进制操作” -} 二进制运算=Ω→ Ω → Ω {- 我可以定义一个二进制操作的例子。 -} _⊙_ : 二进制运算 x⊙ x'=A 中缀40_⊙_ {- 然后我

我不明白我们如何在Agda中定义一种“对称二元关系”。想象一下我有这样的东西:

{-
首先,我们定义一个多态idenity
-}
数据{A:Set}(A:A):A→ 设定地点
idenity的定义:a==a
中缀30_==_
{-
接下来我们定义有限集Ω={A,B,C}
-}
数据:设置位置
A、B、C:Ω
{-
我们添加了一个类型“二进制操作”
-}
二进制运算=Ω→ Ω → Ω
{-
我可以定义一个二进制操作的例子。
-}
_⊙_ : 二进制运算
x⊙ x'=A
中缀40_⊙_
{-
然后我可以证明这一点⊙ 对称的
-}
对称性证明:∀ xy→ x⊙ y==y⊙ x
对称性证明=λx y→ 同一性的定义
如何定义“对称二进制操作”类型? 有了这种类型,我们将能够定义⊙ 作为

_⊙_ : 对称二次运算
x⊙ y=A

并证明⊙ 不需要对称。

详细说明我的评论:即使有检查对称性的决策过程,也无法根据您的需要定义
symmetricbinaryooperation
,因为
symmetricbinaryooperation
必须对所定义的操作进行
对称性证明。也就是说,操作必须在自己的类型签名中提及自己,这显然是一个循环。(因此我关于类型类的观点也是毫无意义的)。

你不能只说,
_⊙_
是对称的,但实际上没有提供这一事实的证明。因此,无法定义
_⊙_作为<代码>_⊙_ : 对称二次运算;x⊙ y=A
,除非使用类型类。定义关系的通常方法是将操作与记录中的证明打包。您可以在标准库中找到示例。还可以查看教程。纸张是有指导意义的。@user3237465所以,在大多数情况下,记录比数据更好。这与Haskell的
newtype
s和
data
s之间的区别非常相似。Agda还制定了eta法规,用于记录和执行复杂的操作。如前所述,您很少不希望有eta,但现在链接中的示例已被弃用,我不知道还有其他示例。我的问题还与所谓的“子类型”有关,这在Agda中是不可能的(如果我的uderstood正确)。例如,Francesco使用了表示“有序列表”的类型Olist,但他也使用了恼人的协同功能“toList:∀ {lu}→ 奥利斯特l u→ 列表X”从列表转换为列表。Agda通过实例参数有一些子类型(例如,在
liftA
函数中,
Applicative
在作用域中,而
\uuu
需要
Functor
)。但你的意思可能是,Agda中确实没有介绍。谢谢。我还找到了@cody's来回答Steve先生的问题。Cody谈到“精化类型(它)捕获了契约的概念,也与公理语义或霍尔逻辑有关”。谢尔盖·柯尔吉佐夫(Sergey Kirgizov),元语言的证明方法导致了原力的黑暗面。