[Agda] Help at propositional equality proof that contains subst.
Apostolis Xekoukoulotakis
apostolis.xekoukoulotakis at gmail.com
Fri May 5 06:43:13 CEST 2017
I think to have solved the problem by first proving heterogeneous equality
and then abstracting function h.
I made a concrete example below. You can try filling the hole and see if
you can prove the statement without using heterogeneous equality.
```
module test where
open import Data.Nat
module _ where
open import Relation.Binary.PropositionalEquality
data A : ℕ → Set where
cz : A zero
ca : {n : ℕ} → A n → A (suc n)
h : {b : ℕ} → A b → A (b + zero)
h cz = cz
h (ca a) = ca (h a)
eq : (c : ℕ) → (c + zero) ≡ c
eq zero = refl
eq (suc c) = cong (λ x → suc x) (eq c)
f : {b : ℕ} → (a : A b) → subst A (eq b) (h a) ≡ a
f {zero} cz = refl
f {suc b} (ca n) = {!!} -- with (b + zero) | (eq b)
-- ... | g | r = ?
module _ where
open import Relation.Binary.HeterogeneousEquality
g : {b : ℕ} → (a : A b) → h a ≅ a
g cz = refl
g (ca {n} a) = cong₂ {B = A} {C = (λ x y → A (suc x))} (λ x y → ca {n =
x} y) (≡-to-≅ (eq n)) (g a)
module _ where
open import Relation.Binary.PropositionalEquality
open import Relation.Binary.HeterogeneousEquality using (_≅_ ; refl ;
≅-to-≡)
af : (b w : ℕ) (eq : w ≡ b) (a : A b) → (h : A b → A w) → (h a ≅ a)
→ subst A eq (h a) ≡ a
af b .b refl a h hteq = ≅-to-≡ hteq
fg : {b : ℕ} → (a : A b) → subst A (eq b) (h a) ≡ a
fg {b} a = af b (b + zero) (eq b) a h (g a)
```
On Thu, May 4, 2017 at 3:06 PM, Martin Escardo <m.escardo at cs.bham.ac.uk>
wrote:
>
>
> On 04/05/17 06:44, apostolis.xekoukoulotakis at gmail.com wrote:
>
>> This seems to be closer to what my code actually looks like:
>>
>> postulate
>> B : Set
>> A : B → Set
>> big_expression : (c : B) → {b : B} → (a : A b) → B
>> h : (c : B) → {b : B} → (a : A b) → A (big_expression c a)
>> eq : (c : B) → {b : B} → (a : A b) → (big_expression c a) ≡ c
>>
>> f : {b : B} → (a : A b) → subst A (eq b a) (h b a) ≡ a
>> f = {!!}
>>
>
> We have
>
> eq b a : big_expression b a = b
> h b a : A(big_expression b a)
>
> Consider the instantiations
>
> A b = Bool
> big_expression c {b} a = c
> h c {b} a = true
> eq b a = refl
>
> So the type subst A (eq b a) (h b a) ≡ a amounts to
>
> subst A refl true = a,
>
> that is,
> true = a.
>
> Hence we have
>
> f : {b : B} → (a : Bool) → true ≡ a
>
> which of course can't be proved.
>
> Hence, in the generality you have things above, you can't complete the
> definition of f.
>
> Of course it may well be that for your specific B, A, big_expression,
> h and eq, you can complete the definition of f.
>
> You will need to cook-up a more specific abstraction of your code
> for us to be able to help more here in this list.
>
> I hope this helps.
>
> Martin
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.chalmers.se/pipermail/agda/attachments/20170505/3758240c/attachment-0001.html>
More information about the Agda
mailing list