2 votes

Abstraction sur les groupes d'assertions dans Z3/SMT-LIB

Existe-t-il de bons mécanismes dans Z3 pour faire abstraction des assertions ? Je veux créer une "fonction" qui prend des paramètres et fait des assertions sur ces paramètres, éventuellement avec des définitions de "variables locales".

Imaginons que je dispose d'un String et je veux affirmer qu'il représente un nombre décimal compris entre 13 et 24. Je pourrais écrire une combinaison d'assertions d'expressions régulières sur la chaîne et la combiner avec une assertion de type str.to.int l'affirmation de la portée. Je peux le faire directement, mais si j'ai des dizaines de variables de ce type pour lesquelles je veux faire l'assertion, cela devient répétitif. Je peux utiliser une API de langage externe, ou peut-être définir une macro/fonction renvoyant un booléen dans Z3 et affirmer que c'est vrai, mais cela semble un peu indirect. Qu'est-ce qui est idiomatique ici ? Je veux que ce soit aussi facile à résoudre pour Z3 que d'écrire les assertions à la main.

2voto

Vous pouvez utiliser define-fun pour définir une fonction booléenne f de manière à ce que vous puissiez (assert (f x y z ...)) donde f peut bien sûr être une conjonction de plusieurs conditions. Les define-fun sera intégré par le frontal SMT2 de Z3, c'est-à-dire qu'il ne devrait pas avoir de coût d'exécution.

(Z3 prend également en charge les macros définies via (forall ((x ...)) (= (f x ...) ...)) mais vous devez appliquer explicitement la tactique de recherche de modèle pour les intégrer).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X