[Agda] Bezonas helpon !
Serge Leblanc
33dbqnxpy7if at gmail.com
Mon Aug 21 08:07:34 CEST 2017
Thank you very much, Andreas, I understand more.
Now I have tried to proveproof₁. Surely, I miss because the proposition
P contains 'xs'. Does anyone have a suggestion? Intuitively, I need an
induction with 'm≤m⊔n'.
proof₁ : (xs : List⁺ ℕ) → All (_≥_ (max″ xs)) (toList xs)
proof₁ (h ∷ []) = {! []!}
proof₁ (h ∷ (x ∷ xs)) = {! (proof₁ (x ∷ xs))!}
Thank you for your help!
Koran dankon, Andreas, mi plibone komprenas.
Nun, mi provis plenumi la pruvon proof₁. Verŝajne, mi malsukcesas pro la
propozicio P enhavas 'xs'.
Ĉu iu havas sugeston ? Intuicie, mi bezonos indukton kun 'm≤m⊔n'.
proof₁ : (xs : List⁺ ℕ) → All (_≥_ (max″ xs)) (toList xs)
proof₁ (h ∷ []) = {! []!}
proof₁ (h ∷ (x ∷ xs)) = {! (proof₁ (x ∷ xs))!}
Antaŭan dankon pro via venonta helpo !
Sincere,
On 201i7-08-18 13:15, Andreas Abel wrote:
> Dear Serge,
>
> > foldr″ c (n ∷ (x ∷ xs)) = c x (foldr″ c (n ∷ xs))
>
> For the structural ord\ering (<), Agda sees that
>
> (n :: xs) < (n :: (x :: xs)) iff xs < (x :: xs)
>
> The latter holds since xs is a subterm of x :: xs.
>
> > foldl″ c (n ∷ (x ∷ xs)) = foldl″ c (c n x ∷ xs)
>
> This does not work since c n x is not a subterm of n or x.
>
> > foldr‴ c (n ∷ (x ∷ xs)) = c x (foldr‴ c (*id* n ∷ xs))
>
> Since Agda does not reduce call arguments during structural
> comparison, this fails, as
>
> id n is not the same as n
>
> (syntactically).
>
> > Andreas,unfortunately I really don't understand your explanation of the
> > /length/ of the list!
>
> My explanation was probably wrong.
>
> On 17.08.2017 12:18, Serge Leblanc wrote:
>> Sinceran dankon Andreas.
>>
>> I don't understand that the following function (foldr″) is well
>> accepted while foldl″ is not?
>> Mi ne komprenas kial la sekva funkcio (foldr″) trafas kvankam la
>> funkciofoldl″ maltrafas?
>>
>> foldr″ : ∀ {a} {A : Set a} → (A → A → A) → List⁺ A → A
>> foldr″ c (n ∷ []) = n
>> foldr″ c (n ∷ (x ∷ xs)) = c x (foldr″ c (n ∷ xs))
>>
>> foldl″ : ∀ {a} {A : Set a} → (A → A → A) → List⁺ A → A
>> foldl″ c (n ∷ []) = n
>> foldl″ c (n ∷ (x ∷ xs)) = foldl″ c (c n x ∷ xs)
>>
>> Termination checking failed for the following functions: foldl″
>>
>> I also remarked that Agda rejects that:
>> Mi ankaŭ remarkis ke agda malakceptas tion:
>>
>> foldr‴ : ∀ {a} {A : Set a} → (A → A → A) → List⁺ A → A
>> foldr‴ c (n ∷ []) = n
>> foldr‴ c (n ∷ (x ∷ xs)) = c x (foldr‴ c (*id* n ∷ xs))
>> where
>> open import Function using (id)
>>
>> Termination checking failed for the following functions:foldr‴
>>
>> Andreas,unfortunately I really don't understand your explanation of
>> the /length/ of the list!
>> Andreas, bedaûrinde mi vere ne komprenis vian klarigon pri la
>> grandeco de la listo!
>>
>>
>> On 2017-08-16 22:54, Andreas Abel wrote:
>>> The function is structurally recursive on the /length/ of the list,
>>> not on the list itself. You can expose the length by
>>>
>>> 1. using vectors instead of lists, or
>>> 2. using sized lists (sized types).
>>>
>>> Alternatively, you can just define an auxiliary function first which
>>> takes the first element of List+ as separate argument. Then the
>>> recursion on the list goes through.
>>>
>>> Best,
>>> Andreas
>>>
>>> On 16.08.2017 22:23, Serge Leblanc wrote:
>>>> Thank you for your help.
>>>>
>>>> Why Agda refuses the following structurally decreasing function?
>>>>
>>>> foldl″ : ∀ {a} {A : Set a} → (A → A → A) → List⁺ A → A
>>>> foldl″ c (n ∷ []) = n
>>>> foldl″ c (n ∷ (x ∷ xs)) = foldl″ c (c n x ∷ xs)
>>>>
>>>> /home/serge/agda/Maximal.agda:47,1-49,50 Termination checking
>>>> failed for the following functions: foldl″ Problematic calls:
>>>> foldl″ c (c n x ∷ xs) (at /home/serge/agda/Maximal.agda:49,27-33)
>>>>
>>>> On 2017-08-14 20:55, Ulf Norell wrote:
>>>>> The fact that foldr₁ is using a private recursive helper function
>>>>> will likely make it impossible to prove your theorem.
>>>>>
>>>>> / Ulf
>>>>>
>>>>> On Mon, Aug 14, 2017 at 6:47 PM, Jesper Cockx <Jesper at sikanda.be
>>>>> <mailto:Jesper at sikanda.be>> wrote:
>>>>>
>>>>> Maybe you can explain what approaches you have already tried and
>>>>> why you got stuck? I think people would be more inclined to help
>>>>> that way.
>>>>>
>>>>> To get you started on proof1, here's a hint: since you are
>>>>> proving
>>>>> something about the functions foldr₁ and _⊔_, you can take a look
>>>>> at their definitions and follow the same structure for your
>>>>> proof.
>>>>> For example, since foldr₁ is defined in terms of the helper
>>>>> function foldr, you probably also need to define a helper lemma
>>>>> that proves a similar statement about foldr.
>>>>>
>>>>> Best regards,
>>>>> Jesper
>>>>>
>>>>> 2017-08-14 18:33 GMT+02:00 Serge Leblanc <33dbqnxpy7if at gmail.com
>>>>> <mailto:33dbqnxpy7if at gmail.com>>:
>>>>>
>>>>> Saluton, neniu bonvolas helpi min?
>>>>>
>>>>> Hi, nobody wants to help me?
>>>>>
>>>>>
>>>>> On 2017-08-06 18:23, Serge Leblanc wrote:
>>>>>> Dear All,
>>>>>> I need help to finish these lemmas.
>>>>>> They have the same meaning, I am right?
>>>>>> All helpers are welcome!
>>>>>>
>>>>>> Estimata ĉiuj,
>>>>>> Mi bezonas helpon por daŭrigi ci-tiuj pruvojn!
>>>>>> Ĉu ili havas je la saman signifon! Ĉu mi pravas?
>>>>>> Ĉiuj helpantoj estas bonvenaj!
>>>>>>
>>>>>> Sincere.
>>>>>> -- Serge Leblanc
>
--
Serge Leblanc
------------------------------------------------------------------------
gpg --search-keys 0x67B17A3F
Fingerprint = 2B2D AC93 8620 43D3 D2C2 C2D3 B67C F631 67B1 7A3F
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.chalmers.se/pipermail/agda/attachments/20170821/dbd75f1c/attachment-0001.html>
-------------- next part --------------
module Maximal where
open import Data.Nat public using (ℕ; zero; suc; _⊔_; _≤_; _≥_; z≤n; s≤s)
open import Data.Nat.Properties public using (m≤m⊔n)
open import Data.List.NonEmpty using (List⁺; foldr₁; _∷_; _∷⁺_; [_]; toList)
open import Data.List.Any as Any using (Any; here; there)
open import Data.List.All as All -- using (All)
open import Relation.Binary.PropositionalEquality as PropEq
using (_≡_; refl; cong; sym )
open import Relation.Binary
open DecTotalOrder Data.Nat.decTotalOrder using () renaming (refl to ≤-refl)
open import Data.List using (List; []; _∷_; _++_)
--open import Function using (id)
foldr : ∀ {a} {A : Set a} → (A → A → A) → List⁺ A → A
foldr {A = A} c (n ∷ l) = foldr′ n l
where
foldr′ : A → List A → A
foldr′ n [] = n
foldr′ n (x ∷ xs) = c n (foldr′ x xs)
foldl : ∀ {a} {A : Set a} → (A → A → A) → List⁺ A → A
foldl {A = A} c (n ∷ l) = foldl′ n l
where
foldl′ : A → List A → A
foldl′ n [] = n
foldl′ n (x ∷ xs) = foldl′ (c n x) xs
foldl″ : ∀ {a} {A : Set a} → (A → A → A) → List⁺ A → A
foldl″ f (h ∷ t) = Data.List.foldl f h t
max : List⁺ ℕ → ℕ
max l = foldl _⊔_ l
max′ : List⁺ ℕ → ℕ
max′ l = foldr _⊔_ l
max″ : List⁺ ℕ → ℕ
max″ (h ∷ t) = Data.List.foldl _⊔_ h t
private
max² : max [ 2 ] ≡ 2
max² = refl
max²″ : max″ [ 2 ] ≡ 2
max²″ = refl
max⁵ : max (4 ∷⁺ 5 ∷⁺ [ 6 ]) ≡ 6
max⁵ = refl
max₅″ : max″ (4 ∷⁺ 5 ∷⁺ [ 6 ]) ≡ 6
max₅″ = refl
module Examples (_⊙_ : ℕ → ℕ → ℕ)
(a b c : ℕ)
where
left₁ : foldl _⊙_ (a ∷⁺ b ∷⁺ [ c ]) ≡ ((a ⊙ b) ⊙ c)
left₁ = refl
left₂ : foldl″ _⊙_ (a ∷⁺ b ∷⁺ [ c ]) ≡ ((a ⊙ b) ⊙ c)
left₂ = refl
right₁ : foldr _⊙_ (a ∷⁺ b ∷⁺ [ c ]) ≡ (a ⊙ (b ⊙ c))
right₁ = refl
⊔-right-identity : ∀ n → n ⊔ 0 ≡ n
⊔-right-identity zero = refl
⊔-right-identity (suc n) = refl
⊔-comm : ∀ x y → x ⊔ y ≡ y ⊔ x
⊔-comm zero y = sym (⊔-right-identity y)
⊔-comm (suc x) zero = refl
⊔-comm (suc x) (suc y) = cong suc (⊔-comm x y)
⊔-asso : ∀ x y z → x ⊔ (y ⊔ z) ≡ (x ⊔ y) ⊔ z
⊔-asso zero _ _ = refl
⊔-asso (suc x) zero _ = refl
⊔-asso (suc x) (suc y) zero = refl
⊔-asso (suc x) (suc y) (suc z) = cong suc (⊔-asso x y z)
open import Relation.Binary.PropositionalEquality as PropEq using (_≡_; refl; cong; cong₂)
open PropEq.≡-Reasoning -- renaming (_≡⟨_⟩_ to _≡[_]_)
private
abstract
lemma₂ : ∀ x₀ x₁ xs → Data.List.foldl _⊔_ x₀ (x₁ ∷ xs) ≡ Data.List.foldl _⊔_ (x₀ ⊔ x₁) xs
lemma₂ x₀ x₁ xs = refl
lemma₃ : ∀ x₀ x₁ xs → x₀ ⊔ Data.List.foldl _⊔_ x₁ xs ≡ Data.List.foldl _⊔_ (x₀ ⊔ x₁) xs
lemma₃ x₀ x₁ [] = refl
lemma₃ x₀ x₁ (h ∷ t) = begin
x₀ ⊔ Data.List.foldl _⊔_ (x₁ ⊔ h) t ≡⟨ lemma₃ x₀ (x₁ ⊔ h) t ⟩
Data.List.foldl _⊔_ (x₀ ⊔ (x₁ ⊔ h)) t ≡⟨ cong (λ s → Data.List.foldl _⊔_ s t) (⊔-asso x₀ x₁ h) ⟩
Data.List.foldl _⊔_ (x₀ ⊔ x₁ ⊔ h) t
∎
lemma₄ : ∀ x xs → x ⊔ max″ xs ≡ max″ (x ∷⁺ xs)
lemma₄ x (h ∷ t) = lemma₃ x h t
++⁺ : ∀ {a p} {A : Set a} {P : A → Set p} {xs ys : List A} →
All P xs → All P ys → All P (xs ++ ys)
++⁺ [] pys = pys
++⁺ (px ∷ pxs) pys = px ∷ ++⁺ pxs pys
proof₁ : (xs : List⁺ ℕ) → All (_≥_ (max″ xs)) (toList xs)
proof₁ (h ∷ []) = {! []!}
proof₁ (h ∷ (x ∷ xs)) = {! (proof₁ (x ∷ xs))!}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 228 bytes
Desc: OpenPGP digital signature
URL: <http://lists.chalmers.se/pipermail/agda/attachments/20170821/dbd75f1c/attachment-0001.sig>
More information about the Agda
mailing list