web-dev-qa-db-ja.com

コンピュータサイエンスにおける「理由」の意味は何ですか。

関数型プログラミングを学びながら、特に純粋な関数や参照透過性のコンテキストで、「理由」という用語に遭遇し続けます。これはどういう意味ですか?

50
user2456976

通常、プログラムを作成する場合、仕事は単にコードを作成するだけではなく、コードが示すいくつかのプロパティも知りたいでしょう。これらのプロパティに到達するには、論理分析または経験的観察の2つの方法があります。

このようなプロパティの例には次のものがあります。

  • 正確さ(プログラムは想定されていることを実行しますか)
  • パフォーマンス(所要時間)
  • スケーラビリティ(パフォーマンスが入力にどのように影響するか)
  • セキュリティ(アルゴリズムが悪用される可能性があります)

これらの特性を経験的に測定すると、限られた精度で結果が得られます。したがって、これらの特性を数学的に証明することははるかに優れていますが、必ずしも容易ではありません。関数型言語は、通常、設計目標の1つとして、プロパティの数学的証明を扱いやすくしています。これは通常、プログラムについて推論することによって意味されます。


機能またはそれ以下の単位に関しては、上記が当てはまりますが、作者がアルゴリズムについて考える、またはアルゴリズムを設計することを単に意味する場合もあります。特定の使用法に依存します。


余談ですが、これらの事柄のいくつかについてどのように推論し、どのように経験的観察を行うことができるかのいくつかの例を示します。

正しさ:コードが正しいことを示すことができれば、コードが正しいことを証明できます。したがって、並べ替え関数の場合、指定したリストに並べ替えのプロパティがあることを示すことができれば、コードが正しいことがわかります。経験的に、ユニットテストスイートを作成して、コードの入力例を提供し、コードに目的の出力があることを確認できます。

パフォーマンスとスケーラビリティ:コードを分析し、アルゴリズムのパフォーマンスの限界を証明できるため、所要時間が入力のサイズにどのように依存するかがわかります。経験的に、コードをベンチマークし、特定のマシンで実際に実行される速度を確認できます。負荷テストを実行し、折りたたむ/実用的でなくなる前に、マシン/アルゴリズムが実際の入力にどれだけ取ることができるかを確認できます。

45
Jakub Hampl

コードについての推論は、Wordの最も緩い意味で、コードとそれについて本当に考えることを意味しますは(あなたがそれをするべきだと思うことではありません。)

  • コードの動作を意識して、データをそこにスローすると、
  • 知っているそれを壊すことなくリファクタリングできるもの、そして
  • タブを維持する実行できる最適化の種類

とりわけ。私にとって、推論の部分は、デバッグやリファクタリングをするときに最大の役割を果たします。

あなたが言及した例を使用するには:参照透過性は、関数の何が問題かを理解しようとするときに非常に役立ちます。参照の透明性により、関数をいろいろと調べてさまざまな引数を与えているときに、関数がプログラム内で同じように反応することがわかります。それはその引数以外には何も依存しません。これにより、関数の推論が容易になります。関数が、私の鼻の下で変化する可能性のある外部変数に依存する可能性がある命令型言語とは対照的です。

それを見る別の方法(これはリファクタリングの際により役立ちます)は、コードが特定のプロパティを満たすことを知っているほど、推論が容易になるということです。例えば、私は知っています

map f (map g xs) === map (f . g) xs

これは、リファクタリング時に直接適用できる便利なプロパティです。 Haskellコードのそのようなプロパティを記述できるという事実は、推論を容易にします。このプロパティをPythonプログラムで宣言することもできますが、fの選択が不運だった場合、 g結果は大きく異なる場合があります。

23
kqr

非公式には、「コードを見ただけでプログラムが何をするかを知ることができる」という意味です。副作用、キャスティング、暗黙の変換、オーバーロードされた関数と演算子などにより、これはほとんどの言語で驚くほど難しい場合があります。与えられた入力に対して行います。

14
John Wiegley

通常、人々が「推論」と言うとき、それらは「等式推論」を意味します。これは、コードを実行することなく、コードに関するプロパティを証明することを意味します。

これらのプロパティは非常に単純です。たとえば、次の(.)およびidの定義があるとします。

id :: a -> a
id x = x

(.) :: (b -> c) -> (a -> b) -> (a -> c)
(f . g) = \x -> f (g x)

...次に、それを証明する必要があります。

f . id = f

これは、次の理由で簡単に証明できます。

(f . id) = \x -> f (id x) = \x -> f x = f

allfでこれを証明したことに注目してください。つまり、このプロパティは何があっても常にtrueであることを知っているため、ある種の単体テストスイートでこのプロパティをテストする必要はありません。失敗することはないからです。

12

「プログラムについての推論」は、単に「プログラムを分析してそれが何をするかを確認する」ことです。

純粋さは、人間がプログラムを変更したり、機械がプログラムをコンパイルしたり、壊れたコーナーケースについてプログラムを分析したりすることによって、理解を単純化するという考え方です。

9
nponeccop

@John Wiegleyが言ったように、手段についての理由

コードを見ただけでプログラムが何をするかがわかる

より重要なのは、理解することです私たちがコードについて推論するのを妨げているもの。これらは副作用です。

0
Alexandr