Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Regarding Cardinality Constraint Encoding #4665

Closed
hadipourh opened this issue Aug 27, 2020 · 2 comments
Closed

Regarding Cardinality Constraint Encoding #4665

hadipourh opened this issue Aug 27, 2020 · 2 comments

Comments

@hadipourh
Copy link

Dear Nikolaj,

Hope you are well. I have created a cryptographic tool in which I am using Z3 as a SMT solver and as a CNF converter as well. Regarding the former one (as the converter), I am using it to convert a SMT problem to the CNF format in which all constraints are simple logical constraints except for one which is a cardinality constraint. The aim of this conversion is using the state of the art SAT solvers. You might know a better tool to do this. If so, I would be most grateful if you let me know.

I am using the following commands to convert my SMT problem to the CNF format:

        G = z3.Goal()
        G.add(solver.assertions())
        cnf_format = z3.Then("card2bv", "tseitin-cnf")
        temp = cnf_format(G)
        dimacs_format = temp[0].dimacs()

I checked it several times, and it works well. However, I am not sure if it is the best way for this conversion? Besides does it always preserve the satisfiability of the original SMT problem?

I had also the following observation:

  • When I use cnf_format = z3.Tactic("card2bv") or cnf_format = z3.Then('simplify', 'bit-blast', 'tseitin-cnf'), it doesn't preserve the satisfiability. I mean the original SMT problem is UNSAT, while the converted one become SAT. Thank you in advance for your time.

Kind regards,
Hosein

NikolajBjorner added a commit that referenced this issue Aug 30, 2020
Signed-off-by: Nikolaj Bjorner <[email protected]>
@NikolajBjorner
Copy link
Contributor

There are a number of different ways to control the encoding. These weren't well exposed so I have pushed a fix for this now.
With the fix, you can run the following tests to explore the space:

(declare-const x Bool)
(declare-const y Bool)
(declare-const z Bool)
(declare-const u Bool)
(push)
(assert ((_ at-most 2) x y z u))
(apply (using-params card2bv :cardinality.encoding unate))
(apply (using-params card2bv :cardinality.encoding grouped))
(apply (using-params card2bv :cardinality.encoding ordered))
(apply (using-params card2bv :cardinality.encoding bimander))
(apply (using-params card2bv :cardinality.encoding circuit))
(pop)

(push)
(assert ((_ pble 4 2 3 1 2) x y z u))
(apply (using-params card2bv :pb.solver solver))
(apply (using-params card2bv :pb.solver circuit))
(apply (using-params card2bv :pb.solver totalizer))
(apply (using-params card2bv :pb.solver sorting))
(apply (using-params card2bv :pb.solver binary_merge))
(pop)

When pb.solver is set to solver, which is the default, Pseudo-Booleans are not going to be converted.
With the other options it may produce bit-vectors or just clauses.
You would need to bit-blast the bit-vectors before converting to CNF. Otherwise, the dimacs file is only an abstraction and does not preserve satisfiability. Generally, you can create a dimacs serialized output from non-propositional formulas. Since dimacs only captures propositional logic this information wil be lost in the output. The dimacs output should then contain information about this abstraction as comments in the end of the file.

NikolajBjorner added a commit that referenced this issue Sep 8, 2020
* fixing issue #4651

* regression fix

* fix #4662

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* reenabled lift_ites_throttled with an additional filter, without the filter finding the model in report #4651 goes from .02s to 20s, also updated pretty printing of regexes to be more accurate

* removing temp testing variable

* Allow to skip System.loadLibrary() calls from Java Native class (#4667)

* using intended utility methods for sort detection

* adding ack/model

Signed-off-by: Nikolaj Bjorner <[email protected]>

* add smt params dependency

Signed-off-by: Nikolaj Bjorner <[email protected]>

* missing file

Signed-off-by: Nikolaj Bjorner <[email protected]>

* deps

Signed-off-by: Nikolaj Bjorner <[email protected]>

* order

Signed-off-by: Nikolaj Bjorner <[email protected]>

* persist fields

Signed-off-by: Nikolaj Bjorner <[email protected]>

* dbg build

Signed-off-by: Nikolaj Bjorner <[email protected]>

* reset caches

Signed-off-by: Nikolaj Bjorner <[email protected]>

* sr

Signed-off-by: Nikolaj Bjorner <[email protected]>

* fix cmake build

Signed-off-by: Nikolaj Bjorner <[email protected]>

* shuffle dependencies

Signed-off-by: Nikolaj Bjorner <[email protected]>

* warnings /errors

Signed-off-by: Nikolaj Bjorner <[email protected]>

* update include

Signed-off-by: Nikolaj Bjorner <[email protected]>

* missing cmakelists

Signed-off-by: Nikolaj Bjorner <[email protected]>

* update cmake

Signed-off-by: Nikolaj Bjorner <[email protected]>

* add depend

Signed-off-by: Nikolaj Bjorner <[email protected]>

* add depend

Signed-off-by: Nikolaj Bjorner <[email protected]>

* virtual method

Signed-off-by: Nikolaj Bjorner <[email protected]>

* path

Signed-off-by: Nikolaj Bjorner <[email protected]>

* move parameters from ast/rewriter to params

Signed-off-by: Nikolaj Bjorner <[email protected]>

* move fpa

Signed-off-by: Nikolaj Bjorner <[email protected]>

* fix warnings

Signed-off-by: Nikolaj Bjorner <[email protected]>

* remove pragma

Signed-off-by: Nikolaj Bjorner <[email protected]>

* dbg

Signed-off-by: Nikolaj Bjorner <[email protected]>

* updated sat_smt

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* fix #4651

Signed-off-by: Nikolaj Bjorner <[email protected]>

* encoding options #4665

Signed-off-by: Nikolaj Bjorner <[email protected]>

* expose name inclusion as optional

Signed-off-by: Nikolaj Bjorner <[email protected]>

* fix misc issues around #4661 introduced when adding lazy push/pop to selected theories

Signed-off-by: Nikolaj Bjorner <[email protected]>

* remove lazy push from theory_lra

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* fix dotnet build

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* release nodes

Signed-off-by: Nikolaj Bjorner <[email protected]>

* free memory in egraph

Signed-off-by: Nikolaj Bjorner <[email protected]>

* avoid duplicate class names frame in sat_scc and sat_smt

Signed-off-by: Nikolaj Bjorner <[email protected]>

* adding euf

Signed-off-by: Nikolaj Bjorner <[email protected]>

* elaborate on smt/drat format outline, expose euf mode as config

Signed-off-by: Nikolaj Bjorner <[email protected]>

* mk-var during copy

Signed-off-by: Nikolaj Bjorner <[email protected]>

* move theory_var_list into id_var_list and utilities from smt-enode into it, prepare for theory variables in egraph

Signed-off-by: Nikolaj Bjorner <[email protected]>

* with bounded

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* Remove duplicate binary condition. Fixes #4668.

* butterfly effect on fp?

Signed-off-by: Nikolaj Bjorner <[email protected]>

* prepare for theory plugins

Signed-off-by: Nikolaj Bjorner <[email protected]>

* file

Signed-off-by: Nikolaj Bjorner <[email protected]>

* build fix

* remove SMTFD

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* na

Signed-off-by: Nikolaj Bjorner <[email protected]>

* SMTFD is back (#4676)

* fixing issue #4651

* regression fix

* reenabled lift_ites_throttled with an additional filter, without the filter finding the model in report #4651 goes from .02s to 20s, also updated pretty printing of regexes to be more accurate

* removing temp testing variable

* using intended utility methods for sort detection

* misc edits related to nonground regexes

* bug fix of state id off by 1 calculation error and improved pretty printing with regex tooltip generated in dgml state graph

* removed unused method declaration

* improved id to regex value map info in generated dgml

* reorgd callback function for state pretty printer

* updated some comments

Co-authored-by: Nikolaj Bjorner <[email protected]>
Co-authored-by: Sergey Vladimirov <[email protected]>
Co-authored-by: Christoph M. Wintersteiger <[email protected]>
Co-authored-by: Arie Gurfinkel <[email protected]>
@hadipourh
Copy link
Author

Thanks for your kind helps.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants