- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我与两个内图f
和g
有传递关系~
。假设 f
和 g
处处一致且 f a ~ f b ~ f c
那么有两种方式显示g a ~ g c
:通过给定的等式将每个 f
转换为 g
然后应用及物性,或者应用传递性然后沿着等式进行变换。得到的证明是否相同?显然是这样,
open import Relation.Binary.PropositionalEquality
postulate A : Set
postulate _~_ : A → A → Set
postulate _⟨~~⟩_ : ∀{a b c} → a ~ b → b ~ c → a ~ c
postulate f g : A → A
subst-dist : ∀{a b c}{ef : f a ~ f b}{psf : f b ~ f c} → (eq : ∀ {z} → f z ≡ g z)
→
subst₂ _~_ eq eq ef ⟨~~⟩ subst₂ _~_ eq eq psf
≡ subst₂ _~_ eq eq (ef ⟨~~⟩ psf)
subst-dist {a} {b} {c} {ef} {psf} eq rewrite eq {a} | eq {b} | eq {c} = refl
我最近刚刚了解了 rewrite
关键字,并认为它可能会有所帮助;显然确实如此。但是,老实说,我不明白这里发生了什么。我在其他时候也使用过rewrite
,并且可以理解。然而,所有这些 subst
都让我感到困惑。
我想知道
subst-dist
?也许图书馆里有类似的东西?rewrite
的这种特殊用法是怎么回事subst-dist
的替代证明(最重要)subst
的情况下获得g a ~ g c
?感谢任何帮助。
最佳答案
rewrite
只是一个加糖的 with
,它只是加糖的“顶级”模式匹配。参见Agda’s documentation .
what are some of the downsides of using heterogeneous equality, it doesn't seem like most people are fond of it. (also important)
这样就可以了
types-equal : ∀ {α} {A B : Set α} {x : A} {y : B} -> x ≅ y -> A ≡ B
types-equal refl = refl
这样也可以
A-is-Bool : {A : Set} {x : A} -> x ≅ true -> A ≡ Bool
A-is-Bool refl = refl
这是一个错误
fail : ∀ {n m} {i : Fin n} {j : Fin m} -> i ≅ j -> n ≡ m
fail refl = {!!}
-- n != m of type ℕ
-- when checking that the pattern refl has type i ≅ j
因为 Fin n ≡ Fin m
并不立即暗示 n ≡ m
(您可以通过启用 --injective-type-constructors
,但 makes Agda anti-classical )(Fin n ≡ Fin m -> n ≡ m
是 provable )。
最初,当 x
和 y
具有不可统一的类型时,Agda 允许在 x ≅ y
上进行模式匹配,但这允许编写奇怪的代码类似的事情(引用自 this 线程)
P : Set -> Set
P S = Σ S (\s → s ≅ true)
pbool : P Bool
pbool = true , refl
¬pfin : ¬ P (Fin 2)
¬pfin ( zero , () )
¬pfin ( suc zero , () )
¬pfin ( suc (suc ()) , () )
tada : ¬ (Bool ≡ Fin 2)
tada eq = ⊥-elim ( ¬pfin (subst (\ S → P S) eq pbool ) )
Saizan or maybe it's just ignoring the types and comparing the constructor names?
pigworker Saizan: that's exactly what I think is happening
Andread Abel:
- If I slighly modify the code, I can prove Bool unequal Bool2, where true2, false2 : Bool2 (see file ..22.agda)
- However, if I rename the constructors to true, false : Bool2, then suddenly I cannot prove that Bool is unequal to Bool2 anymore (see other file). So, at the moment Agda2 compares apples and oranges in certain situations. ;-)
因此,为了对 i ≅ j
进行模式匹配,其中 i : Fin n, j : Fin m
,您首先需要统一 n
与m
OK : ∀ {n m} {i : Fin n} {j : Fin m} -> n ≡ m -> i ≅ j -> ...
OK refl refl = ...
这是异质相等的主要缺点:您需要提供到处索引相等的证明。通常的 cong
和 subst
是非索引的,因此您还必须提供它们的索引版本(或者使用更烦人的 cong2
和 subst2
)。
“heteroindexed”(不知道它是否有合适的名字)相等就不存在这样的问题
data [_]_≅_ {ι α} {I : Set ι} {i} (A : I -> Set α) (x : A i) : ∀ {j} -> A j -> Set where
refl : [ A ] x ≅ x
例如
OK : ∀ {n m} {i : Fin n} {j : Fin m} -> [ Fin ] i ≅ j -> n ≡ m
OK refl = refl
更一般地说,每当您有 x : A i, y : A j, p : [ A ] x ≅ y
时,您就可以对 p
和 j
将与 i
统一,因此不需要额外携带 n ≡ m
的证明。
异质平等,正如 Agda 中所呈现的那样,也是 inconsistent with the univalence axiom .
编辑
x : A, y : B, x ≅ y
上的模式匹配等于 A ≡ B
上的模式匹配,然后更改每个 y
在 x
的上下文中。所以当你写
fail : ∀ {n m} {i : Fin n} {j : Fin m} -> i ≅ j -> n ≡ m
fail refl = {!!}
与此相同
fail' : ∀ {n m} {i : Fin n} {j : Fin m} -> Fin n ≡ Fin m -> i ≅ j -> n ≡ m
fail' refl refl = {!!}
但你不能在 Fin n ≡ Fin m
fail-coerce : ∀ {n m} -> Fin n ≡ Fin m -> Fin n -> Fin m
fail-coerce refl = {!!}
-- n != m of type ℕ
-- when checking that the pattern refl has type Fin n ≡ Fin m
就像你不能进行模式匹配
fail'' : ∀ {n m} -> Nat.pred n ≡ Nat.pred m -> n ≡ m
fail'' refl = {!!}
-- n != m of type ℕ
-- when checking that the pattern refl has type Nat.pred n ≡ Nat.pred m
一般情况
f-inj : ∀ {n m} -> f n ≡ f m -> ...
f-inj refl = ...
仅当f
明显单射时才有效。 IE。如果 f
是一系列构造函数(例如 suc (suc n) ≡ suc (suc m)
)或对其进行计算(例如 2 + n ≡ 2 +米)。类型构造函数(
Fin
是)不是单射的,因为这会使 Agda 反经典,因此除非启用 - -单射类型构造函数
。
指数统一
data [_]_≅_ {ι α} {I : Set ι} {i} (A : I -> Set α) (x : A i) : ∀ {j} -> A j -> Set where
refl : [ A ] x ≅ x
因为您没有尝试将 A i
与 A j
统一,而是显式地携带 [_]_≅_< 类型的索引
,这使得它们可以统一。当索引统一时,两种类型都变成相同的 A i
并且可以像命题相等一样进行。
编辑
异构平等的另一个问题是它不是完全异构的:在 x : A, y : B, x ≅ y
A
和 B
中code> 必须位于同一个宇宙中。 data
定义中对宇宙级别的处理最近发生了变化,现在我们可以定义完全异构的平等:
data _≅_ {α} {A : Set α} (x : A) : ∀ {β} {B : Set β} -> B -> Set where
refl : x ≅ x
但这行不通
levels-equal : ∀ {α β} -> Set α ≅ Set β -> α ≅ β
levels-equal refl = refl
-- Refuse to solve heterogeneous constraint Set α : Set (suc α) =?=
-- Set β : Set (suc β)
因为 Agda 认为 suc
不是单射的
suc-inj : {α β : Level} -> suc α ≅ suc β -> α ≅ β
suc-inj refl = refl
-- α != β of type Level
-- when checking that the pattern refl has type suc α ≅ suc β
如果我们假设它,那么我们就可以证明级别相等
:
hcong : ∀ {α β δ} {A : Set α} {B : Set β} {D : Set δ} {x : A} {y : B}
-> (f : ∀ {γ} {C : Set γ} -> C -> D) -> x ≅ y -> f x ≅ f y
hcong f refl = refl
levelOf : ∀ {α} {A : Set α} -> A -> Level
levelOf {α} _ = α
postulate
suc-inj : {α β : Level} -> suc α ≅ suc β -> α ≅ β
levels-equal : ∀ {α β} -> Set α ≅ Set β -> α ≅ β
levels-equal p = suc-inj (suc-inj (hcong levelOf p))
关于equality - `subst`的分布率,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34845986/
在 Sitecore 中,我尝试在线路管理器中创建分段列表。但是,当我选择条件时,我对“等于”、“不区分大小写等于”和“不不区分大小写等于”感到非常困惑? 谁能给我解释一下其中的区别吗? 谢谢! 最佳
基本上,我想知道在这种情况下我是否应该听 ReSharper... 您认为与字符进行比较应该使用 Char.Equals(char),因为它可以避免拆箱,但 Resharper 建议使用 Object
假设 equals() 是可传递的;我知道如果 x 和 y 有平等的双边协议(protocol),那么其中一个,比如 y,不会单独与第三类 z 签订协议(protocol)。 但是如果我们遇到 x.e
我是 Haskell 新手,正在阅读: http://www.seas.upenn.edu/~cis194/spring13/lectures/01-intro.html 它指出“在 Haskell
阅读有关 C# 中的字符串比较的文章,我发现有很多方法可以比较 2 个字符串以查看它们是否相等。 我习惯了来自 C++ 的 == 但我了解到,如果你将一个对象与一个字符串进行比较,那么 == 默认为引
我有一个 Point 类和一个 MinesweeperSquare 类,后者是前者的子类。如果我重写后者的 equals 方法,就像这样: if (!(obj instanceof Minesweep
我想知道,如果我们有 if-else 条件,那么检查什么在计算上更有效:使用等于运算符或不等于给运营商?有什么区别吗? 例如,以下哪一项在计算上是高效的,下面的两种情况都会做同样的事情,但哪一种更好(
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
某些框架(例如 guice )在某些情况下需要创建 注解接口(interface)的实现类 . 好像有一个区别 Annotation.equals(Object) 之间和 Object.equals(
从三个变量开始,都是System.DateTime。 a: 10/2/2009 2:30:00 PM b: 10/2/2009 2:30:00 PM c: 10/2/2009 2:30:00 PM 相
我实现了一个 PagedModel 类来包装 IEnumerable,为我的 MVC 应用程序中的网格提供分页数据。我使用 Resharper 自动生成的 Equality 代码告诉它检查数据、总行数
正如问题所述。理想情况下,答案应该是 false,因为它将使用 Object#equal,这只是引用比较。 String cat = new String("cat"); String
我想知道以下两个选项中哪一个在速度方面最有效。它们之间可能只有很小的区别(或者根本没有区别?)但是由于我每天使用该代码片段 30 次,所以我想知道这里的“最佳实践”是什么 :) 选项 1: if (s
我有一个以年龄和姓名作为实例成员的基类,以及带有奖金的派生类。我在派生类中重写 equals 。我知道 Java 中只有一个基类时 equals 是如何工作的。但我无法理解继承的情况下它是如何工作的。
==之间的区别和 ===是前者仅检查值(1 == "1" 将返回 true),后者是否检查值并另外检查类型(1 === "1" 将返回 false,因为 number 不是字符串)。 比较对象意味着比
这是一个理论问题。我有一个我自己设计的对象,其中包含一堆变量、方法等。我覆盖了 toString 方法,主要用于记录目的,以返回变量的值。在我看来,比较此对象实例的最简单和最直接的方法是比较从 toS
我是 Java 编程的初学者。目前我正在 this 阅读关于继承和 equals 方法的内容。页。到目前为止,我理解解释: Compare the classes of this and otherO
当 IntelliJ 建议我更正以下内容时,我正在编写代码: objectOne.equals(objectTwo); 告诉我方法调用 equals 可能会产生旧的 java.lang.NullPoi
我尝试创建一个允许在 Java 中使用类似元组的结构的元组类。元组中两个元素的一般类型分别是 X 和 Y。我尝试为此类覆盖正确的等号。 事情是,我知道 Object.equals 属于默认值,它仍然根
可以用和比较字符串类似的方式来比较序列。如果两个序列的长度相同,并且对应元素都相等,equal() 算法会返回 true。有 4 个版本的 equal() 算法,其中两个用 == 运算符来比较元素,另
我是一名优秀的程序员,十分优秀!