Bagaimana Anda memeriksa jika dua algoritma (katakanlah, Urutkan gabungan dan Urutkan naif) mengembalikan hasil yang sama untuk input apa pun, ketika set semua input tidak terbatas?
Pembaruan: Terima kasih, Ben, karena telah menjelaskan bagaimana ini tidak mungkin dilakukan secara algoritmik dalam kasus umum. Jawaban Dave adalah ringkasan yang bagus dari metode algoritmik dan manual (tergantung pada kecerdasan manusia dan metafora) yang tidak selalu berfungsi, tetapi cukup efektif.
computability
formal-methods
software-engineering
software-verification
Andres Riofrio
sumber
sumber
Jawaban:
Berbeda dengan apa yang dikatakan oleh para penentang, ada banyak teknik yang efektif untuk melakukan ini.
Bisimulasi adalah satu pendekatan. Lihat misalnya, makalah Gordon tentang Coinduction and Functional Programming .
Pendekatan lain adalah dengan menggunakan teori operasional kesetaraan program, seperti karya Pitts .
Pendekatan ketiga adalah memverifikasi bahwa kedua program memenuhi spesifikasi fungsional yang sama. Ada ribuan makalah tentang pendekatan ini.
Pendekatan keempat adalah menunjukkan bahwa satu program dapat ditulis ulang menjadi yang lain menggunakan transformasi program suara .
Tentu saja tidak satu pun dari metode ini yang lengkap karena tidak dapat dipastikan, tetapi volume dan volume pekerjaan telah diproduksi untuk mengatasi masalah tersebut.
sumber
Untuk sedikit menguraikan pernyataan "tidak mungkin", inilah sketsa bukti sederhana.
Kita dapat memodelkan algoritma dengan output oleh Turing Machines yang berhenti dengan output mereka pada rekaman mereka. Jika Anda ingin memiliki mesin yang dapat berhenti dengan menerima dengan output pada rekaman mereka atau menolak (dalam hal ini tidak ada output), Anda dapat dengan mudah membuat pengkodean yang memungkinkan Anda untuk memodelkan mesin ini dengan "berhenti atau berhenti tidak, tidak ada mesin "tolak".
Sekarang, anggap saya memiliki algoritma P untuk menentukan apakah dua TM seperti itu memiliki output yang sama untuk setiap input. Kemudian, diberi TM A dan input X , saya bisa membuat TM B baru yang beroperasi sebagai berikut:
Sekarang saya dapat menjalankan P pada A dan B . B tidak berhenti pada X , tetapi memiliki output yang sama dengan A untuk semua input lainnya, jadi jika dan hanya jika A tidak berhenti pada X maka kedua algoritma ini memiliki output yang sama untuk setiap input. Tetapi P diasumsikan dapat mengetahui apakah dua algoritma memiliki output yang sama untuk setiap input, jadi jika kita memiliki P kita dapat mengetahui apakah mesin arbitrase berhenti pada input yang sewenang-wenang, yang merupakan Masalah Pemutusan. Karena Masalah Pemutusan diketahui tidak dapat diputuskan, P tidak bisa ada.
Ini berarti tidak ada pendekatan umum (yang dapat dihitung) untuk menentukan apakah dua algoritma memiliki output yang sama yang selalu berfungsi, jadi Anda harus menerapkan penalaran khusus pada pasangan algoritma yang Anda analisis. Namun dalam praktiknya mungkin ada pendekatan komputasi yang bekerja untuk kelas besar algoritma, dan pasti ada teknik yang dapat Anda gunakan untuk mencoba mencari bukti untuk kasus tertentu. Jawaban Dave Clarke memberi Anda beberapa hal yang relevan untuk dilihat di sini. Hasil "ketidakmungkinan" hanya berlaku untuk merancang metode generik yang akan menyelesaikan masalah sekali dan untuk semua, untuk semua pasangan algoritma.
sumber
Secara umum itu tidak mungkin, tetapi banyak kendala yang memungkinkan. Misalnya, Anda dapat memeriksa kesetaraan dua program kode garis lurus menggunakan BDD. Eksekusi simbolis dapat menangani banyak kasus lainnya.
sumber
Tidak mungkin untuk merancang algoritma yang membuktikan kesetaraan ini secara umum. Petunjuk: pengurangan dari masalah Berhenti.
sumber