web-dev-qa-db-ja.com

テストに代わるものはありませんか?

Entscheidungsproblem 1926年に異議申し立てを行い、

実際に証明を行わなくても証明を解決できるかどうかを確認するアルゴリズムを作成できますか?

Alan Turingは、彼の論文で次のように述べて、彼の停止問題をこの問題に削減しました: "各コンピューティングマシン「それ」に対応して、式「Un(it)」を作成します。 「Un(it)」が証明可能かどうかを判断する一般的な方法があります。次に、「Un」が0を出力するかどうかを判断する一般的な方法があります

したがって、問題の解決策の証明として機能するプログラム(アルゴリズム)は、問題を計算可能とすることを意味します。

しかし、その証明をテストすることで実際に検証し、プログラムが実際にその要件を満たし、目的の操作を実行する場合、動作しているプログラムはソリューションの証明と見なされます。


以下は、要件と許容パラメータを含む一般的なユースケーステンプレートです。アジャイルSCRUMフレームワークでは、user storyを使用できます。

enter image description here

契約による設計 のようなアプローチでソリューションを設計して、バグのないソリューションを作成することはできませんか?テストを避けるために。

3
user1787812

Haskellのような言語には、特定の種類のエラーを排除できる非常に高度な型システムがあります。自分でタイプを正しく取得できれば、Haskellプログラムは最初の試行で正しく実行されることが多いと聞いたことがあります(私自身は経験していません)。

とはいえ、いいえ、テストに代わるものはありません。その理由は、すべての重要なソフトウェアシステムにも要件の仕様があり、要件が満たされていることを証明するためのテストが必要だからです。受け入れテストのない要件は、まったく要件ではありません。彼らは願いです。

10
Robert Harvey

私は主題についてほとんど知らないと思いましたが、あなたは2つの異なる概念を混ぜていると思います:

  • 理論的な問題を解決できない
  • バグ

あなたの引用は理論的な問題を解決することについてですが、あなたはバグのないプログラムを求めています。通常、理論的な問題の解決では、コンピュータの「物理的/実際の」問題は考慮されません。もちろん、顧客向けのアプリケーションを作成するときに、ソリューションがこれらの物理的な問題の1つに遭遇した場合、アルゴリズムが理論的に機能していても、「バグ」と呼ばれるものになります。したがって、バグは次のようになります。

  • 指定された問題を適切に解決しないもの(まったくない、エッジケース...)
  • 時間パフォーマンス:アルゴリズムは機能しますが、本番環境では実行に時間がかかりすぎます。
  • メモリ消費:OOMエラー
  • スペースパフォーマンス:データを書き込み、スペースがなくなった。
  • 数値の精度(浮動小数点...)が0で除算すると、誤った結果になってしまう...
  • ...

結論としては、せいぜい、これらの「物理的」問題のすべてが存在せず、それ以上存在しない完全な世界でアルゴリズムが何を行うかを伝えることができることを証明することができます。

これは DailyWTFリファレンス に関する問題です。

5
Walfrat

非常に広い意味で、テストに代わるものがあり、あなたはそれを提案しました。ただし、実際の生活と同様に、代替品は代替品よりも劣っていることがよくあります。

あなたが質問している質問は、 哲学 に長い歴史があり、その議論では経験主義が主な信念になっています。私たちが今理解しているように、それは科学の中核です。

彼の時代の偉大な科学哲学者、エンペドクレスは ビジョンの放出理論 を作成しました。この理論は、視覚は目から放射された光線の結果であると考えていました。それは論理的に健全であり、プラトンのような本当に賢い人々によって何世紀にもわたって正しいと考えられていました。しかし、これは完全に間違っていることがわかりました。純粋な推論を使用して結論を​​出すときは、いくつかの仮定を行う必要があります。それを回避する方法はありません。そして、失敗につながる可能性があるのは、これらの仮定です。

契約による設計を使用して正しいソリューションを「証明」し、ツールを使用してソフトウェアを作成できるとします。ツールにバグがないことを前提としています。 Walfratは他にも考えられる多くの落とし穴を列挙しています。プリンの証拠が食事にあることは避けられません。

4
JimmyJames

はい、この種のソフトウェアは、航空電子工学および規制で必要とされるその他の分野向けに作成されています。契約による設計は、その方法とは厳密には一致しませんが、おそらく作成しているソフトウェアの種類にとっては、これは良いアプローチです。証明の階層を作成します。

  • 最低レベルのタイプの前提条件、事後条件、および不変条件。
  • 最下位レベルのタイプが正しいことを証明できる必要があります。理想的には、手動ではなく自動化ツールを使用します。つまり、契約言語が必要です。
  • より高いレベルのタイプは、より低いレベルのタイプによって提供される証明に基づいて、より高いレベルの不変量を持っています。
  • アプリケーションレベルでは、アプリケーションの不変条件を証明できます。

適切なツールを使用すると、以前に実績のある正しいコンポーネントを組み合わせて、実績のあるプログラムを作成できます。しかし、あなたはこれをもはやソフトウェアを書くこととは思わないかもしれません...あなたはグラフィカルツールだけを使っているかもしれません。

あなたの質問と、典型的なソフトウェア開発を使用して継続的に導入された脆弱性のタイプ(つまり、証明の代わりにテスト)の両方に関連する興味深いプロジェクトを次に示します。 https://project-everest.github.io/ =

2
Frank Hileman

始める前に、言及する価値があると思います Philip Wadler の「 タイプとしての命題 」は、最初に重点を置いた計算可能性理論の初期の歴史の優れた概要を提供します-orderロジック。 ビデオプレゼンテーション もあります。このトピックに興味のある方はビデオを見て、論文を読むことを強くお勧めします。

アランチューリングは、彼の論文で次のように述べて、彼の停止問題をこの問題に削減しました。「各コンピューティングマシンに対応して、「それは」式を作成し、それを判断する一般的な方法がある場合、 Un(it) 'が証明可能な場合、' it 'が0を出力するかどうかを判断する一般的な方法があります。

はい、Entscheidungsproblemが計算可能であれば、停止問題は計算可能です。停止の問題は計算不可能であることが証明されているため、Entscheidungsproblemは計算不可能です。つまり、任意のプログラムが正しいかどうかを証明する一般的なアルゴリズムは存在しません。ただし、someプログラムが正しいかどうかを証明するアルゴリズムが存在しないという意味ではありません。

したがって、問題の解決策の証明として機能するプログラム(アルゴリズム)は、問題を計算可能とすることを意味します。

「動作する」が「正しい」(停止条件を含む)を意味する場合、はい、問題を解決する証明可能な正しいアルゴリズムは、問題が計算可能であることの証明であると言えます。しかし、プログラムが正しいことをどのようにして知っていますか?その正しさを証明するための一般的なアルゴリズムはあり得ないことがわかっています。これには、2つのオプションがあります。

  • 私たち自身で証明を行うことができます(試みます)。ただし、Entscheidungsproblemの計算能力がないため、証明できないものがあります。これらの問題のいずれかに遭遇した場合、正式な証明は行き止まりです。さらに、証明できないものを証明しようとしているifを(一般に)知る方法はありません。したがって、解決できない問題に向けて、リソースをいくらでも費やすことができます。
  • プログラム(および問題)を、自動的に証明を行うアルゴリズムがある問題のサブセットとして表現する(試行する)ことができます。ただし、proverが正しいことを証明する必要があることに注意してください。したがって、最終的には、誰かが手作業で証明を行う必要があります。

理論的に可能な場合でも、どちらのオプションも非常に時間がかかります。上記のいずれかを実行できない(または実行したくない)場合は、実際にテストするだけで済みます。可能な入力の少なくともsomeに対して正しい結果が生成されることを確認することにより、ある程度包括的な証明を近似します。

さらに、正しさの正式な証明が対処しない多くの実用的な側面があります。それらのいくつかは次のとおりです。

  • 時間と空間のパフォーマンス。証明可能な正しいプログラムが宇宙の熱死の前に結果を計算しない場合、それは私たちに何の役にも立ちません。または、スタックオーバーフローが原因で失敗した場合。または、メインメモリまたはその他のリソースを使い果たした場合。実用的であるためには、これらの特性も証明する必要があります。理論的な正確さ自体は十分ではありません。
  • 自動校正システムに問題を正しく表現しましたか?つまり、私たちは実際に私たちが解決している問題を考えています
  • 正しい問題を解決していますか?それが間違った問題を解決するならば、証明可能な正しいプログラムは役に立たない。
  • 要件が変わるたびに、問題は変わります。したがって、どのような変更でも問題の再定式化と正確性の新しい証明が必要です。

これが、業界で正式な証明に向けたプッシュが比較的少ない理由だと思います。ただし、これは証明を決して使用しないという意味ではありません。たとえば、静的型チェックは、プログラムが適切に型指定されていることを証明するために使用されます。これにより、特定の種類のエラーを排除できますが、それだけですべてのエラーを除外することはできません。

場合によっては、プログラムがすべての可能な入力に対して正しい結果を生成することを確認することによって、プログラムが正しいことを証明することが可能です。そのような場合、テスト自体が実際に正当性の証明となります。ただし、ほとんどの場合、そのような戦略を実用的(または可能性)にするには、入力スペースが大きすぎます(または無限大でさえあります)。したがって、一般に、テストによってプログラムが正しいことを証明することは不可能です

ただし、テストによってプログラムが正しくないことを証明できます。これは、テストの失敗を観察することで発生します。したがって、テストの有用性は、「有用な」プロパティをカバーする「優れた」テストと、「それらの多く」を持つことに帰着します。テストは手動で作成できますが、それほど多くはありません。テストしたい明確に定義されたプロパティがある場合、 QuickCheck などのツールを使用して、多くのテストを自動的に生成できます。

したがって、契約による設計は、一般に、replaceテストではなく、complimentsそれ。

1
Nathan Davis

したがって、問題の解決策の証明として機能するプログラム(アルゴリズム)は、問題を計算可能とすることを意味します。

はい、問題を解決するプログラムがある場合-問題は計算可能であることを証明しました。

しかし、その証明をテストすることで実際に検証し、プログラムが実際にその要件を満たし、目的の操作を実行する場合、動作しているプログラムはソリューションの証明と見なされます。

まあ-あなたのプログラムはさまざまな入力(特にエッジの場合)に対して正しく動作する必要があります。そして、プログラムが期待される出力を別の入力に返すかどうかを確認することは...テストです。

そして、プログラムがすべての入力に対して機能することを証明することは、ほとんどの場合不可能である...または少なくとも非常に難しい。したがって、テストはより現実的なアプローチです。

0
Grzegorz