A Question about Magic With --- Resolved
While I was on the bed listening to Eric Clapton's Bell Bottom Blues, it occurred to me that I could probably use subst
to replace partition p xs
with < ys , zs >
, i.e., something like
subst (\X -> EqualLength xs (pair-concat X)) (refl {< ys , zs >}) (partition xs p)
I expect there are some mysterious connection between a term and a pattern that is matched with the term, which would remind Agda that partition p xs
is in fact < ys , zs >
. Unfortunately it failed. But not much later I came up with the idea that maybe doing a direct with
-match on partition-lenpres xs p
would work, and indeed it worked! The final result is
partition-lenpres : (xs : List Nat)(p : Nat) -> EqualLength xs (pair-concat (partition p xs)) partition-lenpres [] _ = eqlen-base partition-lenpres (x :: xs) p with partition p xs | cmp x p | partition-lenpres xs p -- magic with ... | < ys , zs > | \/-IL x≼p | indHyp = eqlen-step indHyp ... | < ys , zs > | \/-IR p≼x | indHyp = lemma1 x x xs ys zs indHyp
where lemma1
has been proved when I was working on the "intrusive" proof.
lemma1 : {A : Set}(x z : A)(xs ys zs : List A) -> EqualLength xs (ys ++ zs) -> EqualLength (x :: xs) (ys ++ z :: zs)
--
Excellent! Though I still don't understand exactly how with
works...
Labels: Agda, Programming
<< 回到主頁