Coq でやりたいことのために、加重ツリー ライブラリを作成しようとしています。ツリーの各エッジには、実数値の重みが必要です。私が必要とする操作の 1 つは、重みが 0 の場合にツリーから葉のエッジを削除するプルーニング関数です。
次のコードは、ツリーのセットアップです。
Require Import Coq.Reals.Reals.
Require Import Coq.Lists.List.
Section WeightedTrees.
Inductive wtree' (A : Type) : Type :=
| Null : wtree' A
| LNode : A -> wtree' A
| INode : A -> list (wtree' A) -> wtree' A.
Inductive Wtype (A : Type) : Type := W: R -> A -> Wtype A.
Definition wtree (A : Type) := wtree' (Wtype A).
(* Helper: checks whether a tree contains an element *)
Fixpoint wt_contains {A : Type} (a : A) (t : wtree A) : Prop :=
match t with
| Null => False
| LNode (W w a') => a' = a
| INode (W w a') l => a' = a \/ (fold_left or (map (wt_contains a) l) True)
end.
これがプルーン関数での私の現在の試みです。0%R は共誘導型ではないため、Coq はそれを受け入れません。
Fixpoint wt_prune_list {A : Type} (l:list (wtree A)) : (list (wtree A)) :=
match l with
| nil => nil
| (cons Null l) => (cons (Null (Wtype A)) (wt_prune_list l))
| (cons (INode w l') l) => (cons ((INode (Wtype A)) w l') ((wt_prune_list A) l))
| (cons (LNode (W w a')) l) =>
if w = 0%R then
(wt_prune_list l)
else
(cons (LNode (W w a')) (wt_prune_list l))
end.
だから私はいくつかの質問があります:
- 最も重要なこと: 重みがゼロのリーフ エッジのツリーを剪定するように上記のコードを修正するにはどうすればよいですか?
- のようなものが理にかなっているかどうかを確認していますか
w=0%R
? という証明があれば、これはこう言っていると考えるべきだと思いますw = 0%R
。これは正しいですか? - 次のような短い行の書き方はあります
(cons (INode w l') l) => (cons ((INode (Wtype A)) w l') ((wt_prune_list A) l))
か? 一致させることができたのはわかっていますが(cons (INode _) _)
、反対側を構築する良い方法がないようです. の場合と同じように複数の引数を表す(cons (INode _1) _2) => (cons (INode _1) ((wt_prune_list A) _2)
Coq が見つけられるようなものがあればいいのですが。_1
_