リーンでパターンマッチングを行うときに仮定を伝播する方法

LogicChains

アイテムがソートされたリストの先頭よりも小さい場合、それはリストのメンバーではないことをリーンで証明しようとしています。

theorem not_in_greater {α: Type} [d: decidable_linear_order α] {x h: α} (t: list α) (Hs: is_sorted (h::t)) (Hlt: x < h) : x ∉ (h::t) :=
match t with
    | [] := not_eq_not_in (ne_of_lt Hlt)
    | (y::ys) := 
    have x_neq_h: x ≠ h, from ne_of_lt Hlt,
    have sorted_tail: is_sorted (y::ys), from _

tリストの末尾であると一致した後(y::ys)、仮定Hs: is_sorted (h::t)が伝播され、仮定is_sorted (y::ys)として追加れることを期待しました(そして、Idrisがこれを正確に実行することがわかりました)が、Leanではそうではないようです。さらに、平等t = (y::ys)は伝播されないので、それを証明する方法がわかりませんis_sorted (y::ys)

この仮定を伝播するためにパターンマッチングを行うときに、何か特別なことをする必要がありますか?

is_sortedを次のように定義しました。

inductive is_sorted {α: Type} [d: decidable_linear_order α] : list α -> Type 
    | is_sorted_zero : is_sorted []
    | is_sorted_one : Π (x: α), is_sorted [x]
    | is_sorted_many : Π (x y: α) (ys: list α), x < y -> is_sorted (y::ys) -> is_sorted (x::y::ys)

_プレースホルダーとしてのコンテキストでの仮定は次のとおりです。

α : Type,
d : decidable_linear_order α,
x h : α,
t : list α,
Hs : is_sorted (h :: t),
Hlt : x < h,
_match : ∀ (_a : list α), x ∉ h :: _a,
y : α,
ys : list α,
x_neq_h : x ≠ h

参考までに、IdrisのIdris定義はis_sorted、Idrisで目的の動作を生成します。

data IsSorted : {a: Type} -> (ltRel: (a -> a -> Type)) -> List a -> Type where
  IsSortedZero : IsSorted {a=a} ltRel Nil
  IsSortedOne : (x: a) -> IsSorted ltRel [x]
  IsSortedMany : (x: a) -> (y: a) -> .IsSorted rel (y::ys) -> .(rel x y) -> IsSorted rel (x::y::ys)

そしてイドリスの証拠:

notInGreater : .{so: SensibleOrdering a eqRel ltRel} -> (x: a) -> (h: a) -> (t: List a) ->
               .IsSorted ltRel (h::t) -> ltRel x h -> Not (Elem x (h::t))
notInGreater {so} x h [] _ xLtH = let xNeqH = (ltNe so) xLtH in notEqNotIn x h (xNeqH)
notInGreater {so} x h (y::ys) (IsSortedMany h y yYsSorted hLtY) xLtH = elemAbsurd
  where
  xNeqH : Not (x = h)
  xNeqH = (ltNe so) xLtH

  elemAbsurd : Elem x (h::y::ys) -> a
  elemAbsurd  xElemAll = case xElemAll of
    Here {x=y} => absurd $ ((ltNe so) xLtH) Refl
    There inRest => let notInRest = notInGreater {so} x y ys yYsSorted ((ltTrans so) xLtH hLtY)
      in absurd (notInRest inRest)

また、LeanをIdrisの定義に近づけて定義し、:パターンマッチングを可能にするために左に移動してみました

 theorem not_in_greater2 {α: Type} [d: decidable_linear_order α] : Π (x h: α) (t: list α), is_sorted (h::t) -> x < h -> ¬ list.mem x (h::t)
     | x h [] _ x_lt_h := not_eq_not_in (ne_of_lt x_lt_h)
     | x h (y::ys) (is_sorted.is_sorted_many x h (y::ys) h_lt_y rest_sorted) x_lt_h := _

しかし、この場合、リーンはそれを不平を言いますinvalid pattern, 'x' already appeared in this pattern(h、y、ysについても)。そして、たとえば名前hh1変更する、それは文句を言いgiven argument 'h1', expected argument 'h'ます。xyおよびys引数をis_sorted_many暗黙的にすることでこれを回避することが実際に可能であるように思われるので、それらを一致させる必要はありませんが、それは少しハックなようです。

セバスチャン・ウルリッヒ

リーンでは、アクセスできない用語について明示する必要があります。

theorem not_in_greater2 {α: Type} [d: decidable_linear_order α] : Π (x h: α) (t: list α), is_sorted (h::t) → x < h → ¬ list.mem x (h::t)
| x h [] _ x_lt_h := _
| x h (y::ys) (is_sorted.is_sorted_many ._ ._ ._ h_lt_y rest_sorted) x_lt_h := _

アクセスできない用語の詳細については、https://leanprover.github.io/theorem_proving_in_lean/theorem_proving_in_lean.pdfの第8.5章を参照してください

リーンは暗黙の引数にアクセスできない用語を自動的に使用することに注意してください。

inductive is_sorted {α : Type} [decidable_linear_order α] : list α → Type 
| zero : is_sorted []
| one (x : α) : is_sorted [x]
| many {x y : α} {ys : list α} : x < y → is_sorted (y::ys) → is_sorted (x::y::ys)

theorem not_in_greater2 {α : Type} [decidable_linear_order α] : Π (x h : α) (t : list α), is_sorted (h::t) → x < h → ¬ list.mem x (h::t)
| x h [] _ x_lt_h := not_eq_not_in (ne_of_lt x_lt_h)
| x h (y::ys) (is_sorted.many h_lt_y rest_sorted) x_lt_h := _

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

LUAでパターンマッチングを行うときに、単語と数字を組み合わせるにはどうすればよいですか?

分類Dev

const伝播ポインタ型ラッパーを作成するにはどうすればよいですか?

分類Dev

パターンマッチングでリストを分割する方法は?

分類Dev

オーバーレイGoogleMapでのタッチイベントの伝播を停止する方法

分類Dev

node-oracledbでパターンマッチングクエリを実行する方法

分類Dev

Scala 2.13でパターンマッチングを行う方法は?

分類Dev

配列でscalaパターンマッチングを行う方法は?

分類Dev

List( '('、List [Char]、 ')')でパターンマッチングを行う方法は?

分類Dev

ジェネリック型のタプルでパターンマッチングを行う方法は?F#

分類Dev

Elixirのパターンマッチング中に変数全体を参照できる方法はありますか?

分類Dev

["a"; "b"; "c"; "a"; "d"; "e"]を["abc a"; "d";に変換できるようにF#でパターンマッチングを使用する方法「e」]

分類Dev

&selfまたは&mut selfをとる関数でパターンマッチングを行うときに、refキーワードを回避するにはどうすればよいですか?

分類Dev

hstore / jsonb列のキーでパターンマッチングクエリを実行するにはどうすればよいですか?

分類Dev

Elixir:パターンマッチングはタプルとマップで異なる働きをします

分類Dev

フラッターパフォーマンスとレンダリング時間を測定する方法

分類Dev

Rustで複数のタイプのパターンマッチングを行うことは可能ですか?

分類Dev

`for ..in`のユニオンコンストラクターでパターンマッチングを行う方法

分類Dev

Ectoクエリエラーをパターンマッチングする方法

分類Dev

Goでマーシャリングを解除するときにjson値をチェックするタイプ

分類Dev

パターンマッチングの前後の行を削除する方法

分類Dev

Windowsがコマンドプロンプトでパターンマッチングを行う方法を理解する

分類Dev

タッチパッドのマルチフィンガータッピング機能を設定するにはどうすればよいですか?

分類Dev

Perlで配列を使用してパターンマッチングを行う方法はありますか?

分類Dev

ミックスインでパターンマッチングを使用するときの奇妙な動作

分類Dev

クエリ文字列で正確なパターンマッチングを行う方法

分類Dev

マットの変更時に関数を呼び出すときにイベントの伝播を停止する方法-チェックボックス?

分類Dev

<object>からSVGを使用すると、クリックイベントを親ハンドラーに伝播できますか?

分類Dev

httpProviderresponseErrorインターセプターでエラーを伝播する方法

分類Dev

Iterableでパターンマッチングを行うことは可能ですか?

Related 関連記事

  1. 1

    LUAでパターンマッチングを行うときに、単語と数字を組み合わせるにはどうすればよいですか?

  2. 2

    const伝播ポインタ型ラッパーを作成するにはどうすればよいですか?

  3. 3

    パターンマッチングでリストを分割する方法は?

  4. 4

    オーバーレイGoogleMapでのタッチイベントの伝播を停止する方法

  5. 5

    node-oracledbでパターンマッチングクエリを実行する方法

  6. 6

    Scala 2.13でパターンマッチングを行う方法は?

  7. 7

    配列でscalaパターンマッチングを行う方法は?

  8. 8

    List( '('、List [Char]、 ')')でパターンマッチングを行う方法は?

  9. 9

    ジェネリック型のタプルでパターンマッチングを行う方法は?F#

  10. 10

    Elixirのパターンマッチング中に変数全体を参照できる方法はありますか?

  11. 11

    ["a"; "b"; "c"; "a"; "d"; "e"]を["abc a"; "d";に変換できるようにF#でパターンマッチングを使用する方法「e」]

  12. 12

    &selfまたは&mut selfをとる関数でパターンマッチングを行うときに、refキーワードを回避するにはどうすればよいですか?

  13. 13

    hstore / jsonb列のキーでパターンマッチングクエリを実行するにはどうすればよいですか?

  14. 14

    Elixir:パターンマッチングはタプルとマップで異なる働きをします

  15. 15

    フラッターパフォーマンスとレンダリング時間を測定する方法

  16. 16

    Rustで複数のタイプのパターンマッチングを行うことは可能ですか?

  17. 17

    `for ..in`のユニオンコンストラクターでパターンマッチングを行う方法

  18. 18

    Ectoクエリエラーをパターンマッチングする方法

  19. 19

    Goでマーシャリングを解除するときにjson値をチェックするタイプ

  20. 20

    パターンマッチングの前後の行を削除する方法

  21. 21

    Windowsがコマンドプロンプトでパターンマッチングを行う方法を理解する

  22. 22

    タッチパッドのマルチフィンガータッピング機能を設定するにはどうすればよいですか?

  23. 23

    Perlで配列を使用してパターンマッチングを行う方法はありますか?

  24. 24

    ミックスインでパターンマッチングを使用するときの奇妙な動作

  25. 25

    クエリ文字列で正確なパターンマッチングを行う方法

  26. 26

    マットの変更時に関数を呼び出すときにイベントの伝播を停止する方法-チェックボックス?

  27. 27

    <object>からSVGを使用すると、クリックイベントを親ハンドラーに伝播できますか?

  28. 28

    httpProviderresponseErrorインターセプターでエラーを伝播する方法

  29. 29

    Iterableでパターンマッチングを行うことは可能ですか?

ホットタグ

アーカイブ