3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-05-02 13:27:01 +00:00

cave in to supporting proofs (partially) in simplifiers, updated doc

This commit is contained in:
Nikolaj Bjorner 2022-12-06 17:02:04 -08:00
parent aaabbfb594
commit 80033e8744
36 changed files with 157 additions and 108 deletions

View file

@ -5,19 +5,11 @@ Module Name:
injectivity_tactic.cpp
Abstract:
Injectivity tactics
- Discover axioms of the form `forall x. (= (g (f x)) x`
Mark `f` as injective
- Rewrite (sub)terms of the form `(= (f x) (f y))` to `(= x y)` whenever `f` is injective.
Author:
Nicolas Braud-Santoni (t-nibrau) 2017-08-10
Notes:
--*/
#include <algorithm>
#include <utility>
@ -164,8 +156,6 @@ class injectivity_tactic : public tactic {
struct rewriter_eq_cfg : public default_rewriter_cfg {
ast_manager & m_manager;
InjHelper & inj_map;
// expr_ref_vector m_out;
// sort_ref_vector m_bindings;
ast_manager & m() const { return m_manager; }
@ -176,14 +166,13 @@ class injectivity_tactic : public tactic {
}
void cleanup_buffers() {
// m_out.finalize();
}
void reset() {
}
br_status reduce_app(func_decl * f, unsigned num, expr * const * args, expr_ref & result, proof_ref & result_pr) {
if(num != 2)
if (num != 2)
return BR_FAILED;
if (!m().is_eq(f))
@ -230,8 +219,6 @@ class injectivity_tactic : public tactic {
finder * m_finder;
rewriter_eq * m_eq;
InjHelper * m_map;
// rewriter_inverse * m_inverse;
params_ref m_params;
ast_manager & m_manager;

View file

@ -13,7 +13,33 @@ Author:
Nicolas Braud-Santoni (t-nibrau) 2017-08-10
Notes:
Tactic Documentation:
## Tactic injectivity
### Short Description:
- Discover axioms of the form `forall x. (= (g (f x)) x`
Mark `f` as injective
- Rewrite (sub)terms of the form `(= (f x) (f y))` to `(= x y)` whenever `f` is injective.
### Example
```z3
(declare-fun f (Int) Int)
(declare-fun g (Int) Int)
(declare-const x Int)
(declare-const y Int)
(assert (forall ((x Int)) (= (g (f x)) x)))
(assert (not (= (f x) (f (f y)))))
(apply injectivity)
```
### Notes
* does not support cores nor proofs
--*/
#pragma once

View file

@ -23,15 +23,15 @@ Reduce the number of arguments of function applications, when for all occurrence
### Long Description
Example, suppose we have a function `f` with `2` arguments.
There are 1000 applications of this function, but the first argument is always "a", "b" or "c".
Thus, we replace the `f(t1, t2)` with
Example, suppose we have a function $f$ with 2 arguments.
There are 1000 applications of this function, but the first argument is always $a$, $b$ or $c$.
Thus, we replace the $f(t_1, t_2)$ with
* `f_a(t2)` if `t1 = a`
* `f_b(t2)` if `t2 = b`
* `f_c(t2)` if `t2 = c`
* $f_a(t_2)$ if $t_1 = a$
* $f_b(t_2)$ if $t_2 = b$
* $f_c(t_2)$ if $t_2 = c$
Since `f_a`, `f_b`, `f_c` are new symbols, satisfiability is preserved.
Since $f_a$, $f_b$, $f_c$ are new symbols, satisfiability is preserved.
This transformation is very similar in spirit to the Ackermman's reduction.