私は自然に宣言リストの誘導述語に再利用可能なコードを記述しようとしているとき: をリストする - >リストA - > BOOL
Parameter A:Type.
は、その後、私はバイナリ述語を定義するために進めた(用例:
Inductive prefix : list A -> list A -> Prop :=
| prefixNil: forall (l: list A), prefix nil l
| prefixCons: forall (a: A)(l m:list A), prefix l m -> prefix (a::l) (a::m).
これは、与えられたリストが別のリストの接頭辞であるという事実を表しています。次に、この関係を研究し、(例えば)それが部分的な順序であることを示すことができます。ここまでは順調ですね。しかし、数学的概念に対応していない帰納的述語を念頭において定義するのは非常に簡単です。等価性を証明する目的で
isPrefixOf: list A -> list A -> bool
:私は別の機能を定義することによって誘導定義を検証したいと思います
Theorem prefix_validate: forall (l m: list A),
prefix l m <-> isPrefixOf l m = true.
私は私のように、コードの一般性を制限する必要がある場所ですlist A
で動作しなくなりました。ハスケルでは、isPrefixOf :: Eq a => [a] -> [a] -> Bool
があるので、私はA
のようなものを仮定する必要があることを理解しています。 'Eq A
'のようなものです。もちろん、私は仮定することができます:
そしてそこから進んでください。私はおそらくこれを前のコードの完全性を損なわないように、別のファイルまたはセクションで行うでしょう。しかし、私は車輪を再発明していると感じています。これはたぶん一般的なパターンです(Haskell Eq a => ...
のようなものを表現しています)。
できるだけ一般的なコードを維持しながら、私が進めることができるタイプA
について(慣用句、共通の)宣言をしてください。
と私はよりよい働く、同じ好みます例えば抽出を伴う。 @ ejgallegoが言ったように、それはあなたの好み/ユースケースに依存する – Vinz
ありがとう! –
非常に良い! 'prefix'を使って計算の例を提供した場合(どちらの場合も)、関数のシグネチャを変更しているので、答えはもっと良くなります(少なくとも新しい引数を導入する最初のケースでは) –