Aller au contenu

Correspondance de Łukasiewicz

😀 On considère ici des arbres non étiquetés et ordonnés.

Dessin et représentation d'arbres ordonnés et non étiquetés

représenté en interne avec [[[], []], [[]], []]

représenté en interne avec [[[]], [[], []], []]

⚠ Les deux arbres ci-dessus sont différents, d'où la qualification ordonné.

représenté en interne avec [[], [[], [[], []], [], [], []], []]

Correspondance de Łukasiewicz

Pour chaque arbre, on note \(n\) le nombre de nœuds. On rappelle qu'ici « arbre » désigne arbre enraciné, ainsi \(n>0\).

1] On construit d'abord une liste nb_sous_arbres :

  • qui commence avec le nombre de sous-arbres de la racine,
  • que l'on complète récursivement avec le contenu des listes nb_sous_arbres de chaque sous arbre.
  • Pour un feuille, cette liste est [0] ; il y a \(0\) sous-arbre, et donc rien à ajouter.

Exemple :

, la racine possède \(3\) sous arbres, ainsi la liste sera de la forme [3, ...a..., ...b..., ...c...]

  • Le sous-arbre a est une feuille, on remplace donc ...a... par 0, il y a \(0\) nœud et on n'a pas de sous arbres à évoquer.

  • Le sous-arbre b possède \(5\) nœuds, on remplace donc ...b... par 5, 0, ..., 0, 0, 0 ; il y avait 4 feuilles, on a déjà placé les 0, reste à compléter par le dernier morceau qui possède 2 feuilles, donc 2, 0, 0

  • Le sous-arbre c est une feuille, on remplace ...c... par 0

On obtient la liste [3, 0, 5, 0, 2, 0, 0, 0, 0, 0, 0]

Propriétés :

  • Cette liste est de longueur \(n\) et de somme égale à \(n-1\).
  • Cette liste se termine toujours par un \(0\), qui représente la feuille la plus à droite de l'arbre.
  • La somme des \(i\) premiers termes est toujours supérieure ou égale à \(i\) pour tout \(i\) de \(0\) à \(n\).

2] On construit une liste chemin à partir de cette liste, en ôtant \(1\) à chaque nombre de la liste, et enlevant le dernier nombre de cette liste.

Propriétés :

  • Cette liste chemin est de longueur \(n-1\) et de somme nulle.
  • La somme des \(i\) premiers termes est toujours positive pour tout \(i\) de \(0\) à \(n-1\).

Exemple, à partir de la liste [3, 0, 5, 0, 2, 0, 0, 0, 0, 0, 0], on construit [2, -1, 4, -1, 1, -1, -1, -1, -1, -1, -1]

On obtient donc une modélisation d'un chemin de \((0, 0)\) à \((n-1, 0)\) situé dans le quadrant en haut à droite (abscisses et ordonnées positives), dont les étapes sont de la forme \((1, k)\) avec \(k=-1\) ou \(k\in \mathbb N\). On appelle un tel chemin un « chemin de Łukasiewicz ».

Avec l'exemple précédent, on obtient

🥚 easter egg

Si vous résolvez cet exercice, vous aurez accès à un exercice caché : reconstruire un arbre avec le procédé inverse ; c'est bien plus délicat à implémenter.

Exercice

Coder une fonction arbre_vers_chemin qui implémente une partie de la correspondance de Łukasiewicz.

représenté en interne avec [[], []], donne un chemin

qui correspond à la liste [1, -1]

🐍 Console Python
>>> arbre_vers_chemin([[], []])
[1, -1]

représenté en interne avec [[], [], [[], []]], donne un chemin

qui correspond à la liste [2, -1, -1, 1, -1]

🐍 Console Python
>>> arbre_vers_chemin([[], [], [[], []]])
[2, -1, -1, 1, -1]
###(Dés-)Active le code après la ligne # Tests (insensible à la casse)
(Ctrl+I)
Entrer ou sortir du mode "deux colonnes"
(Alt+: ; Ctrl pour inverser les colonnes)
Entrer ou sortir du mode "plein écran"
(Esc)
Tronquer ou non le feedback dans les terminaux (sortie standard & stacktrace / relancer le code pour appliquer)
Si activé, le texte copié dans le terminal est joint sur une seule ligne avant d'être copié dans le presse-papier
Évaluations restantes : /
.321.128013.129370x/.Tr;nbylae%u)dV6Jz3Am(P02è-],59fq7B8 _o=pcwgv4F1kRéhtsSàLC[ji:050s0o0)0n0;0m0*0P0U0m0n0*0*0S010)0;0T010406050*0q0z0z0n0h0l040+0R0m0q160R0j0P020n0z0T0i0P0$0o1g0h0L0q0o0*050e1d1f1h1j1b0T04051O1H1R0e1O1b0s0;0X0~1012140(0;0W0(0m1)0(0)19050_0k0m0o1!1113011(1*1,1*0)1=1@1:0)0h1P0)0(1_1$010K0{0o0j1u0o010~1m0*0T0n0j140D1:2m2o2a1{2d1@2g0z2i040b0P0B0h0R0T0R0*0;1p1r0@2k0h0h0o0U2M1H2t0j1P0e282Y2527261;0s2v141,0j2f2J1:1X1Z0 1`2,0;2.0j0R2=1:0T2R1P2W2Y331c2n1r2@2b2|0h1g0m190P0!2V371a362u391{3b3d3f0D3i2o3k2W2+013p0n3e040P0x3t2X1b3w3n143z3B0P0Y3F3v373x3L3f0I3P3H3R3J3y0R3c3A3f0u3W3l381#3o3#3q3C0M3*3I3-3K3/3%3C0O3?3Y3^3!3$3M0J3~3m403T040!0C453,2^413:0!3h1I3j1S311H2=2#0s272*3Z0U2}2B0?1Y1P300o324k4j3u054u0@4C464e0#190@0K3P3+3x0V3f4Q3@4e0j0K191h0k2R0Q0X0o0h0*0Q0U0(1A2`4V3 4e18040A4=4K3a4!0h4$0o4{4d2b4^0r0=3W0P590P4R3Z4M044O524S4U4E2X5c474Z040%0_0T515k4J531{4^4`5u5m4X4~505h3Z55575u065a5L5b4W2b0*2r04010Z1q2T0;1q0P0h0%0U0q4+1Y1^2`0)4*2.01585M595B4}045!1d0m0_0)3P5N4?2b0R190S5~5?5x190/5F470k192y6a4@195z355O3o5D2R6f54190r0G5:5;66145e0K3#656k3K190*0R0q4,4#6n5u5 4|1{0R4T044;6K6v3y6m5t6j6067045I335K5;5M6T0j195_0q5{0n5}5A6B0162040f6o6l040o0d5,0j0s6{145y736U5p5r6W4k6?756=6Y6C046E6G0Q6I7a4F7c6q0r6t6)6?5e2R0)5%0j6A7f776-6/6;6$6%5=6?6+044.4:7y6S6?6^647O7A4^697e6M7g0l7z7X6@190F7!5w140z0;194i336L7*016x6z7S7#7J7Z7_7=6O196R7:6*195q0n5s767d6X7`6V886q6s5J5L837K4/7,7N8a7~196`7W7=7J2I0T8d4_7q8g5a6T7u0^7x7)3S197L8l3*0e4H4B4l8N0e4o1H0)4q8S2(2Z0n1?8P4o1N5v3x2R0z0Q0K0n0#0o0Q0(0x191z1B1D1F0P6#4D1V4x2?400n0s0z1q2L5X1r2`6y191N3x92940j961q0F160)23040.6.7w6J8~1R0n0P0(2R0K1%210T0*0=0e0e0K0h0f0V0;0#170o1X0n0f3#0W0e9J9L0e0v2o0Q0p0.0I0p0O0!0q0#110;0o9J0U0w190a9*9,9.0;9:1H0n3C9u0/0fa10G0P0:0^0%0P1@0}0k118`2O0m00993`168_0P940@0h2.0P2f0~5!2o0)a89u2|5|970P2I0m1q0`0*1^0^aq2N0%4)aD0T5s0jav0n4)0U0P0y0m9G9N0P0g1h0*9Laqav0+5,8,1r0N2o0n4.a88`6y716:970}aeax0Raz5Y2`4)4+0o0H0P0qap1g9g0E2R0P0s005#0h0;bd0@0}6~4A12a{0P1h2L0(0z5q0;8_0}100h0W1A2fav1o0{0;0*0%8`0,0~1^0:6F0haJ0Pah3$aj1E8q8~8Q4y1W1Y9d93952M0P0*aS0Rbj9b1Qb(9f9h0j9j2L9m0N0hb.0P0c1S3k1O0t6F0}a;0U0E0}bMaf6~4*0U9`1^0Ua;0(a7059u9w0o9y01a10e0M0O0F0-9@2K9_9:0Q0D0Q2R0U0e9=cz9-9/0w0P1x105Z5#172G8_9|6_c21bb!0X3k8Q0^0`0|04.