z3-src 503.2.2

Source distribution of the Z3 SMT solver, for use as a build dependency
Documentation
/*++
Copyright (c) 2012 Microsoft Corporation

Module Name:

    macro_finder_tactic.h

Abstract:

    Macro finder

Author:

    Christoph (cwinter) 2012-10-26

Tactic Documentation

## Tactic macro-finder

### Short Description 

Identifies and applies macros.

### Long Description

It finds implicit macro definitions in quantifiers. 
A main instance of a macro an equality that defines a function `f` using some term `t` that does not contain `f`.
Other instances of macros are also recognized by the macro finder.

* `(forall (x) (= (f x) t))`

* `not (= (p x) t)` is recognized as `(p x) = (not t)`

* `(iff (= (f x) t) cond)`  rewrites to `(f x) = (if cond t else (k x))`
   * add clause `(not (= (k x) t))`

* `(= (+ (f x) s) t)` becomes `(= (f x) (- t s))`

* `(= (+ (* -1 (f x)) x) t)`  becomes `(= (f x) (- (- t s)))`

### Example

```z3
(declare-fun f (Int) Int)
(declare-fun p (Int) Bool)

(assert (forall ((x Int)) (= (+ (f x) x) 3)))
(assert (p (f 8)))
(apply macro-finder)
```

### Notes

* Supports proofs, unsat cores, but not goals with recursive function definitions.

--*/
#pragma once

#include "util/params.h"
#include "tactic/tactic.h"
class ast_manager;
class tactic;

tactic * mk_macro_finder_tactic(ast_manager & m, params_ref const & p = params_ref());

Z3_ADD_TACTIC(macro_finder, "macro-finder", "Identifies and applies macros.", mk_macro_finder_tactic(m, p));