Q1. Kapan kita dapat mengatakan bahwa dua program (ditulis dalam beberapa bahasa pemrograman seperti C ++) berbeda?
Ekstrem pertama adalah untuk mengatakan bahwa dua program adalah setara jika mereka identik. Ekstrem lainnya adalah dengan mengatakan dua program setara jika mereka menghitung fungsi yang sama (atau menunjukkan perilaku yang dapat diamati sama di lingkungan yang sama). Tapi ini tidak baik: tidak semua program memeriksa keaslian adalah sama. Kami dapat menambahkan baris kode tanpa efek pada hasilnya dan kami masih akan menganggapnya sebagai program yang sama.
Q2. Apakah program dan algoritma adalah jenis objek yang sama? Jika tidak, apa definisi dari suatu algoritma dan bagaimana perbedaannya dari definisi suatu program? Kapan kita bisa mengatakan dua algoritma setara?
Jawaban:
T1: Ada banyak gagasan tentang kesetaraan program (jejak kesetaraan, kesetaraan kontekstual, kesetaraan pengamatan, bisimilaritas) yang mungkin atau mungkin tidak mempertimbangkan hal-hal seperti waktu, penggunaan sumber daya, nondeterminisme, penghentian. Banyak pekerjaan telah dilakukan untuk menemukan konsep kesetaraan program yang dapat digunakan. Sebagai contoh: Teori Kesetaraan Program Berbasis Operasional oleh Andy Pitts . Tapi ini nyaris tidak menggores permukaan. Ini harus bermanfaat bahkan jika Anda tertarik ketika dua program tidak setara. Orang bahkan dapat beralasan tentang program yang tidak berhenti (menggunakan bisimulasi dan koinduksi).
T2: Satu jawaban yang mungkin untuk bagian dari pertanyaan ini adalah bahwa program interaktif bukan algoritma (dengan asumsi bahwa seseorang menganggap algoritma untuk mengambil semua inputnya sekaligus, tetapi definisi sempit ini tidak termasuk algoritma online). Suatu program dapat berupa kumpulan proses yang berinteraksi yang juga berinteraksi dengan lingkungannya. Ini tentu saja tidak sesuai dengan gagasan teori Turing-machine / Recursion tentang algoritma.
sumber
Ini bukan ekstrem: kesetaraan program harus didefinisikan relatif terhadap gagasan pengamatan.
Definisi paling umum dalam penelitian PL adalah kesetaraan kontekstual. Dalam kesetaraan kontekstual, idenya adalah bahwa kita mengamati program dengan menggunakannya sebagai komponen program yang lebih besar (konteks). Jadi jika dua program menghitung nilai akhir yang sama untuk semua konteks, maka keduanya dinilai sama. Karena definisi ini mengkuantifikasi semua konteks program yang mungkin, sulit untuk dikerjakan secara langsung. Jadi program penelitian tipikal dalam PL adalah menemukan prinsip-prinsip penalaran komposisi yang menyiratkan kesetaraan kontekstual.
Namun, ini bukan satu-satunya gagasan pengamatan yang mungkin. Sebagai contoh, kita dapat dengan mudah mengatakan bahwa memori, waktu, atau perilaku kekuatan suatu program dapat diamati. Dalam hal ini, lebih sedikit kesetaraan program berlaku, karena kita dapat membedakan lebih banyak program (misalnya, mergesort sekarang dapat dibedakan dari quicksort). Jika Anda ingin (mengatakan) merancang bahasa yang kebal terhadap serangan saluran waktu, atau merancang bahasa pemrograman terbatas ruang, maka ini adalah hal yang harus Anda lakukan.
Selain itu, kami dapat memilih untuk menilai beberapa kondisi perantara dari suatu komputasi yang dapat diamati. Ini selalu terjadi untuk bahasa yang berbarengan, karena kemungkinan gangguan. Tetapi Anda mungkin ingin mengambil tampilan ini bahkan untuk bahasa berurutan --- misalnya, jika Anda ingin memastikan bahwa tidak ada perhitungan yang menyimpan data yang tidak terenkripsi di memori utama, maka Anda harus menganggap penulisan ke memori utama sebagai yang dapat diamati.
Pada dasarnya, tidak ada gagasan tunggal tentang kesetaraan program; itu selalu relatif terhadap gagasan pengamatan yang Anda pilih, dan itu tergantung pada aplikasi yang ada dalam pikiran Anda.
sumber
T2: Saya pikir definisi teoritis yang biasa tidak benar-benar membedakan antara algoritma dan program, tetapi "algoritma" seperti yang biasa digunakan lebih seperti kelas program. Bagi saya suatu algoritma adalah semacam program dengan beberapa subrutin yang tersisa tidak sepenuhnya ditentukan (yaitu perilaku yang diinginkan mereka didefinisikan tetapi tidak implementasi mereka). Sebagai contoh, algoritma eliminasi Gaussian tidak benar-benar menentukan bagaimana perkalian bilangan bulat harus dilakukan.
Saya minta maaf jika ini naif. Saya tidak melakukan riset PL.
sumber