Branch data Line data Source code
1 : : /******************************************************************************
2 : : * Top contributors (to current version):
3 : : * Andrew Reynolds
4 : : *
5 : : * This file is part of the cvc5 project.
6 : : *
7 : : * Copyright (c) 2009-2024 by the authors listed in the file AUTHORS
8 : : * in the top-level source directory and their institutional affiliations.
9 : : * All rights reserved. See the file COPYING in the top-level source
10 : : * directory for licensing information.
11 : : * ****************************************************************************
12 : : *
13 : : * Implementation of sets proof checker.
14 : : */
15 : :
16 : : #include "theory/sets/proof_checker.h"
17 : :
18 : : #include "expr/skolem_manager.h"
19 : :
20 : : namespace cvc5::internal {
21 : : namespace theory {
22 : : namespace sets {
23 : :
24 : 49269 : SetsProofRuleChecker::SetsProofRuleChecker(NodeManager* nm)
25 : 49269 : : ProofRuleChecker(nm)
26 : : {
27 : 49269 : }
28 : :
29 : 18621 : void SetsProofRuleChecker::registerTo(ProofChecker* pc)
30 : : {
31 : 18621 : pc->registerChecker(ProofRule::SETS_SINGLETON_INJ, this);
32 : 18621 : pc->registerChecker(ProofRule::SETS_EXT, this);
33 : 18621 : pc->registerChecker(ProofRule::SETS_FILTER_UP, this);
34 : 18621 : pc->registerChecker(ProofRule::SETS_FILTER_DOWN, this);
35 : 18621 : }
36 : :
37 : 468 : Node SetsProofRuleChecker::checkInternal(ProofRule id,
38 : : const std::vector<Node>& children,
39 : : const std::vector<Node>& args)
40 : : {
41 : 468 : NodeManager* nm = nodeManager();
42 [ + + ]: 468 : if (id == ProofRule::SETS_SINGLETON_INJ)
43 : : {
44 [ - + ][ - + ]: 113 : Assert(children.size() == 1);
[ - - ]
45 [ - + ][ - + ]: 113 : Assert(args.empty());
[ - - ]
46 : 226 : Node eq = children[0];
47 [ + - ][ - + ]: 226 : if (eq.getKind() != Kind::EQUAL || eq[0].getKind() != Kind::SET_SINGLETON
[ - - ]
48 [ + - ][ - + ]: 226 : || eq[1].getKind() != Kind::SET_SINGLETON)
[ + - ][ + - ]
[ - - ]
49 : : {
50 : 0 : return Node::null();
51 : : }
52 : 113 : return eq[0][0].eqNode(eq[1][0]);
53 : : }
54 [ + + ]: 355 : else if (id == ProofRule::SETS_EXT)
55 : : {
56 [ - + ][ - + ]: 301 : Assert(children.size() == 1);
[ - - ]
57 [ - + ][ - + ]: 301 : Assert(args.empty());
[ - - ]
58 : 602 : Node deq = children[0];
59 [ + - ][ - + ]: 602 : if (deq.getKind() != Kind::NOT || deq[0].getKind() != Kind::EQUAL
[ - - ]
60 : 602 : || !deq[0][0].getType().isSet())
61 : : {
62 : 0 : return Node::null();
63 : : }
64 : 602 : Node a = deq[0][0];
65 : 602 : Node b = deq[0][1];
66 : 301 : SkolemManager* sm = nm->getSkolemManager();
67 : 1505 : Node k = sm->mkSkolemFunction(SkolemId::SETS_DEQ_DIFF, {a, b});
68 : 903 : Node as = nm->mkNode(Kind::SET_MEMBER, k, a);
69 : 602 : Node bs = nm->mkNode(Kind::SET_MEMBER, k, b);
70 : 602 : return as.eqNode(bs).notNode();
71 : : }
72 [ + + ]: 54 : else if (id == ProofRule::SETS_FILTER_UP)
73 : : {
74 [ - + ][ - + ]: 36 : Assert(children.size() == 1);
[ - - ]
75 [ - + ][ - + ]: 36 : Assert(args.size() == 1);
[ - - ]
76 : 72 : Node mem = children[0];
77 [ - + ]: 36 : if (mem.getKind() != Kind::SET_MEMBER)
78 : : {
79 : 0 : return Node::null();
80 : : }
81 : 108 : Node pred = nm->mkNode(Kind::APPLY_UF, args[0], mem[0]);
82 : 108 : Node filter = nm->mkNode(Kind::SET_FILTER, args[0], mem[1]);
83 : 108 : Node nmem = nm->mkNode(Kind::SET_MEMBER, mem[0], filter);
84 : 36 : return nmem.eqNode(pred);
85 : : }
86 [ + - ]: 18 : else if (id == ProofRule::SETS_FILTER_DOWN)
87 : : {
88 [ - + ][ - + ]: 18 : Assert(children.size() == 1);
[ - - ]
89 : 36 : Node mem = children[0];
90 : 54 : if (mem.getKind() != Kind::SET_MEMBER
91 [ + - ][ - + ]: 18 : || mem[1].getKind() != Kind::SET_FILTER)
[ + - ][ - + ]
[ - - ]
92 : : {
93 : 0 : return Node::null();
94 : : }
95 : 54 : Node nmem = nm->mkNode(Kind::SET_MEMBER, mem[0], mem[1][1]);
96 : 36 : Node pred = nm->mkNode(Kind::APPLY_UF, mem[1][0], mem[0]);
97 : 18 : return nm->mkNode(Kind::AND, nmem, pred);
98 : : }
99 : : // no rule
100 : 0 : return Node::null();
101 : : }
102 : :
103 : : } // namespace sets
104 : : } // namespace theory
105 : : } // namespace cvc5::internal
|