aboutsummaryrefslogtreecommitdiff
path: root/proofsearch/include/atp/normalize/clausifier.h
diff options
context:
space:
mode:
authorRichard Qin <richard.qin.x@gmail.com>2026-04-02 15:23:43 +0800
committerRichard Qin <richard.qin.x@gmail.com>2026-04-02 15:23:43 +0800
commit3512aed92fce7e1f750327090cfc6909379ed2e6 (patch)
tree35f79db495a1766bacac5c3058446d381e158941 /proofsearch/include/atp/normalize/clausifier.h
parentcc440e2674697afc967e081cf91e03f149333502 (diff)
downloadrcc-project-3512aed92fce7e1f750327090cfc6909379ed2e6.tar.gz
rcc-project-3512aed92fce7e1f750327090cfc6909379ed2e6.tar.xz
refactor: replace string-based formula representation with interned SymbolIds and introduce stateful Clausifier for TPTP parsing
Diffstat (limited to 'proofsearch/include/atp/normalize/clausifier.h')
-rw-r--r--proofsearch/include/atp/normalize/clausifier.h37
1 files changed, 34 insertions, 3 deletions
diff --git a/proofsearch/include/atp/normalize/clausifier.h b/proofsearch/include/atp/normalize/clausifier.h
index 1ff4d27..61d2505 100644
--- a/proofsearch/include/atp/normalize/clausifier.h
+++ b/proofsearch/include/atp/normalize/clausifier.h
@@ -16,15 +16,20 @@
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
-
#pragma once
/// @file clausifier.h
/// @brief Converts FOL formulas to Clause Normal Form (CNF).
///
+/// Clausifier is a stateful object because:
+/// 1. Skolem function counter must be shared across all formulas in a problem
+/// (otherwise different formulas generate conflicting Skolem names).
+/// 2. Variable renaming counter must be shared for the same reason.
+///
/// Pipeline: eliminate ↔/→ → NNF → Skolemize → distribute ∨ over ∧ → flatten.
#include "atp/core/clause.h"
+#include "atp/core/symbol_table.h"
#include "atp/core/term_bank.h"
#include "atp/normalize/formula.h"
@@ -32,7 +37,33 @@
namespace atp {
-/// Convert a first-order formula into a set of clauses (CNF).
-std::vector<Clause> clausify(const Formula& formula, TermBank& bank);
+/// Stateful clausifier. Create one per proof problem.
+///
+/// Usage:
+/// Clausifier clausifier(bank, symbols);
+/// auto clauses1 = clausifier.clausify(formula1);
+/// auto clauses2 = clausifier.clausify(formula2);
+/// // Skolem IDs are unique across both calls.
+class Clausifier {
+ public:
+ Clausifier(TermBank& bank, SymbolTable& symbols);
+
+ /// Convert a single formula to CNF clauses.
+ /// Skolem functions generated here are globally unique (counter persists).
+ [[nodiscard]] std::vector<Clause> clausify(const Formula& formula);
+
+ /// Negate a formula: wraps it in ¬(...)
+ /// Used to negate the conjecture before clausification.
+ [[nodiscard]] static std::unique_ptr<Formula> negate(std::unique_ptr<Formula> formula);
+
+ /// Number of Skolem functions generated so far.
+ [[nodiscard]] uint32_t skolemCount() const { return next_skolem_id_; }
+
+ private:
+ TermBank& bank_;
+ SymbolTable& symbols_;
+ uint32_t next_skolem_id_ = 0;
+ uint32_t next_var_id_ = 0; ///< For variable standardization apart
+};
} // namespace atp