assertTNodeNotExpired();
return getMetaKind() == kind::metakind::VARIABLE;
}
+ inline bool isUninterpretedVar() const {
+ assertTNodeNotExpired();
+ return getMetaKind() == kind::metakind::VARIABLE &&
+ getKind() != kind::UNIVERSE_SET &&
+ getKind() != kind::SEP_NIL;
+ }
inline bool isClosure() const {
assertTNodeNotExpired();
// 1) x is a variable
// 2) x is not in the term t
// 3) x : T and t : S, then S <: T
- if (in[0].isVar() && !in[1].hasSubterm(in[0]) &&
+ if (in[0].isUninterpretedVar() && !in[1].hasSubterm(in[0]) &&
(in[1].getType()).isSubtypeOf(in[0].getType()) ){
outSubstitutions.addSubstitution(in[0], in[1]);
return PP_ASSERT_STATUS_SOLVED;
}
- if (in[1].isVar() && !in[0].hasSubterm(in[1]) &&
+ if (in[1].isUninterpretedVar() && !in[0].hasSubterm(in[1]) &&
(in[0].getType()).isSubtypeOf(in[1].getType())){
outSubstitutions.addSubstitution(in[1], in[0]);
return PP_ASSERT_STATUS_SOLVED;
rel_tp_join_1.cvc \
rel_transpose_0.cvc \
set-strat.cvc \
- rel_tc_8.cvc
+ rel_tc_8.cvc \
+ atom_univ2.cvc
# unsolved : garbage_collect.cvc
--- /dev/null
+% EXPECT: unsat\r
+OPTION "logic" "ALL_SUPPORTED";\r
+Atom: TYPE;\r
+\r
+a : SET OF [Atom];\r
+b : SET OF [Atom, Atom];\r
+\r
+x : Atom;\r
+y : Atom;\r
+\r
+ASSERT NOT(x = y);\r
+\r
+ASSERT TUPLE(y) IS_IN a;\r
+ASSERT (x, y) IS_IN b;\r
+\r
+ASSERT UNIVERSE::SET OF [Atom, Atom] = (UNIVERSE::SET OF [Atom] PRODUCT UNIVERSE::SET OF [Atom]);\r
+\r
+u : SET OF [Atom, Atom];\r
+ASSERT u = UNIVERSE::SET OF [Atom, Atom];\r
+\r
+ASSERT NOT (x, y) IS_IN u;\r
+\r
+CHECKSAT;\r
emp2-quant-unsat.smt2 \
dispose-1.smt2 \
finite-witness-sat.smt2 \
- sep-fmf-priority.smt2
+ sep-fmf-priority.smt2 \
+ nil-no-elim.smt2
FAILING_TESTS =
--- /dev/null
+(set-logic ALL)
+(set-info :status unsat)
+(declare-sort U 0)
+(declare-fun f (U) U)
+(declare-fun a () U)
+
+(assert (= (as sep.nil U) (f a)))
+
+(assert (pto (f a) 0))
+
+(check-sat)