In questa sezione

Questa guida mostra come far fallire la build quando una dichiarazione Lean esportata, o la dimostrazione di un claim su di essa, dipende da codice non dimostrato o non controllato; come richiedere che gli export portino claim dimostrati e che nulla si appoggi su un’assunzione che non accetti; e come verificare da che cosa dipendono gli export.

Scegli le politiche

Tre politiche si applicano a ogni dichiarazione esportata, e le prime due anche alla prova di ogni claim (il teorema che lo dimostra):

Politica Predefinita Fa fallire la build quando un export (o la prova di un claim)…
deny_sorry attiva dipende da sorry
deny_axioms disattiva dipende da un assioma oltre a propext, Classical.choice, Quot.sound
deny_unsafe disattiva esegue codice unsafe al di fuori della toolchain di Lean (solo export)

Abilita quelle che ti servono in build.rs:

fn main() -> lungo_build::Result<()> {
    lungo_build::configure().deny_axioms(true).deny_unsafe(true).compile_lean("lean")
}

Una violazione fallisce con LNG0601 ed elenca ogni export con le dipendenze responsabili:

error[LNG0601]: exported declarations violate the configured trust policy:
  Formal.step depends on `sorry` (deny_sorry)
  the claim Formal.step_implements depends on `sorry` (deny_sorry)

Rimuovi la dipendenza in Lean, oppure smetti di esportare la dichiarazione (per un claim, completa la sua dimostrazione o togli il suo @[lungo_claim]).

deny_sorry è attiva per impostazione predefinita; disattivala solo per il lavoro in corso (.deny_sorry(false)). Con la politica disattivata, un claim la cui dimostrazione usa sorry viene riportato con lo stato incomplete, mai proved.

Richiedi claim dimostrati

Per far fallire la build quando un export non porta alcun claim dimostrato, seleziona gli export per percorso (. seleziona ogni export; qualsiasi altro percorso l’export che nomina e ogni export al suo interno come spazio dei nomi):

fn main() -> lungo_build::Result<()> {
    lungo_build::configure().require_claims("Formal.step").require_claims("Formal.run").compile_lean("lean")
}

Un export selezionato senza un claim dimostrato fallisce con LNG0602:

error[LNG0602]: the export Formal.run has no proved claim (`require-claims` selects it with "Formal.run"); state what it does with `@[lungo_claim]` on a theorem about it

Un percorso che non seleziona alcun export è un errore di configurazione.

Vieta assunzioni

Un claim può essere dimostrato sotto un’assunzione su una facility dell’host (vedi come dichiarare facility e assunzioni). Per rifiutare ciò che si appoggia su un’assunzione che non accetti, vietala con il suo nome Lean; vietare una facility vieta tutte le sue assunzioni, e ogni export che chiama le sue operazioni:

lungo_build::configure().forbid_assumption("Timing.Ticks").compile_lean("lean")

Un claim dimostrato che la assume, o un export che ha bisogno di una facility vietata, fallisce con LNG0603. Un nome che non è né un’assunzione né una facility del programma è un errore di configurazione.

Per il comando lungo, le stesse impostazioni sono la tabella [assurance] di lungo.toml:

[assurance]
require-claims = ["Formal.step", "Formal.run"]
forbid-assumptions = ["Timing.Ticks"]

e lungo assurance --policy le controlla senza generare nulla, uscendo con stato 2 quando non sono rispettate.

Verifica senza fallire

Per vedere le dipendenze di ogni export senza imporre una politica, leggi assurance.json nell’output della build (il trust di ogni export, con i suoi claim, le assunzioni e le facility; vedi il documento di garanzia), elenca gli export con un problema con lungo assurance --trust-issue <issue> (sorry, axioms, unsafe, partial, facility, no-claim, incomplete, assumption), esamina una dichiarazione con lungo inspect <name>, oppure leggi i metadati in esecuzione:

for d in formal::__meta::declarations() {
    println!("{}: axioms {:?}, claims {:?}", d.lean_name, d.trust.axioms, d.assurance.claims);
}

Le definizioni partial e le dipendenze extern vengono riportate ma non sono governate da una politica: sono parti ordinarie del codice Lean eseguibile.