Apa itu invarian?


130

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!)?


Mungkin mereka seharusnya menyebutnya non-varian?
johnny

Jawaban:


189

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.


1
Contoh bagus ini akan lebih baik jika itu menyertakan jawaban cero dengan tautan wikipedia.
ablarg

2
Usia orang tua lebih besar dari usia anak kandungnya. Konteks sekitarnya akan berubah, tetapi yang tidak berubah tidak pernah berubah. Misalnya, keluarga Smith yang memiliki 2 anak. Atau bisa juga pada spesies lain dari mamalia manapun. Konteksnya berubah, tetapi invariannya tidak berubah.
kebenaranadjustr

1
"... properti dari status program yang selalu benar ..." - @jacob baskin - ditulis dengan baik dan terima kasih untuk ini.
twknab

"... properti dari status program yang selalu benar ..." - Saya setuju bahwa itu ditulis dengan baik, tetapi dapat menyesatkan. Pertama saya memahaminya sebagai boolean true, tapi saya cukup yakin itu berarti "... selalu konstan" (tapi mungkin itu hanya karena bahasa Inggris bukan bahasa pertama saya)
dev-null

29

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.


17

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.


17

Keajaiban wikipedia: Invariant (ilmu komputer)

Dalam ilmu komputer, predikat yang, jika benar, akan tetap benar sepanjang urutan operasi tertentu, disebut (an) invarian dari urutan tersebut.


2
Tautan? Jargon teknis? BACAAN? WTF ? ;) Serius, link bagus, tapi sedikit ringkasan akan menyenangkan.
Dustman

10

Seperti yang dinyatakan baris ini:

Dalam ilmu komputer, predikat yang, jika benar, akan tetap benar sepanjang urutan operasi tertentu, disebut (an) invarian dari urutan tersebut.

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 countdan menambahkannya dalam variabel yang disebut sebagaisum

The invarian (lagi itu lebih seperti konsep):

// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades

Kode di atas akan menjadi seperti ini,

int count=0;
double sum=0,x=0;
while (cin >> x) {
++count;
sum+=x;
}

Apa fungsi kode di atas?

1) Membaca masukan dari cindan memasukkannyax

2) Setelah berhasil membaca, menambah countdansum = 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

while(cin>>x){
  }

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).

// we have read count grades so far, and

Bagaimana cara agar invarian tetap benar?

Sederhana! hitungan kenaikan.

Jadi ++count;akan bagus !. Sekarang kode kita menjadi seperti ini,

while(cin>>x){
 ++count; 
 }

Tapi

Bahkan sekarang invarian kita (konsep yang pasti BENAR) adalah Salah karena sekarang kita tidak memenuhi bagian kedua dari invariant kita .

// sum is the sum of the first count grades

Jadi apa yang harus dilakukan sekarang?

Tambahkan xke sumdan menyimpannya dalam sum( sum+=x) dan waktu berikutnya cin>>xakan membaca nilai baru ke dalam x.

Sekarang kode kita menjadi seperti ini,

while(cin>>x){
 ++count; 
 sum+=x;
 }

Mari kita periksa

Apakah kode cocok dengan invarian kami

// invariant:
// we have read count grades so far, and
// sum is the sum of the first count grades

kode:

while(cin>>x){
 ++count; 
 sum+=x;
 }

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


4

Sesuatu yang tidak berubah dalam satu blok kode


2

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.


2

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.


2

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 piadalah rasio invarian antara keliling lingkaran dengan diameternya. Tidak peduli seberapa besar atau kecil lingkarannya, rasio itu akan selalu demikian pi.


1

Invarian ADT menentukan hubungan di antara bidang data (variabel instan) yang harus selalu benar sebelum dan sesudah eksekusi metode instan apa pun.


0

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.

masukkan deskripsi gambar di sini


0

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.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.