Apakah ada bahasa pemrograman yang menggunakan variabel seperti dalam matematika?

11

Dalam matematika, sebuah variabel berarti Anda dapat memasukkan angka apa pun di sana, dan sebuah persamaan akan tetap benar:

root(square(x)) = abs(x)

Dalam bahasa pemrograman, ini tidak begitu: var bisa berubah. Dengan Python:

y = (x**2)**.5
x *= 2
assert y == abs(x)

akan memunculkan eksepsi, karena x pada baris terakhir tidak sama.

Apakah ada bahasa pemrograman yang menggunakan variabel tidak berubah?


sumber
5
Dalam matematika, sebagian besar persamaan bukanlah identitas. Misalnya, x ^ 2 + 5 = 6x valid jika dan hanya jika x = 1 atau x = 5. Persamaan yang valid untuk semua nilai dalam beberapa "semesta" (seperti himpunan semua bilangan real), misalnya sin ( 2x) = 2 sin x cos x, disebut identitas .
Andreas Rejbrand
4
variabel dalam matematika! = variabel dalam bahasa pemrograman. Saya selalu berpikir bahwa mereka harus memiliki nama yang berbeda juga, karena begitu banyak orang bingung ketika mereka membawa prasangka tentang variabel dalam matematika ke pemrograman.
Lie Ryan
1
Saya pikir tujuan variabel dalam matematika tidak sama dengan pemrograman. Dalam matematika, variabel mewakili nilai yang tidak diketahui yang ingin Anda ketahui atau tempat ke dalam rumus yang Anda berikan nilai untuk mengambil hasilnya. Untuk bahasa pemrograman umum, hanya huruf kedua yang masuk akal. Untuk kasus pertama, Anda akan memerlukan perangkat lunak seperti Mathematica.
Pagotti
Tidak, mereka tidak. Coba letakkan angka apa saja di "x = 5".

Jawaban:

6

Untuk menjawab pertanyaan judul Anda "Apakah bahasa pemrograman menggunakan variabel seperti dalam matematika?": C, C #, Java, C ++, dan variabel bahasa gaya C lainnya menggunakan cara mereka digunakan dalam matematika.

Anda hanya perlu menggunakan == alih-alih =.

Jika saya mengambil asli Anda

root(square(x)) = abs(x)

Kemudian saya bisa menerjemahkannya ke dalam C # secara langsung tanpa ada perubahan selain dari sintaks. Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

Ini akan mengevaluasi true untuk setiap nilai x selama x kuadrat kurang dari maks untuk tipe data yang Anda gunakan. (Java akan sangat mirip, tapi saya percaya namespace Matematika agak berbeda)

Bit berikutnya ini akan gagal dikompilasi dalam C # karena kompiler cukup pintar untuk mengetahui saya tidak dapat menetapkan kembalinya satu operasi ke operasi lain.

Math.Sqrt(Math.Pow(x,2)) = Math.Abs(x)

Kekekalan tidak ada hubungannya dengan ini. Anda masih perlu menetapkan nilai dalam bahasa yang tidak dapat diubah dan sangat mungkin bahwa bahasa yang diberikan dapat memilih untuk melakukan ini dengan menggunakan = sebagai operator.

Lebih lanjut membuktikan poinnya, loop ini akan berjalan sampai Anda menghabiskan nilai hukum x dan mendapatkan pengecualian overflow:

 while (Math.Sqrt(Math.Pow(x, 2)) == Math.Abs(x))
        {
            ++x;
            System.Console.WriteLine(x);
        }

Inilah sebabnya mengapa ahli matematika membenci penggunaan = untuk tugas. Itu membingungkan mereka. Saya pikir ini telah membuat Anda bingung sendiri. Ambillah contoh Anda

y = (x**2)**.5
x *= 2
assert y == abs(x)

Ketika saya mengubah ini menjadi aljabar, saya mendapatkan ini:

abs (2x) = root (x ^ 2)

Yang tentu saja tidak benar untuk nilai selain 0. Ketidakmampuan hanya menyelamatkan Anda dari kesalahan mengubah nilai x ketika Anda menambahkan langkah-langkah tambahan antara mengevaluasi Sisi Kiri dan Sisi Kanan dari persamaan asli. Sebenarnya tidak mengubah cara Anda mengevaluasi ekspresi.

MIA
sumber
24

Bahasa pemrograman yang murni fungsional, seperti Haskell , menegakkan variabel yang tidak dapat diubah. Saya suka menyebutnya pengidentifikasi, bukan variabel.

Ionuț G. Stan
sumber
3
Di Erlang, yang merupakan bahasa fungsional yang tidak murni, variabel juga tidak berubah.
sepp2k
Saya tidak tahu terlalu banyak tentang Erlang. Itu adalah atom, bukan? Apakah Erlang mengizinkan segala jenis penyimpanan yang bisa diubah-ubah seperti variabel?
Ionuț G. Stan
3
@Ionut: Tidak, atom-atom Erlang adalah apa yang disebut simbol-simbol dalam lisp dan ruby. Mengenai pertanyaan kedua Anda: Ini memiliki kamus proses, yang merupakan global (baik, per-proses), peta hash yang bisa berubah. Namun itu sangat jarang digunakan dalam pengalaman saya. Selain itu satu-satunya cara untuk memecah transparansi referensial adalah lewat pesan.
sepp2k
4
Hm, saya harus belajar sendiri beberapa bahasa Erlang :)
Ionuț G. Stan
bagaimana ini menjawab pertanyaan yang diajukan?
Agak
5

The =tanda yang digunakan dalam bahasa pemrograman menyesatkan. <-, yang berarti "toko", atau bahkan COBOL MOVEharus digunakan sebagai gantinya.

Sebagai tambahan, Prolog menggunakan variabel seperti matematika: Variabel tidak dapat berubah, dan mesin Prolog akan mengisi variabel untuk melihat apakah solusinya ada.

Juga, Curry adalah campuran dari Haskell dan Prolog.

Ming-Tang
sumber
3

C, C ++, dan Objective-C dapat menentukan ketidakmampuan untuk argumen fungsi (dan metode), serta variabel lain (pengidentifikasi), dengan jenis kualifikasi "const".

Huperniket
sumber
3

Anda dapat mensimulasikan ketidakmampuan dalam Python juga dengan tidak mengizinkan pembaruan ke kelas. Seperti yang dinyatakan sebelumnya sebagian besar bahasa pemrograman fungsional murni memaksakan imutabilitas. Clojure adalah tambahan terbaru untuk platform JVM (Clojure adalah dialek LISP)

Dalam Scala (juga bahasa JVM ) pemersatu variabel dukungan OO dan FP yang dideklarasikan dengan valtidak dapat diubah. Ekspresifitas Scala dan dukungan hibrida OO / FP membuatnya terlihat mirip dengan Mathematica . ( Akka adalah kerangka kerja yang menambahkan fungsi Erlang OTP dan Clojure seperti STM .. ke Scala dan Java.) LACASA menambahkan sistem tipe dan model pemrograman untuk menegakkan disiplin kemampuan objek dalam Scala, dan untuk menyediakan referensi objek yang unik. ( kode ) ( latar belakang teoritis )

Di Jawa, variabel yang dideklarasikan finaltidak dapat diubah, dan perpustakaan Java seperti Google Guava menyertakan perpustakaan koleksi yang tidak dapat diubah. Java Stringjuga selalu berubah.

oluies
sumber