Use (non-recursive) unpurified form instead of original form for defining Skolems...
authorAndrew Reynolds <andrew.j.reynolds@gmail.com>
Tue, 3 May 2022 19:47:44 +0000 (14:47 -0500)
committerGitHub <noreply@github.com>
Tue, 3 May 2022 19:47:44 +0000 (19:47 +0000)
commit70b5c27382628cc0e3d7bf6cbae58c8532668023
tree15671bc37a8aaf922716178b237a0d04ec0d6c05
parentea74d802c27ce8c0bdd0564b9720e030333c5ec6
Use (non-recursive) unpurified form instead of original form for defining Skolems (#8699)

This modifies our treatment of purification Skolems in the internal proof calculus. In particular, we now use an "unpurified form" instead of "original form" for defining Skolems. SKOLEM_INTRO is modified to prove the equality between a skolem and its unpurified form.

For example:
k1 purifies (ite A B C)
k2 purifies (+ k1 1)

The unpurified form of k2 is (+ k1 1), its original form is (+ (ite A B C) 1).

As a consequence:
(1) Our global skolem sharing is now slightly weaker, for example a k3 could be constructed whose unpurified form is (+ (ite A B C) 1); previously this would guaranteed to be k1.
(2) We do not require recursively computing the original form of terms when constructing purification Skolems,
(3) The witness form proof generator requires a fix point.
(4) The LFSC signature is simplified, and does not require a side condition to recursively compute the original form of a Skolem.

Fixes cvc5/LFSC#81.
proofs/lfsc/signatures/quantifiers_rules.plf
proofs/lfsc/signatures/strings_programs.plf
proofs/lfsc/signatures/strings_rules.plf
proofs/lfsc/signatures/util_defs.plf
src/expr/skolem_manager.cpp
src/expr/skolem_manager.h
src/proof/lfsc/lfsc_node_converter.cpp
src/proof/lfsc/lfsc_printer.cpp
src/proof/proof_rule.h
src/smt/witness_form.cpp
src/theory/quantifiers/proof_checker.cpp