Là ký hiệu âm nhạc Turing-Complete?


63

Tôi đang tự hỏi, ngôn ngữ ký hiệu âm nhạc Turing-Complete phải không?

Suy nghĩ đầu tiên của tôi là có những vòng lặp trong ký hiệu âm nhạc, nhưng không có cách nào để viết các nhánh có điều kiện, phải không?

Tôi không phải là nhạc sĩ, vì vậy có lẽ ai đó có thể giúp lấp đầy những khoảng trống?


7
ngôn ngữ phân vùng âm nhạc là gì? một số hình thức ký hiệu âm nhạc ?
gnat

4
Tôi không biết nhiều về ký hiệu âm nhạc: bằng cách nào đó bạn có thể mã hóa một lượng "biến có thể thay đổi" (hoặc "băng" không giới hạn) không? Mặt khác, tôi không thấy làm thế nào nó có thể được hoàn thành.
nikie

không, nó không
shabunc

@nikie Tôi không chắc chắn nếu một điệp khúc hoạt động như một chức năng được lưu trữ hoặc một cái gì đó tương tự ...
Klaim

2
Tất nhiên đó là Turing-Complete, chỉ cần sử dụng 8 ghi chú khác nhau để thể hiện 8 ký tự của Brainfuck. :)
Chris Burt-Brown

Câu trả lời:


37

Có, nếu bạn thừa nhận một vài hướng dẫn về chuyển vị thì không phổ biến nhưng không rõ.

Sau đó, bạn có thể diễn giải một tác phẩm là Choon , đó là Turing-Complete. Người biểu diễn là bộ nhớ: họ phải nhớ số lượng ghi chú mà tác phẩm hiện đang được chuyển đổi và tất cả các ghi chú họ đã chơi cho đến nay. Rõ ràng nó chỉ khả thi đối với một máy tính, hoặc có lẽ là một người hiểu biết.

Từ hướng dẫn sử dụng Choon:

  • Chuyển vị

    Có ba hướng dẫn chuyển vị, lên ( +), xuống ( -) và hủy ( .). Một lệnh chuyển vị chuyển đổi tất cả các ghi chú tiếp theo được phát bằng số lượng ghi chú cuối cùng được phát. Lệnh hủy ( .) đặt chuyển vị trở về không.

    Các chuyển vị được tích lũy, do đó, mã Choon để hoán chuyển các ghi chú trong tương lai lên 2 là b+và 4 sẽ là b++. Ngoài ra, giá trị được sử dụng là giá trị của ghi chú trước đó sau khi chuyển vị đã được áp dụng, do đó b+b+chuyển đổi các ghi chú trong tương lai lên 6, không phải bằng 4.

  • John Lồng

    Lệnh John Cage ( %) gây ra sự im lặng một nốt trong luồng đầu ra. Giá trị chuyển vị của John Cage bằng 0 - %-%+không có op (ngoại trừ một khoảng lặng duy nhất được thêm vào đầu ra).

  • Thanh lặp lại

    Các hướng dẫn Thanh lặp lại ( ||::||) kèm theo một vòng lặp. Vòng lặp sẽ thực thi số lần được chỉ định bởi ghi chú gần đây nhất được phát trước khi ||:gặp phải. Giá trị 0 hoặc âm sẽ có nghĩa là Choon sẽ ngay lập tức nhảy để bắt đầu chơi từ trận đấu :||. John Cage có nghĩa là lặp lại mãi mãi - %||::||là một vòng lặp vô hạn.

  • Âm thoa

    Lệnh Tune Fork ~cung cấp một cách để thoát ra khỏi các vòng lặp. Nếu một ngã ba điều chỉnh gặp phải trong một vòng lặp và ghi chú cuối cùng được phát là một ghi chú về giá trị A, thì Choon sẽ ngay lập tức nhảy để bắt đầu chơi từ sau lệnh tiếp theo :||. Nếu không có :||hướng dẫn thêm (nghĩa là ~đã được sử dụng bên ngoài bất kỳ thanh lặp lại nào), thì hiệu suất sẽ ngay lập tức chấm dứt.

  • Điểm đánh dấu

    Markers cung cấp sự thuận tiện lập trình tuyệt vời. Điểm đánh dấu là một chữ cái viết thường hoặc từ ghi nhớ một điểm trong luồng đầu ra. Tham chiếu đến một điểm đánh dấu (xem bên dưới) sẽ khiến ghi chú được phát sau khi đánh dấu xảy ra để được phát lại. Lưu ý rằng chuyển vị sẽ ảnh hưởng đến ghi chú mới được phát này.

    Khi hai hoặc nhiều điểm đánh dấu xảy ra tuần tự hoặc một điểm đánh dấu tuân theo hướng dẫn phát từ điểm đánh dấu, chúng phải được phân tách bằng khoảng trắng.

  • Chơi từ đầu ra

    Hướng dẫn Play From Output ( =) cho phép bạn phát lại các ghi chú đã được phát trong luồng đầu ra. Bạn có thể tham khảo các ghi chú theo số - ghi chú thứ 5 được phát kể từ khi chương trình bắt đầu =5, theo số tương đối - ghi chú gần đây thứ 3 được chơi sẽ =-3hoặc theo điểm đánh dấu - ghi chú được phát sau khi đánh dấu xsẽ là =x.

    Đây là một thành ngữ phổ biến để sử dụng lại một điểm đánh dấu và ngay sau đó tham chiếu đến nó, như thế này : x=x. Điều này giống như nói x=x+ytrong một ngôn ngữ lập trình thông thường (trong đó yđại diện cho giá trị chuyển vị hiện có hiệu quả).

Một John Cage chỉ là một phần còn lại , một Fork Fork là (khoảng) dal segno, và một điểm đánh dấu là một segno. Tôi cho rằng ngã ba điều chỉnh có thể được chơi bởi một người biểu diễn bổ sung mà người biểu diễn chính phản hồi, nhưng nguyên tắc là như vậy.


1
Tôi muốn nói rằng đây là câu trả lời tốt nhất cho câu hỏi: không có câu trả lời nào khác chứng minh rằng ký hiệu âm nhạc chưa hoàn chỉnh.
K.Steff

24

Tối thiểu Turing đòi hỏi, tối thiểu, ba điều: một vòng lặp vô hạn, một bước nhảy có điều kiện (nếu-thì) và một cách để lưu trữ kết quả tính toán vào một nơi nào đó trong bộ nhớ. Ngay cả khi ký hiệu âm nhạc có các bước nhảy có điều kiện, nó không có trạng thái, vì vậy không, nó không hoàn chỉnh.


13
Nó có các bước nhảy có điều kiện, được sử dụng kết hợp với các dấu hiệu lặp lại: "ở lần lặp lại đầu tiên, chơi phần này, lặp lại lần thứ hai, chơi phần đó". Bộ đếm lặp lại (mà bạn giữ trong đầu khi chơi) là trạng thái. Nhưng nó thực sự không có một băng vô hạn chứa trạng thái.
Jesper

49
Sự thật thú vị: Giải tích Lambda không có vòng lặp, không có bước nhảy có điều kiện và không có cách nào để lưu trữ kết quả tính toán ở đâu đó trong bộ nhớ. Tuy nhiên, nó là Turing hoàn chỉnh ;-)
nikie

11
@Nikie: Đừng nhầm lẫn trừu tượng với thực tế. Phép tính Lambda có một khái niệm về đánh giá có điều kiện, đệ quy được sử dụng cho cả vòng lặp và bước nhảy, và trạng thái được tính là kết quả của việc đánh giá biểu thức. Các khái niệm là có; họ chỉ thực hiện theo một cách rất khác với lập trình máy tính thực sự.
Mason Wheeler

5
@MasonWheeler: LC không có các khái niệm cơ bản về vòng lặp, trạng thái và điều kiện, nhưng bạn có thể rút ra những thứ phục vụ cho mục đích tương tự. Đó chỉ là một cách khác để nói rằng nó hoàn thành. Vì vậy, câu hỏi không phải là: ký hiệu âm nhạc có những khái niệm này không, nhưng: bạn có thể rút ra chúng bằng cách nào đó không? Bạn chỉ đơn giản tuyên bố rằng bạn không thể, mà không có bằng chứng. (Tôi đồng ý với kết luận của bạn, tôi chỉ không nghĩ rằng lý luận của bạn là hợp lệ.)
nikie

9
@MasonWheeler: Lambda tính toán chương trình máy tính thực sự.
dan_waterworth

23

Bằng chứng tiêu chuẩn cho một ngôn ngữ được Turing hoàn thành là viết một máy Turing bằng ngôn ngữ đó. Điều này chứng tỏ rằng có sự tương đương giữa ngôn ngữ (thường là tập hợp con của ngôn ngữ) và máy Turing.

Khái niệm "Ký hiệu âm nhạc" hơi trơn. Có rất nhiều khắc tiêu chuẩn được sử dụng. Tuy nhiên. Có những nhà soạn nhạc đẩy phong bì viết tất cả những thứ điên rồ xuống giấy.

Hãy giả vờ rằng bạn muốn tập trung vào tập hợp các ký hiệu âm nhạc được coi là đủ tiêu chuẩn để trở thành một phần của Finale hoặc Sibelius hoặc một số bộ công cụ khắc dòng chính.

Vì thế.

Đối với Python (hoặc C hoặc bất cứ điều gì), bạn xác định các ký hiệu, băng, quy tắc chuyển đổi và các hành động khác nhau cập nhật băng để phản ánh sự thay đổi trạng thái và chuyển động của băng, đọc và viết ký hiệu trên băng.

Sử dụng "Ký hiệu âm nhạc", chúng tôi phải xác định các ký hiệu và băng trạng thái, quy tắc chuyển đổi và các hành động khác nhau để cập nhật băng.

Những gì chúng ta thiếu là một băng ghi âm và các quy tắc cho các nhạc sĩ biết cách phản ứng với các biểu tượng trên băng và cách cập nhật băng đó.

Theo một nghĩa nào đó, những tiếng động chảy trong không khí có thể là băng ghi âm. Nhưng. Không có cách nào dễ dàng để tua lại băng. Việc thiếu tua lại này có nghĩa là người biểu diễn sẽ phải giữ một "băng" riêng tư nào đó.

Điều này nhận được bên ngoài ký hiệu âm nhạc và vào một số hướng dẫn ngoài âm nhạc khác cho người biểu diễn.


Chà, bạn thực sự không thể tua lại một chương trình đang chạy, ... (Nhưng vâng, tôi hiểu ý của bạn về việc cập nhật trạng thái, nhưng đó có thể là ngôn ngữ chức năng không?)
Izkata

2
Bạn không tua lại chương trình. Bạn tua lại băng. Điểm đáng chú ý là băng Turing có tất cả các vị trí có thể truy cập. Đó là "Bộ nhớ truy cập ngẫu nhiên" được đơn giản hóa thành thời gian tuyến tính với chuyển động tiến và lùi.
S.Lott

Ohhh, tôi nhớ điều đó bây giờ, xin lỗi. Tôi đã nghĩ đến "băng" là thứ âm nhạc được viết vì một lý do nào đó =)
Izkata

Xây dựng máy Turing là cách tiêu chuẩn để chứng minh một thứ gì đó là Turing hoàn chỉnh, nhưng điều ngược lại là không đúng - đơn giản vì bạn không thể tìm ra cách xây dựng máy Turing không có nghĩa là một thứ gì đó không hoàn thành. Một máy Turing (có băng và tất cả) chỉ là một bản tóm tắt tùy ý có đủ sức mạnh tính toán; có những thứ trừu tượng khác cũng mạnh mẽ không có khái niệm về băng. Hãy xem tính toán lambda, tính toán SKI hoặc một số ngôn ngữ bí truyền (Fractran rất tuyệt).
Tikhon Jelvis

3

Phần lớn các ký hiệu được mở để giải thích, và các hướng dẫn ngôn ngữ tự nhiên là một khía cạnh được chấp nhận của ký hiệu âm nhạc - và đã có trong hầu hết nếu không phải là tất cả lịch sử của âm nhạc ký hiệu phương Tây.

Fermatas theo định nghĩa phụ thuộc vào ý của người biểu diễn, điều đó có nghĩa là nó sẽ phụ thuộc vào trạng thái của chính họ, điều này hầu như luôn bị thay đổi bởi âm nhạc kết hợp với các yếu tố bên ngoài - vì vậy điều này đặt ra một số câu hỏi về bản chất phi trạng thái của ký hiệu âm nhạc.

Canon a 2 mỗi Tonus từ Nhạc phẩm của Bach là một tác phẩm được lặp đi lặp lại vô hạn, âm điệu của nó tăng lên theo từng bước trong suốt thời gian cho đến khi tác phẩm được thực hiện.

Gần đây, người ta thường thấy các hướng dẫn như "lặp lại cho mỗi nghệ sĩ độc tấu", ví dụ, các phiên bản được ghi chú của các bản nhạc Jazz như Take Five của Dave Brubeck .

Điều đó nói rằng, ngoài các khía cạnh tùy tiện vốn có như fermata, như các câu trả lời khác, ký hiệu âm nhạc không có gì ngoài các biểu tượng chung có lẽ không hoàn chỉnh.


1

Nó không liên quan đến ngôn ngữ hoàn chỉnh Turing vì đây là ngôn ngữ mô tả. Không có lệnh về tính toán hoặc sửa đổi dữ liệu, không có trạng thái, không có đầu vào, không có đầu ra ngoại trừ kết quả của bản mô tả.

Ngoài ra không có bước nhảy có điều kiện tùy thuộc vào đầu vào. Khi bạn giải quyết tất cả các bước nhảy, bạn sẽ có được cấu trúc tuyến tính chứ không phải cây. Vì vậy, tất cả các "chương trình" có thể được mô hình hóa bằng ngôn ngữ này là tuyến tính mà không có bất kỳ vòng lặp hoặc nhảy nào cả.


1
Những gì bạn liệt kê là không cần thiết cho một ngôn ngữ hoàn chỉnh Turing. Phép tính Lambda chỉ có các ứng dụng, biến và lambdas (ví dụ: không có vòng lặp, trạng thái hoặc lệnh) nhưng đã hoàn tất Turing. Điều tương tự cũng xảy ra với một loạt các mô hình tính toán khác như các tổ hợp SKI.
Tikhon Jelvis
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.