36

これが math.SE の質問なのか SO の質問なのかについては、私はやや未定でしたが、Haskell プログラマーはよく知っているかもしれないのに対し、一般の数学者は特にこのカテゴリについてあまり知らないか気にかけているとは思えません。

したがって、 Haskには多かれ少なかれ製品があることがわかっています (もちろん、ここでは理想化された Hask を使用しています)。イコライザーがあるかどうかに興味があります (その場合、すべての有限の制限があります)。

セットのように分離を行うことができないため、直感的にはそうではないように思われます。そのため、サブオブジェクトは一般的に構築するのが難しいようです。しかし、思いつきたい特定のケースについては、Setでイコライザーを作成してカウントすることでハックできるようです (結局のところ、すべての Haskell 型は可算であり、すべての可算セットはHaskell が持つ有限型または自然型のいずれかに同型)。そのため、反例を見つける方法がわかりません。

さて、Agda はもう少し有望に思えます: サブオブジェクトを形成するの比較的簡単です。明らかなシグマ型Σ A (λ x → f x == g x)はイコライザーですか? 詳細がうまくいかない場合、それは道徳的にイコライザーですか?

4

2 に答える 2

30

tl;dr提案された候補はイコライザーではありませんが、その無関係な対応物は

Agda のイコライザーの候補は良さそうです。それでは、試してみましょう。基本キットが必要です。これが私の rejectnik ASCII 従属ペア型と同種内包等価性です。

record Sg (S : Set)(T : S -> Set) : Set where
  constructor _,_
  field
    fst : S
    snd : T fst
open Sg

data _==_ {X : Set}(x : X) : X -> Set where
  refl : x == x

2つの関数のイコライザーの候補は次のとおりです

Q : {S T : Set}(f g : S -> T) -> Set
Q {S}{T} f g = Sg S \ s -> f s == g s

射影がfstに送信Q f gされSます。

内容: の要素はソース型Q f gの要素sであり、その証明と共にf s == g s. しかし、これはイコライザーですか?そうするようにしましょう。

イコライザーとは何かというと、関数構成を定義する必要があります。

_o_ : {R S T : Set} -> (S -> T) -> (R -> S) -> R -> T
(f o g) x = f (g x)

だから今、私は候補h : R -> Sを識別し、因数分解しなければならないf o hanyを示す必要があります。他のコンポーネントと、実際にとして因数分解する証明の両方を提供する必要があります。これが図です:ダイアグラムが なしで交換するときはいつでも、ダイアグラムがまだ交換されている状態で追加する独自の方法がある場合、 はイコライザーです。g o hfst : Q f g -> Su : R -> Q f ghfst o u(Q f g , fst)uu

イコライザー図

ここに仲介の存在が入りuます。

mediator : {R S T : Set}(f g : S -> T)(h : R -> S) ->
           (q : (f o h) == (g o h)) ->
           Sg (R -> Q f g) \ u -> h == (fst o u)

明らかに、Sそのピックの同じ要素を選択する必要がありhます。

mediator f g h q = (\ r -> (h r , ?0)) , ?1

2つの立証義務を残して

?0 : f (h r) == g (h r)
?1 : h == (\ r -> h r)

さて、Agda の定義上の等価性が関数の eta-law を持っているの?1と同じようにできます。reflというのは?0、私たちは によって祝福されていqます。同等の機能はアプリケーションを尊重します

funq : {S T : Set}{f g : S -> T} -> f == g -> (s : S) -> f s == g s
funq refl s = refl

だから私たちは取るかもしれません?0 = funq q r

しかし、時期尚早に祝うのはやめましょう。媒介射の存在だけでは十分ではないからです。その独自性も必要です。==そして、ここではホイールが不安定になる可能性があります。これはintensional であるためです。一意性とは仲介マップを実装する方法が 1 つしかないことを意味します。しかし、私たちの仮定は意図的なものでもあります...

これが私たちの証明義務です。他の仲介射は によって選択されたものと等しいことを示さなければなりませんmediator

mediatorUnique :
  {R S T : Set}(f g : S -> T)(h : R -> S) ->
  (qh : (f o h) == (g o h)) ->
  (m : R -> Q f g) ->
  (qm : h == (fst o m)) ->
  m == fst (mediator f g h qh)

qmviaと getをすぐに置き換えることができます

mediatorUnique f g .(fst o m) qh m refl = ?

? :  m == (\ r -> (fst (m r) , funq qh r))

Agda にはレコードの eta 法則があるため、これは良さそうです。

m == (\ r -> (fst (m r) , snd (m r)))

しかし、私たちが作ろうとすると? = refl、苦情が寄せられます

snd (m _) != funq qh _ of type f (fst (m _)) == g (fst (m _))

身元証明は(標準構成では)一意であるため、これは面倒です。さて、拡張性を仮定し、平等に関する他のいくつかの事実を使用することで、この問題から抜け出すことができます

postulate ext : {S T : Set}{f g : S -> T} -> ((s : S) -> f s == g s) -> f == g

sndq : {S : Set}{T : S -> Set}{s : S}{t t' : T s} ->
       t == t' -> _==_ {Sg S T} (s , t) (s , t')
sndq refl = refl

uip : {X : Set}{x y : X}{q q' : x == y} -> q == q'
uip {q = refl}{q' = refl} = refl

? = ext (\ s -> sndq uip)

唯一の問題は厄介な等式証明の不一致です: 実装の計算可能な部分がノーズで一致します。したがって、修正は irrelevance で動作することですSg2 番目のコンポーネントが無関係であるとドットでマークされているExistential 量指定子に置き換えます。さて、証人が優れているという証拠をどのように使用するかは問題ではありません。

record Ex (S : Set)(T : S -> Set) : Set where
  constructor _,_
  field
    fst : S
    .snd : T fst
open Ex

そして、新しい候補イコライザーは

Q : {S T : Set}(f g : S -> T) -> Set
Q {S}{T} f g = Ex S \ s -> f s == g s

最後の義務を除いて、全体の構築は以前と同じように行われます

? = refl

受け入れられます!

そうです、意図的な設定であっても、イータの法則と、フィールドを無関係としてマークする機能により、イコライザーが得られます。

この構築には決定不能な型チェックは含まれていません。

于 2013-02-28T13:20:22.547 に答える
14

ハスク

Hask にはイコライザーがありません。覚えておくべき重要なことは、型 (または任意のカテゴリのオブジェクト) とその同型クラスについて考えるには、矢印について考える必要があるということです。基になるセットについてあなたが言うことは真実ですが、同型の基になるセットを持つ型は確かに同型であるとは限りません。Hask と Set の違いの 1 つは、Hask の矢印は計算可能でなければならず、実際、理想化された Hask の場合、それらは合計でなければならないということです。

私はしばらくの間、実際に防御可能な反例を考え出そうとしましたが、それができないことを示唆するいくつかの参考文献を見つけましたが、証明はありません. ただし、「道徳的な」反例がいくつかあります。Haskell にイコライザーが存在しないことを証明することはできませんが、それは確かに不可能に思えます!

例 1

f, g: ([Int], Int) -> Int

f (p,v) = treat p as a polynomial with given coefficients, and evaluate p(v).
g _ = 0

イコライザーは、p(n) = 0 であるすべてのペア (p,n) の型であり、これらのペアを ([Int], Int) に注入する関数と "すべき" です。ヒルベルトの第 10 問題により、この集合は決定不能です。これにより、Haskell 型である可能性は排除されるはずですが、それを証明することはできません (誰も発見していないこの型を作成する奇妙な方法がある可能性はありますか?)。たぶん、私は一点も二点も結び付けていないのかもしれません -- おそらく、これが不可能であることを証明するのは難しくありませんか?

例 2

あなたがプログラミング言語を持っているとしましょう。ソースコードと入力を受け取り、関数の固定小数点が出力となる関数を生成するコンパイラがあります。(このようなコンパイラはありませんが、このようなセマンティクスを指定することは前代未聞ではありません)。だから、あなたは持っています

compiler : String -> Int -> (Int -> Int)

それを関数に (Un) カリー化する

compiler' : (String, Int, Int) -> Int

機能を追加します

id' : (String, Int, Int) -> Int
id' (_,_,x) = x

次に、コンパイラのイコライザー'、id' は、ソース プログラム、入力、出力のトリプレットのコレクションになります。これは、プログラミング言語が完全に一般的であるため、計算できません。

その他の例

お気に入りの決定不可能な問題を選んでください。通常、オブジェクトが何らかのセットのメンバーであるかどうかを決定する必要があります。多くの場合、特定のオブジェクトのこのプロパティをチェックするために使用できる合計関数があります。この関数を使用して、タイプが決定不能セット内のすべての項目であるイコライザーを作成できます。それが最初の 2 つの例の由来であり、さらに多くの例があります。

アグダ

私はAgdaに精通していません。私の直感では、シグマ型はイコライザーでなければなりません。必要な注入関数と共に型を書き留めると、定義を完全に満たしているように見えます。ただ、アグダを使っていない者としては、詳細を確認する資格はないと思います。

ただし、実際の実際の問題は、シグマ型の型チェックが常に計算可能であるとは限らないため、これを行うことが常に役立つとは限らないことです。上記のすべての例で、指定したシグマ型を書き留めることができますが、何かがその型のメンバーであるかどうかを証明なしで簡単に確認することはできません。

ちなみに、これが Haskell がイコライザーを持てない理由です: もしそうなら、型チェックは決定不能になります! 依存型は、すべてを動かすものです。Haskell は型システムが決定可能であるため、型で興味深い数学的構造を表現できる必要があります。したがって、理想化された Agda にはすべての有限の制限があると当然期待します (そうでなければがっかりするでしょう)。同じことが他の依存型言語にも当てはまります。たとえば、Coq には間違いなくすべての制限が必要です。

于 2013-02-27T13:58:38.270 に答える