mirror of
https://github.com/Z3Prover/z3
synced 2026-06-01 22:57:51 +00:00
Move tptp frontend to cmd_context and add string API
Agent-Logs-Url: https://github.com/Z3Prover/z3/sessions/1be7cf7e-2747-43ba-9a33-2e71dad2d14d Co-authored-by: NikolajBjorner <3085284+NikolajBjorner@users.noreply.github.com>
This commit is contained in:
parent
b3e19ffeaa
commit
a8c6b0bf1b
10 changed files with 65 additions and 53 deletions
|
|
@ -12,6 +12,7 @@ z3_add_component(cmd_context
|
||||||
simplifier_cmds.cpp
|
simplifier_cmds.cpp
|
||||||
tactic_cmds.cpp
|
tactic_cmds.cpp
|
||||||
tactic_manager.cpp
|
tactic_manager.cpp
|
||||||
|
tptp_frontend.cpp
|
||||||
COMPONENT_DEPENDENCIES
|
COMPONENT_DEPENDENCIES
|
||||||
rewriter
|
rewriter
|
||||||
solver
|
solver
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@
|
||||||
#include "ast/expr_abstract.h"
|
#include "ast/expr_abstract.h"
|
||||||
#include "ast/ast_util.h"
|
#include "ast/ast_util.h"
|
||||||
#include "cmd_context/cmd_context.h"
|
#include "cmd_context/cmd_context.h"
|
||||||
#include "shell/tptp_frontend.h"
|
#include "cmd_context/tptp_frontend.h"
|
||||||
#include "smt/smt_solver.h"
|
#include "smt/smt_solver.h"
|
||||||
#include "util/error_codes.h"
|
#include "util/error_codes.h"
|
||||||
#include "util/z3_exception.h"
|
#include "util/z3_exception.h"
|
||||||
|
|
@ -727,6 +727,15 @@ public:
|
||||||
m_sorts.emplace("$real", m_arith.mk_real());
|
m_sorts.emplace("$real", m_arith.mk_real());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void parse_stream(std::istream& in, std::string const& current_file) {
|
||||||
|
std::ostringstream buf;
|
||||||
|
buf << in.rdbuf();
|
||||||
|
m_input = buf.str();
|
||||||
|
m_lex = std::make_unique<lexer>(m_input);
|
||||||
|
next();
|
||||||
|
parse_toplevel(current_file);
|
||||||
|
}
|
||||||
|
|
||||||
void parse_file(std::string const& filename) {
|
void parse_file(std::string const& filename) {
|
||||||
if (!m_seen_files.insert(filename).second) return;
|
if (!m_seen_files.insert(filename).second) return;
|
||||||
std::ifstream in(filename);
|
std::ifstream in(filename);
|
||||||
|
|
@ -735,21 +744,11 @@ public:
|
||||||
out << "failed to open file '" << filename << "'";
|
out << "failed to open file '" << filename << "'";
|
||||||
throw parse_error(out.str());
|
throw parse_error(out.str());
|
||||||
}
|
}
|
||||||
std::ostringstream buf;
|
parse_stream(in, filename);
|
||||||
buf << in.rdbuf();
|
|
||||||
m_input = buf.str();
|
|
||||||
m_lex = std::make_unique<lexer>(m_input);
|
|
||||||
next();
|
|
||||||
parse_toplevel(filename);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void parse_stream(std::istream& in) {
|
void parse_stream(std::istream& in) {
|
||||||
std::ostringstream buf;
|
parse_stream(in, ".");
|
||||||
buf << in.rdbuf();
|
|
||||||
m_input = buf.str();
|
|
||||||
m_lex = std::make_unique<lexer>(m_input);
|
|
||||||
next();
|
|
||||||
parse_toplevel(".");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool has_conjecture() const { return m_has_conjecture; }
|
bool has_conjecture() const { return m_has_conjecture; }
|
||||||
|
|
@ -787,14 +786,13 @@ expr_ref tptp_parser::parse_formula() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned read_tptp(char const* file_name) {
|
static unsigned read_tptp_stream(std::istream& in, char const* current_file) {
|
||||||
try {
|
try {
|
||||||
cmd_context ctx;
|
cmd_context ctx;
|
||||||
ctx.set_solver_factory(mk_smt_strategic_solver_factory());
|
ctx.set_solver_factory(mk_smt_strategic_solver_factory());
|
||||||
|
|
||||||
tptp_parser p(ctx);
|
tptp_parser p(ctx);
|
||||||
if (file_name) p.parse_file(file_name);
|
p.parse_stream(in, current_file ? current_file : ".");
|
||||||
else p.parse_stream(std::cin);
|
|
||||||
|
|
||||||
// Suppress default check-sat output; TPTP frontend reports SZS status explicitly.
|
// Suppress default check-sat output; TPTP frontend reports SZS status explicitly.
|
||||||
std::ostringstream sink;
|
std::ostringstream sink;
|
||||||
|
|
@ -840,3 +838,19 @@ unsigned read_tptp(char const* file_name) {
|
||||||
return ERR_INTERNAL_FATAL;
|
return ERR_INTERNAL_FATAL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
unsigned read_tptp(char const* file_name) {
|
||||||
|
if (!file_name)
|
||||||
|
return read_tptp_stream(std::cin, ".");
|
||||||
|
std::ifstream in(file_name);
|
||||||
|
if (in.fail()) {
|
||||||
|
std::cerr << "TPTP parse error: failed to open file '" << file_name << "'\n";
|
||||||
|
return ERR_PARSER;
|
||||||
|
}
|
||||||
|
return read_tptp_stream(in, file_name);
|
||||||
|
}
|
||||||
|
|
||||||
|
unsigned read_tptp_string(char const* input) {
|
||||||
|
std::istringstream in(input ? input : "");
|
||||||
|
return read_tptp_stream(in, "<string>");
|
||||||
|
}
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
unsigned read_tptp(char const* file_name);
|
unsigned read_tptp(char const* file_name);
|
||||||
|
unsigned read_tptp_string(char const* input);
|
||||||
|
|
@ -27,7 +27,6 @@ add_executable(shell
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/mem_initializer.cpp"
|
"${CMAKE_CURRENT_BINARY_DIR}/mem_initializer.cpp"
|
||||||
opt_frontend.cpp
|
opt_frontend.cpp
|
||||||
smtlib_frontend.cpp
|
smtlib_frontend.cpp
|
||||||
tptp_frontend.cpp
|
|
||||||
z3_log_frontend.cpp
|
z3_log_frontend.cpp
|
||||||
# FIXME: shell should really link against libz3 but it can't due to requiring
|
# FIXME: shell should really link against libz3 but it can't due to requiring
|
||||||
# use of some hidden symbols. Also libz3 has the ``api_dll`` component which
|
# use of some hidden symbols. Also libz3 has the ``api_dll`` component which
|
||||||
|
|
|
||||||
|
|
@ -30,7 +30,7 @@ Revision History:
|
||||||
#include "shell/dimacs_frontend.h"
|
#include "shell/dimacs_frontend.h"
|
||||||
#include "shell/datalog_frontend.h"
|
#include "shell/datalog_frontend.h"
|
||||||
#include "shell/opt_frontend.h"
|
#include "shell/opt_frontend.h"
|
||||||
#include "shell/tptp_frontend.h"
|
#include "cmd_context/tptp_frontend.h"
|
||||||
#include "util/timeout.h"
|
#include "util/timeout.h"
|
||||||
#include "util/z3_exception.h"
|
#include "util/z3_exception.h"
|
||||||
#include "util/error_codes.h"
|
#include "util/error_codes.h"
|
||||||
|
|
|
||||||
|
|
@ -146,7 +146,6 @@ add_executable(test-z3
|
||||||
theory_pb.cpp
|
theory_pb.cpp
|
||||||
timeout.cpp
|
timeout.cpp
|
||||||
tptp.cpp
|
tptp.cpp
|
||||||
../shell/tptp_frontend.cpp
|
|
||||||
total_order.cpp
|
total_order.cpp
|
||||||
totalizer.cpp
|
totalizer.cpp
|
||||||
trigo.cpp
|
trigo.cpp
|
||||||
|
|
@ -167,7 +166,6 @@ z3_add_memory_initializer_rule(${z3_test_deps})
|
||||||
z3_add_gparams_register_modules_rule(${z3_test_deps})
|
z3_add_gparams_register_modules_rule(${z3_test_deps})
|
||||||
target_compile_definitions(test-z3 PRIVATE
|
target_compile_definitions(test-z3 PRIVATE
|
||||||
${Z3_COMPONENT_CXX_DEFINES}
|
${Z3_COMPONENT_CXX_DEFINES}
|
||||||
Z3_TEST_SRC_DIR="${CMAKE_CURRENT_SOURCE_DIR}"
|
|
||||||
)
|
)
|
||||||
target_compile_options(test-z3 PRIVATE ${Z3_COMPONENT_CXX_FLAGS})
|
target_compile_options(test-z3 PRIVATE ${Z3_COMPONENT_CXX_FLAGS})
|
||||||
target_link_libraries(test-z3 PRIVATE ${Z3_DEPENDENT_LIBS})
|
target_link_libraries(test-z3 PRIVATE ${Z3_DEPENDENT_LIBS})
|
||||||
|
|
|
||||||
|
|
@ -3,19 +3,19 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
#include "util/debug.h"
|
#include "util/debug.h"
|
||||||
#include "shell/tptp_frontend.h"
|
#include "cmd_context/tptp_frontend.h"
|
||||||
|
|
||||||
struct tptp_case {
|
struct tptp_case {
|
||||||
char const* file;
|
char const* name;
|
||||||
|
char const* input;
|
||||||
char const* expected_status;
|
char const* expected_status;
|
||||||
};
|
};
|
||||||
|
|
||||||
static std::string run_tptp(char const* file) {
|
static std::string run_tptp(char const* input) {
|
||||||
std::string path = std::string(Z3_TEST_SRC_DIR) + "/tptp/" + file;
|
|
||||||
std::streambuf* old_out = std::cout.rdbuf();
|
std::streambuf* old_out = std::cout.rdbuf();
|
||||||
std::ostringstream out;
|
std::ostringstream out;
|
||||||
std::cout.rdbuf(out.rdbuf());
|
std::cout.rdbuf(out.rdbuf());
|
||||||
unsigned code = read_tptp(path.c_str());
|
unsigned code = read_tptp_string(input);
|
||||||
std::cout.rdbuf(old_out);
|
std::cout.rdbuf(old_out);
|
||||||
ENSURE(code == 0);
|
ENSURE(code == 0);
|
||||||
return out.str();
|
return out.str();
|
||||||
|
|
@ -27,12 +27,35 @@ bool g_display_model = false;
|
||||||
|
|
||||||
void tst_tptp() {
|
void tst_tptp() {
|
||||||
std::vector<tptp_case> cases = {
|
std::vector<tptp_case> cases = {
|
||||||
{"agatha-butler.p", "% SZS status Theorem"},
|
{"agatha-butler",
|
||||||
{"socrates-theorem.p", "% SZS status Theorem"},
|
R"(fof(ax1,axiom, lives(agatha)).
|
||||||
{"simple-sat.p", "% SZS status Satisfiable"}
|
fof(ax2,axiom, lives(butler)).
|
||||||
|
fof(ax3,axiom, lives(charles)).
|
||||||
|
fof(ax4,axiom, ! [X] : (lives(X) => (X = agatha | X = butler | X = charles))).
|
||||||
|
fof(ax5,axiom, ! [X,Y] : (killed(X,Y) => hates(X,Y))).
|
||||||
|
fof(ax6,axiom, ! [X,Y] : (killed(X,Y) => ~ richer(X,Y))).
|
||||||
|
fof(ax7,axiom, ! [X] : (hates(agatha,X) => ~ hates(charles,X))).
|
||||||
|
fof(ax8,axiom, ! [X] : (X != butler => hates(agatha,X))).
|
||||||
|
fof(ax9,axiom, ! [X] : (~ richer(X,agatha) => hates(butler,X))).
|
||||||
|
fof(ax10,axiom, ! [X] : (hates(agatha,X) => hates(butler,X))).
|
||||||
|
fof(ax11,axiom, ! [X] : (? [Y] : ~ hates(X,Y))).
|
||||||
|
fof(ax12,axiom, agatha != butler).
|
||||||
|
fof(ax13,axiom, ? [X] : killed(X,agatha)).
|
||||||
|
fof(conj,conjecture, ~ killed(butler,agatha)).)",
|
||||||
|
"% SZS status Theorem"},
|
||||||
|
{"socrates-theorem",
|
||||||
|
R"(fof(a1,axiom, ! [X] : (human(X) => mortal(X))).
|
||||||
|
fof(a2,axiom, human(socrates)).
|
||||||
|
fof(c1,conjecture, mortal(socrates)).)",
|
||||||
|
"% SZS status Theorem"},
|
||||||
|
{"simple-sat",
|
||||||
|
R"(fof(a1,axiom, p(a)).)",
|
||||||
|
"% SZS status Satisfiable"}
|
||||||
};
|
};
|
||||||
for (auto const& c : cases) {
|
for (auto const& c : cases) {
|
||||||
std::string out = run_tptp(c.file);
|
std::string out = run_tptp(c.input);
|
||||||
|
if (out.find(c.expected_status) == std::string::npos)
|
||||||
|
std::cerr << "Unexpected TPTP status for case: " << c.name << "\n" << out << "\n";
|
||||||
ENSURE(out.find(c.expected_status) != std::string::npos);
|
ENSURE(out.find(c.expected_status) != std::string::npos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
||||||
fof(ax1,axiom, lives(agatha)).
|
|
||||||
fof(ax2,axiom, lives(butler)).
|
|
||||||
fof(ax3,axiom, lives(charles)).
|
|
||||||
|
|
||||||
fof(ax4,axiom, ! [X] : (lives(X) => (X = agatha | X = butler | X = charles))).
|
|
||||||
fof(ax5,axiom, ! [X,Y] : (killed(X,Y) => hates(X,Y))).
|
|
||||||
fof(ax6,axiom, ! [X,Y] : (killed(X,Y) => ~ richer(X,Y))).
|
|
||||||
|
|
||||||
fof(ax7,axiom, ! [X] : (hates(agatha,X) => ~ hates(charles,X))).
|
|
||||||
fof(ax8,axiom, ! [X] : (X != butler => hates(agatha,X))).
|
|
||||||
fof(ax9,axiom, ! [X] : (~ richer(X,agatha) => hates(butler,X))).
|
|
||||||
fof(ax10,axiom, ! [X] : (hates(agatha,X) => hates(butler,X))).
|
|
||||||
fof(ax11,axiom, ! [X] : (? [Y] : ~ hates(X,Y))).
|
|
||||||
|
|
||||||
fof(ax12,axiom, agatha != butler).
|
|
||||||
fof(ax13,axiom, ? [X] : killed(X,agatha)).
|
|
||||||
|
|
||||||
fof(conj,conjecture, ~ killed(butler,agatha)).
|
|
||||||
|
|
@ -1,2 +0,0 @@
|
||||||
fof(a1,axiom, p(a)).
|
|
||||||
|
|
||||||
|
|
@ -1,4 +0,0 @@
|
||||||
fof(a1,axiom, ! [X] : (human(X) => mortal(X))).
|
|
||||||
fof(a2,axiom, human(socrates)).
|
|
||||||
fof(c1,conjecture, mortal(socrates)).
|
|
||||||
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue