La notazione musicale è Turing-Complete?


63

Mi chiedo, il linguaggio delle notazioni musicali è Turing-Complete ?

Il mio primo pensiero è che ci sono anelli nella notazione musicale, ma non c'è modo di scrivere rami condizionali, giusto?

Non sono un musicista, quindi forse qualcuno può aiutare a colmare le lacune?


7
qual è la lingua della partizione musicale ? qualche forma di notazione musicale ?
moscerino il

4
Non so molto sulla notazione musicale: puoi in qualche modo codificare una quantità illimitata di "variabili mutabili" (o "nastro")? Altrimenti, non vedo come potrebbe essere completo.
Nikie,

no, non lo fa
shabunc

@nikie Non sono sicuro che un ritornello funga da funzione memorizzata o qualcosa di simile ...
Klaim

2
Ovviamente è Turing completo, basta usare 8 note diverse per rappresentare gli 8 personaggi di Brainfuck. :)
Chris Burt-Brown,

Risposte:


37

Sì, se ammetti alcune istruzioni per la trasposizione, non comuni ma non sconosciute.

È quindi possibile interpretare un brano come Choon , che è Turing completo. L'esecutore è il ricordo: devono ricordare il numero di note con cui il brano è attualmente trasposto e tutte le note che hanno suonato finora. Ovviamente è fattibile solo per un computer, o forse un esperto.

Dal manuale Choon:

  • trasposizioni

    Esistono tre istruzioni di trasposizione, su ( +), giù ( -) e cancella ( .). Un'istruzione di trasposizione traspone tutte le note successive suonate dalla quantità dell'ultima nota suonata. L'istruzione cancel ( .) riporta la trasposizione a zero.

    Le trasposizioni sono cumulative, quindi il codice Choon per trasporre le note future di 2 è b+, e lo sarebbe di 4 b++. Inoltre, il valore utilizzato è il valore della nota precedente dopo l'applicazione delle trasposizioni, quindi b+b+traspone le note future di 6, non di 4.

  • John Cage

    L'istruzione John Cage ( %) provoca un silenzio di una nota nel flusso di output. Il valore di trasposizione di una John Cage è zero - %-e %+non sono operativi (tranne che un singolo silenzio viene aggiunto all'output).

  • Ripeti le barre

    Le istruzioni Ripeti le barre ( ||:e :||) racchiudono un loop. Il loop eseguirà il numero di volte indicato dalla nota più recente suonata prima ||:dell'incontro. Un valore zero o negativo significa che Choon salterà immediatamente per iniziare a giocare dalla corrispondenza :||. Una John Cage significa ripetere per sempre - %||::||è un ciclo infinito.

  • Diapason

    Le istruzioni del diapason ~forniscono un modo per uscire dagli anelli. Se si incontra un diapason in un loop e l'ultima nota suonata era una nota di valore A, Choon salterà immediatamente per iniziare a suonare dopo l' :||istruzione successiva . Se non ci sono ulteriori :||istruzioni (il significato ~è stato usato al di fuori di qualsiasi barra di ripetizione), l'esecuzione si interromperà immediatamente.

  • marcatori

    I marcatori offrono una straordinaria comodità di programmazione. Un marcatore è una lettera minuscola o parola che ricorda un punto nel flusso di output. Facendo riferimento a un marker (vedere sotto), la nota suonata dopo che si è verificato il Marker verrà nuovamente riprodotta. Nota che le trasposizioni influenzeranno questa nota appena suonata.

    Laddove due o più marker si verificano in sequenza, o un marker segue un'istruzione play-from-marker, devono essere separati da spazi bianchi.

  • Riproduci dall'output

    L'istruzione Play From Output ( =) consente di riprodurre nuovamente le note che sono già state riprodotte nel flusso di output. È possibile fare riferimento alle note per numero - la quinta nota suonata dall'inizio del programma sarebbe =5, per numero relativo - la terza nota più recente suonata sarebbe =-3o per marcatore - la nota suonata dopo il marcatore xsarebbe =x.

    Si tratta di un idioma comune di ri-utilizzare un marcatore e subito quindi fare riferimento ad esso, in questo modo: x=x. Questo è come dire x=x+yin un linguaggio di programmazione convenzionale (dove yrappresenta il valore di trasposizione attualmente efficace).

Una John Cage è solo un periodo di riposo , un diapason è (approssimativamente) dal segno e un marker è un segno. Suppongo che il diapason possa essere suonato da un esecutore aggiuntivo al quale risponde l'esecutore principale, ma il principio è lo stesso.


1
Direi che questa è la migliore risposta alla domanda: nessuna delle altre risposte dimostra che la notazione musicale non sia completa di Turing.
K.Steff,

24

La completezza di Turing richiede almeno tre cose: un loop infinito, un salto condizionale (if-then) e un modo per memorizzare i risultati dei calcoli in un punto della memoria. Anche se la notazione musicale aveva dei salti condizionati, non ha stato, quindi no, non è completa di Turing.


13
Ha una sorta di salti condizionali, usati in combinazione con segni di ripetizione: "sulla prima ripetizione, gioca questa parte, sulla seconda ripetizione, suona quella parte". Il contatore di ripetizioni (che tieni in testa mentre giochi) è stato. Ma in effetti non ha un nastro infinito contenente stato.
Jesper,

49
Curiosità: il calcolo Lambda non ha loop, nessun salto condizionale e nessun modo per memorizzare i risultati dei calcoli da qualche parte nella memoria. Eppure è completamente completo ;-)
nikie

11
@Nikie: non confondere le astrazioni con le realtà. Il calcolo lambda ha un concetto di valutazione condizionale, la ricorsione viene utilizzata sia per il loop che per il salto e lo stato viene calcolato come risultato della valutazione delle espressioni. I concetti ci sono; sono solo implementati in un modo molto diverso dalla vera programmazione per computer.
Mason Wheeler,

5
@MasonWheeler: LC non ha concetti fondamentali di loop, stato e condizionali, ma puoi ricavare cose che hanno uno scopo simile. Questo è solo un altro modo per dire che è Turing completo. Quindi la domanda non è: la notazione musicale ha questi concetti, ma: puoi derivarli in qualche modo? Hai semplicemente affermato di non poterlo fare, senza prove. (Sono d'accordo con la tua conclusione, non penso proprio che il tuo ragionamento sia valido.)
Nikie,

9
@MasonWheeler: il calcolo Lambda è una vera programmazione per computer.
dan_waterworth,

23

La prova standard per completare una lingua di Turing è scrivere una macchina Turing in quella lingua. Ciò dimostra che esiste un'equivalenza tra la lingua (di solito un sottoinsieme della lingua) e la macchina di Turing.

La nozione di "Notazione musicale" è un po 'scivolosa. Vengono utilizzate molte incisioni standardizzate. Però. Ci sono compositori che spingono buste che scrivono tutti i tipi di cose folli sulla carta.

Facciamo finta che tu voglia concentrarti sul sottoinsieme della notazione musicale che è considerato abbastanza standard da far parte di Finale o Sibelius o qualche set di strumenti per l'incisione del flusso principale.

Così.

Per Python (o C o altro) si definiscono i simboli, il nastro, le regole di transizione e le varie azioni che aggiornano il nastro per riflettere il cambiamento di stato e il movimento del nastro, leggendo e scrivendo simboli sul nastro.

Usando "Notazione musicale", dobbiamo definire i simboli e il nastro con stato, le regole di transizione e le varie azioni che aggiornano il nastro.

Ciò che ci manca è un nastro con stato e regole che diano ai musicisti come rispondere ai simboli sul nastro e come aggiornare quel nastro.

In un certo senso, i rumori che circolano nell'aria potrebbero essere il nastro con stato. Ma. Non esiste un modo semplice per riavvolgere il nastro. Questa mancanza di riavvolgimento significa che l'esecutore dovrebbe mantenere un "nastro" privato di qualche tipo.

Questo va al di fuori della notazione musicale e in alcune altre istruzioni extra-musicali per l'esecutore.


Beh, non puoi davvero riavvolgere un programma in esecuzione, neanche ... (Ma sì, capisco cosa intendi per aggiornare lo stato, ma potrebbe a sua volta essere un linguaggio funzionale?)
Izkata

2
Non riavvolgi il programma. Riavvolgi il nastro. Il punto è che il nastro di Turing ha tutte le posizioni accessibili. È "Random Access Memory" semplificata in un tempo lineare con movimenti avanti e indietro.
S.Lott

Ohhh, ora me lo ricordo, scusa. Stavo pensando al "nastro" come la cosa su cui è stata scritta la musica per qualche motivo =)
Izkata,

Costruire una macchina Turing è il modo standard per dimostrare che qualcosa è Turing completa, ma il contrario non è vero - semplicemente perché non riesci a capire come costruire una macchina Turing non significa che qualcosa non sia completa. Una macchina di Turing (con un nastro e tutto) è solo un'astrazione arbitraria che ha abbastanza potenza di calcolo; ci sono altre astrazioni altrettanto potenti senza la nozione di nastri. Dai un'occhiata al calcolo lambda, al calcolo SKI o ad alcune lingue esoteriche (Fractran è fantastico).
Tikhon Jelvis,

3

Gran parte della notazione è aperta all'interpretazione e le istruzioni in linguaggio naturale sono un aspetto accettato della notazione musicale - e sono state nella maggior parte, se non in tutta la storia della musica notata occidentale.

Le fermate, per definizione, dipendono dalla discrezione dell'esecutore , il che significa che dipenderebbe dal proprio stato, che è quasi sempre alterato dalla musica in combinazione con fattori esterni - quindi questo solleva alcune domande sulla natura apolide della notazione musicale.

Canon a 2 per Tonus dell'Offerta Musicale di Bach è un pezzo a loop infinito la cui tonalità aumenta di un passo ogni volta per tutto il tempo in cui il pezzo viene eseguito.

Più recentemente, è comune vedere istruzioni come "ripeti per ogni solista", ad esempio in versioni notate di brani jazz come Take Five di Dave Brubeck .

Detto questo, a parte aspetti intrinsecamente arbitrari come la fermata, come affermano le altre risposte, la notazione musicale con nient'altro che i simboli generali non è probabilmente Turing completa.


1

Non è correlato alle lingue complete di Turing in quanto è una lingua descrittiva. Non ci sono comandi in termini di calcolo o modifica dei dati, né stati, né input, né output se non per il risultato della descrizione stessa.

Inoltre non ci sono salti condizionati a seconda dell'input. Quando risolvi tutti i salti ottieni una struttura lineare, non un albero. Quindi tutti i "programmi" che possono essere modellati da questo linguaggio sono lineari senza alcun loop o salto.


1
Ciò che hai elencato non è necessario per una lingua completa di Turing. Il calcolo Lambda ha solo applicazioni, variabili e lambda (ad esempio senza loop, stati o comandi) ma Turing è completo. Lo stesso vale per un sacco di altri modelli di calcolo come i combinatori SKI.
Tikhon Jelvis,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.