2012-11-08 2 views
12

が明らかなぜなぜ(すべての文字列[])が真であるべきですか? <code>every?</code>のソースコードを見てみると

(every? string? []) => true 

ますevery?を再帰的に実装され、再帰を終了する(nil? (seq coll))を使用しているためです。しかし、私の質問は、この感覚はどのような意味ですか?ただそれを乗り越えた。

私は

(and (seq x) (every? string? x)) 
+9

空のベクトルのすべての要素が文字列であることは確かです。 –

+3

'every every?'は正の姿勢の人間によって書かれています – Ankur

答えて

9

forall-quantifierと同じ働きをするためです。すなわち、最初は真であるとみなされ、述語の各アプリケーションはそれを偽証する試みである。存在量限定子(これは、矛盾のためにClojureでany?というよりむしろsomeと呼ばれます)は逆の方法で動作します。これはfalseを仮定しており、述語の各アプリケーションはそれを真実にする試みです。

言い換えれば、何も存在しない場合には真であり、何もない場合には何かが真であることは常に偽です。

+0

これはどういう意味があるのか​​を説明しているリファレンスにリンクしてください。私はこれがSet Theoryのものだと仮定しますが、それは直感的ではありません。 – noahlz

+0

これは、set理論よりも正式な論理に関係します(ただし、これは集合理論でも紹介できます)。これは、Pawelsの回答のような否定について考えると、実際には非常に直感的です。「Xの中のすべてのxについて真実」は、「何かが真でないxはXにありません」と同じです。 'every? 'は空のseqsに対してはfalseであるため、かなり複雑な式を作ることになります。 – Cubic

+0

Pawełがリンクを投稿しました。 – 0dB

0

それとも、より良い(every? string? [])falseを得なければならない理由を尋ねるを使用して、私の問題を解決しましたか?両方のバリエーションは特定の要件で間違った答えにつながります。しかし、明らかに空のシーケンスにエラーが発生するよりも優れています。

+0

空のシーケンスでエラーが発生するのは明らかです。それは実際には良くないかもしれません!私が正しく覚えていれば、Scalaの非常に大きな振る舞いのために、いくつかのコードが吹き飛ばされました。私は吹き飛ばしが間違っているとは言いません。何らかの行動があなたを傷つける状況があるということだけです。実際には、空のリストに対してこれらの操作を実行するのを止めるのに十分な強力な型システムが必要です。 –

+0

私は高く評価して学んだハスケルですが、私はClojureに固執し、このような驚くべき問題に対処しようとします:-) – 0dB

+1

@ 0dB普遍的な数値化に慣れていれば驚くことではありませんが、ハスケルの人々でさえ、空のリストと空ではないリストのタイプが異なるのは間違っていると言います。 – Cubic

8

機能every?は、universal quantificationを実装しています。

(every? string? []) => falseから、[](これは普遍的数量詞の作品のどのnegationです)x(string? x) => falseそのオブジェクトが含まれていることをたどります。これは矛盾につながりますので、(every? string? [])trueを返す必要があります。

7

それは数学で定義されているので、その理由があります。 every?が他の方法で定義されていれば、一貫性障害になります。

現在の定義では、すべての連結されたコレクションもevery? fooを満たす場合にのみ、連結の結果はevery? fooを満たします。空のリスト上のevery?リターンfalseを作ることは、この便利な同値と他のホストを破る(例えば要素の除去は時々falsetrueからevery?を切り替えるにつながる。)でしょう

+0

私は「常識」であるというこの答えも好きです:-) – 0dB

0

私の答えはvacuous truthです。

数学と論理で

は、空虚な真実が空のセットのすべてのメンバーが特定の性質を持っている をアサート文です:
Wikiのは、私は単に現在の最初の段落を引用しますので、それをうまくカバーしています。 の場合、「部屋のすべての携帯電話はオフになっています」というメッセージが表示されます 部屋に携帯電話がない場合は常にtrueになります。この の場合、「部屋のすべての携帯電話がオンになっている」という文は、 も空になります。また、2つの接続の場合と同じです:「すべてのセル 電話がオンになり、オフになります。

0

"and"および "or"操作のID値になります。任意のブールBについて、BがB & Tと同じ値を有する場合がある。したがって、値のない "と"は真でなければなりません。同様に、B | FはBと同じ値を持つので、値のない "or"はfalseです。

同様に、項の積は1であり、項の和は0であり、これらは乗算および加算演算子の同一性値である。

関連する問題