9

証明のコンテキストで仮説を再帰的に反転するための戦術を定義するのに問題があります。たとえば、次のような仮説を含む証明コンテキストがあるとします。

H1 : search_tree (node a (node b ll lr) (node c rl rr))

仮説を繰り返し反転して、仮説を含む証明コンテキストを取得したい

H1 : search_tree (node a (node b ll lr) (node c rl rr))
H2 : search_tree (node b ll lr)
H3 : search_tree (node c rl rr)
H4 : lt_tree a (node b ll lr)
H5 : gt_tree a (node c rl rr)
H6 : lt_tree b ll
H7 : gt_tree b lr
H8 : lt_tree c rl
H9 : gt_tree c rr

もちろん、この証明コンテキストを取得するのは、反転戦術を繰り返し適用することで簡単です。ただし、仮説を反転すると、異なる仮説が異なるサブゴールに入れられることがあり、それぞれを反転するかどうかは、反転によって提供される情報の性質によって異なります。

明らかな問題は、証明コンテキストに対する無差別なパターンマッチングが非終了を引き起こすことです。たとえば、元の仮説を反転した後も保持したい場合、以下は機能しません。

Ltac invert_all :=
  match goal with
    | [ H1 : context [ node ?a ?l ?r ] |- ?goal ] => invert H1; invert_all
    | _ => idtac
  end.

これを行う簡単な方法はありますか?明らかな解決策は、すでに反転した仮説のスタックを保持することです。もう1つの解決策は、特定の深さまで仮説を反転することです。これにより、Ltacでの再帰呼び出しが削除されます。

4

1 に答える 1

5

それが本当にやりたいことである場合は、最初にFixpoint subtreelist (st : searchtree): list (...)これらすべてのサブツリーのリストを返すヘルパーを証明し、次に、必要なすべての追加の仮説が得られるまでリストを呼び出しsubtreelistて再帰的に呼び出す戦術を証明したいと思います。destruct

それで頑張ってください!

于 2012-01-26T04:26:56.217 に答える