Je me demande, est notation musicale langue Turing-Complete ?
Ma première pensée est qu'il y a des boucles dans la notation musicale, mais il n'y a aucun moyen d'écrire des branches conditionnelles, non?
Je ne suis pas musicien, alors peut-être que quelqu'un peut aider à combler les lacunes?
Oui, si vous admettez quelques instructions de transposition - peu communes mais pas inconnues.
Vous pouvez alors interpréter une pièce comme Choon , qui est Turing-complete. L'interprète est la mémoire: ils doivent se souvenir du nombre de notes par lesquelles la pièce est actuellement transposée, et de toutes les notes qu'ils ont jouées jusqu'à présent. De toute évidence, cela n'est possible que pour un ordinateur, ou peut-être un savant.
Du manuel Choon:
Transpositions
Il y a trois instructions de transposition, en haut (
+
), En bas (-
) Et en annulation (.
). Une instruction de transposition transpose toutes les notes suivantes jouées par la quantité de la dernière note jouée. L'instruction d'annulation (.
) Remet la transposition à zéro.Les transpositions sont cumulatives, donc le code Choon pour transposer les notes futures par 2 est
b+
, Et par 4 seraitb++
. De plus, la valeur utilisée est la valeur de la note précédente après l'application des transpositions, doncb+b+
Transpose les notes futures par 6, pas par 4.John Cage
L'instruction John Cage (
%
) Provoque un silence d'une note dans le flux de sortie. La valeur de transposition d'une John Cage est nulle -%-
Et%+
Sont sans opération (sauf qu'un seul silence est ajouté à la sortie).Répéter les mesures
Les instructions de répétition des barres (
||:
Et:||
) Contiennent une boucle. La boucle s'exécutera le nombre de fois indiqué par la note la plus récente jouée avant que le||:
Ne soit rencontré. Une valeur nulle ou négative signifie que Choon sautera immédiatement pour commencer à jouer à partir du:||
Correspondant. Un John Cage signifie répéter pour toujours -%||::||
Est une boucle infinie.Diapason
L'instruction Tuning Fork
~
Fournit un moyen de sortir des boucles. Si un diapason est rencontré dans une boucle et que la dernière note jouée était une note de valeurA
, alors Choon sautera immédiatement pour commencer à jouer après la prochaine instruction:||
. S'il n'y a pas d'autre instruction:||
(Ce qui signifie que~
A été utilisé en dehors de toute barre de répétition), la performance s'arrête immédiatement.Marqueurs
Les marqueurs offrent une merveilleuse commodité de programmation. Un marqueur est une lettre minuscule ou un mot qui se souvient d'un point dans le flux de sortie. En se référant à un marqueur (voir ci-dessous), la note jouée après que le marqueur s'est produit sera rejouée. Notez que les transpositions affecteront cette nouvelle note jouée.
Lorsque deux marqueurs ou plus apparaissent séquentiellement, ou qu'un marqueur suit une instruction de lecture à partir du marqueur, ils doivent être séparés par des espaces.
Lire à partir de la sortie
L'instruction Lire depuis la sortie (
=
) Vous permet de rejouer des notes qui ont déjà été jouées dans le flux de sortie. Vous pouvez vous référer aux notes par numéro - la 5ème note jouée depuis le début du programme serait=5
, Par numéro relatif - la 3ème note jouée la plus récente serait=-3
Ou par marqueur - la note joué après le marqueurx
serait=x
.C'est un idiome commun de réutiliser un marqueur et de s'y référer immédiatement, comme ceci:
x=x
. Cela revient à direx=x+y
Dans un langage de programmation conventionnel (oùy
représente la valeur de transposition actuellement effective).
A John Cage est juste un reste , un Tuning Fork est (à peu près) dal segno, et un marqueur est un segno. Je suppose que le diapason pourrait être joué par un artiste supplémentaire auquel l'interprète principal répond, mais le principe est le même.
Pour être complet, il faut au minimum trois choses: une boucle infinie, un saut conditionnel (si-alors) et un moyen de stocker les résultats des calculs quelque part en mémoire. Même si la notation musicale avait des sauts conditionnels, elle n'a pas état, donc non, ce n'est pas Turing-complete.
La preuve standard pour qu'une langue soit Turing complète est d'écrire une machine Turing dans cette langue. Cela prouve qu'il existe une équivalence entre la langue (généralement un sous-ensemble de la langue) et la machine de Turing.
La notion de "notation musicale" est un peu glissante. Il y a beaucoup de gravure standardisée qui est utilisée. Toutefois. Il y a des compositeurs poussant les enveloppes qui écrivent toutes sortes de trucs fous sur papier.
Imaginons que vous souhaitiez vous concentrer sur le sous-ensemble de la notation musicale qui est considéré comme suffisamment standard pour faire partie de Finale ou Sibelius ou d'un ensemble d'outils de gravure du flux principal.
Donc.
Pour Python (ou C ou autre), vous définissez les symboles, la bande, les règles de transition et les diverses actions qui mettent à jour la bande pour refléter le changement d'état et le mouvement de la bande, en lisant et en écrivant des symboles sur Le ruban.
A l'aide de la "notation musicale", nous devons définir les symboles et la bande avec état, les règles de transition et les différentes actions qui mettent à jour la bande.
Ce qui nous manque, c'est une bande avec état et des règles qui indiquent aux musiciens comment réagir aux symboles sur la bande et comment mettre à jour cette bande.
Dans un sens, les bruits qui circulent dans l'air pourraient être la bande avec état. Mais. Il n'y a pas de moyen facile de rembobiner la bande. Ce manque de rembobinage signifie que l'artiste interprète ou exécutant devrait conserver une "bande" privée quelconque.
Cela va à l'extérieur de la notation musicale et dans d'autres instructions extra-musicales à l'interprète.
Une grande partie de la notation est sujette à interprétation, et les instructions en langage naturel sont un aspect accepté de la notation musicale - et ont été à travers la plupart sinon la totalité de l'histoire de la musique notée occidentale.
Fermatas par définition dépendent de la discrétion de l'interprète, ce qui signifie qu'il dépendrait de leur propre état, qui est presque toujours modifié par la musique en conjonction avec des facteurs externes - cela soulève donc des questions sur les apatrides nature de la notation musicale.
Canon a 2 par tonus de l'offrande musicale de Bach est une pièce en boucle infinie dont la tonalité augmente d'un pas à chaque fois aussi longtemps que la pièce est jouée.
Plus récemment, il est courant de voir des instructions telles que "répéter pour chaque soliste" dans, par exemple, des versions notées de morceaux de Jazz comme Dave Brubeck's Take Five .
Cela dit, à part des aspects intrinsèquement arbitraires comme les fermata, comme l'indiquent les autres réponses, la notation musicale avec rien d'autre que les symboles généraux n'est probablement pas complète de Turing.
Non. Vous pouvez toujours déterminer en regardant la partition si la pièce continue indéfiniment ou finit éventuellement. Par conséquent, la notation musicale ne présente pas le problème d'arrêt , ce qui prouve qu'il n'est pas Turing-complete .
L'exhaustivité de Turing fait référence à un ensemble de symboles et à un ensemble de règles pour manipuler ces symboles. Les règles sont la partie intéressante. Les symboles peuvent être n'importe quoi, et il est bien connu que vous pouvez vous en tirer avec seulement deux symboles.
Si nous considérons simplement la notation musicale comme un ensemble de symboles et que nous créons ensuite notre propre ensemble de règles, nous pouvons facilement créer un système complet. Nous pouvons le faire avec n'importe quel ensemble de symboles arbitraires, donc cela ne dit rien d'intéressant sur la notation musicale en particulier.
Mais si nous acceptons uniquement les règles implicites de la notation musicale (c'est-à-dire comment les musiciens sont censés interpréter les notes et les jouer), alors non, la notation musicale n'est pas Turing-complete. Cela peut être vu en ce que tout morceau de partition se termine.
Les répétitions n'aident pas, car les sections sont toujours répétées un nombre fixe de fois.
(Eh bien, je suppose que nous pourrions écrire "répéter indéfiniment" sur une répétition. Mais même si nous permettions cela dans le cadre de la notation, nous pourrions toujours déterminer facilement pour chaque morceau de musique s'il se termine ou non. Si la notation musicale était Turing-complete , cela ne serait pas possible en général.)
Il n'est pas lié aux langages complets de Turing car il s'agit d'un langage descriptif. Il n'y a pas de commandes en termes de calcul ou de modification de données, pas d'états, pas d'entrée, pas de sortie à l'exception du résultat de la description elle-même.
Il n'y a pas non plus de sauts conditionnels en fonction de l'entrée. Lorsque vous résolvez tous les sauts, vous obtenez une structure linéaire, pas un arbre. Tous les "programmes" modélisables par ce langage sont donc linéaires, sans boucles ni sauts.