Bagaimana kita tahu bahwa metode formal berfungsi?

20

Tujuan penting dari metode formal adalah untuk membuktikan kebenaran sistem, baik dengan cara otomatis atau yang diarahkan manusia. Namun, tampaknya bahkan jika Anda dapat memberikan bukti kebenaran, Anda TIDAK mungkin dapat menjamin bahwa sistem tidak akan gagal. Sebagai contoh:

  • Spesifikasi mungkin tidak memodelkan sistem dengan benar, atau sistem produksi mungkin terlalu rumit untuk dimodelkan, atau sistem mungkin cacat secara inheren karena persyaratan yang bertentangan. Teknik apa yang diketahui untuk menguji apakah suatu spesifikasi masuk akal sama sekali?
  • Proses pembuktian mungkin juga cacat! Siapa yang tahu bahwa aturan inferensi itu benar dan sah? Selain itu, buktinya bisa sangat besar, dan bagaimana kita tahu mereka tidak mengandung kesalahan? Ini adalah jantung dari kritik di de Millo, Lipton, dan Perlis "Proses Sosial dan Bukti Teorema dan Program". Bagaimana para peneliti metode formal modern merespons kritik ini?
  • Saat runtime, ada banyak kejadian dan faktor nondeterministik yang dapat secara serius mempengaruhi sistem. Sebagai contoh, sinar kosmik dapat mengubah RAM dengan cara yang tidak dapat diprediksi, dan lebih umum kami tidak memiliki jaminan bahwa perangkat keras tidak akan mengalami kesalahan Bizantium, yang telah terbukti Lamport sangat sulit untuk dikuatkan. Jadi kebenaran sistem statis tidak menjamin sistem tidak akan gagal! Apakah ada teknik yang diketahui bertanggung jawab atas kesalahan perangkat keras yang sebenarnya?
  • Saat ini, pengujian adalah alat paling penting yang kami miliki untuk menetapkan bahwa perangkat lunak berfungsi. Sepertinya itu harus menjadi alat pelengkap dengan metode formal. Namun, saya kebanyakan melihat penelitian yang berfokus pada metode formal atau pengujian. Apa yang diketahui tentang menggabungkan keduanya?
Jenny
sumber
4
Masalah 1 dan 3 tampaknya melekat pada analisis sistem, apa pun metodenya. Metode formal setidaknya membuatnya jelas, tidak seperti metode lain. Edisi 2 tidak ada sejauh yang saya tahu; sistem formal yang saya lihat digunakan terbukti benar; Anda dapat mengacaukan setiap sistem deduksi dengan mengubahnya sendiri dan membuat kesalahan, tentu saja.
Raphael
8
Pertanyaan ini diutarakan agak subyektif, dan dengan cara memancing. Saya akan merekomendasikan pengulangan atau penutupan.
Suresh Venkat
4
Saya membuat beberapa revisi besar untuk membuat pertanyaan lebih berguna dalam penilaian saya. Jika menurut Anda ini perubahan yang terlalu agresif, silakan kirim dalam meta.
Neel Krishnaswami
1
@Neel: Suntingan yang bagus. Satu hal yang dihilangkan oleh perubahan Anda adalah referensi ke keamanan sistem, yang merupakan bagian dari inti dari pertanyaan awal. Mungkin Jenny bisa memasukkannya kembali, untuk membuatnya kembali menjadi pertanyaannya.
Dave Clarke
1
Adapun peluru baru 4: Kesalahpahaman besar: pengujian (realistis) tidak pernah bisa menunjukkan tidak adanya kesalahan.
Raphael

Jawaban:

11

Mengenai 4: Ada banyak pekerjaan yang menggabungkan metode formal dan pengujian. "Pengujian metode formal" Google mengungkapkan pekerjaan yang cukup besar. Meskipun ada banyak tujuan berbeda dari pekerjaan tersebut, salah satu tujuan utama adalah untuk menghasilkan ruang tes yang lebih efektif. Pembicaraan ini memberikan pengantar yang bagus, berdasarkan pengecekan model.

Juga mengenai masalah keamanan perangkat lunak , yang telah diedit dari pertanyaan: metode formal perlu bekerja lebih keras untuk disampaikan di ranah itu. Biasanya seseorang menulis spesifikasi untuk perangkat lunak dan memverifikasi bahwa spesifikasi terpenuhi, yaitu, ketika input memenuhi prasyarat bahwa output memenuhi postkondisi. Untuk memastikan perangkat lunak yang aman, orang juga perlu memeriksa juga bahwa perangkat lunak berperilaku bijaksana untuk input yang tidak memenuhi persyaratan. (Ini tentu saja setara dengan pengaturan prasyarat menjadi true untuk semua input.) Ruang semua input biasanya jauh lebih besar dari sekadar input yang dibentuk dengan baik, tetapi biasanya ini adalah satu tempat di mana bahkan perangkat lunak yang berfungsi secara fungsional dapat dilanggar, hanya dengan melanggar asumsinya.

Mengenai poin 3: Beberapa pekerjaan telah dilakukan untuk memverifikasi sistem dalam pengaturan di mana kesalahan dimodelkan secara eksplisit, termasuk Kesalahan Logika: Penalaran Tentang Program toleran-kesalahan. Matthew Meola dan David Walker. Simposium Eropa tentang Pemrograman, 2010. Bekerja pada pengecekan model probabilistik dan verifikasi probabilistik tentunya keduanya juga menangani masalah kesalahan sampai tingkat tertentu.

Dave Clarke
sumber
9

Urutan poin Anda:

  • Kebenaran semua spesifikasi pada akhirnya bersifat subyektif: mereka dianggap mampu memecahkan masalah dengan benar menurut penggunanya atau tidak. Tidak ada jalan keluar dari ini pengembangan perangkat lunak, dan tidak ada metode yang memiliki peluru perak untuk yang satu ini.
  • Banyak pekerjaan membuktikan bahwa prosesnya benar sehubungan dengan asumsinya. Biasanya ada informasi yang tersedia bagi para ahli untuk memvalidasi aturan-aturan ini. Setiap aktivitas manusia dapat mengalami kesalahan tetapi sistem yang sangat formal yang menggunakan pendekatan yang dipelajari dengan baik jauh lebih sedikit mengalami kesalahan daripada hampir semua proses manusia lainnya.
  • Pada titik tertentu, sistem apa pun memiliki mode kegagalan di luar ruang lingkup sistem itu. Anda masih lebih baik menghilangkan semua sumber kesalahan yang dapat diprediksi , bahkan jika Anda membiarkan beberapa sumber yang tidak dapat diprediksi tidak ditemukan.
  • Menguji dan membuktikan dapat dengan mudah hidup berdampingan. Pengujian adalah proses yang kurang spesifik, lebih ad hoc , sehingga Anda mungkin menemukan lebih sedikit pekerjaan formal yang dilakukan. Tetapi Anda mungkin tertarik pada alat seperti QuickCheck yang melengkapi dengan menguji bukti yang ditawarkan oleh sistem jenis Haskell.
Marc Hamann
sumber
9

Metode formal telah terbukti berhasil dengan sangat baik. Tanpa mereka, kita tidak akan mampu mengatasi kompleksitas merancang sistem digital modern (mikroprosesor).

Tidak ada kapal mikro tanpa logikanya yang tunduk pada verifikasi kesetaraan fungsional; tanpa FPU yang menjadi subjek FV; tanpa protokol koherensi cache yang menjadi sasaran FV (ini telah terjadi sejak 1995).

Kecuali perbedaan yang jelas antara perangkat lunak dan sistem fisik yang direkayasa (misalnya jembatan, tempat seseorang dapat menambahkan faktor keamanan), mereka memainkan peran matematika teknik dalam CS. Namun, penggunaan FM selalu tergantung pada manfaat / biaya. Pengujian fuzz memberi hasil besar di perusahaan-perusahaan seperti Microsoft (Google SAGE dalam satu slide).

Bahkan di dalam mikro, terdapat subsistem (mis. Pipeline mikroprosesor), di mana FV tidak memiliki dampak yang sama seperti di tempat lain (misalnya FPU, di mana pengujian konvensional tidak dilakukan sama sekali dalam banyak kasus ketika evaluasi lintasan simbolik formal membuktikan tidak adanya bug. : Kaivola et al CAV'09).

Metode formal juga digunakan dalam sintesis artefak (kode, tes berkualitas tinggi, jadwal untuk menguras bank baterai secara optimal, ...). Tentu saja, semua masalah yang diangkat dalam pertanyaan cukup valid, dan seperti dalam penggunaan teknologi lainnya, iklan palsu harus dikenali dan dihindari.

Ganesh
sumber
8

Mengenai 2: jika sistem diformalkan dalam asisten bukti (misalnya, Twelf atau Agda atau Coq) dan sifat kesehatan dan kelengkapan diverifikasi, dan bukti dilakukan dalam pengkodean ini, ini bukan masalah. Anda mungkin telah memformalkan suatu sistem yang tidak menggambarkan apa yang Anda maksudkan, tetapi setidaknya Anda tidak akan memiliki bukti yang salah atau sistem yang rusak di mana Anda beralasan.

Jamie Morgenstern
sumber
1
Juga, ada sesuatu yang dikenal sebagai "kecukupan" pengkodean Anda: bahwa apa yang telah Anda formalkan dalam asisten bukti sebenarnya adalah sistem yang Anda tulis di atas kertas (lihat twelf.plparty.org/wiki/Adequacy ). Ini bukan, bagaimanapun, membahas poin pertama Anda, itu membangun sebuah peninggalan.
Jamie Morgenstern
6

Namun, tampaknya bahkan jika Anda dapat memberikan bukti kebenaran, Anda TIDAK mungkin dapat menjamin bahwa sistem tidak akan gagal.

Ya, mungkin tidak ada jaminan . Metode formal dimaksudkan untuk menemukan dan menghilangkan kesalahan dan untuk meyakinkan manusia.

Teknik apa yang diketahui untuk menguji apakah suatu spesifikasi masuk akal sama sekali?

Anda mungkin tertarik pada alat pengecekan model untuk spesifikasi sistem formal .

Proses pembuktian mungkin juga cacat! Siapa yang tahu bahwa aturan inferensi itu benar dan sah?

Saya pikir (karena teorema ketidaklengkapan Goedel) menunjukkan sistem aturan inferensi secara konsisten tentu menarik bagi seperangkat aturan inferensi yang bahkan lebih kuat.

Selain itu, buktinya bisa sangat besar, dan bagaimana kita tahu bahwa mereka tidak mengandung kesalahan?

Mudah-mudahan, bukti besar diperiksa oleh pemeriksa bukti kecil yang dapat dibaca dan dipahami oleh manusia dalam jumlah waktu yang wajar. Ini kadang-kadang disebut "kriteria de Bruijn". Jika Anda percaya bahwa pemeriksa bukti tidak akan mengesahkan bukti yang salah, Anda hanya perlu memeriksa pemeriksa.

Apakah ada teknik yang diketahui bertanggung jawab atas kesalahan perangkat keras yang sebenarnya?

Bagaimana dengan bahasa assembly yang diketik dari kesalahan toleransi ?

Namun, saya kebanyakan melihat penelitian yang berfokus pada metode formal atau pengujian. Apa yang diketahui tentang menggabungkan keduanya?

"Konferensi TAP dikhususkan untuk konvergensi bukti dan tes" .

Hanya googling untuk "bukti dan tes" memiliki beberapa hit yang baik di atas flip.

jbapple
sumber
5

Teknik apa yang diketahui untuk menguji apakah suatu spesifikasi masuk akal sama sekali?

Ini jelas merupakan panggilan penilaian. Dalam rekayasa perangkat lunak, orang telah merancang metodologi yang sangat ketat untuk menemukan / menulis / mengkonfirmasi spesifikasi. Ini dilakukan oleh manusia nyata dan menggunakan non formal (dalam arti non matematis proses), sehingga masih tunduk pada inkonsistensi, tetapi pada akhirnya, itu sesuai dengan apa yang orang ingin verifikasi, tidak lebih tidak kurang.

Apakah ada teknik yang diketahui bertanggung jawab atas kesalahan perangkat keras yang sebenarnya?

Tentu, ada bidang verifikasi yang dikenal sebagai verifikasi runtime , Anda juga dapat menggunakan model pengecekan berbasis eksekusi pada sistem nyata yang berjalan pada lingkungan yang benar-benar virtual yang tunduk pada skenario tertentu (saya berkontribusi sendiri untuk ini dengan V-DS + APMC ). Namun, ini jelas merupakan masalah besar untuk menambahkan interaksi antara sistem dan lingkungan ke dalam proses verifikasi.

Namun, saya kebanyakan melihat penelitian yang berfokus pada metode formal atau pengujian. Apa yang diketahui tentang menggabungkan keduanya?

Wow, hari ini aku akan benar-benar tak tahu malu dan mengutip diriku lagi. Dengan penulis bersama kami berupaya menggabungkan pemeriksaan dan pengujian model, Anda dapat melihat daftar publikasi mantan mahasiswa PhD grup kami atau mencari "perkiraan model probabilistik" atau "pengecekan model statistik" di mesin pencari yang baik (pekerjaan yang dilakukan oleh Younes dkk., Sen dkk. Atau saya sendiri dkk. Dan banyak lainnya).

Sylvain Peyronnet
sumber
iklan 1: Perhatikan bahwa kebutuhan akan formulasi spesifikasi formal diharapkan untuk membantu bagian subyektif sebagai lawan dari formulasi dalam bahasa alami. Dengan harus sangat tepat, ketidakkonsistenan dan ketidakpastian terlihat dan harus diselesaikan.
Raphael
Prosesnya tidak formal, tetapi hasilnya, untuk pengecekan model, biasanya formula temporal (LTL atau CTL misalnya). Dalam pengalaman saya (dengan orang-orang dari industri), menggunakan bahasa formal tidak serta merta meningkatkan konsistensi hasilnya :(
Sylvain Peyronnet
Tetapi setidaknya Anda dapat memeriksa ketidakkonsistenan, bukan? Apa pengalaman Anda tentang "mendapatkan apa yang Anda inginkan"?
Raphael
2
Ya, saya dapat memeriksa inkonsistensi, tetapi sayangnya itu tidak selalu membantu menyelesaikannya. Masalahnya adalah sangat sulit bagi kebanyakan insinyur / perancang industri untuk menulis spesifikasi dalam bahasa verifikasi klasik. Pendapat saya adalah, jika Anda tidak memiliki pengetahuan yang mendalam tentang bahasa spesifikasi, menggunakannya akan memandu Anda terlalu banyak: Anda akhirnya hanya menulis apa yang dapat Anda tulis dengan sedikit keakraban bahasa tersebut. Singkatnya, itu membunuh kreativitas Anda.
Sylvain Peyronnet