Kata tersebut tampaknya digunakan dalam sejumlah konteks. Yang terbaik yang bisa saya pikirkan adalah bahwa itu berarti variabel yang tidak dapat berubah. Bukankah itu gunanya konstanta / final (sialan Java!)?
language-agnostic
invariants
Tukang sampah
sumber
sumber
Jawaban:
Invarian lebih "konseptual" daripada variabel. Secara umum, ini adalah properti dari status program yang selalu benar. Sebuah fungsi atau metode yang memastikan bahwa kepemilikan invarian dikatakan mempertahankan invarian tersebut.
Misalnya, pohon pencarian biner mungkin memiliki invarian bahwa untuk setiap node, kunci anak kiri node kurang dari kunci node itu sendiri. Fungsi penyisipan yang ditulis dengan benar untuk pohon ini akan mempertahankan invarian tersebut.
Seperti yang Anda tahu, itu bukanlah hal yang dapat Anda simpan dalam variabel: ini lebih merupakan pernyataan tentang program. Dengan mencari tahu jenis invarian apa yang harus dipertahankan program Anda, lalu meninjau kode Anda untuk memastikan bahwa program tersebut benar-benar mempertahankan invarian tersebut, Anda dapat menghindari kesalahan logika dalam kode Anda.
sumber
Ini adalah kondisi yang Anda tahu untuk selalu benar di tempat tertentu dalam logika Anda dan dapat memeriksa saat debugging untuk mencari tahu apa yang salah.
sumber
Saya biasanya melihatnya lebih dalam hal algoritme atau struktur.
Misalnya, Anda dapat memiliki loop invariant yang dapat dinyatakan - selalu benar di awal atau akhir setiap iterasi. Artinya, jika loop Anda seharusnya memproses kumpulan objek dari satu tumpukan ke tumpukan lainnya, Anda dapat mengatakan bahwa | stack1 | + | stack2 | = c, di bagian atas atau bawah loop.
Jika pemeriksaan invarian gagal, itu akan menunjukkan ada yang tidak beres. Dalam contoh ini, ini bisa berarti Anda lupa mendorong elemen yang diproses ke tumpukan akhir, dll.
sumber
Keajaiban wikipedia: Invariant (ilmu komputer)
sumber
Seperti yang dinyatakan baris ini:
Untuk lebih memahami harapan ini contoh di C ++ membantu.
Pertimbangkan skenario di mana Anda harus mendapatkan beberapa nilai dan mendapatkan jumlah totalnya dalam variabel yang disebut sebagai
count
dan menambahkannya dalam variabel yang disebut sebagaisum
The invarian (lagi itu lebih seperti konsep):
Kode di atas akan menjadi seperti ini,
Apa fungsi kode di atas?
1) Membaca masukan dari
cin
dan memasukkannyax
2) Setelah berhasil membaca, menambah
count
dansum = sum + x
3) Ulangi 1-2 sampai pembacaan berhenti (yaitu ctrl + D)
Loop invarian:
Invarian harus True SELALU . Jadi awalnya Anda memulai kode Anda hanya dengan ini
Loop ini membaca data dari input standar dan menyimpannya di x. Baik dan bagus. Tetapi invarian menjadi salah karena bagian pertama dari invarian kita tidak diikuti (atau tetap benar).
Bagaimana cara agar invarian tetap benar?
Sederhana! hitungan kenaikan.
Jadi
++count;
akan bagus !. Sekarang kode kita menjadi seperti ini,Tapi
Bahkan sekarang invarian kita (konsep yang pasti BENAR) adalah Salah karena sekarang kita tidak memenuhi bagian kedua dari invariant kita .
Jadi apa yang harus dilakukan sekarang?
Tambahkan
x
kesum
dan menyimpannya dalamsum
(sum+=x
) dan waktu berikutnyacin>>x
akan membaca nilai baru ke dalam x.Sekarang kode kita menjadi seperti ini,
Mari kita periksa
Apakah kode cocok dengan invarian kami
kode:
Ah!. Sekarang invarian loop selalu True dan kode berfungsi dengan baik.
Contoh di atas diambil dan dimodifikasi dari buku Accelerated C ++ oleh Andrew-koening dan Barbara-E
sumber
Sesuatu yang tidak berubah dalam satu blok kode
sumber
Sebagai lanjutan dari apa itu, invariants cukup berguna dalam menulis kode yang bersih, karena mengetahui secara konseptual invarian apa yang harus ada dalam kode Anda memungkinkan Anda dengan mudah memutuskan bagaimana mengatur kode Anda untuk mencapai tujuan tersebut. Seperti disebutkan sebelumnya, mereka juga berguna dalam debugging, karena memeriksa untuk melihat apakah invarian yang dipertahankan seringkali merupakan cara yang baik untuk melihat apakah manipulasi apa pun yang Anda coba lakukan benar-benar melakukan apa yang Anda inginkan.
sumber
Ini biasanya kuantitas yang tidak berubah dalam operasi matematika tertentu. Sebuah contoh adalah skalar, yang tidak berubah di bawah rotasi. Dalam pencitraan resonansi magnetik, misalnya, sangat berguna untuk mengkarakterisasi properti jaringan dengan invarian rotasi, karena estimasi idealnya tidak bergantung pada orientasi tubuh pada pemindai.
sumber
Jawaban ini untuk anak saya yang berusia 5 tahun. Jangan menganggap invarian sebagai nilai numerik tetap atau konstan. Tapi itu bisa terjadi. Namun, lebih dari itu.
Sebaliknya, invarian adalah sesuatu seperti hubungan tetap antara berbagai entitas. Misalnya, usia Anda akan selalu kurang dari itu dibandingkan dengan orang tua kandung Anda. Baik usia Anda, dan usia orang tua Anda berubah seiring berjalannya waktu, tetapi hubungan yang saya sebutkan di atas adalah invarian.
Invarian juga bisa berupa konstanta numerik. Misalnya, nilai dari
pi
adalah rasio invarian antara keliling lingkaran dengan diameternya. Tidak peduli seberapa besar atau kecil lingkarannya, rasio itu akan selalu demikianpi
.sumber
Invarian ADT menentukan hubungan di antara bidang data (variabel instan) yang harus selalu benar sebelum dan sesudah eksekusi metode instan apa pun.
sumber
Ada contoh yang sangat baik dari sebuah invarian dan mengapa itu penting dalam buku Java Concurrency in Practice .
Meskipun berpusat pada Java, contoh tersebut menjelaskan beberapa kode yang bertanggung jawab untuk menghitung faktor bilangan bulat yang disediakan. Kode contoh mencoba untuk menyimpan nomor terakhir yang diberikan, dan faktor-faktor yang dihitung untuk meningkatkan kinerja. Dalam skenario ini, terdapat invarian yang tidak diperhitungkan dalam kode contoh yang membuat kode rentan terhadap kondisi balapan dalam skenario bersamaan.
sumber
Semua jawaban di sini bagus, tetapi saya merasa bahwa saya dapat menjelaskan lebih banyak tentang masalah ini:
Invariant dari sudut pandang bahasa berarti sesuatu yang tidak pernah berubah. Konsepnya sebenarnya berasal dari matematika, itu salah satu teknik pembuktian yang populer bila dikombinasikan dengan induksi.
Berikut adalah bagaimana buktinya, Jika Anda dapat menemukan invarian yang ada di negara bagian awal, Dan invarian ini tetap ada terlepas dari setiap transformasi [hukum] yang diterapkan pada negara tersebut, maka Anda dapat membuktikan bahwa Jika negara tertentu tidak memiliki ini invariant maka itu tidak akan pernah terjadi, tidak peduli urutan transformasi apa yang diterapkan ke keadaan awal.
Sekarang cara berpikir sebelumnya (sekali lagi dikombinasikan dengan induksi) memungkinkan untuk memprediksikan logika perangkat lunak komputer. Terutama penting ketika eksekusi berjalan dalam loop, di mana invarian dapat digunakan untuk membuktikan bahwa loop tertentu akan menghasilkan hasil tertentu atau tidak akan pernah mengubah status program dengan cara tertentu.
Ketika invarian digunakan untuk mempredikat logika loop, invariannya disebut loop . Ini dapat digunakan di luar loop, tetapi untuk loop sangat penting, karena Anda sering memiliki banyak kemungkinan, atau kemungkinan yang tak terbatas.
Perhatikan bahwa saya menggunakan kata "predikat" logika perangkat lunak komputer, dan bukan membuktikan. Dan itu karena sementara dalam invarian matematika dapat digunakan sebagai bukti, tidak pernah dapat membuktikan bahwa perangkat lunak komputer ketika dijalankan akan menghasilkan apa yang diharapkan, karena fakta bahwa perangkat lunak dijalankan di atas banyak abstraksi, yang tidak pernah dapat dibuktikan bahwa mereka akan menghasilkan apa yang diharapkan (pikirkan abstraksi perangkat keras misalnya).
Akhirnya, sementara logika perangkat lunak yang diprediksi secara teoritis dan ketat hanya penting untuk aplikasi kritis tinggi seperti Medis, dan Militer. Invarian masih dapat digunakan untuk membantu programmer pada umumnya saat melakukan debug. Dapat digunakan untuk mengetahui di mana di lokasi tertentu Program gagal karena gagal mempertahankan invarian tertentu - banyak dari kita tetap menggunakannya tanpa memikirkannya.
sumber