Để 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.