まず、型クラスについてよく知らなくても、型クラスを使用できない場合や方法を理解していない場合を除き、型クラスは型の表記法をオーバーロードするための最良の方法のようです。私は型クラスを使用していません。
\<in>
第二に、\<times>
、*
、\<union>
、 など、すべての型に意味を持つ演算子の表記法をオーバーライドしたくないと確信しています。
ただし、このような演算子+
は type には意味がありませんがsT
、これは最初のポイントにつながります。最終的には+
、 type に複数の意味を持たsT => sT => sT
せたいと考えていますが、それは実現しないと思います。
例の 4 つのバージョン
私の質問を具体的にし、問題を抱えているのは私だけではないことを示すために、クラインのコースから簡単な例を取り上げます。ファイルはDemo14.thyです。
例の 4 つのバージョンの後、「4 番目の例では、警告を取り除くことができますか?」と尋ねます。
彼は、警告もエラーも出さない単純な例から始めます。
locale semi =
fixes prod :: "['a, 'a] => 'a" (infixl "\<cdot>" 70)
assumes assoc: "(x \<cdot> y) \<cdot> z = x \<cdot> (y \<cdot> z)"
彼は\<cdot>
.
\<cdot>
彼をに変更する+
と、エラーが発生します。
locale semi2 =
fixes prod :: "['a, 'a] => 'a" (infixl "+" 70)
assumes assoc: "(x + y) + z = x + (y + z)"
HOL ソースを調べたところ、 type 、特に特定の型クラスに対して+
が定義されていることがわかりました。('a => 'a => 'a)
semi2
単独に固有のものではないことを確認するために変更する'a
と、警告のみが表示されます。
locale semi3 =
fixes prod :: "('a => 'a) => ('a => 'a) => 'a" (infixl "+" 70)
assumes assoc: "(x + y) + z = x + (y + z)"
私が本当に気にかけているのは、この 4 番目のバージョンです。挿入したにもかかわらず、警告が表示され(x::sT)
ます。
locale semi4 =
fixes prod :: "sT => sT => sT" (infixl "+" 70)
assumes assoc: "((x::sT) + y) + z = x + (y + z)"
警告は次のとおりです。
Ambiguous input
produces 16 parse trees (10 displayed):
[...]
Fortunately, only one parse tree is type correct,
but you may still want to disambiguate your grammar or your input.
まとめと質問
私自身は、次のように要約しています。 演算子+
は多くの場所で定義されており、特に type に対して定義されており'a => 'a => 'a
、これは一般に に対しても定義されていsT => sT => sT
ます。そのため、証明者は多くの作業を行い、 my がtype に対して定義されているsemi4
唯一の場所であることを最終的に把握した後、それを使用させてくれます。+
sT => sT => sT
サマリーがわかりませsemi4
んが、警告が表示されないように修正できますか?
(注: 例を考えると、数学的には の*
代わりに記号を使用する方が理にかなっています+
が、*
オーバーライドしたくない表記になります。)