Z3 ne vérifie pas la division par zéro car, comme l'a mentionné Patrick Trentin, la sémantique de division par zéro selon SMT-LIB est qu'elle renvoie une valeur inconnue.
Vous pouvez demander manuellement à Z3 de vérifier la division par zéro, pour vous assurer que vous ne dépendez jamais de la division par zéro. (. Ceci est important, par exemple, si vous modélisez une langue où la division par zéro a une sémantique différente de SMT-LIB)
Pour exemple, cela se présentera comme suit:
(declare-fun f (Int) Int)
(declare-const c Int)
(assert (>= c 0))
(assert (= (f 0) 0))
; check for division by zero
(push)
(declare-const n Int)
(assert (>= n 0))
(assert (= (- n c) 0))
(check-sat) ; reports sat, meaning division by zero is possible
(get-model) ; an example model where division by zero would occur
(pop)
;; Supposing the check had passed (returned unsat) instead, we could
;; continue, safely knowing that division by zero could not happen in
;; the following.
(assert (forall ((n Int))
(=> (>= n 0)
(= (f (+ n 1))
(+ (f n) (/ 10 (- n c)))))))
Êtes-vous demander un moyen pour que l'outil signale une division possible par zéro? Ou demandez-vous qu'il détecte que l'ensemble de l'installation est insaturé? –
Je veux outil qui signale la division par des incohérences de type zéro présentes dans les axiomes FOL – Tom
Je ne connais pas une telle chose.Une approche serait de demander d'abord au solveur de prouver qu'il n'y a pas de division par zéro. Seriez-vous ouvert à cela? –