A volte, quando sto scrivendo prove applicare in stile, ho voluto un modo per modificare un metodo di prova per foo
applicare un metodo se e solo se si risolve l'obiettivo attuale
Prova
foo
al primo obbiettivo. Se risolve l'obiettivo, bene; se lo fa, non lo risolve, ripristina lo stato originale e fallisce.
Questo si avvicinò nel codice seguente:
qed (subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)+
Dopo qualche cambiamento più in alto, la chiamata a simp
non risolverebbe completamente un obiettivo più, e allora questo ciclo. Se avessi potuto specificato qualcosa di simile
qed (solve_goal(subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail))+
o (in alternativa suggerita synatx)
qed ((subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)!)+
o (forse anche la sintassi più bello)
qed ((subst fibs.simps, (subst fib.simps)?, simp add: nth_zipWith nth_tail)[1!])+
sarebbe fermato al primo obiettivo che non è stato risolvibile da questo script.
penso che la '' fibs.simps' o fib.simps' attivare il comportamento di loop (forse a causa di sinistra generale e un se sul lato destro)? Spesso è possibile sostituirli con regole condizionali. –
Ho inviato una [patch che implementa questo] (https://mailmanbroy.informatik.tu-muenchen.de/pipermail/isabelle-dev/2013-March/003911.html), vediamo cosa succede. –
@Joachim Breitner: Solo per la cronaca, personalmente non penso che in una dimostrazione strutturata (come il tuo esempio) tale mostruosità appartiene a un 'qed';). Preferirei sempre impostare esplicitamente un altro sotto-proof all'interno del corrispondente 'proof' /' qed'. Tuttavia, stai parlando di script "apply" e per loro sono completamente d'accordo. (Forse potresti trasformare il 'qed' nel tuo esempio in un' apply'?) – chris