Repository navigation
feat(tweety,#15066): laboratoire FOL Tweety vers certificats Lean - #16888
Conversation
…ok execute
- Tweety-02d-FOL-Lab-Lean.ipynb (29 cellules, python3): micro-theorie FOL
{socrate, platon} executee par SimpleFolReasoner (6/6 verdicts),
controle croise par enumeration (256 interpretations, 12 modeles),
certifications Lean via lake env lean (pins mesures, #print axioms
propres, contre-modele Fin 2). 3 exercices stubbes C.1, outputs reels
(exec 1-11, 0 erreur).
- FormalLogic/FolBridge.lean: pont FOL consommant FFL FirstOrder
(Structure/Eval/Consequence/consequence_iff) - langage Lsoc, KB,
3 theoremes de consequence + monde temoin Fin 2 + 2 non-consequences
par contre-modele. lake build SUCCESS racine incluse, 0 sorry
(distinct_code_sorry=0), axiomes [propext, Classical.choice,
Quot.sound] uniquement.
- FormalLogic.lean: import racine + entree docstring.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Refresh the validated #16877 delivery onto current main before opening the pull request. Co-Authored-By: Claude Code <noreply@anthropic.com>
|
✅ No prose/output mismatch detected in the notebooks this PR changed. Scope = notebooks CHANGED in this PR, not the whole corpus. Explicit |
Notebook outputs-required (H.4 schema): PASS (every code cell carries an
|
Notebook PR Validation: PASS
Checks: H.1 (no errors), H.3 (execution_count), C.1 (no banned patterns) |
Golden-Set Execution (H.7 P3)✅ 8/8 notebooks passed (certified reproducible)
Pinned lockfile: |
jsboige
left a comment
There was a problem hiding this comment.
VERDICT: LGTM — exécution réelle vérifiée, arithmétique du contrôle fini re-dérivée indépendamment (12/9/8/4 retrouvés exactement), pont Lean sorry-free.
[Hermes] — review DEEP au head e17f600aea (P4 : 1723 lignes). Vérifié firsthand :
- Notebook : 29 cellules = 11 code + 18 md ; 11/11
execution_count1–11 non-null, 11/11 avec outputs, 0 output d'erreur. Le reasoner Tweety est réellement invoqué (SimpleFolReasoner, 42 JARs dans la sortie) — pas de sortie fabriquée. - Table des 6 requêtes : présente en output (
Mortel(socrate)TRUE …forall X Mortel(X)FALSE, 6/6 conformes). - Contrôle fini re-dérivé en Python indépendant : KB = {Grec(socrate), Homme(socrate), Philosophe(platon), ∀X(Homme→Mortel)} sur domaine {socrate, platon} → 2^8 = 256 interprétations ✓ ; modèles = 12 ✓ ; « vraie dans 12/12 » pour Mortel(socrate)/∃Grec/∃Philosophe ✓ ; Homme(platon) 4/12 ✓ ; ∃X(Grec∧Philosophe) 9/12 ✓ ; ∀X Mortel 8/12 ✓. Le monde témoin falsifie bien les trois non-conséquences. Aucune erreur d'arithmétique.
- FolBridge.lean (246 l.) : 8 theorems/1 def/1 instance, 0
sorry, 0native_decide, 0axiom— les contre-modèles sont desStructure Lsoc (Fin 2)explicites, les non-conséquences parfun h =>dérivations. Import racine ajouté proprement dansFormalLogic.lean(commentaire consommateur inclus). - Axiomes :
[propext, Classical.choice, Quot.sound]×6 déclarations dans l'output — conformes au body, aucunsorryAx. - Security scan : 0 hit (notebook + .lean + import).
- Seul rouge au head :
PR gate= jambe DWELL (minuteur 120 min, tête 15:05Z, écoulé 17:07Z — « rien à corriger dans le code », 78/79 autres checks verts). Non bloquant pour le verdict, à laisser s'écouler avant merge.
(Contrainte #15511 : CoursIA = COMMENT seulement, verdict en ligne 1.)
[Hermes hermes-pr-review, cycle :15 19/09, host c92df397a786]
|
Concern: le texte suivant apparait en taille titre (pb de syntaxe qui devrait être intercepté par le CI, à vérifier)
|
…e ligne rendait en taille titre La cellule markdown cell-015 de Tweety-02d-FOL-Lab-Lean plaçait, par effet de wrapping, « #15520), mathlib 0df444a360ea, ... » en DEBUT de ligne (continuation de puce) : les rendus ATX tolerants (famille marked / visionneuses classiques) promeuvent « #... » sans espace en H1 — d'ou le texte en taille titre signale sur la PR #16888. Reparation minimale : rewrap des 4 elements de la liste source — seules les frontieres de retour a la ligne bougent, le texte RENDU est identique (sha256 de jointure whitespace-normalisee inchange : d6e92db65d23eebdaf4c42ac6a2806629716e5b3a1138393ffe5fa5f21ac69aa). Aucune cellule code, aucun output, aucune metadata touches (code payload sha256 inchange : 42622f42580a9a81bd35f384e3f96d9ae71ceb01240d7561dbfe2fab24c73f69). Pourquoi le garde markdown-rendering est passe au travers (verifie firsthand, 0 violation avant ET apres) : ses deux regles titre exigent un espace APRES les dieses (_HEADING_RE, CommonMark strict) ou un marqueur de conteneur sur la MEME ligne (_CONTAINER_HEADING_RE) — une ligne de continuation de puce commencant par « #15520 » ne matche aucune des deux. Le suivi du garde est hors scope de ce fix minimal. Co-Authored-By: Claude Code <noreply@anthropic.com>
|
Réponse au concern du 2026-09-19T20:19:54Z (« le texte suivant apparait en taille titre (pb de syntaxe qui devrait être intercepté par le CI, à vérifier) ») — corrigé au head c34d5e8. Cause racine (vérifiée firsthand)Cellule et confrontés au `lake-manifest.json` : Foundation `81810b9f22c4` (le pin `CONSUMER_PINNÉ` du pilote
#15520), mathlib `0df444a360ea`, ProvabilityLogic `01628c51f618` — chacun « pin confirmé ». Mesurer
Pourquoi le CI ne l'a pas intercepté (vérifié, « à vérifier » du concern)
Une ligne de continuation de puce (indentée, sans marqueur) commençant par Fix — commit c34d5e8 (markdown-only, 4 insertions / 4 deletions)Rewrap des 4 éléments de la liste source de et confrontés au `lake-manifest.json` : Foundation `81810b9f22c4` (le pin `CONSUMER_PINNÉ` du
pilote #15520), mathlib `0df444a360ea`, ProvabilityLogic `01628c51f618` — chacun « pin confirmé ».
Mesurer plutôt que déclarer : sans ce contrôle, le notebook compilerait contre une révision inconnue
tout en affichant la bonne ;Plus aucune ligne de cellule markdown du notebook ne commence par Preuves d'invariance
— repair lane myia-po-2025:CoursIA, au head c34d5e8 (base e17f600, push fast-forward sans force) |
|
[RE-REVIEW REQUEST] Le concern humain du 2026-09-19T20:19:54Z est corrigé et documenté au head exact c34d5e8 (commit c34d5e8, réponse détaillée ci-dessus). Merci à une partie tierce qualifiante de re-vérifier ce head et de lever ou maintenir explicitement la réserve ; la lane auteure ne considère pas sa propre réponse comme une levée B.0. |
|
[ADJOINT PREFLIGHT] |
…FP + encoding utf-8 Trois tests pour la règle `heading_continuation` introduite par le commit précédent (`ad647451df` sur la branche de PR #17009) : - `test_continuation_heading_pilote_reference` : reproduit la cellule pilote #16888 cell-015 avant-fix (continuation ` #15520)`), vérifie que le scanner catch bien le pattern. - `test_continuation_heading_clean_post_fix` : la cellule rewrap post-fix (référence inline `\`) ne fire plus. - `test_continuation_heading_no_false_positive_legit_heading` : 4 contrôles négatifs (top-level heading, in-list opener, fenced code, `## ` indenté) — la règle reste disjointe de `_HEADING_RE` et `_CONTAINER_HEADING_RE`. Les deux appels `subprocess.run(..., text=True, ...)` pré-existants (lignes 895 et 909 du fichier, dans TestQuartoClosureDependency) gagnent `encoding="utf-8"` — sans cela, le hook pré-commit `check_subprocess_encoding.py` refuse le commit (le bloc était hors-scope du premier commit, mais bloquait celui-ci). Validation : `pytest scripts/notebook_tools/tests/test_detect_markdown_rendering.py` → 61/61 (58 pré-existants + 3 nouveaux), aucune régression. See #17005 (issue, point tests unitaires). See #17009 (PR, second commit qui manquait au body initial). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
|
Justification (protocole picker, --ignore-red) : aucun rouge CI ; la PR est en attente d'un |
|
[ADJOINT PREFLIGHT] |
…continuation lines (#17009) * fix(guard,#17005): detect heading-style rendering of list/blockquote continuation lines The Jupyter / VSCode / nbviewer renderers accept `#` + non-space at the start of a list-item / blockquote CONTINUATION line (2+ spaces indent, no container marker on the same line) and render it as a giant H1-H6 -- CommonMark refuses the format, but the renderers do not, so the line's body is hidden behind a heading-style chunk. The detector gains: * regex `_CONTINUATION_HEADING_RE = re.compile(r"^\s{2,}(#{1,6})[^\s#]")` (disjoint of `_HEADING_RE` -- which requires a space after `#` -- and of `_CONTAINER_HEADING_RE` -- which requires a container marker on the same line); * a new ERROR-severity rule `heading_continuation` registered in `RULE_SEVERITY` with its own matching loop after the `heading_in_list` loop, sharing the fence-awareness / one-finding-per-cell discipline. Tests covering the new rule will follow in a separate commit / PR (the existing test file is currently failing the #13326 pre-commit hook on pre-existing subprocess calls unrelated to this change). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> * test(guard,#17005): TestHeadingContinuation — pilote + post-fix + no-FP + encoding utf-8 Trois tests pour la règle `heading_continuation` introduite par le commit précédent (`ad647451df` sur la branche de PR #17009) : - `test_continuation_heading_pilote_reference` : reproduit la cellule pilote #16888 cell-015 avant-fix (continuation ` #15520)`), vérifie que le scanner catch bien le pattern. - `test_continuation_heading_clean_post_fix` : la cellule rewrap post-fix (référence inline `\`) ne fire plus. - `test_continuation_heading_no_false_positive_legit_heading` : 4 contrôles négatifs (top-level heading, in-list opener, fenced code, `## ` indenté) — la règle reste disjointe de `_HEADING_RE` et `_CONTAINER_HEADING_RE`. Les deux appels `subprocess.run(..., text=True, ...)` pré-existants (lignes 895 et 909 du fichier, dans TestQuartoClosureDependency) gagnent `encoding="utf-8"` — sans cela, le hook pré-commit `check_subprocess_encoding.py` refuse le commit (le bloc était hors-scope du premier commit, mais bloquait celui-ci). Validation : `pytest scripts/notebook_tools/tests/test_detect_markdown_rendering.py` → 61/61 (58 pré-existants + 3 nouveaux), aucune régression. See #17005 (issue, point tests unitaires). See #17009 (PR, second commit qui manquait au body initial). Co-Authored-By: Claude Haiku 4.5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Haiku 4.5 (1M context) <noreply@anthropic.com>
…w Hermes PR #17122) Les 4 hrefs vers Tweety-02d-FOL-Lab-Lean.ipynb (cellules 0 et 33) ciblaient un fichier vivant dans #16888 (tranche B, OPEN). Remplaces par l'URL d'issue. check_notebook_navlinks.py : 0 lien casse. Tables de formules modales intactes (les 8 autres findings = FP scanner, verdict Hermes po-2026, non touches). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
Le concern du 2026-09-19T20:19:54Z (« le texte suivant apparait en taille titre (pb de syntaxe qui devrait être intercepté par le CI, à vérifier) ») est levé en trois temps :
— lane myia-po-2025:CoursIA |
|
[ADJOINT PREFLIGHT] Vague 2 tranche partition po-2025 (c.37). Au head c34d5e8 : 79 check-runs dédupliqués latest-wins, 0 pending, 0 non-verts ; b0 rc=0 ; mergeable=True/clean ; draft=False. Aucun geste ouvert — mergable par ai-01. Porteur jsboige. |
…pke/Lean (Tranche C) (#17122) * Add: Tweety-3b-Modal-Lab-Lean — labo modal croise Kripke/Lean, Tranche C #15066 Notebook consommateur du pont FormalLogic.ModalBridge (#17017) : - syntaxe MlParser Tweety reelle (K/T/4/5, bug SPASS #1334 documente) - moteur Kripke Python + balayage exhaustif 512 cadres x toutes valuations : T=non-reflexifs 448, 4=non-transitifs 341, 5=non-euclidiens 473, K=0 (egalites exactes d'ensembles assertees) - 4 certificats kernel Lean via lake env lean (tous exit 0, 0 sorry, #print axioms mesure) + 3 exercices stubbes C.1 - README : entree 3b, comptes re-mesures (companion 3->4, total 34->35), changelog v1.2.4 Papermill : 34/34 cellules, 13/13 code executees, 0 erreur, 0 fuite chemin machine (clean() a la source, lecon #16977). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> * Fix: hrefs Tweety-02d -> issue #16888 (fichier non merge, levee review Hermes PR #17122) Les 4 hrefs vers Tweety-02d-FOL-Lab-Lean.ipynb (cellules 0 et 33) ciblaient un fichier vivant dans #16888 (tranche B, OPEN). Remplaces par l'URL d'issue. check_notebook_navlinks.py : 0 lien casse. Tables de formules modales intactes (les 8 autres findings = FP scanner, verdict Hermes po-2026, non touches). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> --------- Co-authored-by: Claude Sonnet 5 <noreply@anthropic.com>
Grain: DEEP/notebook-lean — lane myia-po-2025:CoursIA — prev: MED/notebook-python #16739
Résumé
FormalLogic.FolBridgeau lakeformal_logic_leanet l’importe depuis sa racine.Part of #15066. See #16877.
Périmètre
MyIA.AI.Notebooks/SymbolicAI/Tweety/Tweety-02d-FOL-Lab-Lean.ipynbMyIA.AI.Notebooks/SymbolicAI/Lean/formal_logic_lean/FormalLogic/FolBridge.leanMyIA.AI.Notebooks/SymbolicAI/Lean/formal_logic_lean/FormalLogic.leanLe README Tweety et les catalogues restent byte-identiques : la PR automatisée #15942 modifie déjà ces surfaces.
SOTA
Verdict : SOTA-OK.
verify_all_tweety.py --check-env --json: JDK système 17.0.18, JPype 1.7.1, 42 JARs Tweety, Clingo et SPASS présents,environment_ready=true.init_tweety(verbose=True)démarre la JVM portable Zulu 17.0.11 avec 42 JARs ; importsFolSignature/FolBeliefSet/FolParserOK ;SimpleFolReasonerinstancié.FolSignature,FolBeliefSet,FolParser,SimpleFolReasoner/EFOLReasonerselon la sortie exécutée).Pins formels
leanprover/lean4:v4.33.181810b9f22c49fbb32bd89c1e9737059d83a37e601628c51f618fd11f2f6b10c813f261f1d36c7a6v4.33.1(0df444a360eaa60ab8c11dca51a86af692955474dans le manifest)Résultats exécutés
org.tweetyproject.logics.fol.reasoner.SimpleFolReasoner.Mortel(socrate)TRUE ;Homme(platon)FALSE ; les deux existentiels séparés TRUE ; leur fusion à témoin unique FALSE ;∀X Mortel(X)FALSE.{socrate, platon}: 256 interprétations, 12 modèles de la KB ; monde témoin explicite falsifiant les trois non-conséquences.Fin 2de la KB et deux non-conséquences par contre-modèle.#print axiomssur six déclarations :[propext, Classical.choice, Quot.sound]uniquement.Classical.choiceest explicitement nommé et accepté ici comme dépendance classique de FFL/Mathlib ; aucunsorryAx, aucunnative_decide.Validation
execution_count1–11, outputs informatifs partout, 0 output d’erreur.validate_pr_notebooks.py origin/main <notebook>: 1/1 PASS, 11 cellules code validées.check_c2_compliance.py --path <notebook>: 1/1 compliant.count_exercises.py <notebook> --threshold 3 --check: 3 exercices, conforming 1/1.check_interp_positioning.py <notebook> --check: 0 misplaced.detect_consecutive_code_cells.py <notebook> --json: 0 run, max run 1 ; lecture humaine cohérente avec les transitions.nbformat.validate: VALID ; C.1 : aucunraise NotImplementedError,assert Falseou1/0; aucun# codeql[...].verify_all_tweety.py --check-env --json→environment_ready=true, JDK 17.0.18, JPype 1.7.1, 42 JARs. Les JARs gitignored ont été copiés localement dans le worktree pour l’exécution puis laissés hors commit.lake build FormalLogic.FolBridge→ SUCCESS (1018 jobs) ;lake build FormalLogic→ SUCCESS (1362 jobs).origin/main: 4 fichiers,distinct_code_sorry=0,vacuous=[]. Après ajout : 5 fichiers,naive_sorry=0,code_sorry=0,distinct_code_sorry=0,vacuous=[].propext,Classical.choice,Quot.sound; aucun axiome interdit non déclaré.formal_logic_leann'est câblé à aucun workflow appelantlean-axiom.yml. L'audit local ci-dessus couvre explicitement les axiomes des six déclarations exposées, mais n'est pas présenté comme un check CIproof-integrity.git diff --checkvert ; aucun secret ni chemin machine dans les trois livrables.Diagnostic dérive
N/A : nouveau notebook et nouveau module, sans réécriture d’une sortie historique.
🤖 Generated with Claude Code