|
|
--- |
|
|
license: apache-2.0 |
|
|
base_model: |
|
|
- Qwen/Qwen3-8B |
|
|
--- |
|
|
This is the formalizer for translating infromal math problem into formal statement in Lean 4. In Goedel-Prover-V2 project we use this formalizer in generating lean4 statements. |
|
|
Different from all previous open-source formalizers, this formalizer has the ability to think before generating the lean4 statements, which significantly increases the acurracy of the translation. |
|
|
In our internal evaluation, we test the performance of formalizers on a eval set containing 300 informal statements from Omni-MATH. Kimina-formalizer-8B successfully translates 161/300 statements, while Goedel-Formalizer-V2-32B success in 228 statements. |
|
|
|
|
|
Here is an example code to use this formalizer: |
|
|
|
|
|
``` |
|
|
from transformers import AutoModelForCausalLM, AutoTokenizer |
|
|
import torch |
|
|
import re |
|
|
torch.manual_seed(30) |
|
|
|
|
|
model_id = "Goedel-LM/Goedel-Formalizer-V2-8B" |
|
|
tokenizer = AutoTokenizer.from_pretrained(model_id) |
|
|
model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", torch_dtype=torch.bfloat16, trust_remote_code=True) |
|
|
|
|
|
|
|
|
problem_name = "test_problem" |
|
|
informal_statement_content = "Prove that 3 cannot be written as the sum of two cubes." |
|
|
|
|
|
|
|
|
# Construct the prompt for the model |
|
|
user_prompt_content = ( |
|
|
f"Please autoformalize the following natural language problem statement in Lean 4. " |
|
|
f"Use the following theorem name: {problem_name}\n" |
|
|
f"The natural language statement is: \n" |
|
|
f"{informal_statement_content}" |
|
|
f"Think before you provide the lean statement." |
|
|
) |
|
|
|
|
|
|
|
|
|
|
|
chat = [ |
|
|
{"role": "user", "content": user_prompt_content}, |
|
|
] |
|
|
|
|
|
inputs = tokenizer.apply_chat_template(chat, tokenize=True, add_generation_prompt=True, return_tensors="pt").to(model.device) |
|
|
|
|
|
import time |
|
|
start = time.time() |
|
|
outputs = model.generate(inputs, max_new_tokens=16384, temperature = 0.9, do_sample = True, top_k=20, top_p=0.95) |
|
|
|
|
|
|
|
|
model_output_text = tokenizer.batch_decode(outputs)[0] |
|
|
|
|
|
def extract_code(text_input): |
|
|
"""Extracts the last Lean 4 code block from the model's output.""" |
|
|
try: |
|
|
matches = re.findall(r'```lean4\n(.*?)\n```', text_input, re.DOTALL) |
|
|
return matches[-1].strip() if matches else "No Lean 4 code block found." |
|
|
except Exception: |
|
|
return "Error during code extraction." |
|
|
|
|
|
|
|
|
extracted_code = extract_code(model_output_text) |
|
|
|
|
|
print(time.time() - start) |
|
|
print("output:\n", model_output_text) |
|
|
print("lean4 statement:\n", extracted_code) |
|
|
|
|
|
|
|
|
``` |