Ok, sto tentando di fare una funzione per determinare se un elenco di tuple è transitivo, cioè se (x, y) e (y, z) sono nella lista, quindi (x , z) è anche nella lista.'unificazione' in list comprehensions
Ad esempio, [(1,2), (2,3), (1,3)]
è transitivo.
Ora, venendo da un background Prolog, il seguente senso per me:
transitive xs = and [elem (x, z) xs | (x, y) <- xs , (y, z) <- xs ]
tuttavia, non funziona. Sembra che la 'y' non abbia il singolo valore come mi aspetterei, ma è 'riassegnata' quando si tratta della seconda tupla. Invece, dobbiamo usare:
transitive xs = and [elem (x, z) xs | (x, y1) <- xs , (y2, z) <- xs, y1 == y2 ]
Perché è così? Perché il primo esempio non causa un errore, e questo non va contro il principio di "trasparenza referenziale" dei linguaggi di programmazione funzionale?
"Tuttavia, in puro linguaggio funzionale e logico, le variabili sono legate alle espressioni e mantengono un singolo valore durante l'intera vita a causa dei requisiti di trasparenza referenziale." - Wikipedia
Grazie!
Si prega di imparare a formattare il codice. – Marcin
Lo farò, mi scuso – Jarmex
Non c'è bisogno di scusarmi - SO in realtà non fa un buon lavoro di avvertire i nuovi utenti che hanno bisogno di farlo, quindi quasi ogni singolo nuovo utente deve essere detto a un certo punto. – Marcin