Skip to content
Original file line number Diff line number Diff line change
Expand Up @@ -2511,27 +2511,6 @@
"Arguments `a` (Economie), `b` (Environnement), `c` (Justice), attaques `a->b`, `b->c`, `c->a` (cycle). Testez les 3 ordres cycliques et identifiez celui qui donne le plus grand grounded.\n"
]
},
{
"cell_type": "markdown",
"id": "1171b43b",
"metadata": {
"tags": [],
"papermill": {
"duration": 0.024846,
"end_time": "2026-09-02T02:09:42.703295+00:00",
"exception": false,
"start_time": "2026-09-02T02:09:42.678449+00:00",
"status": "completed"
}
},
"source": [
"### 8.1 Exercice 1 : ADF cyclique\n",
"\n",
"Construire l'ADF a deux arguments `a : not b` et `b : not a` avec la classe `ADF` de la tranche 1, puis calculer le grounded.\n",
"\n",
"Le cycle est symetrique : aucun des deux arguments ne peut etre decide sans supposer l'autre deja decide. Observer ce que le point fixe 3-valued en fait, et comparer avec ce que produirait un cadre de Dung sur deux arguments qui s'attaquent mutuellement."
]
},
{
"cell_type": "code",
"execution_count": 15,
Expand Down Expand Up @@ -2573,27 +2552,6 @@
"Show(\"Exo1\", \"Exercice a completer : ADF cyclique (attendu : extension grounded vide, tous U)\");\n"
]
},
{
"cell_type": "markdown",
"id": "494d68d7",
"metadata": {
"tags": [],
"papermill": {
"duration": 0.019217,
"end_time": "2026-09-02T02:09:42.887796+00:00",
"exception": false,
"start_time": "2026-09-02T02:09:42.868579+00:00",
"status": "completed"
}
},
"source": [
"### 8.2 Exercice 2 : SetAF, une attaque qui n'existe qu'a plusieurs\n",
"\n",
"Construire le SetAF sur `{x, y, z}` avec les attaques d'ensembles `{x,y} -> z` puis `{z} -> x`, et calculer le grounded.\n",
"\n",
"Tout l'interet est dans la premiere attaque : elle n'est portee par aucun des deux arguments pris isolement. Determiner lesquels sortent *in*, puis se demander ce que deviendrait le resultat si `{x,y} -> z` etait remplacee par les deux attaques simples `x -> z` et `y -> z`."
]
},
{
"cell_type": "code",
"execution_count": 16,
Expand Down Expand Up @@ -2635,27 +2593,6 @@
"Show(\"Exo2\", \"Exercice a completer : SetAF 3 args (qui est IN ?)\");\n"
]
},
{
"cell_type": "markdown",
"id": "6a2e0a41",
"metadata": {
"tags": [],
"papermill": {
"duration": 0.021203,
"end_time": "2026-09-02T02:09:43.039345+00:00",
"exception": false,
"start_time": "2026-09-02T02:09:43.018142+00:00",
"status": "completed"
}
},
"source": [
"### 8.3 Exercice 3 : EAF, casser une reinstallation\n",
"\n",
"Reprendre l'EAF de la section 5 (`a -> b`, plus la meta-attaque de `c` sur l'attaque `a -> b`), ajouter l'argument `d` et l'attaque `d -> c`, puis recalculer le grounded avec `useMeta: true`.\n",
"\n",
"`c` neutralisait l'attaque `a -> b` : tant que `c` tient, `b` survit. En mettant `c` *out*, on rend son effet a `a -> b`. Suivre la chaine et verifier ce que devient `b`."
]
},
{
"cell_type": "code",
"execution_count": 17,
Expand Down Expand Up @@ -2696,27 +2633,6 @@
"Show(\"Exo3\", \"Exercice a completer : EAF avec c OUT -> b OUT (reinstatement perdu)\");\n"
]
},
{
"cell_type": "markdown",
"id": "43c8c22a",
"metadata": {
"tags": [],
"papermill": {
"duration": 0.018281,
"end_time": "2026-09-02T02:09:43.172395+00:00",
"exception": false,
"start_time": "2026-09-02T02:09:43.154114+00:00",
"status": "completed"
}
},
"source": [
"### 8.4 Exercice 4 : VAF, l'ordre des valeurs decide du cycle\n",
"\n",
"Construire le VAF cyclique `a -> b -> c -> a` en affectant a chaque argument une valeur distincte (Economie, Environnement, Justice), puis faire varier l'ordre de preference sur les valeurs.\n",
"\n",
"Un cycle impair est le cas ou Dung ne tranche rien. Ici l'ordre des valeurs peut rendre une des trois attaques inoperante et debloquer le cycle : tester plusieurs ordres, identifier ceux qui maximisent l'extension fondee — et voir s'il en existe qui ne debloquent rien du tout."
]
},
{
"cell_type": "code",
"execution_count": 18,
Expand Down
72 changes: 0 additions & 72 deletions MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-11-Causal-Csharp.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -821,20 +821,6 @@
"Show(\" Le lien storm -> drops est ROMPU : drops ne depend plus de storm.\");\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Que lit-on dans la chirurgie ?** En comparant les deux affichages : le SCM original porte trois\n",
"équations (`drops <=> storm`, `rain <=> storm`) ; le SCM après `do(drops=True)` ne porte plus\n",
"l'équation de `drops` — remplacée par une constante. Deux conséquences immédiates :\n",
"\n",
"- l'observation `drops=True` n'informe plus sur `storm` (plus de canal) : `P(rain | do(drops))`\n",
" retombe sur la valeur de base — le baromètre cassé ne fait pas pleuvoir ;\n",
"- la *corrélation* `drops ⇔ rain` de la section 3 a disparu **par construction**, sans toucher aux\n",
" données : c'est une modification du mécanisme générateur, pas un filtrage d'échantillons."
]
},
{
"cell_type": "markdown",
"id": "fa30c257",
Expand Down Expand Up @@ -1409,17 +1395,6 @@
"Show(\" coupe bien le lien cloudy -> sprinkler, exactement comme la chirurgie from-scratch du §3.\");"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Lecture du pont.** Les trois sorties ci-dessus montrent le même réseau, la même intervention et le\n",
"même contrefactuel que les sections 3-5, mais calculés par le moteur **TweetyProject** (Java) exécuté\n",
"dans le processus .NET via IKVM. L'intérêt pédagogique est la **parité** : notre implémentation\n",
"from-scratch des sections 1-2 n'est pas une simplification qualitative, elle reproduit le comportement\n",
"de la référence académique — l'écart éventuel serait un bug de notre moteur, pas une limite de méthode."
]
},
{
"cell_type": "markdown",
"id": "7c9dd2d6",
Expand Down Expand Up @@ -1494,34 +1469,6 @@
"> mais l'intervention `do(education)` coupe ce lien — l'effet direct devrait tomber à False."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Le protocole des exercices.** Les trois exercices suivants rejouent les gestes des sections 3-5 sur\n",
"des réseaux inédits, chacun ciblant une confusion classique : l'exercice 1 distingue observation et\n",
"intervention sur une chaîne `education → skill → income` ; l'exercice 2 montre qu'un `do` ne remonte\n",
"pas la flèche causale (intervenir sur un effet ne change pas la cause) ; l'exercice 3 demande le\n",
"contrefactuel *sur la cause* cette fois — le miroir de la section 5. Les squelettes sont exécutables\n",
"tels quels (C.1) : chaque cellule affiche ce qu'il faut construire, et les indices suffisent à écrire\n",
"les 3-5 lignes attendues avec l'API des sections 1-2."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**Attendu de l'exercice 1, pour auto-vérification.** Si votre implémentation est juste :\n",
"`observe(skill=True)` doit propager vers `income=True` (la corrélation se lit dans les deux sens sur\n",
"la chaîne), tandis que `do(skill=True)` doit laisser `education` à sa valeur de fond — l'intervention\n",
"coupe la flèche entrante, elle ne la remonte pas. Ce couple de verdicts est le même discriminant que\n",
"le réseau Sprinkler de la section 4 : c'est la signature qu'on interroge le mécanisme, pas seulement\n",
"la corrélation.\n",
"\n",
"Un contrôle anti-piège utile : si vos deux verdicts sont identiques, vous avez probablement écrit\n",
"`observe` aux deux endroits — le `do` se reconnaît à ce que SA cible garde sa valeur de fond."
]
},
{
"cell_type": "code",
"execution_count": 12,
Expand Down Expand Up @@ -1713,25 +1660,6 @@
"Show(\" (reflechir : cloudy est la cause de rain ; si cloudy avait ete faux, rain n'aurait pas eu lieu)\");\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Synthèse — les trois barreaux de l'échelle causale\n",
"\n",
"Les sections précédentes ont gravi, dans l'ordre, les trois barreaux de l'échelle de la causalité (Pearl) :\n",
"\n",
"| Barreau | Question | Outil du notebook | Exemple mesuré |\n",
"|---|---|---|---|\n",
"| 1. **Associer** | *que voit-on ensemble ?* | `observe` sur le SCM propagé | `observe(drops)` → `rain=True` (corrélation baromètre/pluie) |\n",
"| 2. **Intervenir** | *que se passe-t-il si je force ?* | `do` = chirurgie sur l'équation | `do(rain)` n'active plus `sprinkler` dans le réseau de sec. 4 |\n",
"| 3. **Imaginer** | *qu'aurait-il fallu d'autre ?* | contrefactuel `cf` | herbe mouillée même avec `sprinkler=OFF` car `rain` suffisait |\n",
"\n",
"La coupure entre barreau 1 et barreau 2 est LA leçon du notebook : aucune quantité d'observation, aussi\n",
"grande soit-elle, ne remplace l'intervention — c'est une différence de *nature* (le modèle structural),\n",
"pas de degré (plus de données)."
]
},
{
"cell_type": "markdown",
"id": "02c12c96",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -542,19 +542,6 @@
"\n"
]
},
{
"cell_type": "markdown",
"id": "8a2e56b2",
"metadata": {
"papermill": {},
"tags": []
},
"source": [
"### Les trois exercices : une échelle sur la même API\n",
"\n",
"Les stubs forment une progression sur la surface vue aux sections 2 et 3. **Exercice 1** — une chaîne de subsomption à trois niveaux (`Salarie`/`Personne`/`Employe`) : le même geste que le test 1 de la section 3, porté à deux arêtes au lieu d'une, avec la question du sens des flèches (`Salarie subsume Personne` vs `Salarie subsume Employe` — les deux lignes du stub les distinguent). **Exercice 2** — un rôle et une **restriction existentielle** : là où la section 2 ne posait que des concepts atomiques et une intersection, il faut ici un rôle binaire (`hasParent`) et l'assertion `alice : exists hasParent . Human` — l'API des rôles vue vide dans la signature de la cellule 8 entre enfin en scène. **Exercice 3** — la cohabitation exemple + exercice dans la même base : la conjonction de deux assertions sur `alice` (Human et Salarie) vérifie que l'étudiant combine les constructions au lieu de les copier. Les sorties `Exercice a completer` sont les diagnostics conventionnels des stubs (règle C.1) : le notebook s'exécute de bout en bout incomplet."
]
},
{
"cell_type": "markdown",
"id": "4b71c541e959",
Expand Down
13 changes: 0 additions & 13 deletions MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-4-Aspic-Csharp.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -888,19 +888,6 @@
"\n"
]
},
{
"cell_type": "markdown",
"id": "100b1042",
"metadata": {
"papermill": {},
"tags": []
},
"source": [
"### Les trois exercices : retrouver les flèches du pingouin\n",
"\n",
"Les trois stubs ramènent au contraste des sections 2 et 4. **Exercice 1** — lever l'indétermination du vol par une **règle stricte** : l'énoncé reprend l'exemple Tweety et demande la règle qui fait de `!flies` une conséquence certaine (la même idée que `penguin -> bird`) ; la question « `!flies` skeptiquement accepté ? » teste la lecture de la fondée. **Exercice 2** — un **cycle défaisable à trois** (`p => q => r => p`) : l'énigme posée aux préférées ; la sortie attendue énumèrera les extensions, et le contraste avec le cas sans cycle répond tout seul. **Exercice 3** — une mini-théorie libre (juridique ou médical) : combiner un fait, une règle et une contradiction réaliste, et prédire le verdict fondé avant de l'afficher. Les sorties `Exercice a completer` sont les diagnostics C.1 des stubs : le notebook s'exécute incomplet."
]
},
{
"cell_type": "markdown",
"id": "m28626",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -193,19 +193,6 @@
" print(f\" {a} attaque {b}\")"
]
},
{
"cell_type": "markdown",
"id": "4105e589",
"metadata": {
"papermill": {},
"tags": []
},
"source": [
"### Lire la spécification : six arguments, huit attaques, deux paires mutuelles\n",
"\n",
"La sortie est la transcription du graphe `AF-A` : un en-tête qui nomme les compteurs (`6 arguments, 8 attaques`) puis huit lignes, une par arête, dans l'ordre où elles ont été déclarées. Deux lectures structurales. **Les paires mutuelles** : `0 attaque 1` et `1 attaque 0`, `4 attaque 5` et `5 attaque 4` — deux conflits bidirectionnels, les seuls qui interdisent frontalement la coexistence de deux arguments dans une extension. **Les attaques unidirectionnelles** : `2 attaque 3`, `1 attaque 3`, `3 attaque 4`, `0 attaque 5` — elles relient les paires entre elles et donnent au graphe sa connectivité. Le dernier point de lecture est l'ordre : les huit lignes s'impriment dans l'ordre source, pas triées — c'est le graphe « brut » que les sections suivantes soumettent tel quel au solveur."
]
},
{
"cell_type": "markdown",
"id": "b6f47728",
Expand Down Expand Up @@ -307,19 +294,6 @@
"print(f\"Témoin S = {{{witness}}}\")"
]
},
{
"cell_type": "markdown",
"id": "bfbe6f90",
"metadata": {
"papermill": {},
"tags": []
},
"source": [
"### Lire le verdict sat : un témoin de trois arguments\n",
"\n",
"Deux lignes, deux informations. `Z3 : sat` dit que la spécification est satisfiable — il existe au moins un sous-ensemble stable ; le solveur l'affirme par modèle, et la `sanity` de la cellule suivante le relit par les deux prédicats. `Témoin S = {[1, 2, 5]}` imprime ensuite le choix : trois arguments sur six, dans l'ordre croissant 1, 2, 5. Ce que la sortie ne dit pas, et que la lecture doit mesurer, c'est la taille du rôle : parmi les 2⁶ = 64 candidats du sous-ensemble, le solveur en a visité l'espace par contraintes et rend un témoin que la section suivante soumettra à une vérification indépendante — le geste « constructeur » de la Loi II, une valeur à la main, jamais affirmée."
]
},
{
"cell_type": "markdown",
"id": "c2f7be1c",
Expand Down Expand Up @@ -476,19 +450,6 @@
"print(\"Dissociation confirmee a la borne n = 3 : aucune extension stable n'existe.\")"
]
},
{
"cell_type": "markdown",
"id": "efddd20c",
"metadata": {
"papermill": {},
"tags": []
},
"source": [
"### Lire l'unsat : AUCUN et une borne\n",
"\n",
"La sortie déclare l'absence en trois lignes de plus en plus fortes : `Z3 sur le 3-cycle : unsat` (le solveur ne trouve pas de modèle), `Ensembles sans conflit ET dominants : AUCUN` (la quantification sur les 2³ = 8 sous-ensembles du 3-cycle est exhaustive), `Dissociation confirmee a la borne n = 3 : aucune extension stable n'existe.` (le verdict passe au général). La lecture honnête du triplet : l'UNSAT est une preuve d'absence par contraintes — Z3 ne parcourt pas les candidats, il montre qu'aucun modèle de la spécification n'existe, et son verdict vaut pour ce graphe et cette taille. C'est exactement le contraste que la section creuse : le même outil qui a rendu sat sur AF-A rend unsat ici, et les deux verdicts sont imprimés avec le même statut — le notebook enregistre la dissociation entre substrats comme un résultat."
]
},
{
"cell_type": "markdown",
"id": "4edacdd4",
Expand Down Expand Up @@ -810,19 +771,6 @@
"print(\"Exercice a completer\")"
]
},
{
"cell_type": "markdown",
"id": "bc9a37e8",
"metadata": {
"papermill": {},
"tags": []
},
"source": [
"### Lire les trois exercices : l'échelle qui vérifie la loi\n",
"\n",
"Les trois cellules d'exercice impriment la même invite (`Exercice a completer`) — le contrat C.1 : le notebook s'exécute d'un bout à l'autre, la vérification est l'étudiant. L'échelle se lit dans les énoncés : **Exercice 1** ajoute un septième argument (arêtes (2, 6) et (6, 5)) et demande si le témoin {1, 2, 5} tient encore — un premier test de robustesse du témoin face à une spécification étendue ; **Exercice 2** passe du 3-cycle au 4-cycle (0 → 1 → 2 → 3 → 0) et questionne les cycles pairs : le 3-cycle n'a pas d'extension stable, le 4-cycle en a-t-il une ? — la parité devient l'hypothèse ; **Exercice 3** généralise par l'expérience (tester les 1-AF et 2-AF exhaustivement) le fait que l'ensemble vide n'est jamais stable dès qu'il y a un argument — la clause de dominance qui l'interdit est à nommer exactement. Trois exercices, trois niveaux : re-mesurer un objet, changer l'hypothèse, exhiber la clause."
]
},
{
"cell_type": "markdown",
"id": "1428a951",
Expand Down
1 change: 1 addition & 0 deletions scripts/notebook_tools/twin_pairs.d/tweety-11-causal.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,5 +7,6 @@
bridge_verdict_reason: "Python = JPype vers la vraie lib Java Tweety causal-1.30 (`from org.tweetyproject.causal.reasoner import ArgumentationBasedCausalReasoner`). C# = §§1-5 from-scratch pedagogique (do-calculus reimplemente, titre 'twin C# from-scratch') + §6 (PR #10570) pont IKVM chargeant `org.tweetyproject.tweety-causal.dll` (DLL build #10566, 13/13 classes causales actives, verifie firsthand via Assembly.GetExportedTypes) : `StructuralCausalModel.intervene()` Java reel invoque sous le runtime IKVM 8.15. Verdict SOTA-OK (pas de workaround degrade) : §6 prouve la parite moteur-contre-moteur -- `do(sprinkler=True)` produit `sprinkler <=> +` (surgery Java reel) IDENTIQUE au do-calculus from-scratch §3 `do(drops=True)` -> `drops <=> +`. Les DEUX cotes executent le meme moteur Java Tweety causal (Python via JPype, C# via IKVM). parity_level reste `surface` car le mode pedagogique primaire reste §§1-5 from-scratch ; §6 est le pont de validation qui confirme la conformite du from-scratch au moteur de reference."
known_differences:
- "2026-09-15 (PR #16319, myia-po-2026:CoursIA) : enrichissement markdown-only cote C# (tranche densite #13410, +9 cellules d'interpretation) ; cellules code et outputs byte-identiques (md5 avant/apres), twin Python intact."
- "2026-09-25 (PR #17058, myia-po-2025:CoursIA-2, redressement densite #17040) : retrait de 5 de ces cellules cote C# (3 doublons de lectures deja presentes, 2 lectures de cellules d'exercice) ; 4 cellules d'interpretation conservees (4, 7, 16, 21) ; cellules code et outputs byte-identiques (14/14 verifiees main vs tete), twin Python intact -- le Python n'a jamais porte ces cellules, la suppression ne fait que reduire l'asymetrie ouverte par #16319."
- "Socle commun : inference causale et do-calculus (Pearl) sur modeles causaux structurels."
- "Asymetrie de profondeur (surface) : le Python s'appuie sur la vraie bibliotheque Java Tweety `causal-1.30.jar` via JPype (`from org.tweetyproject.causal.reasoner import ArgumentationBasedCausal`). C# §§1-5 = jumeau **from-scratch** pedagogique (titre 'twin C# from-scratch', reimplemente le do-calcul) ; §6 (PR #10570) ajoute un pont IKVM vers la meme DLL Java `tweety-causal.dll` (build #10566) -- §§1-5 from-scratch et pont §6 donnent le meme resultat surgery (`<=> +`), validant la conformite du from-scratch au moteur de reference. Parite `surface` (mode primaire = from-scratch) avec pont de validation SOTA-OK en §6."
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
date: '2026-09-25'
by: myia-po-2025:CoursIA-2
python_sha: 31af5d293d415afd765bad5163f120d5afec8ad1
csharp_sha: c431cd2f654382e09af4675ea8677b41135d586f
content_python_sha: 0aac270d1addf04051129029a59e070afb362893d1d490eb1c6bfbc0dd4d5a87
content_csharp_sha: 2afffe6eeaffbe21e0e1eed0bd2c999e3728c0095b9c8540bb79bc4e26372740
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
date: '2026-09-25'
by: myia-po-2025:CoursIA-2
python_sha: aebffde4c2a7da67d2834d8072f2fe6d54287764
csharp_sha: f0a74fb660f41983664c968a69de45addadf592c
content_python_sha: 9eaf16b3f99c3b984d924fe6d58ff023c43793e57d3ccb6bd1eaf2bc56360a3b
content_csharp_sha: d8147a65db1d386a32007f2706eb4ded5e86f90f58f573f425d34208b28fdcc7
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
date: '2026-09-25'
by: myia-po-2025:CoursIA-2
python_sha: dea6b917d24172003a44ae27e5713c31cd9fc193
csharp_sha: d17720cbcf977664e914e5fd031e8e9d7aa7c62c
content_python_sha: 82435911c2efa65ea80a5f304092417e508f61abb1ff3ae247e1a17f517bb41a
content_csharp_sha: 17b933735f17ea6535c7dc8e7a3a11182908aab1a5aa27445863f084ea837f65
Loading