Có ngôn ngữ lập trình nào sử dụng các biến như trong toán học không?


11

Trong toán học, một biến có nghĩa là bạn có thể đặt bất kỳ số nào ở đó và một phương trình sẽ vẫn đúng:

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

Trong các ngôn ngữ lập trình, điều này không phải vậy: một var có thể thay đổi. Trong Python:

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

sẽ đưa ra một ngoại lệ, vì x ở dòng cuối cùng không giống nhau.

Có ngôn ngữ lập trình sử dụng các biến không thay đổi?


5
Trong toán học, hầu hết các phương trình không phải là danh tính. Chẳng hạn, x ^ 2 + 5 = 6x là hợp lệ khi và chỉ khi x = 1 hoặc x = 5. Phương trình hợp lệ cho tất cả các giá trị trong một số "vũ trụ" (chẳng hạn như tập hợp tất cả các số thực), ví dụ sin ( 2x) = 2 sin x cos x, được gọi là danh tính .
Andreas Rejbrand

4
biến trong toán học! = biến trong ngôn ngữ lập trình. Tôi đã luôn nghĩ rằng họ cũng nên có những cái tên khác nhau, vì rất nhiều người bối rối khi họ mang những định kiến ​​về biến trong toán học để lập trình.
Lie Ryan

1
Tôi nghĩ rằng mục tiêu của các biến trong toán học không giống như trong lập trình. Trong toán học, các biến đại diện cho một giá trị không xác định mà bạn muốn biết hoặc đặt một công thức vào một công thức mà bạn đặt một giá trị để lấy kết quả. Đối với các ngôn ngữ lập trình phổ biến, chỉ có trường hợp thứ hai có ý nghĩa. Đối với trường hợp đầu tiên, bạn sẽ cần một phần mềm như Mathicala.
Pagotti

Không, họ không có. Hãy thử đặt bất kỳ số nào vào "x = 5".

Câu trả lời:


6

Để trả lời câu hỏi tiêu đề của bạn "Có ngôn ngữ lập trình nào sử dụng các biến như chúng trong toán học không?": C, C #, Java, C ++ và bất kỳ ngôn ngữ kiểu C nào khác sử dụng các biến theo cách chúng được sử dụng trong toán học.

Bạn chỉ cần sử dụng == thay vì =.

Nếu tôi lấy bản gốc của bạn

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

Sau đó, tôi có thể dịch nó thành C # trực tiếp mà không có bất kỳ thay đổi nào ngoài cú pháp. Math.Sqrt(Math.Pow(x,2)) == Math.Abs(x)

Điều này sẽ đánh giá là đúng với bất kỳ giá trị nào của x miễn là x bình phương nhỏ hơn giá trị tối đa của loại dữ liệu bạn đang sử dụng. (Java sẽ rất giống nhau, nhưng tôi tin rằng không gian tên Math hơi khác một chút)

Bit tiếp theo này sẽ không biên dịch được trong C # vì trình biên dịch đủ thông minh để biết tôi không thể gán trả về một hoạt động này cho một hoạt động khác.

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

Bất biến không có gì để làm với điều này. Bạn vẫn cần gán giá trị bằng một ngôn ngữ không thay đổi và hoàn toàn có thể một ngôn ngữ đã cho có thể chọn thực hiện điều này bằng cách sử dụng = làm toán tử.

Chứng minh thêm, điểm này sẽ chạy cho đến khi bạn sử dụng hết giá trị pháp lý của x và nhận được ngoại lệ tràn:

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

Đây là lý do tại sao các nhà toán học ghét việc sử dụng = cho bài tập. Nó làm họ bối rối. Tôi nghĩ rằng điều này đã khiến bạn bối rối chính mình. Lấy ví dụ của bạn

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

Khi tôi biến điều này thành đại số, tôi nhận được điều này:

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

Tất nhiên điều này không đúng với các giá trị khác 0. Tính bất biến chỉ giúp bạn tránh khỏi lỗi thay đổi giá trị của x khi bạn thêm các bước bổ sung giữa việc đánh giá Mặt trái và Mặt phải của phương trình ban đầu. Nó không thực sự thay đổi cách bạn đánh giá biểu thức.


24

Các ngôn ngữ lập trình chức năng thuần túy, như Haskell , thực thi các biến bất biến. Tôi thích gọi chúng là định danh, thay vì các biến.


3
Trong Erlang, một ngôn ngữ chức năng không tinh khiết, các biến cũng không thay đổi.
sepp2k

Tôi không biết quá nhiều Erlang. Đó là những nguyên tử, phải không? Erlang có cho phép bất kỳ loại lưu trữ giống như biến nào không?
Ionuț G. Stan

3
@Iovy: Không, các nguyên tử Erlang là những gì được gọi là biểu tượng trong lisp và ruby. Về câu hỏi thứ hai của bạn: Nó có từ điển quy trình, đó là một bản đồ băm có thể thay đổi toàn cầu (tốt, theo quy trình). Tuy nhiên, điều đó rất hiếm khi được sử dụng trong kinh nghiệm của tôi. Ngoài ra, cách duy nhất để phá vỡ tính minh bạch của tham chiếu là truyền thông điệp.
sepp2k

4
Hừm, tôi nên tự học một số Erlang :)
Ionuț G. Stan

Làm thế nào để trả lời câu hỏi này?
gnat

5

Các =dấu hiệu được sử dụng trong ngôn ngữ lập trình được gây hiểu lầm. <-, có nghĩa là "cửa hàng", hoặc thậm chí là COBOL MOVEnên được sử dụng thay thế.

Ngoài ra, Prolog sử dụng biến như toán học: Biến không thể thay đổi và công cụ Prolog sẽ điền vào các biến để xem các giải pháp có tồn tại không.

Ngoài ra, Curry là sự pha trộn của Haskell và Prolog.


3

C, C ++ và Objective-C có thể chỉ định tính không thay đổi cho các đối số hàm (và phương thức), cũng như các biến (định danh) khác, với định tính loại "const".


3

Bạn cũng có thể mô phỏng tính bất biến trong Python bằng cách không cho phép cập nhật các lớp. Như đã nêu trước đó, hầu hết các ngôn ngữ lập trình chức năng thuần túy đều thi hành tính bất biến. Clojure là một bổ sung gần đây cho nền tảng JVM (Clojure là một phương ngữ LISP)

Trong Scala (cũng là ngôn ngữ JVM ), một bộ hợp nhất các biến hỗ trợ OO và FP được khai báo vallà không thay đổi. Tính biểu cảm của Scala và hỗ trợ lai OO / FP làm cho nó trông giống với Mathicala . ( Akka là một khuôn khổ có thêm Erlang OTP và Clojure chức năng như STM .. để Scala và Java.) Lacasa thêm hệ thống kiểu và mô hình lập trình để thực thi kỷ luật khả năng đối tượng trong Scala, và để cung cấp tài liệu tham khảo đối tượng duy nhất. ( ) ( nền tảng lý thuyết )

Trong Java, một biến được khai báo finallà bất biến và các thư viện Java như Google Guava bao gồm các thư viện bộ sưu tập bất biến. Java Stringcũng luôn luôn bất biến.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.