Singkatnya : Algoritma adalah bagian konstruktif dari bukti konstruktif bahwa masalah yang diberikan memiliki solusi. Motivasi untuk definisi ini adalah isomorfisma Curry-Howard antara program dan bukti, mengingat bahwa suatu program hanya memiliki minat jika menyelesaikan masalah, tetapi terbukti demikian. Definisi ini memungkinkan untuk lebih banyak abstraksi, dan membiarkan beberapa pintu terbuka mengenai jenis domain yang mungkin diperhatikan, misalnya mengenai sifat-sifat keterbatasan.
Peringatan . Saya mencoba menemukan pendekatan formal yang tepat untuk menjawab pertanyaan. Saya pikir itu diperlukan, tetapi tampaknya tidak ada pengguna yang menjawab sejauh ini (termasuk saya, dan beberapa lebih atau kurang eksplisit tentang hal itu di pos lain) memiliki latar belakang yang tepat untuk mengembangkan masalah dengan benar, yang terkait dengan matematika konstruktif, teori bukti, teori jenis dan hasil seperti isomorfisma Curry-Howard antara bukti dan program. Saya melakukan yang terbaik di sini, dengan potongan pengetahuan apa pun yang saya miliki (yakini) miliki, dan saya terlalu menyadari keterbatasan jawaban ini. Saya hanya berharap memberikan beberapa petunjuk tentang bagaimana jawaban saya seharusnya. Jika Anda melihat suatu hal yang jelas salah secara formal (terbukti), izinkan saya sekarang dalam komentar - atau melalui email.
Mengidentifikasi beberapa masalah
Cara standar untuk mempertimbangkan suatu algoritma adalah dengan menyatakan bahwa suatu algoritma adalah program yang ditentukan secara sewenang-wenang untuk beberapa perangkat komputasi , termasuk yang tidak memiliki batasan dalam memori. Bahasa ini mungkin juga merupakan bahasa mesin komputer. Sebenarnya itu sudah cukup untuk mempertimbangkan semua program untuk perangkat komputasi lengkap Turing (yang menyiratkan tidak memiliki keterbatasan memori). Ini mungkin tidak memberi Anda semua presentasi algoritma, dalam arti bahwa algoritma harus diekspresikan dalam bentuk yang tergantung pada detailnya pada konteks interpretasi, bahkan teoretis, karena semuanya didefinisikan hingga beberapa pengkodean. Tetapi, karena ia akan menghitung semua yang harus dikomputasi, ia akan mencakup semua algoritma, hingga penyandian.
π
π, mungkin dalam arti matematika hampir semua. Tetapi itu membutuhkan ketelitian dalam definisi.
Jadi pertanyaan sebenarnya adalah mengetahui apa saja algoritma yang bermakna. Jawabannya adalah bahwa algoritma yang bermakna adalah yang memecahkan masalah, menghitung langkah demi langkah "solusi", "jawaban", untuk masalah itu. Algoritma menarik jika dikaitkan dengan masalah yang dipecahkannya.
Jadi diberi masalah formal bagaimana kita mendapatkan algoritma yang memecahkan masalah. Apakah secara eksplisit atau implisit, algoritma dikaitkan dengan gagasan bahwa ada solusi untuk masalah tersebut, yang dapat dibuktikan benar. Apakah teknik pembuktian kami akurat atau tidak, adalah masalah lain, tetapi kami setidaknya mencoba meyakinkan diri sendiri. Jika Anda membatasi diri pada matematika konstruktif, yang sebenarnya harus kita lakukan (dan merupakan kendala aksiomatik yang dapat diterima untuk sebagian besar matematika), cara untuk membuktikan keberadaan solusi adalah melalui langkah-langkah bukti yang benar-benar memperlihatkan konstruk yang mewakili solusi, termasuk kemungkinan langkah-langkah lain yang membuktikan kebenarannya.
Semua programmer berpikir sesuatu seperti: jika saya mengutak-atik data dengan cara ini dan itu, maka saya mendapatkan widget ini yang hanya memiliki sifat yang tepat karena teorema Sesame, dan menjalankan transformasi foo-preserving ini saya mendapatkan jawaban yang diinginkan . Tetapi buktinya biasanya informal, dan kami tidak mengerjakan semua detail, yang menjelaskan mengapa satelit mencoba mengorbit Mars di bawah tanah (di antara hal-hal lain). Kami melakukan banyak alasan, tetapi kami hanya menyimpan bagian konstruktif yang membangun solusi, dan kami menggambarkannya dalam bahasa komputer sebagai algoritme yang memecahkan masalah.
Algoritma (atau program) yang menarik
Semua ini untuk memperkenalkan ide-ide berikut, yang merupakan objek dari banyak penelitian saat ini (yang saya bukan spesialis). Gagasan " algoritma menarik " yang digunakan di sini adalah milik saya, diperkenalkan sebagai tempat penampung informal untuk definisi yang lebih akurat.
Algoritma yang menarik adalah bagian konstruktif dari bukti konstruktif bahwa masalah yang diberikan memiliki solusi . Itu berarti bahwa buktinya harus benar-benar menunjukkan solusi daripada sekadar membuktikan keberadaannya, misalnya dengan kontradisi. Untuk lebih jelasnya lihat Intuitionistic Logic dan Constructivism in Mathematics.
Ini tentu saja definisi yang sangat terbatas, yang hanya mempertimbangkan apa yang saya sebut algoritma yang menarik. Jadi itu mengabaikan hampir semua dari mereka. Tapi begitu juga semua buku teks kami tentang algoritma. Mereka mencoba mengajar hanya beberapa yang menarik.
Mengingat semua parameter masalah (input data), ini memberi tahu Anda cara mendapatkan hasil yang ditentukan langkah demi langkah. Contoh tipikal adalah resolusi persamaan ( algoritma nama sebenarnya berasal dari nama ahli matematika Persia, Muḥammad ibn Mūsā al-Khwārizmī , yang mempelajari resolusi beberapa persamaan). Bagian dari bukti digunakan untuk menetapkan bahwa beberapa nilai yang dihitung dalam algoritma memang memiliki beberapa properti, tetapi bagian ini tidak perlu disimpan dalam algoritma itu sendiri.
Tentu saja, ini harus terjadi dalam kerangka kerja logis formal yang menetapkan apa yang dihitung dengan data, apa langkah-langkah komputasi dasar yang diizinkan, dan apa aksioma yang digunakan.
Kembali ke contoh faktorial Anda, mungkin ditafsirkan sebagai suatu algoritma, meskipun yang sepele. Fungsi faktorial normal sesuai dengan bukti bahwa, diberikan beberapa kerangka aritmatika, dan diberi bilangan bulat, ada angka yang merupakan produk dari bilangan bulat n pertama. Ini cukup mudah, seperti perhitungan faktorial. Bisa jadi lebih kompleks untuk fungsi lain.
Sekarang, jika Anda memutuskan untuk mentabulasi faktorial, dengan asumsi Anda bisa, yang tidak berlaku untuk semua bilangan bulat (tetapi bisa benar untuk beberapa domain nilai terbatas), semua yang Anda lakukan adalah termasuk dalam aksioma Anda keberadaan faktorial dengan mendefinisikan dengan aksioma baru nilainya untuk setiap integer, sehingga Anda tidak perlu lagi membuktikan (karenanya menghitung) apa pun.
Tetapi sistem aksioma seharusnya terbatas (atau setidaknya didefinisikan secara terbatas). Dan ada tak terhingga nilai untuk faktorial, satu per bilangan bulat. Jadi Anda berada dalam kesulitan untuk sistem aksioma berhingga Anda jika Anda aksioma fungsi tak terbatas, yaitu didefinisikan pada domain tak terbatas. Itu menerjemahkan secara komputasional dalam kenyataan bahwa calon tabel pencarian Anda tidak dapat diimplementasikan untuk semua bilangan bulat. Itu akan membunuh persyaratan keterbatasan biasa untuk algoritma (tetapi apakah harus seketat yang sering disajikan?).
Anda dapat memutuskan untuk memiliki generator aksioma yang didefinisikan secara halus untuk menangani semua kasus. Ini akan berjumlah, lebih atau kurang, untuk memasukkan program faktorial standar dalam algoritma Anda untuk menginisialisasi array yang diperlukan. Itu disebut memoisasi oleh programmer. Ini sebenarnya yang paling dekat dengan tabel setara yang Anda peroleh. Dapat dipahami bahwa memiliki tabel yang sudah dikomputasi, kecuali fakta bahwa tabel tersebut sebenarnya dibuat dalam mode evaluasi malas , kapan pun diperlukan. Diskusi ini mungkin perlu sedikit lebih banyak perawatan formal.
Anda dapat mendefinisikan operasi primitif sesuai keinginan (sesuai dengan sistem formal) dan menetapkan biaya apa pun yang Anda pilih saat digunakan dalam algoritme, sehingga dapat melakukan kompleksitas atau analisis kinerja. Tetapi, jika sistem konkret yang benar-benar menerapkan algoritma Anda (komputer, atau otak misalnya) tidak dapat menghormati spesifikasi biaya ini, analisis Anda mungkin secara intelektual menarik, tetapi tidak berharga untuk penggunaan aktual di dunia nyata.
21000
Program apa yang menarik
Diskusi ini harus lebih terkait dengan hasil seperti
isomorfisme Curry-Howard antara program dan bukti. Jika ada program yang sebenarnya merupakan bukti dari sesuatu, program apa pun dapat ditafsirkan sebagai program yang menarik dalam arti definisi di atas.
Namun, untuk pemahaman saya (terbatas), isomorfisma ini terbatas pada program yang dapat diketik dengan baik dalam beberapa sistem pengetikan yang tepat, di mana jenis-jenisnya sesuai dengan proposisi teori aksiomatik. Karenanya tidak semua program dapat dikualifikasikan sebagai program yang menarik. Dugaan saya adalah bahwa dalam hal itulah suatu algoritma seharusnya menyelesaikan suatu masalah.
Ini mungkin mengecualikan sebagian besar program "yang dibuat secara acak".
Ini juga merupakan definisi yang agak terbuka tentang apa yang merupakan "algoritma yang menarik". Program apa pun yang dapat dilihat menarik tentu saja demikian, karena ada sistem tipe yang diidentifikasi yang membuatnya menarik. Tetapi program yang tidak bisa diketik sejauh ini, bisa menjadi tipe dengan sistem tipe yang lebih maju, dan dengan demikian menjadi menarik. Lebih tepatnya, itu selalu menarik, tetapi karena kurangnya pengetahuan tentang sistem tipe yang tepat, kita tidak bisa mengetahuinya.
Namun, diketahui bahwa tidak semua program dapat diketik, karena diketahui bahwa beberapa ekspresi lambda, seperti menerapkan kombinator Y , tidak dapat diketik dalam sistem jenis suara .
Pandangan ini hanya berlaku untuk pemrograman formalisme yang dapat langsung dikaitkan dengan beberapa sistem bukti aksiomatik. Saya tidak tahu bagaimana itu dapat diperluas ke formalisme komputasi tingkat rendah seperti Mesin Turing. Namun, karena algoritmik dan komputabilitas sering kali merupakan permainan penyandian masalah dan solusi (pikirkan aritmatika yang dikodekan dalam kalkulus lambda ), orang dapat mempertimbangkan bahwa setiap perhitungan yang ditetapkan secara formal yang dapat ditampilkan sebagai penyandian algoritma juga merupakan algoritma. Pengkodean seperti itu mungkin hanya menggunakan sebagian kecil dari apa yang dapat diekspresikan dalam formalisme tingkat rendah, seperti Mesin Turing.
Salah satu minat dari pendekatan ini adalah bahwa ia memberikan gagasan tentang algoritma yang lebih abstrak dan independen dari masalah pengkodean aktual, "keterwakilan fisik" dari domain komputasi. Jadi, seseorang dapat, misalnya, mempertimbangkan domain dengan objek tak terbatas selama ada cara yang baik secara komputasional untuk menggunakannya.