2016-09-28 8 views
2

私は、this SO questionthis 3 part seriesespecially thisのようなページで、ADTを実数に似ていて操作する方法を読んでいます。代数データ型の代数をさらに乱用する - これはなぜ機能するのですか?

最後のリンクの「トラブル」セクションが私の目を引っ張り、記事には不可能と書かれていても、Natを解決しようとしました。

Nat = 1 + Nat 
Nat - Nat = 1 
Nat(1 - 1) = 1 
Nat = 1/(1 - 1) 

私はちょうど0で割ったので、これは総ナンセンスのように見えるかもしれません(とあなたが正しいかもしれない)が、あなたはそれらのリンクまたは類似のもののいずれかを読めば、あなたはそれが非常に似ていることに気づくでしょうリストの定義。

List(x) = 1/(1 - x) 

だからあなたはあなたが開始式で繰り返し置換することにより得るでしょう正確に何である、Nat = List(1) = 1 + 1 + 1 + ...のようにNATを書くことができます。また、これはHaskellで、このような自然数の定義と同等です:自然数、0 = []S(N) =() : Nの有効なエンコーディングは間違い

type Nat = [()] 

はどれ。


私の質問はどのように私はこれから有効な結果を得たのですか?私はちょうど0で割った。始動方程式自体はほとんど矛盾であることは言うまでもありません。

このように私は何の意味があるのでしょうか?これはちょうど純粋な偶然の一致ですか、あるいはこの文脈で何らかの形で定義された0による除算ですか?

+0

厳密に言えば、 '1!= 1 * 1'なので、' Nat = 1 + 1 * 1 + 1 * 1 * 1 + ... 'と書く方が正しいでしょう。 – chepner

+0

@chepner理由を説明していただけますか?私がそれを理解した形で、型はsemiringを形成します。ここで '1'は' * 'のアイデンティティです。つまり、任意のxに対して 'x * 1 = 1'となります。したがって、「1」と「1 * 1」は等価です。 –

+0

これらは同形ではありません。順序付きペア '(()、())'は '()'とは区別されます。 '(a、())::(x、())'を 'a :: x'に、またその逆に無損失で変換できるので、' x * 1 == x'です。 – chepner

答えて

1

Natは無限であるため、Nat - Nat = Nat ⋅ (1 - 1) = Nat ⋅ 0 = 0を実際に使用することはできません。差Nat - Natは、であり、有限個数であるのに対し、Natは明らかに無限である。したがって、1 - 1は実際にはゼロではありません。nonstandard analysisでは極端に小さい値のようです。あなたが無限小で何かを分けるならば、あなたは何かを大きく(無限大、確かに...まあ)得るが、あなたはちょうどゼロに分割することはできない。それが有限であれば、あなたゼロ除算されるので -

は実際に、私はあなたがについて尋ねたというパラドックスが「Natが無限であることを証明」として見ることができると思います。

もちろん、あなたは実際にはそうではありませんこのタイプの算術演算は何でもあります...それは面白い娯楽ですが、実際には数学的ではありません。

+0

この種別ではありませんが、より慎重なソート(差分計算のもの)を使用してください。 – dfeuer

関連する問題