Singkatnya : Apa yang mungkin dimaksudkan oleh guru Anda adalah bahwa semantik while
hampir sama di sebagian besar bahasa, sedangkan semantik for
mungkin berubah banyak (lihat diskusi di bawah). Oleh karena itu, bukti independen bahasa abstrak lebih dapat diandalkan dengan a while
, tetapi orang harus berhati-hati bahwa bukti dengan for
loop mungkin tidak cocok dengan semantik for
loop dalam banyak bahasa.
Pertanyaan Anda tidak cukup tepat (meskipun itu mungkin bukan salah Anda).
Intinya adalah bahwa, afaik, tidak ada standar, standar yang didukung ISO, atau definisi for
dan while
loop referensi yang diterima secara resmi
. Definisi ini tergantung pada bahasa pemrograman.
Karenanya Anda tidak dapat membuat pernyataan umum apa pun tentang kesetaraannya sebelum Anda menentukan dengan tepat apa yang dapat dilakukan masing-masing. Saya mengemukakan hal itu dengan lebih tepat, karena itu adalah salah satu argumen utama yang digunakan dalam jawaban lain (dan diskusi akan bermanfaat dalam apa yang berikut).
Pada intertranslatability for
dan while
loop
Ringkasan : itu tergantung pada bahasa pemrograman, tetapi selalu mungkin selama Anda dapat memiliki satu loop tak terbatas dan cara untuk keluar darinya.
Tetapi Anda dapat membuat pernyataan seperti itu untuk bahasa pemrograman tertentu, dan jawabannya akan tergantung pada fitur untuk bahasa tersebut.
Itu juga berarti bahwa tidak ada bukti umum, tetapi hanya satu untuk setiap bahasa pemrograman.
Satu hal yang secara umum benar adalah bahwa while
loop umumnya dapat meniru for
loop, karena loop sementara dapat melakukan pengujian kondisi keluar dari loop, melakukan inisialisasi variabel kontrol dengan tugas sebelum memasukkan loop, dan melakukan penambahan pada akhir loop body, sehingga
for i from 1 by 2 to 10 do { xxx }
menjadi
i=1
while i≤11 do { xxx; i←i+2 }
Ini kurang lebih berfungsi untuk sebagian besar bahasa, tetapi tidak sejelas kelihatannya, dan mungkin ada banyak "detail" yang perlu dikhawatirkan.
Misalnya, dalam banyak bahasa, for
loop mengevaluasinya 3 argumen (nilai awal, kenaikan, dan nilai akhir) sebagai argumen yang ketat , dievaluasi satu kali sebelum memasukkan loop, sementara yang lain akan menggunakan argumen thunk untuk dievaluasi kembali pada setiap belokan, atau mungkin sebagai argumen malas untuk dievaluasi hanya ketika pertama kali dibutuhkan.
Poin lain mungkin bahwa variabel kenaikan mungkin lokal ke
for
loop, atau harus variabel lokal dari fungsi tempat loop muncul.
Bergantung pada masalah-masalah seperti itu, terjemahan a for
ke a while
dapat sangat bervariasi, meskipun biasanya mungkin untuk mencapainya.
Hal yang sama berlaku untuk yang sebaliknya, menerjemahkan a while
ke dalam satu for
lingkaran.
Masalah pertama adalah bahwa while
loop akan selalu mengevaluasi kembali kondisi keluar di setiap belokan. Tetapi beberapa for
loop tidak menyediakan kondisi yang dievaluasi ulang pada setiap belokan, selain perbandingan variabel kontrol dengan beberapa nilai tetap yang dihitung pada entri loop. Maka terjemahan tidak mungkin kecuali ada cara lain untuk melompat keluar dari loop pada beberapa kondisi yang sewenang-wenang.
Itu dapat dicapai dengan berbagai perangkat, biasanya dimulai dengan pernyataan kondisional menguji kondisi, diikuti dengan lompatan yang diimplementasikan, sebagaimana tersedia, dengan pernyataan keluar loop, pernyataan kembali (setelah merangkum loop dalam suatu fungsi), pernyataan goto atau peningkatan pengecualian.
Dengan kata lain, sekali lagi sangat tergantung pada bahasa, dan mungkin pada fitur bahasa yang halus.
Ini mengatakan, seperti dijawab oleh @milleniumbug , intertranslation mudah dalam bahasa C, karena for
lopp pada dasarnya adalah sebuah while
loop ditambah beberapa tambahan untuk variabel kontrol yang ditambahkan.
Tetapi ini tidak selalu berlaku untuk bahasa lain, dan kemungkinan besar tidak dengan cara yang sama.
Ini dikatakan, bahasa pemrograman biasanya memiliki kekuatan Turing dengan hanya satu dari loop ini, karena semua yang Anda butuhkan untuk itu adalah satu loop tak terbatas. Jadi, selama Anda memiliki beberapa cara pengulangan untuk selamanya, dan mungkin memutuskan untuk berhenti, Anda cukup yakin Anda dapat meniru konstruksi lain ... tetapi tidak harus dengan mudah.
Mengenai bukti
Ringkasan : Tidak ada alasan bagi saya untuk menyatakan bahwa bukti harus secara signifikan lebih sulit dengan satu atau yang lain (kecuali beberapa fitur aneh dari bahasa).
Mungkin ada kesalahpahaman, atau guru Anda memikirkan sesuatu yang lain.
Semantik formal dapat didefinisikan untuk berbagai jenis loop yang didefinisikan dalam bahasa pemrograman, dan kemudian digunakan untuk membuktikan properti.
Mungkin, sekali lagi tergantung pada bahasa, bahwa melakukan bukti formal mengenai program mungkin lebih kompleks dalam beberapa kasus. Tetapi itu tergantung pada bahasanya.
Saya tidak bisa membayangkan alasan mengapa bukti harus jauh lebih sulit dengan satu konstruksi lebih dari yang lain. The for
Loop mungkin lebih kompleks karena dapat menawarkan, seperti di C, semua yang dilakukan dengan while
ditambah hal-hal lain. Tetapi jika Anda melakukannya dengan while
, Anda harus menambahkan ekstra dalam beberapa bentuk lain.
Saya bisa menggunakan argumen umum formal tentang intertranslatabilitas, selama ada kemungkinan untuk satu loop tak terbatas. Namun saya akan menahan diri untuk tidak melakukan itu, karena konstruksi yang terlibat bukanlah sesuatu yang ingin Anda tangani dalam sebuah bukti, dan itu jelas merupakan pernyataan yang tidak adil, setidaknya dalam praktik.
Namun, setelah diskusi di atas, kita telah melihat bahwa kesulitan untuk transtranslabilitas berasal dari variabilitas besar for
loop dari bahasa ke bahasa. Maka kesimpulan berikut yang mungkin merupakan jawaban yang tepat:
Satu kemungkinan untuk memahami pernyataan guru Anda adalah bahwa semantik while
loop hampir sama di semua bahasa pemrograman, sedangkan sintaks dan semantik for
loop dapat bervariasi secara signifikan dari bahasa ke bahasa. Oleh karena itu, dimungkinkan untuk membuat bukti "abstrak" umum dengan while
loop yang memiliki semantik independen bahasa sampai tingkat yang baik, sementara ini tidak mungkin untuk for
loop yang memiliki sintaks dan semantik berubah terlalu banyak dari bahasa ke bahasa. Tetapi ini tidak berlaku dalam bahasa tertentu, ketika semantik keduanya didefinisikan secara tepat.
Saran terbaik saya adalah Anda harus bertanya kepada guru Anda apa yang ia maksudkan dengan tepat, dan apakah ia dapat memberi Anda contoh. Misphrasing atau kesalahpahaman adalah peristiwa umum.
for
daripadawhile
sekadar tidak masuk akal. Mungkin ada satu, tapi ini bukan.