Tôi muốn giải quyết ý tưởng mà nhiều người đăng đã đưa ra, rằng một ngôn ngữ như vậy sẽ là "vô dụng". Có lẽ sẽ vô ích khi con người viết, bằng tay, với ý định giải quyết một số nhiệm vụ cụ thể. Tuy nhiên, mặc dù là trường hợp sử dụng đa số cho các ngôn ngữ lập trình, đó chắc chắn không phải là trường hợp sử dụng duy nhất. Một số trường hợp sử dụng xuất hiện trong đó một ngôn ngữ như vậy là hữu ích và chúng ta có thể tìm đến các trường đó để biết ví dụ về các ngôn ngữ đó.
Trước hết, ám chỉ về di truyền học của Cort Ammon là: sự chuyển đổi chương trình trong câu hỏi (thay thế )
cho 5
) có thể được coi là một đột biến . Loại thao tác này là phổ biến trong lĩnh vực tính toán tiến hóa ; trong các thuật toán di truyền cụ thể thực hiện các biến đổi như vậy trên các chuỗi , trong khi lập trình di truyền biến đổi các chương trình . Trong cả hai trường hợp, chúng ta thường muốn gán ý nghĩa cho mọi khả năng, vì điều đó sẽ tạo ra không gian tìm kiếm nhỏ gọn nhất.
Các thuật toán di truyền dựa trên một số loại chức năng đánh giá cho chuỗi; nếu chúng ta sử dụng trình thông dịch ngôn ngữ lập trình làm chức năng đánh giá, thì chúng ta có một kịch bản trong đó một ngôn ngữ lập trình gán nghĩa cho tất cả các chuỗi có thể là hữu ích. Trong lập trình di truyền, người ta cho rằng chức năng đánh giá của chúng tôi là một trình thông dịch ngôn ngữ lập trình, nhưng chúng tôi có thể chọn các cách trình bày khác nhau cho các chương trình của chúng tôi; ví dụ, nhiều hệ thống hoạt động trên các cây cú pháp trừu tượng. Nếu chúng ta chọn các chuỗi làm đại diện, thì chúng ta sẽ phục hồi cùng một kịch bản như với các thuật toán di truyền.
Một tình huống khác mà chúng ta có thể muốn mọi chuỗi là một chương trình hợp lệ là khi liệt kê các chương trình. Điều này có liên quan đến sự lựa chọn được đề cập bởi CodeInChaos, nhưng chúng tôi có thể thích hoạt động trên các chuỗi hơn là số tự nhiên vì một số lý do:
- Nếu có một số cấu trúc trong ngôn ngữ, ví dụ. chúng ta có thể gán nghĩa cho các chuỗi con, điều này có thể bị mất khi dịch sang số tự nhiên. Trong trường hợp này, chúng tôi có thể thích sử dụng các chuỗi, để lý giải và chuyển đổi các chuỗi con cục bộ, thay vì đại diện cho toàn bộ chương trình dưới dạng một số. Điều này tương tự như cách chúng ta có thể thích sử dụng các phép toán bit trên một int hơn là các biểu thức số học, khi mỗi bit có một ý nghĩa riêng. Đây về cơ bản là một khái quát của kịch bản tiến hóa.
- Chúng tôi có thể muốn tạo ra các chương trình theo yêu cầu; ví dụ, chúng ta có thể bắt đầu thực hiện một chương trình hoàn toàn không xác định và chỉ tạo (ví dụ: ngẫu nhiên) các lệnh riêng lẻ (ví dụ: ký tự) khi / nếu con trỏ lệnh đến chúng. Điều này là phổ biến trong lý thuyết thông tin thuật toán, trong đó chương trình là băng máy Turing và mục đích là để mô tả hành vi của các chương trình được tạo ngẫu nhiên. Ví dụ: chúng ta có thể xây dựng Solomonoff trước các chuỗi tùy ý là xác suất mà một máy Turing phổ dụng với một băng ngẫu nhiên sẽ tạo ra chuỗi đó.
Về các ngôn ngữ ví dụ, nhiều hệ thống tính toán tiến hóa dựa trên các ngôn ngữ ngăn xếp như họ Push . Chúng có xu hướng cho phép các luồng mã thông báo tùy ý (mà chúng ta có thể biểu thị dưới dạng các ký tự riêng lẻ). Đôi khi (như ví dụ Brainfuck của BrainSlugs83) có những hạn chế trong việc cân bằng dấu ngoặc đơn; tuy nhiên, chúng ta có thể liên hệ điều này với các chương trình tự phân định , trong đó một chuỗi như [
có thể không phải là một chương trình hợp lệ , nhưng nó là một tiền tố chương trình hợp lệ . Nếu chúng ta tưởng tượng một trình biên dịch / trình thông dịch đọc mã nguồn từ stdin, thì nó sẽ không từ chối một chuỗi như thế [
, nó sẽ chỉ chờ thêm đầu vào trước khi tiếp tục.
Các ngôn ngữ như Logic kết hợp nhị phân và tính toán nhị phân Lambda tính trực tiếp phát sinh từ lý thuyết thông tin thuật toán, ví dụ. từ http://tromp.github.io/cl/cl.html
Thiết kế của một máy tính phổ thông tối giản này được thúc đẩy bởi mong muốn của tôi để đưa ra một định nghĩa cụ thể về Độ phức tạp Kolmogorov, nghiên cứu tính ngẫu nhiên của các đối tượng riêng lẻ.
You are a bimbo.