From f043b5754a0fe309bbbcb3ae8574ce931e684ebb Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Tue, 28 May 2024 08:19:16 +0000 Subject: [PATCH 01/41] MiniF2F-test evaluation results for internlm2-math-pluss models --- eval/pretrain/minif2f/compute_metrics.py | 5 +- eval/pretrain/minif2f/output.zip | Bin 61196 -> 184889 bytes .../minif2f/proofsearch_internLM2-plus.py | 318 ++++++++++++++++++ .../scripts/eval_internLM2-plus_20b.sh | 21 ++ .../minif2f/scripts/eval_internLM2-plus_7b.sh | 21 ++ 5 files changed, 364 insertions(+), 1 deletion(-) create mode 100644 eval/pretrain/minif2f/proofsearch_internLM2-plus.py create mode 100755 eval/pretrain/minif2f/scripts/eval_internLM2-plus_20b.sh create mode 100755 eval/pretrain/minif2f/scripts/eval_internLM2-plus_7b.sh diff --git a/eval/pretrain/minif2f/compute_metrics.py b/eval/pretrain/minif2f/compute_metrics.py index d504bb5..3e2c47b 100644 --- a/eval/pretrain/minif2f/compute_metrics.py +++ b/eval/pretrain/minif2f/compute_metrics.py @@ -3,7 +3,10 @@ for setting in [ 'internLM2-7b_minif2f_test', - 'internLM2-20b_minif2f_test' + 'internLM2-20b_minif2f_test', + 'internLM2-plus-7b_minif2f_test', + 'internLM2-plus-20b_minif2f_test' + ]: fs = [json.load(open(x)) for x in glob.glob('./output/%s/*.json' % setting)] n = 0 diff --git a/eval/pretrain/minif2f/output.zip b/eval/pretrain/minif2f/output.zip index 7846d7ac46903bab010639fa088c2ad85a28bafe..6e43084641bc7a4f27165e2d7d38676e0c298347 100644 GIT binary patch literal 184889 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�Y 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 z±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

drf6B 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 H1mFD!y;#ab literal 61196 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 BQMv#C diff --git a/eval/pretrain/minif2f/proofsearch_internLM2-plus.py b/eval/pretrain/minif2f/proofsearch_internLM2-plus.py new file mode 100644 index 0000000..517a974 --- /dev/null +++ b/eval/pretrain/minif2f/proofsearch_internLM2-plus.py @@ -0,0 +1,318 @@ +# Lean proof search with LeanDojo interaction +# Author: Sean Welleck +import json +import heapq +import subprocess +import time +import transformers +import vllm +from datetime import datetime +from lean_dojo import * +from pathlib import Path +from tqdm import tqdm, trange + +os.environ['TOKENIZERS_PARALLELISM'] = 'false' + + +def chat_template_to_prompt(prompt_list): + result = "" + total_step = len(prompt_list) + for i, message in enumerate(prompt_list): + result += ('[UNUSED_TOKEN_146]' + message['role'] + + '\n' + message['content']) + if i+1 != total_step: + result += '[UNUSED_TOKEN_145]\n' + elif message['role'] == 'user': + result += '[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n' + return result + + +def generate_vllm(prompt, model, tokenizer, temperatures, num_samples, stop, max_tokens=256): + if not isinstance(prompt, str): + prompt = chat_template_to_prompt(prompt) + texts, scores = [], [] + for temperature in temperatures: + params = vllm.SamplingParams( + n=num_samples, + temperature=temperature, + use_beam_search=temperature==0.0, + max_tokens=max_tokens, + stop=stop, + ) + outputs = model.generate([prompt], params, use_tqdm=False) + if len(outputs) == 0: + return [], [] + for output in outputs[0].outputs: + text = output.text.replace(tokenizer.eos_token, '') + score = output.cumulative_logprob/max(len(output.token_ids), 1) + texts.append(text) + scores.append(score) + + texts, scores = _unique_sorted(texts, scores) + return texts, scores + + +def _unique_sorted(texts, scores): + texts_ = [] + scores_ = [] + for t, s in sorted(zip(texts, scores), key=lambda x: -x[1]): + if t not in texts_: + texts_.append(t) + scores_.append(s) + return texts_, scores_ + + +def _tactic_state(state): + if isinstance(state, TacticState): + ts = state.pp + else: + ts = state.unsolved_tactic_state + return ts + + +def _prompt_fewshot(state): + prompt = f"My LEAN 4 state is:\n```lean\n" + state + \ + "```\nPlease predict a possible tactic to help me prove the theorem." + prompt = [{"role": "user", "content": prompt}] + return prompt + + +def best_first_search( + theorem, + model, + tokenizer, + max_iters, + temperatures, + num_samples, + prompt_fn, + timeout=600, + early_stop=False, + max_tokens=256 +) -> dict: + """Best first search.""" + attempt_results = [] + try: + with Dojo(theorem, hard_timeout=timeout) as (dojo, init_state): + + start = time.time() + proof_finished = False + queue = [(0.0, [], init_state, [])] + visited = set() + + for iteration in trange(max_iters): + if len(queue) == 0 or proof_finished: + break + + total_score, steps, state, trace = heapq.heappop(queue) + ts = _tactic_state(state) + visited.add(ts) + + step_cands, step_scores = generate_vllm( + prompt_fn(ts), + model, + tokenizer, + temperatures, + num_samples, + stop=['---','\n'], + max_tokens=max_tokens + ) + step_cands = [s.strip() for s in step_cands] + + for step, score in zip(step_cands, step_scores): + result = dojo.run_tac(state, step) + step_trace = { + "tactic": step, + "state_before": _tactic_state(state) + } + if isinstance(result, ProofFinished): + attempt_results.append({ + 'theorem': theorem.full_name, + 'proof': steps + [step], + 'score': total_score - score, + 'success': True, + 'failure_reason': '', + 'trace': trace + [step_trace], + 'temperature': temperatures, + 'elapsed': start - time.time(), + 'iteration': iteration + }) + if early_stop: + return attempt_results + proof_finished = True + break + elif isinstance(result, TacticState): + if _tactic_state(result) not in visited: + # Score is negative log probability summed across steps + new_score = (total_score - score) + heapq.heappush( + queue, (new_score, steps+[step], result, trace+[step_trace]) + ) + except (DojoInitError, DojoHardTimeoutError, DojoCrashError, subprocess.CalledProcessError) as e: + if len(attempt_results) == 0: + attempt_results.append({ + 'theorem': theorem.full_name, + 'success': False, + 'failure_reason': type(e).__name__ + }) + + if len(attempt_results) == 0: + attempt_results.append({ + 'theorem': theorem.full_name, + 'success': False, + 'failure_reason': 'SearchEnded' + }) + + return attempt_results + + +def _save(model_name, results, args_dict, output_dir, shard): + Path(output_dir).mkdir(parents=True, exist_ok=True) + output_file = os.path.join( + output_dir, + 'results__%s__%s.json' % (model_name.replace('/', '_'), shard) + ) + with open(output_file, 'w') as f: + json.dump({ + 'results': results, + 'args': args_dict + }, f, indent=4) + print(output_file) + + +def _load_model(model_name, tp_degree): + model = vllm.LLM( + model=model_name, + tensor_parallel_size=tp_degree, + dtype='bfloat16', + max_num_batched_tokens=8192, + trust_remote_code=True, + enforce_eager=True + ) + tokenizer = transformers.AutoTokenizer.from_pretrained(model_name) + return model, tokenizer + + +def _load_data(dataset_name, dataset_path): + if 'minif2f' in dataset_name: + data = [] + with open(dataset_path) as f: + for line in f.readlines(): + data_ = json.loads(line) + assert data_['commit'] == 'd00c776260c77de7e70125ef0cd119de6c0ff1de' + data.append(data_) + + if 'valid' in dataset_name: + data = [x for x in data if x['split'] == 'valid'] + else: + data = [x for x in data if x['split'] == 'test'] + repo = LeanGitRepo(data[0]['url'], data[0]['commit']) + else: + raise NotImplementedError(dataset_name) + + return repo, data + + +def print_stats(results): + print(len([x for x in results if x['success']]) / len(results)) + print("# successes: ", len([x for x in results if x['success']]), sep="\t") + + +def resume_from(results_filename, data): + results = json.load(open(results_filename))['results'] + data = data[len(results):] + print("=== Resuming from %d" % (len(results))) + return results, data + + +def make_output_dir(output_dir): + dt = datetime.now().strftime("%d-%m-%Y-%H-%M") + output_dir = os.path.join(output_dir, dt) + Path(output_dir).mkdir(parents=True, exist_ok=True) + return output_dir + + +if __name__ == '__main__': + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( + '--model-name', + choices=[ + 'internlm/internlm2-math-base-7b', + "internlm/internlm2-math-base-20b", + "internlm/internlm2-math-plus-7b", + "internlm/internlm2-math-plus-20b" + ], + required=True + ) + parser.add_argument( + '--dataset-name', + default='minif2f-test', + choices=['minif2f-valid', 'minif2f-test'] + ) + parser.add_argument('--shard', type=int, required=True) + parser.add_argument('--resume-from', type=str, default=None) + parser.add_argument('--dataset-path', default='data/minif2f.jsonl') + parser.add_argument('--output-dir', default='output/minif2f') + parser.add_argument('--early-stop', action='store_true') + parser.add_argument('--tp-degree', type=int, default=1) + parser.add_argument('--num-shards', type=int, default=8) + parser.add_argument('--max-iters', type=int, default=100) + parser.add_argument('--timeout', type=int, default=1200) + parser.add_argument('--num-examples', type=int, default=-1) + parser.add_argument('--num-samples', type=int, default=32) + parser.add_argument('--clear-process-hours', type=int, default=3) + parser.add_argument('--temperatures', type=float, nargs='+', default=[0.0]) + args = parser.parse_args() + model, tokenizer = _load_model(args.model_name, args.tp_degree) + output_dir = make_output_dir(args.output_dir) + + repo, data = _load_data(args.dataset_name, args.dataset_path) + shard_size = len(data) // args.num_shards + data = data[args.shard*shard_size:(args.shard+1)*shard_size] if args.num_shards > 1+ args.shard else data[args.shard*shard_size:] + print("Shard size: %d" % (len(data))) + + if args.resume_from is not None: + results, data = resume_from(args.resume_from, data) + else: + results = [] + + start = time.time() + for example in tqdm(data, total=len(data)): + file_path = example['file_path'] + theorem_name = example['full_name'] + theorem = Theorem(repo, file_path, theorem_name) + attempt_results = best_first_search( + theorem, model, tokenizer, + max_iters=args.max_iters, + prompt_fn=_prompt_fewshot, + temperatures=args.temperatures, + num_samples=args.num_samples, + timeout=args.timeout, + early_stop=args.early_stop + ) + + result = { + 'attempt_results': attempt_results, + 'success': any([x['success'] for x in attempt_results]), + 'example': example + } + + results.append(result) + + _save( + model_name=args.model_name, + results=results, + args_dict=args.__dict__, + output_dir=output_dir, + shard=args.shard + ) + print_stats(results) + # The proof search occasionally leaves Lean processes open. As a workaround, + # we periodically kill all Lean processes. Note that this may cause a proof search failure. + if args.shard == 0: + hours = 60*60*args.clear_process_hours + if time.time() - start > hours: + print("=== Killing active leanprover processes to mitigate leak") + os.system("ps aux | grep leanprover | awk '{print $2}' | xargs kill -9") + start = time.time() diff --git a/eval/pretrain/minif2f/scripts/eval_internLM2-plus_20b.sh b/eval/pretrain/minif2f/scripts/eval_internLM2-plus_20b.sh new file mode 100755 index 0000000..0af6ce6 --- /dev/null +++ b/eval/pretrain/minif2f/scripts/eval_internLM2-plus_20b.sh @@ -0,0 +1,21 @@ +MAX_ITERS=100 +NUM_SAMPLES=32 +TEMPERATURES="0.0" +TIMEOUT=600 +NUM_SHARDS=8 +DATASET="minif2f-test" +DATA="data/minif2f.jsonl" + +MODEL="internlm/internlm2-math-plus-20b" +NAME="internLM2-plus-20b" + +OUTPUT_DIR="output/${NAME}_minif2f_test" +mkdir -p logs +for SHARD in 0 1 2 3 4 5 6 7 +do + CUDA_VISIBLE_DEVICES=${SHARD} python proofsearch_internLM2-plus.py --dataset-name ${DATASET} \ + --temperatures ${TEMPERATURES} --timeout ${TIMEOUT} --num-shards ${NUM_SHARDS} \ + --shard ${SHARD} --model-name ${MODEL} --max-iters ${MAX_ITERS} --dataset-path ${DATA} \ + --num-samples ${NUM_SAMPLES} --early-stop --output-dir ${OUTPUT_DIR} \ + &> logs/${NAME}_shard${SHARD}.out & +done \ No newline at end of file diff --git a/eval/pretrain/minif2f/scripts/eval_internLM2-plus_7b.sh b/eval/pretrain/minif2f/scripts/eval_internLM2-plus_7b.sh new file mode 100755 index 0000000..6d575f4 --- /dev/null +++ b/eval/pretrain/minif2f/scripts/eval_internLM2-plus_7b.sh @@ -0,0 +1,21 @@ +MAX_ITERS=100 +NUM_SAMPLES=32 +TEMPERATURES="0.0" +TIMEOUT=600 +NUM_SHARDS=8 +DATASET="minif2f-test" +DATA="data/minif2f.jsonl" + +MODEL="internlm/internlm2-math-plus-7b" +NAME="internLM2-plus-7b" + +OUTPUT_DIR="output/${NAME}_minif2f_test" +mkdir -p logs +for SHARD in 0 1 2 3 4 5 6 7 +do + CUDA_VISIBLE_DEVICES=${SHARD} python proofsearch_internLM2-plus.py --dataset-name ${DATASET} \ + --temperatures ${TEMPERATURES} --timeout ${TIMEOUT} --num-shards ${NUM_SHARDS} \ + --shard ${SHARD} --model-name ${MODEL} --max-iters ${MAX_ITERS} --dataset-path ${DATA} \ + --num-samples ${NUM_SAMPLES} --early-stop --output-dir ${OUTPUT_DIR} \ + &> logs/${NAME}_shard${SHARD}.out & +done \ No newline at end of file From 7a9a1b6c23a9a0e7ebcc6927d403833ee24a9ff2 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Tue, 28 May 2024 16:24:21 +0800 Subject: [PATCH 02/41] Update README.md --- eval/pretrain/minif2f/README.md | 22 ++++------------------ 1 file changed, 4 insertions(+), 18 deletions(-) diff --git a/eval/pretrain/minif2f/README.md b/eval/pretrain/minif2f/README.md index 6b37cbc..5be67a5 100644 --- a/eval/pretrain/minif2f/README.md +++ b/eval/pretrain/minif2f/README.md @@ -1,4 +1,4 @@ -# `InternMath2` formal2formal +# `InternLM-Math` MiniF2F performance reproduce Scripts for the Lean formal2formal (tactic prediction) experiments. Adapted from [`llemma`_formal2formal](https://github.com/wellecks/llemma_formal2formal). @@ -24,22 +24,8 @@ Configure LeanDojo: export CONTAINER="native" ``` -Patch vllm - -Currently vllm doesn't officially support `internLM2`. Adaptations from the vllm community can be found here [#2666](https://github.com/vllm-project/vllm/pull/2666) [#2527](https://github.com/vllm-project/vllm/pull/2527). - - #### Run -See `scripts` - -#### Compute metrics - -First unzip `output.zip` to get the detailed evaluation results. Then the metrics can be computed. - -```bash -python compute_metrics.py -==> - -internLM2-7b_minif2f_test 0.30327868852459017 74 244 -internLM2-20b_minif2f_test 0.29508196721311475 72 244 +``` +cd scripts +bash eval_internLM2-plus_7b.sh ``` From ba0b948da48e17b73bf35ab7d37aaf4ff4556f8a Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Tue, 28 May 2024 16:25:10 +0800 Subject: [PATCH 03/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 66089f8..c4976ac 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. | **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) | 2024-05-27 | ## Formal Math Reasoning -We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. +We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. This is how to reproduce our performance **eval/pretrain/minif2f/README.md**. | Models | MiniF2F-test | | -------------------------------- | ------------ | | ReProver | 26.5 | From eb3bd570cc1fd3ec7c4f18110d93822da69bd5f8 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Wed, 29 May 2024 13:20:01 +0800 Subject: [PATCH 04/41] Update README.md --- eval/pretrain/minif2f/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eval/pretrain/minif2f/README.md b/eval/pretrain/minif2f/README.md index 5be67a5..d9bb780 100644 --- a/eval/pretrain/minif2f/README.md +++ b/eval/pretrain/minif2f/README.md @@ -1,7 +1,7 @@ # `InternLM-Math` MiniF2F performance reproduce Scripts for the Lean formal2formal (tactic prediction) experiments. Adapted from -[`llemma`_formal2formal](https://github.com/wellecks/llemma_formal2formal). +[llemma-formal2formal](https://github.com/wellecks/llemma_formal2formal). #### Setup From dbc23d8dc94b148b9fb71d8c6bbd3d50985e38f7 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Wed, 29 May 2024 21:23:16 +0800 Subject: [PATCH 05/41] Update README.md --- README.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index c4976ac..b28fcd4 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,12 @@ A **solver**, **prover**, **verifier**, **augmentor**. ## Download -| Model | Model Type | Transformers(HF) | Release Date | -| --------------------------- | ---------- | -------------------------------------------------------------------------------------------- |------------ | -| **InternLM2-Math-Plus-1.8B** | Chat | 🤗[internlm/internlm2-math-plus-1_8b](https://huggingface.co/internlm/internlm2-math-plus-1_8b/) | 2024-05-27 | -| **InternLM2-Math-Plus-7B** | Chat | 🤗[internlm/internlm2-math-plus-7b](https://huggingface.co/internlm/internlm2-math-plus-7b/) | 2024-05-27 | -| **InternLM2-Math-Plus-20B** | Chat | 🤗[internlm/internlm2-math-plus-20b](https://huggingface.co/internlm/internlm2-math-plus-20b/) | 2024-05-27 | -| **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) | 2024-05-27 | +| Model | Model Type | Transformers(HF) |ModelScope| Release Date | +| --------------------------- | ---------- | -------------------------------------------------------------------------------------------- |------------ |------------ | +| **InternLM2-Math-Plus-1.8B** | Chat | 🤗[internlm/internlm2-math-plus-1_8b](https://huggingface.co/internlm/internlm2-math-plus-1_8b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-1_8b/summary)| 2024-05-27 | +| **InternLM2-Math-Plus-7B** | Chat | 🤗[internlm/internlm2-math-plus-7b](https://huggingface.co/internlm/internlm2-math-plus-7b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-7b/summary)| 2024-05-27 | +| **InternLM2-Math-Plus-20B** | Chat | 🤗[internlm/internlm2-math-plus-20b](https://huggingface.co/internlm/internlm2-math-plus-20b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-20b/summary)| 2024-05-27 | +| **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) |Uploading| 2024-05-27 | ## Formal Math Reasoning We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. This is how to reproduce our performance **eval/pretrain/minif2f/README.md**. From 9d666ee3a9709603d27ca2c91c08ff269f5ad410 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 30 May 2024 19:16:38 +0800 Subject: [PATCH 06/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index b28fcd4..f8c32f6 100644 --- a/README.md +++ b/README.md @@ -40,7 +40,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. | **InternLM2-Math-Plus-1.8B** | Chat | 🤗[internlm/internlm2-math-plus-1_8b](https://huggingface.co/internlm/internlm2-math-plus-1_8b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-1_8b/summary)| 2024-05-27 | | **InternLM2-Math-Plus-7B** | Chat | 🤗[internlm/internlm2-math-plus-7b](https://huggingface.co/internlm/internlm2-math-plus-7b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-7b/summary)| 2024-05-27 | | **InternLM2-Math-Plus-20B** | Chat | 🤗[internlm/internlm2-math-plus-20b](https://huggingface.co/internlm/internlm2-math-plus-20b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-20b/summary)| 2024-05-27 | -| **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) |Uploading| 2024-05-27 | +| **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b/summary)| 2024-05-27 | ## Formal Math Reasoning We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. This is how to reproduce our performance **eval/pretrain/minif2f/README.md**. From 2ebf8124576235735ad79f236485f34e176cb6dd Mon Sep 17 00:00:00 2001 From: braisedpork1964 <497494458@qq.com> Date: Mon, 3 Jun 2024 20:11:53 +0800 Subject: [PATCH 07/41] add code interpreter examples --- README.md | 15 +- agent/README.md | 81 +++++ agent/math_agent.py | 695 +++++++++++++++++++++++++++++++++++++++++ agent/requirements.txt | 10 + 4 files changed, 795 insertions(+), 6 deletions(-) create mode 100644 agent/README.md create mode 100644 agent/math_agent.py create mode 100644 agent/requirements.txt diff --git a/README.md b/README.md index f8c32f6..896d024 100644 --- a/README.md +++ b/README.md @@ -35,12 +35,12 @@ A **solver**, **prover**, **verifier**, **augmentor**. ## Download -| Model | Model Type | Transformers(HF) |ModelScope| Release Date | -| --------------------------- | ---------- | -------------------------------------------------------------------------------------------- |------------ |------------ | -| **InternLM2-Math-Plus-1.8B** | Chat | 🤗[internlm/internlm2-math-plus-1_8b](https://huggingface.co/internlm/internlm2-math-plus-1_8b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-1_8b/summary)| 2024-05-27 | -| **InternLM2-Math-Plus-7B** | Chat | 🤗[internlm/internlm2-math-plus-7b](https://huggingface.co/internlm/internlm2-math-plus-7b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-7b/summary)| 2024-05-27 | -| **InternLM2-Math-Plus-20B** | Chat | 🤗[internlm/internlm2-math-plus-20b](https://huggingface.co/internlm/internlm2-math-plus-20b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-20b/summary)| 2024-05-27 | -| **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) |[Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b/summary)| 2024-05-27 | +| Model | Model Type | Transformers(HF) | ModelScope | Release Date | +| ------------------------------------ | ---------- | --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | +| **InternLM2-Math-Plus-1.8B** | Chat | 🤗[internlm/internlm2-math-plus-1_8b](https://huggingface.co/internlm/internlm2-math-plus-1_8b/) | [Shanghai_AI_Laboratory/internlm2-math-plus-1_8b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-1_8b/summary) | 2024-05-27 | +| **InternLM2-Math-Plus-7B** | Chat | 🤗[internlm/internlm2-math-plus-7b](https://huggingface.co/internlm/internlm2-math-plus-7b/) | [Shanghai_AI_Laboratory/internlm2-math-plus-7b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-7b/summary) | 2024-05-27 | +| **InternLM2-Math-Plus-20B** | Chat | 🤗[internlm/internlm2-math-plus-20b](https://huggingface.co/internlm/internlm2-math-plus-20b/) | [Shanghai_AI_Laboratory/internlm2-math-plus-20b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-20b/summary) | 2024-05-27 | +| **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) | [Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b/summary) | 2024-05-27 | ## Formal Math Reasoning We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. This is how to reproduce our performance **eval/pretrain/minif2f/README.md**. @@ -61,6 +61,9 @@ We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benc ## Informal Math Reasoning We evaluate the performance of InternLM2-Math-Plus on informal math reasoning benchmark MATH and GSM8K. InternLM2-Math-Plus-1.8B outperforms MiniCPM-2B in the smallest size setting. InternLM2-Math-Plus-7B outperforms Deepseek-Math-7B-RL which is the state-of-the-art math reasoning open source model. InternLM2-Math-Plus-Mixtral8x22B achieves 68.5 on MATH (with Python) and 91.8 on GSM8K. + +> For tool-calling inference and evaluation, please see the [agent section](agent/). + | Model | MATH | MATH-Python | GSM8K | | -------------------------------- | -------- | ----------- | -------- | | MiniCPM-2B | 10.2 | - | 53.8 | diff --git a/agent/README.md b/agent/README.md new file mode 100644 index 0000000..29aa6e1 --- /dev/null +++ b/agent/README.md @@ -0,0 +1,81 @@ +# InternLM-Math Agent + +The performance of InternLM-Math could be lifted by external tools. We provide an example using [Lagent](https://github.com/InternLM/lagent) to build agents interacting with the code interpreter to solve MATH problems. + +## Setup + +Install the extra dependencies + +```sh +pip install -r requirements.txt +``` + +## Usages + +Run the following script to perform inference and evaluation on MATH test. + + +```sh +python math_agent.py \ + --backend=lmdeploy \ # For HuggingFace models: hf + --model_path=internlm/internlm2-math-plus-1_8b \ + --tp=1 \ + --temperature=1.0 \ + --top_k=1 \ + --output_path=math_lmdeploy.jsonl \ + --do_eval +``` + +`output_path` is a jsonl format file to save the inference results. Each line is like + +```json +{ + "problem": "The point $(a, b)$ lies on the line with the equation $3x + 2y = 12.$ When $a = 4$, what is the value of $b$?", + "level": "Level 2", + "type": "Algebra", + "solution": "We plug in $x = 4$: \\begin{align*}\n3(4) + 2y &= 12\\\\\n12 + 2y &= 12\\\\\ny &= 0.\n\\end{align*}\n\nTherefore, $b = \\boxed{0}$.", + "idx": 41, + "query": "The point $(a, b)$ lies on the line with the equation $3x + 2y = 12.$ When $a = 4$, what is the value of $b$?", + "gt": "0", + "pred": [ + "0" + ], + "steps": [ + { + "role": "language", + "content": "To find the value of $b$ when $a = 4$ for the line with the equation $3x + 2y = 12$, we can substitute $a = 4$ into the equation and solve for $b$. This will give us the coordinates of the point $(a, b)$ on the line.\n\nLet's start by substituting $a = 4$ into the equation and solving for $b$." + }, + { + "role": "tool", + "content": { + "name": "IPythonInteractiveManager", + "parameters": { + "command": "```python\nfrom sympy import symbols, Eq, solve\n\n# Define symbols\na, b = symbols('a b')\n\n# Given equation of the line\nequation = Eq(3*a + 2*b, 12)\n\n# Substitute a = 4 into the equation\nsubstituted_equation = equation.subs(a, 4)\n\n# Solve for b\nsolution = solve(substituted_equation, b)\n\nsolution[0]\n```" + } + }, + "name": "interpreter" + }, + { + "role": "environment", + "content": "0", + "name": "interpreter" + }, + { + "role": "language", + "content": "After substituting $a = 4$ into the equation and solving for $b$, we find that $b = 0$. Therefore, the value of $b$ when $a = 4$ for the given line is $\\boxed{0}$." + } + ], + "error": null +} +``` + +Once it is prepared, just skip the inference stage as follows. + +```bash +python math_agent.py \ + --output_path=math_lmdeploy.jsonl \ + --no-do_infer \ + --do_eval +``` + +Please refer to [`math_agent.py`](math_agent.py) for more information about the arguments. \ No newline at end of file diff --git a/agent/math_agent.py b/agent/math_agent.py new file mode 100644 index 0000000..7e999af --- /dev/null +++ b/agent/math_agent.py @@ -0,0 +1,695 @@ +# flake8: noqa +# isort: skip_file + +# This logic is modified from ToRA: +# - https://github.com/microsoft/ToRA +# +# Copyright (c) Microsoft Corporation. +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to deal +# in the Software without restriction, including without limitation the rights +# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +# copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in all +# copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +# SOFTWARE + +import argparse +import multiprocessing +import os +import re +import sys +import traceback +from math import isclose, ceil +from typing import Union + +import jsonlines +import numpy as np +from datasets import load_dataset +from lagent import (INTERNLM2_META, ActionExecutor, HFTransformer, + Internlm2Agent, Internlm2Protocol, LMDeployPipeline, + IPythonInteractiveManager) +from pebble import ProcessPool +from sympy import N, simplify +from sympy.parsing.latex import parse_latex +from sympy.parsing.sympy_parser import parse_expr +from tqdm import tqdm + +# --------------------- modify the system prompt as needed --------------------- +DEFAULT_PROMPT = ( + 'Integrate step-by-step reasoning and Python code to solve math problems ' + 'using the following guidelines:\n' + '- Analyze the question and write jupyter code to solve the problem;\n' + r"- Present the final result in LaTeX using a '\boxed{{}}' without any " + 'units. \n') +# ------------------------------------------------------------------------------ + + +def parse_args(): + parser = argparse.ArgumentParser(description='Math Code Interpreter') + parser.add_argument( + '--backend', + type=str, + default='lmdeploy', + help='Which inference framework to use.', + choices=['lmdeploy', 'hf']) + parser.add_argument( + '--model_path', + type=str, + default='internlm/internlm2-chat-7b', + help='Path or name to the model, could be HuggingFace model specifier.' + ) + parser.add_argument( + '--output_path', + type=str, + required=True, + help='Path to save inference results to, should be a `jsonl` file') + parser.add_argument( + '--batch_size', + type=int, + default=100, + help='Agent inference batch size') + parser.add_argument( + '--max_turn', + type=int, + default=5, + help= + 'Maximum number of interaction rounds between the agent and environment' + ) + parser.add_argument( + '--tp', + type=int, + default=1, + help='Number of tensor parallelism. It may be required in LMDelpoy.') + parser.add_argument( + '--temperature', + type=float, + default=0.1, + help='Temperature in next token prediction') + parser.add_argument( + '--top_p', + type=float, + default=0.8, + help='Parameter for Top-P Sampling.') + parser.add_argument( + '--top_k', type=int, default=40, help='Parameter for Top-K Sampling.') + parser.add_argument( + '--stop_words', + type=str, + default=['<|action_end|>', '<|im_end|>'], + action='append', + help='Stop words') + parser.add_argument( + '--max_new_tokens', + type=int, + default=512, + help='Number of maximum generated tokens.') + parser.add_argument( + '--do_infer', + default=True, + action=argparse.BooleanOptionalAction, # python > 3.8 + help='Whether to launch model inference.') + # parser.add_argument( + # '--no-do_infer', + # dest='do_infer', + # action='store_false', + # help='Disable the inference.' + # ) + parser.add_argument( + '--do_eval', + default=False, + action='store_true', + help='Whether to evaluate the inference results.') + parser.add_argument( + '--overwrite', + default=False, + action='store_true', + help='Whether to overwrite the existing result file') + return parser.parse_args() + + +def _fix_fracs(string): + substrs = string.split('\\frac') + new_str = substrs[0] + if len(substrs) > 1: + substrs = substrs[1:] + for substr in substrs: + new_str += '\\frac' + if len(substr) > 0 and substr[0] == '{': + new_str += substr + else: + try: + assert len(substr) >= 2 + except Exception: + return string + a = substr[0] + b = substr[1] + if b != '{': + if len(substr) > 2: + post_substr = substr[2:] + new_str += '{' + a + '}{' + b + '}' + post_substr + else: + new_str += '{' + a + '}{' + b + '}' + else: + if len(substr) > 2: + post_substr = substr[2:] + new_str += '{' + a + '}' + b + post_substr + else: + new_str += '{' + a + '}' + b + string = new_str + return string + + +def _fix_a_slash_b(string): + if len(string.split('/')) != 2: + return string + a = string.split('/')[0] + b = string.split('/')[1] + try: + if 'sqrt' not in a: + a = int(a) + if 'sqrt' not in b: + b = int(b) + assert string == '{}/{}'.format(a, b) + new_string = '\\frac{' + str(a) + '}{' + str(b) + '}' + return new_string + except Exception: + return string + + +def _fix_sqrt(string): + _string = re.sub(r'\\sqrt(\w+)', r'\\sqrt{\1}', string) + return _string + + +def strip_string(string): + string = str(string).strip() + # linebreaks + string = string.replace('\n', '') + + # right "." + string = string.rstrip('.') + + # remove inverse spaces + string = string.replace('\\!', '') + string = string.replace('\\ ', '') + + # replace \\ with \ + string = string.replace('\\\\', '\\') + string = string.replace('\\\\', '\\') + + # replace tfrac and dfrac with frac + string = string.replace('tfrac', 'frac') + string = string.replace('dfrac', 'frac') + + # remove \left and \right + string = string.replace('\\left', '') + string = string.replace('\\right', '') + + # Remove unit: miles, dollars if after is not none + _string = re.sub(r'\\text{.*?}$', '', string).strip() + if _string != '' and _string != string: + # print("Warning: unit not removed: '{}' -> '{}'".format(string, _string)) + string = _string + + # Remove circ (degrees) + string = string.replace('^{\\circ}', '') + string = string.replace('^\\circ', '') + + # remove dollar signs + string = string.replace('\\$', '') + string = string.replace('$', '') + + string = string.replace('\\text', '') + string = string.replace('x\\in', '') + + # remove percentage + string = string.replace('\\%', '') + string = string.replace('\%', '') + string = string.replace('%', '') + + # " 0." equivalent to " ." and "{0." equivalent to "{." Alternatively, add "0" if "." is the start of the string + string = string.replace(' .', ' 0.') + string = string.replace('{.', '{0.') + + # cdot + string = string.replace('\\cdot', '') + + # inf + string = string.replace('infinity', '\\infty') + if '\\infty' not in string: + string = string.replace('inf', '\\infty') + string = string.replace('+\\inity', '\\infty') + + # and + string = string.replace('and', '') + string = string.replace('\\mathbf', '') + + # use regex to remove \mbox{...} + string = re.sub(r'\\mbox{.*?}', '', string) + + # quote + string.replace("'", '') + string.replace('"', '') + + # i, j + if 'j' in string and 'i' not in string: + string = string.replace('j', 'i') + + # replace a.000b where b is not number or b is end, with ab, use regex + string = re.sub(r'(\d+)\.0+([^\d])', r'\1\2', string) + string = re.sub(r'(\d+)\.0+$', r'\1', string) + + # if empty, return empty string + if len(string) == 0: + return string + if string[0] == '.': + string = '0' + string + + # to consider: get rid of e.g. "k = " or "q = " at beginning + if len(string.split('=')) == 2: + if len(string.split('=')[0]) <= 2: + string = string.split('=')[1] + + string = _fix_sqrt(string) + string = string.replace(' ', '') + + # \frac1b or \frac12 --> \frac{1}{b} and \frac{1}{2}, etc. Even works with \frac1{72} (but not \frac{72}1). Also does a/b --> \\frac{a}{b} + string = _fix_fracs(string) + + # NOTE: X/Y changed to \frac{X}{Y} in dataset, but in simple cases fix in case the model output is X/Y + string = _fix_a_slash_b(string) + + return string + + +def last_boxed_only_string(string): + idx = string.rfind('\\boxed') + if idx < 0: + idx = string.rfind('\\fbox') + if idx < 0: + return None + + i = idx + right_brace_idx = None + num_left_braces_open = 0 + while i < len(string): + if string[i] == '{': + num_left_braces_open += 1 + if string[i] == '}': + num_left_braces_open -= 1 + if num_left_braces_open == 0: + right_brace_idx = i + break + i += 1 + + if right_brace_idx is None: + retval = None + else: + retval = string[idx:right_brace_idx + 1] + + return retval + + +def extract_answer(pred_str: str, execute: bool = False) -> str: + if re.search('\boxed|boxed', pred_str): + answer = re.split('\boxed|boxed', pred_str)[-1] + if len(answer) == 0: + return '' + elif (answer[0] == '{'): + stack = 1 + a = '' + for c in answer[1:]: + if (c == '{'): + stack += 1 + a += c + elif (c == '}'): + stack -= 1 + if (stack == 0): break + a += c + else: + a += c + else: + a = answer.split('$')[0].strip() + elif re.search('[Tt]he (final )?answer is:?', pred_str): + a = re.split('[Tt]he (final )?answer is:?', + pred_str)[-1].strip().rstrip('.') + elif pred_str.startswith('```python') and execute: + # fall back to program + from lagent import get_tool + + a = get_tool('IPythonInteractive').exec(pred_str).value or '' + else: # use the last number + pred = re.findall(r'-?\d*\.?\d+', pred_str.replace(',', '')) + if len(pred) >= 1: + a = pred[-1] + else: + a = '' + # multiple lines + pred = a.split('\n')[0] + if pred != '' and pred[0] == ':': + pred = pred[1:] + if pred != '' and pred[-1] == '.': + pred = pred[:-1] + if pred != '' and pred[-1] == '/': + pred = pred[:-1] + pred = strip_string(pred) + return pred + + +def is_digit(s): + try: + float(str(s).replace(',', '')) + return True + except ValueError: + return False + + +def math_equal( + prediction: Union[bool, float, str], + reference: Union[float, str], + include_percentage: bool = True, + is_close: bool = True, + tolerance: float = 1e-4, + timeout: bool = False, +) -> bool: + """Exact match of math if and only if: + + 1. numerical equal: both can convert to float and are equal + 2. symbolic equal: both can convert to sympy expression and are equal + """ + try: # 1. numerical equal + if is_digit(prediction) and is_digit(reference): + prediction = float(str(prediction).replace(',', '')) + reference = float(str(reference).replace(',', '')) + # number questions + if include_percentage: + gt_result = [reference / 100, reference, reference * 100] + else: + gt_result = [reference] + for item in gt_result: + try: + if is_close: + if isclose(item, prediction, rel_tol=tolerance): + return True + else: + if item == prediction: + return True + except Exception: + continue + return False + except Exception: + pass + + if not prediction and prediction not in [0, False]: + return False + + # 2. symbolic equal + reference = str(reference).strip() + prediction = str(prediction).strip() + + ## deal with [], (), {} + pred_str, ref_str = prediction, reference + if (prediction.startswith('[') and prediction.endswith(']') + and not reference.startswith('(')) or ( + prediction.startswith('(') and prediction.endswith(')') + and not reference.startswith('[')): + pred_str = pred_str.strip('[]()') + ref_str = ref_str.strip('[]()') + for s in ['{', '}', '(', ')']: + ref_str = ref_str.replace(s, '') + pred_str = pred_str.replace(s, '') + if pred_str == ref_str: + return True + + ## [a, b] vs. [c, d], return a==c and b==d + if ((prediction.startswith('[') and prediction.endswith(']')) and + (reference.startswith('[') and reference.endswith(']')) + or (prediction.startswith('(') and prediction.endswith(')')) and + (reference.startswith('(') and reference.endswith(')'))): + pred_parts = prediction[1:-1].split(',') + ref_parts = reference[1:-1].split(',') + if len(pred_parts) == len(ref_parts): + if all([ + math_equal(pred_parts[i], ref_parts[i], include_percentage, + is_close) for i in range(len(pred_parts)) + ]): + return True + + # symbolic equal with sympy + if timeout: + if call_with_timeout(symbolic_equal_process, prediction, reference): + return True + else: + if symbolic_equal(prediction, reference): + return True + + return False + + +def math_equal_process(param): + return math_equal(param[-2], param[-1]) + + +def symbolic_equal(a, b): + + def _parse(s): + for f in [parse_latex, parse_expr]: + try: + return f(s) + except Exception: + pass + return s + + a = _parse(a) + b = _parse(b) + + try: + if simplify(a - b) == 0: + return True + except Exception: + pass + + try: + if isclose(N(a), N(b), rel_tol=1e-3): + return True + except Exception: + pass + return False + + +def symbolic_equal_process(a, b, output_queue): + result = symbolic_equal(a, b) + output_queue.put(result) + + +def call_with_timeout(func, *args, timeout=1, **kwargs): + output_queue = multiprocessing.Queue() + process_args = args + (output_queue, ) + process = multiprocessing.Process( + target=func, args=process_args, kwargs=kwargs) + process.start() + process.join(timeout) + + if process.is_alive(): + process.terminate() + process.join() + return False + + return output_queue.get() + + +def init_agent(backend: str, max_turn: int, model_path: str, tp: int, + **kwargs): + if backend == 'lmdeploy': + from lmdeploy import TurbomindEngineConfig + model = LMDeployPipeline( + path=model_path, + model_name='internlm2-chat', + meta_template=INTERNLM2_META, + pipeline_cfg=dict(backend_config=TurbomindEngineConfig(tp=tp)), + **kwargs) + elif backend == 'hf': + model = HFTransformer( + path=model_path, meta_template=INTERNLM2_META, **kwargs) + else: + raise NotImplementedError + + agent = Internlm2Agent( + llm=model, + protocol=Internlm2Protocol( + meta_prompt=None, interpreter_prompt=DEFAULT_PROMPT), + interpreter_executor=ActionExecutor(actions=[ + IPythonInteractiveManager( + max_workers=200, + ci_lock=os.path.join( + os.path.dirname(__file__), '.ipython.lock')) + ]), + max_turn=max_turn) + return agent + + +def predict(args): + + def process(d, k): + d['idx'] = k + d['query'] = d['problem'] + gt = extract_answer(d['solution']) + if '\\boxed{90\\text{ square\nunits}}' in d['solution']: + gt = '90' + elif '$6$ is our answer' in d['solution']: + gt = '6' + elif gt.startswith('x\\in'): + gt = gt[len('x\\in'):] + gt = strip_string(gt) + d['gt'] = gt + d['pred'], d['steps'] = [], [] + d['error'] = None + return d + + dataset = load_dataset('lighteval/MATH', split='test').map(process, True) + agent = init_agent( + backend=args.backend, + max_turn=args.max_turn, + model_path=args.model_path, + tp=args.tp, + temperature=args.temperature, + stop_words=args.stop_words, + top_p=args.top_p, + top_k=args.top_k, + max_new_tokens=args.max_new_tokens, + ) + num_batches = ceil(len(dataset) / args.batch_size) + with jsonlines.open(args.output_path, 'w', flush=True) as f: + for i in tqdm(range(num_batches)): + batch = dataset.select( + range(i * args.batch_size, + min((i + 1) * args.batch_size, len(dataset)))) + try: + rets = agent.batch_chat(batch['query']) + for item, ret in zip(batch, rets): + item['steps'] = ret.inner_steps + last = item['steps'][-1] + item['pred'].append( + extract_answer(last['content']) if last['role'] == + 'language' else '😭') + f.write(item) + except Exception as e: + err = str(traceback.format_exc()) + print(f'Processing batch data error: {e}\n{err}') + for item in batch: + item['error'] = err + f.write(item) + finally: + agent._interpreter_executor.actions[ + 'IPythonInteractiveManager'].reset() + + +def evaluate(args): + samples = [sample for sample in jsonlines.open(args.output_path)] + scores = [] + timeout_cnt = 0 + with ProcessPool() as pool: + future = pool.map( + math_equal_process, + [(idx, pred, sample['gt']) for idx, sample in enumerate(samples) + for pred in sample['pred']], + timeout=20, + ) + iterator = future.result() + with tqdm(total=len(samples), desc='Evaluate') as progress_bar: + while True: + try: + result = next(iterator) + scores.append(result) + except StopIteration: + break + except TimeoutError as error: + print(error) + scores.append(False) + timeout_cnt += 1 + except Exception as error: + print(error.__traceback__) + # sys.exit() + progress_bar.update(1) + + idx = 0 + score_mat = [] + for sample in samples: + sample['score'] = scores[idx:idx + len(sample['pred'])] + assert len(sample['score']) == len(sample['pred']) + score_mat.append(sample['score']) + idx += len(sample['pred']) + + max_len = max([len(s) for s in score_mat]) + + for i, s in enumerate(score_mat): + if len(s) < max_len: + score_mat[i] = s + [s[-1]] * (max_len - len(s)) # pad + + # output mean of each column of scores + col_means = np.array(score_mat).mean(axis=0) + mean_score = list(np.round(col_means * 100, decimals=1)) + + result_str = f'Num samples: {len(samples)}\n' \ + f'Num scores: {len(scores)}\n' \ + f'Sum scores: {sum(scores)}\n' \ + f'Timeout samples: {timeout_cnt}\n' \ + f"Empty samples: {len([s for s in samples if not s['pred'][-1]])}\n" \ + f'Mean score: {mean_score}\n' + + # each type score + if 'type' in samples[0]: + type_scores = {} + for sample in samples: + if sample['type'] not in type_scores: + type_scores[sample['type']] = [] + type_scores[sample['type']].append(sample['score'][-1]) + type_scores = { + k: np.round(np.array(v).mean() * 100, decimals=1) + for k, v in type_scores.items() + } + type_scores = { + k: v + for k, v in sorted(type_scores.items(), key=lambda item: item[0]) + } + result_str += f'Type scores: {type_scores}\n' + + print(result_str) + + +if __name__ == '__main__': + args = parse_args() + if args.do_infer and os.path.exists( + args.output_path) and not args.overwrite: + args.do_infer = False + print(f'File {args.output_path} already exists. ' + f'Please add the `--overwrite` flag if needed.') + if args.do_infer: + predict(args) + if args.do_eval: + if not args.do_infer: + evaluate(args) + else: + import subprocess + + res = subprocess.run( + [ + sys.executable, __file__, '--output_path', + args.output_path, '--no-do_infer', '--do_eval' + ], + capture_output=True, + text=True, + check=True, + ) + print(res.stdout) diff --git a/agent/requirements.txt b/agent/requirements.txt new file mode 100644 index 0000000..602fda4 --- /dev/null +++ b/agent/requirements.txt @@ -0,0 +1,10 @@ +lmdeploy>=0.2.2 +datasets +tqdm +numpy +pebble +jsonlines +sympy==1.12 +antlr4-python3-runtime==4.11.0 +lagent @ git+https://github.com/InternLM/lagent@main +einops \ No newline at end of file From 20c0d3ed37e6e6ecea325ac3d51a29f74ad5cf44 Mon Sep 17 00:00:00 2001 From: braisedpork1964 <497494458@qq.com> Date: Mon, 3 Jun 2024 20:35:49 +0800 Subject: [PATCH 08/41] update --- agent/math_agent.py | 1 + 1 file changed, 1 insertion(+) diff --git a/agent/math_agent.py b/agent/math_agent.py index 7e999af..9660d89 100644 --- a/agent/math_agent.py +++ b/agent/math_agent.py @@ -620,6 +620,7 @@ def evaluate(args): timeout_cnt += 1 except Exception as error: print(error.__traceback__) + scores.append(False) # sys.exit() progress_bar.update(1) From 9a29b63f05f7718a61adcfa01405b2e87d6cf5c4 Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Tue, 4 Jun 2024 05:06:39 +0000 Subject: [PATCH 09/41] Fix prompt --- eval/pretrain/minif2f/proofsearch_internLM2-plus.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/eval/pretrain/minif2f/proofsearch_internLM2-plus.py b/eval/pretrain/minif2f/proofsearch_internLM2-plus.py index 517a974..5d0599d 100644 --- a/eval/pretrain/minif2f/proofsearch_internLM2-plus.py +++ b/eval/pretrain/minif2f/proofsearch_internLM2-plus.py @@ -26,6 +26,14 @@ def chat_template_to_prompt(prompt_list): result += '[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n' return result +def prompt_style_internlm_chat_0522_extractor(result:str): + START_STR="Here is the predicted next tactic:\n```lean\n" + END_STR="\n```" + if result.startswith(START_STR): + result=result[len(START_STR):] + if result.endswith(END_STR): + result=result[:-len(END_STR)] + return result def generate_vllm(prompt, model, tokenizer, temperatures, num_samples, stop, max_tokens=256): if not isinstance(prompt, str): @@ -48,6 +56,7 @@ def generate_vllm(prompt, model, tokenizer, temperatures, num_samples, stop, max texts.append(text) scores.append(score) + texts = list(map(prompt_style_internlm_chat_0522_extractor,texts)) texts, scores = _unique_sorted(texts, scores) return texts, scores @@ -113,7 +122,7 @@ def best_first_search( tokenizer, temperatures, num_samples, - stop=['---','\n'], + stop=['[UNUSED_TOKEN_145]',], max_tokens=max_tokens ) step_cands = [s.strip() for s in step_cands] @@ -188,7 +197,7 @@ def _load_model(model_name, tp_degree): trust_remote_code=True, enforce_eager=True ) - tokenizer = transformers.AutoTokenizer.from_pretrained(model_name) + tokenizer = transformers.AutoTokenizer.from_pretrained(model_name,trust_remote_code=True) return model, tokenizer From 787abf1c3e6f139cfefc724900e88ecb46e4e445 Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Tue, 4 Jun 2024 06:38:10 +0000 Subject: [PATCH 10/41] Fix tokenizer issue --- eval/pretrain/minif2f/proofsearch_internLM2-plus.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/eval/pretrain/minif2f/proofsearch_internLM2-plus.py b/eval/pretrain/minif2f/proofsearch_internLM2-plus.py index 5d0599d..09f39e5 100644 --- a/eval/pretrain/minif2f/proofsearch_internLM2-plus.py +++ b/eval/pretrain/minif2f/proofsearch_internLM2-plus.py @@ -18,12 +18,12 @@ def chat_template_to_prompt(prompt_list): result = "" total_step = len(prompt_list) for i, message in enumerate(prompt_list): - result += ('[UNUSED_TOKEN_146]' + message['role'] + + result += ('<|im_start|>' + message['role'] + '\n' + message['content']) if i+1 != total_step: - result += '[UNUSED_TOKEN_145]\n' + result += '<|im_end|>\n' elif message['role'] == 'user': - result += '[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n' + result += '<|im_end|>\n<|im_start|>assistant\n' return result def prompt_style_internlm_chat_0522_extractor(result:str): @@ -122,7 +122,7 @@ def best_first_search( tokenizer, temperatures, num_samples, - stop=['[UNUSED_TOKEN_145]',], + stop=['<|im_end|>',], max_tokens=max_tokens ) step_cands = [s.strip() for s in step_cands] @@ -193,7 +193,7 @@ def _load_model(model_name, tp_degree): model=model_name, tensor_parallel_size=tp_degree, dtype='bfloat16', - max_num_batched_tokens=8192, + max_num_batched_tokens=32768, trust_remote_code=True, enforce_eager=True ) From 17ed6f467456a6392cfc51947b4d43c99fc70999 Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Tue, 4 Jun 2024 06:39:52 +0000 Subject: [PATCH 11/41] Reorganize evaluation results --- {eval/pretrain/minif2f => minif2f}/LICENSE | 0 {eval/pretrain/minif2f => minif2f}/README.md | 0 .../pretrain/minif2f => minif2f}/compute_metrics.py | 0 .../pretrain/minif2f => minif2f}/data/minif2f.jsonl | 0 {eval/pretrain/minif2f => minif2f}/output.zip | Bin .../proofsearch_internLM2-plus.py | 0 .../minif2f => minif2f}/proofsearch_internLM2.py | 0 {eval/pretrain/minif2f => minif2f}/requirements.txt | 0 .../scripts/eval_internLM2-plus_20b.sh | 0 .../scripts/eval_internLM2-plus_7b.sh | 0 .../scripts/eval_internLM2_20b.sh | 0 .../scripts/eval_internLM2_7b.sh | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename {eval/pretrain/minif2f => minif2f}/LICENSE (100%) rename {eval/pretrain/minif2f => minif2f}/README.md (100%) rename {eval/pretrain/minif2f => minif2f}/compute_metrics.py (100%) rename {eval/pretrain/minif2f => minif2f}/data/minif2f.jsonl (100%) rename {eval/pretrain/minif2f => minif2f}/output.zip (100%) rename {eval/pretrain/minif2f => minif2f}/proofsearch_internLM2-plus.py (100%) rename {eval/pretrain/minif2f => minif2f}/proofsearch_internLM2.py (100%) rename {eval/pretrain/minif2f => minif2f}/requirements.txt (100%) rename {eval/pretrain/minif2f => minif2f}/scripts/eval_internLM2-plus_20b.sh (100%) rename {eval/pretrain/minif2f => minif2f}/scripts/eval_internLM2-plus_7b.sh (100%) rename {eval/pretrain/minif2f => minif2f}/scripts/eval_internLM2_20b.sh (100%) rename {eval/pretrain/minif2f => minif2f}/scripts/eval_internLM2_7b.sh (100%) diff --git a/eval/pretrain/minif2f/LICENSE b/minif2f/LICENSE similarity index 100% rename from eval/pretrain/minif2f/LICENSE rename to minif2f/LICENSE diff --git a/eval/pretrain/minif2f/README.md b/minif2f/README.md similarity index 100% rename from eval/pretrain/minif2f/README.md rename to minif2f/README.md diff --git a/eval/pretrain/minif2f/compute_metrics.py b/minif2f/compute_metrics.py similarity index 100% rename from eval/pretrain/minif2f/compute_metrics.py rename to minif2f/compute_metrics.py diff --git a/eval/pretrain/minif2f/data/minif2f.jsonl b/minif2f/data/minif2f.jsonl similarity index 100% rename from eval/pretrain/minif2f/data/minif2f.jsonl rename to minif2f/data/minif2f.jsonl diff --git a/eval/pretrain/minif2f/output.zip b/minif2f/output.zip similarity index 100% rename from eval/pretrain/minif2f/output.zip rename to minif2f/output.zip diff --git a/eval/pretrain/minif2f/proofsearch_internLM2-plus.py b/minif2f/proofsearch_internLM2-plus.py similarity index 100% rename from eval/pretrain/minif2f/proofsearch_internLM2-plus.py rename to minif2f/proofsearch_internLM2-plus.py diff --git a/eval/pretrain/minif2f/proofsearch_internLM2.py b/minif2f/proofsearch_internLM2.py similarity index 100% rename from eval/pretrain/minif2f/proofsearch_internLM2.py rename to minif2f/proofsearch_internLM2.py diff --git a/eval/pretrain/minif2f/requirements.txt b/minif2f/requirements.txt similarity index 100% rename from eval/pretrain/minif2f/requirements.txt rename to minif2f/requirements.txt diff --git a/eval/pretrain/minif2f/scripts/eval_internLM2-plus_20b.sh b/minif2f/scripts/eval_internLM2-plus_20b.sh similarity index 100% rename from eval/pretrain/minif2f/scripts/eval_internLM2-plus_20b.sh rename to minif2f/scripts/eval_internLM2-plus_20b.sh diff --git a/eval/pretrain/minif2f/scripts/eval_internLM2-plus_7b.sh b/minif2f/scripts/eval_internLM2-plus_7b.sh similarity index 100% rename from eval/pretrain/minif2f/scripts/eval_internLM2-plus_7b.sh rename to minif2f/scripts/eval_internLM2-plus_7b.sh diff --git a/eval/pretrain/minif2f/scripts/eval_internLM2_20b.sh b/minif2f/scripts/eval_internLM2_20b.sh similarity index 100% rename from eval/pretrain/minif2f/scripts/eval_internLM2_20b.sh rename to minif2f/scripts/eval_internLM2_20b.sh diff --git a/eval/pretrain/minif2f/scripts/eval_internLM2_7b.sh b/minif2f/scripts/eval_internLM2_7b.sh similarity index 100% rename from eval/pretrain/minif2f/scripts/eval_internLM2_7b.sh rename to minif2f/scripts/eval_internLM2_7b.sh From c8826a546cc34ea24ec4efb23449bb7973c9a5b3 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:29:21 +0800 Subject: [PATCH 12/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 896d024..216fe04 100644 --- a/README.md +++ b/README.md @@ -43,7 +43,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. | **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) | [Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b/summary) | 2024-05-27 | ## Formal Math Reasoning -We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. This is how to reproduce our performance **eval/pretrain/minif2f/README.md**. +We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. This is how to reproduce our performance on [MiniF2F](minif2f/README.md). | Models | MiniF2F-test | | -------------------------------- | ------------ | | ReProver | 26.5 | From b6321fd0097f9b7e3b88ef0eab51db129b987598 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Tue, 4 Jun 2024 17:30:36 +0800 Subject: [PATCH 13/41] Update README.md --- README.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 216fe04..3cde01e 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # InternLM2-Math-Plus -## Download +## Checkpoints | Model | Model Type | Transformers(HF) | ModelScope | Release Date | | ------------------------------------ | ---------- | --------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------ | @@ -43,7 +43,10 @@ A **solver**, **prover**, **verifier**, **augmentor**. | **InternLM2-Math-Plus-Mixtral8x22B** | Chat | 🤗[internlm/internlm2-math-plus-mixtral8x22b](https://huggingface.co/internlm/internlm2-math-plus-mixtral8x22b/) | [Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b](https://modelscope.cn/models/Shanghai_AI_Laboratory/internlm2-math-plus-mixtral8x22b/summary) | 2024-05-27 | ## Formal Math Reasoning -We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. This is how to reproduce our performance on [MiniF2F](minif2f/README.md). +We evaluate the performance of InternLM2-Math-Plus on formal math reasoning benchmark MiniF2F-test. The evaluation setting is same as Llemma with LEAN 4. + +> This is how to reproduce our performance on [MiniF2F](minif2f/README.md). + | Models | MiniF2F-test | | -------------------------------- | ------------ | | ReProver | 26.5 | @@ -97,7 +100,7 @@ We also evaluate models on [MathBench-A](https://github.com/open-compass/MathBen | InternLM2-Math-Plus-1.8B | 43.0 | 43.3 | 25.4 | 18.9 | 4.7 | 27.1 | -# Introduction +# Introduction (For InternLM2-Math) - **7B and 20B Chinese and English Math LMs with better than ChatGPT performances.** InternLM2-Math are continued pretrained from InternLM2-Base with ~100B high quality math-related tokens and SFT with ~2M bilingual math supervised data. We apply minhash and exact number match to decontaminate possible test set leakage. - **Add Lean as a support language for math problem solving and math theorem proving.** We are exploring combining Lean 3 with InternLM-Math for verifiable math reasoning. InternLM-Math can generate Lean codes for simple math reasoning tasks like GSM8K or provide possible proof tactics based on Lean states. - **Also can be viewed as a reward model, which supports the Outcome/Process/Lean Reward Model.** We supervise InternLM2-Math with various types of reward modeling data, to make InternLM2-Math can also verify chain-of-thought processes. We also add the ability to convert a chain-of-thought process into Lean 3 code. From a7064febd15d1adceaf067feef1094c726605ac4 Mon Sep 17 00:00:00 2001 From: yinghy18 <56391069+yinghy18@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:00:24 +0800 Subject: [PATCH 14/41] Add files via upload --- leanworkbook/inference_backtranslate.py | 190 +++++++++++++++++++ leanworkbook/inference_nli.py | 203 +++++++++++++++++++++ leanworkbook/inference_translate_answer.py | 194 ++++++++++++++++++++ leanworkbook/mainpic.jpg | Bin 0 -> 63241 bytes leanworkbook/readme.md | 34 ++++ 5 files changed, 621 insertions(+) create mode 100644 leanworkbook/inference_backtranslate.py create mode 100644 leanworkbook/inference_nli.py create mode 100644 leanworkbook/inference_translate_answer.py create mode 100644 leanworkbook/mainpic.jpg create mode 100644 leanworkbook/readme.md diff --git a/leanworkbook/inference_backtranslate.py b/leanworkbook/inference_backtranslate.py new file mode 100644 index 0000000..c66bb31 --- /dev/null +++ b/leanworkbook/inference_backtranslate.py @@ -0,0 +1,190 @@ +import argparse +import json +import os +from tqdm import tqdm +from vllm import LLM, SamplingParams +import numpy as numpy +from transformers import AutoTokenizer + +def run_eval( + model_path, + model_id, + questions, + answer_file, + max_new_token, + temperature, + tp_size, +): + + + print(os.environ["CUDA_VISIBLE_DEVICES"]) + + tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True) + special_tokens_dict = dict() + if tokenizer.pad_token is None: + special_tokens_dict["pad_token"] = '' + if tokenizer.eos_token is None: + special_tokens_dict["eos_token"] = '' + if tokenizer.bos_token is None: + special_tokens_dict["bos_token"] = '' + if tokenizer.unk_token is None: + special_tokens_dict["unk_token"] = '' + if len(special_tokens_dict) > 0 and model_path.find('Qwen') == -1: + tokenizer.add_special_tokens(special_tokens_dict) + # tokenizer.save_pretrained(model_path) + + # os.environ['CUDA_VISIBLE_DEVICES'] = str(os.environ['RANK']) + print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") + print(f"Output to {answer_file}") + print(f"Num Questions: {len(questions)}") + print(f"TP: {tp_size}") + device = 'cuda:' + os.environ['RANK'] + # torch.cuda.set_device(int(os.environ['RANK'])) # hard code for single card inference + + try: + model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + except RecursionError: + model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + + sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]']) + + def get_query(example): + output = example['theorem'] + output = '[UNUSED_TOKEN_146]user\nConvert the formal statement into natural language:\n```lean\n'+output+'\n```[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n' + + return output + + prompts = [get_query(example) for example in questions] + + prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} + + # debug + """ + outputs = model.generate(prompts[0:10], sampling_params) + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + #print(output) + + outputs = model.generate(prompts, sampling_params) + """ + outputs = model.generate(prompts, sampling_params) + print(prompts[0]) + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + + question['back_translate'] = output.replace('[UNUSED_TOKEN_145]','') + question['generator'] = model_id + + # Dump answers + os.makedirs(os.path.dirname(answer_file), exist_ok=True) + with open(os.path.expanduser(answer_file), "a") as fout: + fout.write(json.dumps(question, ensure_ascii=False) + "\n") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--model-path", + type=str, + required=True, + help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", + ) + # parser.add_argument("--model-id", type=str, required=True) + parser.add_argument( + "--question-file", + type=str, + default=None, + help="The name of the benchmark question set.", + ) + parser.add_argument( + "--answer-file", + type=str, + default=None, + help="The output answer file.", + ) + parser.add_argument( + "--max-new-token", + type=int, + default=1024, + help="The maximum number of new generated tokens.", + ) + parser.add_argument( + "--temperature", + type=float, + default=0.7, + ) + parser.add_argument( + "--repeat_times", + type=int, + default=1, + ) + + args = parser.parse_args() + os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) + + with open(args.question_file, 'r') as f: + questions = [json.loads(item) for item in f.readlines()] + # with open('/cpfs01/shared/public/llm_math/yinghuaiyuan/math-sft-exp-yhy/type_classification.json', 'r') as f: + # df = json.load(f) + + # questions = [] + # for key in df: + # for prob in df[key]: + # print(prob) + # questions.append({'prompt': "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + prob['problem'] + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n"}) + + if args.repeat_times > 1: + questions = questions * args.repeat_times + + if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: + num_replicas = int(os.environ['WORLD_SIZE']) + rank = int(os.environ['RANK']) + + # tp_size = torch.cuda.device_count() // num_replicas + tp_size = 1 + device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) + # os.environ['CUDA_VISIBLE_DEVICES'] = device + print(num_replicas, rank, tp_size, device) + + total_size = len(questions) + questions = questions[rank:total_size:num_replicas] + args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") + else: + tp_size = 1 + + run_eval( + args.model_path, + args.model_path, + questions, + args.answer_file, + args.max_new_token, + args.temperature, + tp_size, + ) diff --git a/leanworkbook/inference_nli.py b/leanworkbook/inference_nli.py new file mode 100644 index 0000000..9526b7e --- /dev/null +++ b/leanworkbook/inference_nli.py @@ -0,0 +1,203 @@ +import argparse +import json +import os +from tqdm import tqdm +from vllm import LLM, SamplingParams +import numpy as numpy +from transformers import AutoTokenizer + +def run_eval( + model_path, + model_id, + questions, + answer_file, + max_new_token, + temperature, + tp_size, +): + + + print(os.environ["CUDA_VISIBLE_DEVICES"]) + + tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True) + special_tokens_dict = dict() + if tokenizer.pad_token is None: + special_tokens_dict["pad_token"] = '' + if tokenizer.eos_token is None: + special_tokens_dict["eos_token"] = '' + if tokenizer.bos_token is None: + special_tokens_dict["bos_token"] = '' + if tokenizer.unk_token is None: + special_tokens_dict["unk_token"] = '' + if len(special_tokens_dict) > 0 and model_path.find('Qwen') == -1: + tokenizer.add_special_tokens(special_tokens_dict) + # tokenizer.save_pretrained(model_path) + + # os.environ['CUDA_VISIBLE_DEVICES'] = str(os.environ['RANK']) + print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") + print(f"Output to {answer_file}") + print(f"Num Questions: {len(questions)}") + print(f"TP: {tp_size}") + device = 'cuda:' + os.environ['RANK'] + # torch.cuda.set_device(int(os.environ['RANK'])) # hard code for single card inference + + try: + model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + except RecursionError: + model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + + sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]']) + + def get_query(example): + sys_prompt = 'Please check following two math problems is same or different? Please consider each statement in two problems, they are different if any statement is different. Please point out any different you found. Please reply **same** or **different** at the final sentence with bold format.' + problem_origin = example['problem'] + probelm_back = example['back_translate'] + prompt = 'Problem 1:\n' + problem_origin + '\nProblem 2:\n' + probelm_back + + messages = [ + {"role": "system", "content": sys_prompt}, + {"role": "user", "content": prompt} + ] + text = tokenizer.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True + ) + return text + + prompts = [get_query(example) for example in questions] + + prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} + + # debug + """ + outputs = model.generate(prompts[0:10], sampling_params) + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + print(output) + """ + + outputs = model.generate(prompts, sampling_params) + #for p in prompts: + # output = model.generate([p], sampling_params) + # outputs.append(output) + + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + + question['nli_output'] = output + question['generator_nli'] = model_id + + # Dump answers + os.makedirs(os.path.dirname(answer_file), exist_ok=True) + with open(os.path.expanduser(answer_file), "a") as fout: + fout.write(json.dumps(question, ensure_ascii=False) + "\n") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--model-path", + type=str, + required=True, + help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", + ) + # parser.add_argument("--model-id", type=str, required=True) + parser.add_argument( + "--question-file", + type=str, + default=None, + help="The name of the benchmark question set.", + ) + parser.add_argument( + "--answer-file", + type=str, + default=None, + help="The output answer file.", + ) + parser.add_argument( + "--max-new-token", + type=int, + default=1024, + help="The maximum number of new generated tokens.", + ) + parser.add_argument( + "--temperature", + type=float, + default=0.7, + ) + parser.add_argument( + "--repeat_times", + type=int, + default=1, + ) + + args = parser.parse_args() + os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) + + with open(args.question_file, 'r') as f: + questions = [json.loads(item) for item in f.readlines()] + # with open('/cpfs01/shared/public/llm_math/yinghuaiyuan/math-sft-exp-yhy/type_classification.json', 'r') as f: + # df = json.load(f) + + # questions = [] + # for key in df: + # for prob in df[key]: + # print(prob) + # questions.append({'prompt': "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + prob['problem'] + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n"}) + + if args.repeat_times > 1: + questions = questions * args.repeat_times + + if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: + num_replicas = int(os.environ['WORLD_SIZE']) + rank = int(os.environ['RANK']) + + # tp_size = torch.cuda.device_count() // num_replicas + tp_size = 1 + device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) + # os.environ['CUDA_VISIBLE_DEVICES'] = device + print(num_replicas, rank, tp_size, device) + + total_size = len(questions) + questions = questions[rank:total_size:num_replicas] + args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") + else: + tp_size = 1 + + run_eval( + args.model_path, + args.model_path, + questions, + args.answer_file, + args.max_new_token, + args.temperature, + tp_size, + ) diff --git a/leanworkbook/inference_translate_answer.py b/leanworkbook/inference_translate_answer.py new file mode 100644 index 0000000..d83dc5a --- /dev/null +++ b/leanworkbook/inference_translate_answer.py @@ -0,0 +1,194 @@ +import argparse +import json +import os +import torch +from tqdm import tqdm +from vllm import LLM, SamplingParams +import numpy as numpy +from transformers import AutoTokenizer + +def run_eval( + model_path, + model_id, + questions, + answer_file, + max_new_token, + temperature, + tp_size, +): + print('##################'+str(torch.cuda.is_available())) + #os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) + print(os.environ["CUDA_VISIBLE_DEVICES"]) + + tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True) + special_tokens_dict = dict() + if tokenizer.pad_token is None: + special_tokens_dict["pad_token"] = '' + if tokenizer.eos_token is None: + special_tokens_dict["eos_token"] = '' + if tokenizer.bos_token is None: + special_tokens_dict["bos_token"] = '' + if tokenizer.unk_token is None: + special_tokens_dict["unk_token"] = '' + if len(special_tokens_dict) > 0 and model_path.find('Qwen') == -1: + tokenizer.add_special_tokens(special_tokens_dict) + # tokenizer.save_pretrained(model_path) + + # os.environ['CUDA_VISIBLE_DEVICES'] = str(os.environ['RANK']) + print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") + print(f"Output to {answer_file}") + print(f"Num Questions: {len(questions)}") + print(f"TP: {tp_size}") + device = 'cuda:' + os.environ['RANK'] + # torch.cuda.set_device(int(os.environ['RANK'])) # hard code for single card inference + + try: + model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + except RecursionError: + model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + + sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]', 'by', 'sorry']) + + def get_query(example): + if 'answer' in example and 'prove' not in example['problem'].split(' ') and 'Prove' not in example['problem'].split(' ') and example['answer'] != '' and len(example['answer']) <= 30: + return "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + str(example['problem']) + "Show that it is " + str(example['answer']) + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\nHere is the formal statement in LEAN 4:\n```lean\ntheorem" + else: + return "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + str(example['problem']) + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\nHere is the formal statement in LEAN 4:\n```lean\ntheorem" + + prompts = [get_query(example) for example in questions] + + prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} + + # debug + ''' + outputs = model.generate(prompts[0:10], sampling_params) + print(prompts[0]) + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + print(output) + ''' + + outputs = model.generate(prompts, sampling_params) + + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + + question['output'] = output + question['generator'] = model_id + + # Dump answers + os.makedirs(os.path.dirname(answer_file), exist_ok=True) + with open(os.path.expanduser(answer_file), "a") as fout: + fout.write(json.dumps(question, ensure_ascii=False) + "\n") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--model-path", + type=str, + required=True, + help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", + ) + # parser.add_argument("--model-id", type=str, required=True) + parser.add_argument( + "--question-file", + type=str, + default=None, + help="The name of the benchmark question set.", + ) + parser.add_argument( + "--answer-file", + type=str, + default=None, + help="The output answer file.", + ) + parser.add_argument( + "--max-new-token", + type=int, + default=1024, + help="The maximum number of new generated tokens.", + ) + parser.add_argument( + "--temperature", + type=float, + default=0.7, + ) + parser.add_argument( + "--repeat_times", + type=int, + default=1, + ) + + args = parser.parse_args() + os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) + + with open(args.question_file, 'r') as f: + questions = [json.loads(item) for item in f.readlines()] + #questions_1 = json.load(f) + + + # with open('/cpfs01/shared/public/llm_math/yinghuaiyuan/math-sft-exp-yhy/type_classification.json', 'r') as f: + # df = json.load(f) + + # questions = [] + # for key in df: + # for prob in df[key]: + # print(prob) + # questions.append({'prompt': "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + prob['problem'] + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n"}) + + if args.repeat_times > 1: + questions = questions * args.repeat_times + + if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: + num_replicas = int(os.environ['WORLD_SIZE']) + rank = int(os.environ['RANK']) + + # tp_size = torch.cuda.device_count() // num_replicas + tp_size = 1 + device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) + # os.environ['CUDA_VISIBLE_DEVICES'] = device + print(num_replicas, rank, tp_size, device) + + total_size = len(questions) + questions = questions[rank:total_size:num_replicas] + args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") + else: + tp_size = 1 + + run_eval( + args.model_path, + args.model_path, + questions, + args.answer_file, + args.max_new_token, + args.temperature, + tp_size, + ) diff --git a/leanworkbook/mainpic.jpg b/leanworkbook/mainpic.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa98816bbf158ef16140982a96aea203affe2cb1 GIT binary patch literal 63241 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 iA9afO{||iFe`ON Date: Thu, 6 Jun 2024 11:15:37 +0800 Subject: [PATCH 15/41] Delete leanworkbook directory --- leanworkbook/inference_backtranslate.py | 190 ------------------- leanworkbook/inference_nli.py | 203 --------------------- leanworkbook/inference_translate_answer.py | 194 -------------------- leanworkbook/mainpic.jpg | Bin 63241 -> 0 bytes leanworkbook/readme.md | 34 ---- 5 files changed, 621 deletions(-) delete mode 100644 leanworkbook/inference_backtranslate.py delete mode 100644 leanworkbook/inference_nli.py delete mode 100644 leanworkbook/inference_translate_answer.py delete mode 100644 leanworkbook/mainpic.jpg delete mode 100644 leanworkbook/readme.md diff --git a/leanworkbook/inference_backtranslate.py b/leanworkbook/inference_backtranslate.py deleted file mode 100644 index c66bb31..0000000 --- a/leanworkbook/inference_backtranslate.py +++ /dev/null @@ -1,190 +0,0 @@ -import argparse -import json -import os -from tqdm import tqdm -from vllm import LLM, SamplingParams -import numpy as numpy -from transformers import AutoTokenizer - -def run_eval( - model_path, - model_id, - questions, - answer_file, - max_new_token, - temperature, - tp_size, -): - - - print(os.environ["CUDA_VISIBLE_DEVICES"]) - - tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True) - special_tokens_dict = dict() - if tokenizer.pad_token is None: - special_tokens_dict["pad_token"] = '' - if tokenizer.eos_token is None: - special_tokens_dict["eos_token"] = '' - if tokenizer.bos_token is None: - special_tokens_dict["bos_token"] = '' - if tokenizer.unk_token is None: - special_tokens_dict["unk_token"] = '' - if len(special_tokens_dict) > 0 and model_path.find('Qwen') == -1: - tokenizer.add_special_tokens(special_tokens_dict) - # tokenizer.save_pretrained(model_path) - - # os.environ['CUDA_VISIBLE_DEVICES'] = str(os.environ['RANK']) - print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") - print(f"Output to {answer_file}") - print(f"Num Questions: {len(questions)}") - print(f"TP: {tp_size}") - device = 'cuda:' + os.environ['RANK'] - # torch.cuda.set_device(int(os.environ['RANK'])) # hard code for single card inference - - try: - model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") - except RecursionError: - model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") - - sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]']) - - def get_query(example): - output = example['theorem'] - output = '[UNUSED_TOKEN_146]user\nConvert the formal statement into natural language:\n```lean\n'+output+'\n```[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n' - - return output - - prompts = [get_query(example) for example in questions] - - prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} - - # debug - """ - outputs = model.generate(prompts[0:10], sampling_params) - for _, output in enumerate(outputs): - output_ids = output.outputs[0].token_ids - question = questions[prompt_id_map[output.prompt]] - - output = model.get_tokenizer().decode( - output_ids, - spaces_between_special_tokens=False, - ) - - for special_token in model.get_tokenizer().special_tokens_map.values(): - if isinstance(special_token, list): - for special_tok in special_token: - output = output.replace(special_tok, "") - else: - output = output.replace(special_token, "") - output = output.strip() - #print(output) - - outputs = model.generate(prompts, sampling_params) - """ - outputs = model.generate(prompts, sampling_params) - print(prompts[0]) - for _, output in enumerate(outputs): - output_ids = output.outputs[0].token_ids - question = questions[prompt_id_map[output.prompt]] - - output = model.get_tokenizer().decode( - output_ids, - spaces_between_special_tokens=False, - ) - - for special_token in model.get_tokenizer().special_tokens_map.values(): - if isinstance(special_token, list): - for special_tok in special_token: - output = output.replace(special_tok, "") - else: - output = output.replace(special_token, "") - output = output.strip() - - question['back_translate'] = output.replace('[UNUSED_TOKEN_145]','') - question['generator'] = model_id - - # Dump answers - os.makedirs(os.path.dirname(answer_file), exist_ok=True) - with open(os.path.expanduser(answer_file), "a") as fout: - fout.write(json.dumps(question, ensure_ascii=False) + "\n") - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--model-path", - type=str, - required=True, - help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", - ) - # parser.add_argument("--model-id", type=str, required=True) - parser.add_argument( - "--question-file", - type=str, - default=None, - help="The name of the benchmark question set.", - ) - parser.add_argument( - "--answer-file", - type=str, - default=None, - help="The output answer file.", - ) - parser.add_argument( - "--max-new-token", - type=int, - default=1024, - help="The maximum number of new generated tokens.", - ) - parser.add_argument( - "--temperature", - type=float, - default=0.7, - ) - parser.add_argument( - "--repeat_times", - type=int, - default=1, - ) - - args = parser.parse_args() - os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) - - with open(args.question_file, 'r') as f: - questions = [json.loads(item) for item in f.readlines()] - # with open('/cpfs01/shared/public/llm_math/yinghuaiyuan/math-sft-exp-yhy/type_classification.json', 'r') as f: - # df = json.load(f) - - # questions = [] - # for key in df: - # for prob in df[key]: - # print(prob) - # questions.append({'prompt': "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + prob['problem'] + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n"}) - - if args.repeat_times > 1: - questions = questions * args.repeat_times - - if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: - num_replicas = int(os.environ['WORLD_SIZE']) - rank = int(os.environ['RANK']) - - # tp_size = torch.cuda.device_count() // num_replicas - tp_size = 1 - device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) - # os.environ['CUDA_VISIBLE_DEVICES'] = device - print(num_replicas, rank, tp_size, device) - - total_size = len(questions) - questions = questions[rank:total_size:num_replicas] - args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") - else: - tp_size = 1 - - run_eval( - args.model_path, - args.model_path, - questions, - args.answer_file, - args.max_new_token, - args.temperature, - tp_size, - ) diff --git a/leanworkbook/inference_nli.py b/leanworkbook/inference_nli.py deleted file mode 100644 index 9526b7e..0000000 --- a/leanworkbook/inference_nli.py +++ /dev/null @@ -1,203 +0,0 @@ -import argparse -import json -import os -from tqdm import tqdm -from vllm import LLM, SamplingParams -import numpy as numpy -from transformers import AutoTokenizer - -def run_eval( - model_path, - model_id, - questions, - answer_file, - max_new_token, - temperature, - tp_size, -): - - - print(os.environ["CUDA_VISIBLE_DEVICES"]) - - tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True) - special_tokens_dict = dict() - if tokenizer.pad_token is None: - special_tokens_dict["pad_token"] = '' - if tokenizer.eos_token is None: - special_tokens_dict["eos_token"] = '' - if tokenizer.bos_token is None: - special_tokens_dict["bos_token"] = '' - if tokenizer.unk_token is None: - special_tokens_dict["unk_token"] = '' - if len(special_tokens_dict) > 0 and model_path.find('Qwen') == -1: - tokenizer.add_special_tokens(special_tokens_dict) - # tokenizer.save_pretrained(model_path) - - # os.environ['CUDA_VISIBLE_DEVICES'] = str(os.environ['RANK']) - print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") - print(f"Output to {answer_file}") - print(f"Num Questions: {len(questions)}") - print(f"TP: {tp_size}") - device = 'cuda:' + os.environ['RANK'] - # torch.cuda.set_device(int(os.environ['RANK'])) # hard code for single card inference - - try: - model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") - except RecursionError: - model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") - - sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]']) - - def get_query(example): - sys_prompt = 'Please check following two math problems is same or different? Please consider each statement in two problems, they are different if any statement is different. Please point out any different you found. Please reply **same** or **different** at the final sentence with bold format.' - problem_origin = example['problem'] - probelm_back = example['back_translate'] - prompt = 'Problem 1:\n' + problem_origin + '\nProblem 2:\n' + probelm_back - - messages = [ - {"role": "system", "content": sys_prompt}, - {"role": "user", "content": prompt} - ] - text = tokenizer.apply_chat_template( - messages, - tokenize=False, - add_generation_prompt=True - ) - return text - - prompts = [get_query(example) for example in questions] - - prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} - - # debug - """ - outputs = model.generate(prompts[0:10], sampling_params) - for _, output in enumerate(outputs): - output_ids = output.outputs[0].token_ids - question = questions[prompt_id_map[output.prompt]] - - output = model.get_tokenizer().decode( - output_ids, - spaces_between_special_tokens=False, - ) - - for special_token in model.get_tokenizer().special_tokens_map.values(): - if isinstance(special_token, list): - for special_tok in special_token: - output = output.replace(special_tok, "") - else: - output = output.replace(special_token, "") - output = output.strip() - print(output) - """ - - outputs = model.generate(prompts, sampling_params) - #for p in prompts: - # output = model.generate([p], sampling_params) - # outputs.append(output) - - for _, output in enumerate(outputs): - output_ids = output.outputs[0].token_ids - question = questions[prompt_id_map[output.prompt]] - - output = model.get_tokenizer().decode( - output_ids, - spaces_between_special_tokens=False, - ) - - for special_token in model.get_tokenizer().special_tokens_map.values(): - if isinstance(special_token, list): - for special_tok in special_token: - output = output.replace(special_tok, "") - else: - output = output.replace(special_token, "") - output = output.strip() - - question['nli_output'] = output - question['generator_nli'] = model_id - - # Dump answers - os.makedirs(os.path.dirname(answer_file), exist_ok=True) - with open(os.path.expanduser(answer_file), "a") as fout: - fout.write(json.dumps(question, ensure_ascii=False) + "\n") - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--model-path", - type=str, - required=True, - help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", - ) - # parser.add_argument("--model-id", type=str, required=True) - parser.add_argument( - "--question-file", - type=str, - default=None, - help="The name of the benchmark question set.", - ) - parser.add_argument( - "--answer-file", - type=str, - default=None, - help="The output answer file.", - ) - parser.add_argument( - "--max-new-token", - type=int, - default=1024, - help="The maximum number of new generated tokens.", - ) - parser.add_argument( - "--temperature", - type=float, - default=0.7, - ) - parser.add_argument( - "--repeat_times", - type=int, - default=1, - ) - - args = parser.parse_args() - os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) - - with open(args.question_file, 'r') as f: - questions = [json.loads(item) for item in f.readlines()] - # with open('/cpfs01/shared/public/llm_math/yinghuaiyuan/math-sft-exp-yhy/type_classification.json', 'r') as f: - # df = json.load(f) - - # questions = [] - # for key in df: - # for prob in df[key]: - # print(prob) - # questions.append({'prompt': "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + prob['problem'] + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n"}) - - if args.repeat_times > 1: - questions = questions * args.repeat_times - - if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: - num_replicas = int(os.environ['WORLD_SIZE']) - rank = int(os.environ['RANK']) - - # tp_size = torch.cuda.device_count() // num_replicas - tp_size = 1 - device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) - # os.environ['CUDA_VISIBLE_DEVICES'] = device - print(num_replicas, rank, tp_size, device) - - total_size = len(questions) - questions = questions[rank:total_size:num_replicas] - args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") - else: - tp_size = 1 - - run_eval( - args.model_path, - args.model_path, - questions, - args.answer_file, - args.max_new_token, - args.temperature, - tp_size, - ) diff --git a/leanworkbook/inference_translate_answer.py b/leanworkbook/inference_translate_answer.py deleted file mode 100644 index d83dc5a..0000000 --- a/leanworkbook/inference_translate_answer.py +++ /dev/null @@ -1,194 +0,0 @@ -import argparse -import json -import os -import torch -from tqdm import tqdm -from vllm import LLM, SamplingParams -import numpy as numpy -from transformers import AutoTokenizer - -def run_eval( - model_path, - model_id, - questions, - answer_file, - max_new_token, - temperature, - tp_size, -): - print('##################'+str(torch.cuda.is_available())) - #os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) - print(os.environ["CUDA_VISIBLE_DEVICES"]) - - tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True) - special_tokens_dict = dict() - if tokenizer.pad_token is None: - special_tokens_dict["pad_token"] = '' - if tokenizer.eos_token is None: - special_tokens_dict["eos_token"] = '' - if tokenizer.bos_token is None: - special_tokens_dict["bos_token"] = '' - if tokenizer.unk_token is None: - special_tokens_dict["unk_token"] = '' - if len(special_tokens_dict) > 0 and model_path.find('Qwen') == -1: - tokenizer.add_special_tokens(special_tokens_dict) - # tokenizer.save_pretrained(model_path) - - # os.environ['CUDA_VISIBLE_DEVICES'] = str(os.environ['RANK']) - print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") - print(f"Output to {answer_file}") - print(f"Num Questions: {len(questions)}") - print(f"TP: {tp_size}") - device = 'cuda:' + os.environ['RANK'] - # torch.cuda.set_device(int(os.environ['RANK'])) # hard code for single card inference - - try: - model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") - except RecursionError: - model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") - - sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]', 'by', 'sorry']) - - def get_query(example): - if 'answer' in example and 'prove' not in example['problem'].split(' ') and 'Prove' not in example['problem'].split(' ') and example['answer'] != '' and len(example['answer']) <= 30: - return "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + str(example['problem']) + "Show that it is " + str(example['answer']) + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\nHere is the formal statement in LEAN 4:\n```lean\ntheorem" - else: - return "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + str(example['problem']) + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\nHere is the formal statement in LEAN 4:\n```lean\ntheorem" - - prompts = [get_query(example) for example in questions] - - prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} - - # debug - ''' - outputs = model.generate(prompts[0:10], sampling_params) - print(prompts[0]) - for _, output in enumerate(outputs): - output_ids = output.outputs[0].token_ids - question = questions[prompt_id_map[output.prompt]] - - output = model.get_tokenizer().decode( - output_ids, - spaces_between_special_tokens=False, - ) - - for special_token in model.get_tokenizer().special_tokens_map.values(): - if isinstance(special_token, list): - for special_tok in special_token: - output = output.replace(special_tok, "") - else: - output = output.replace(special_token, "") - output = output.strip() - print(output) - ''' - - outputs = model.generate(prompts, sampling_params) - - for _, output in enumerate(outputs): - output_ids = output.outputs[0].token_ids - question = questions[prompt_id_map[output.prompt]] - - output = model.get_tokenizer().decode( - output_ids, - spaces_between_special_tokens=False, - ) - - for special_token in model.get_tokenizer().special_tokens_map.values(): - if isinstance(special_token, list): - for special_tok in special_token: - output = output.replace(special_tok, "") - else: - output = output.replace(special_token, "") - output = output.strip() - - question['output'] = output - question['generator'] = model_id - - # Dump answers - os.makedirs(os.path.dirname(answer_file), exist_ok=True) - with open(os.path.expanduser(answer_file), "a") as fout: - fout.write(json.dumps(question, ensure_ascii=False) + "\n") - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--model-path", - type=str, - required=True, - help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", - ) - # parser.add_argument("--model-id", type=str, required=True) - parser.add_argument( - "--question-file", - type=str, - default=None, - help="The name of the benchmark question set.", - ) - parser.add_argument( - "--answer-file", - type=str, - default=None, - help="The output answer file.", - ) - parser.add_argument( - "--max-new-token", - type=int, - default=1024, - help="The maximum number of new generated tokens.", - ) - parser.add_argument( - "--temperature", - type=float, - default=0.7, - ) - parser.add_argument( - "--repeat_times", - type=int, - default=1, - ) - - args = parser.parse_args() - os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) - - with open(args.question_file, 'r') as f: - questions = [json.loads(item) for item in f.readlines()] - #questions_1 = json.load(f) - - - # with open('/cpfs01/shared/public/llm_math/yinghuaiyuan/math-sft-exp-yhy/type_classification.json', 'r') as f: - # df = json.load(f) - - # questions = [] - # for key in df: - # for prob in df[key]: - # print(prob) - # questions.append({'prompt': "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + prob['problem'] + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n"}) - - if args.repeat_times > 1: - questions = questions * args.repeat_times - - if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: - num_replicas = int(os.environ['WORLD_SIZE']) - rank = int(os.environ['RANK']) - - # tp_size = torch.cuda.device_count() // num_replicas - tp_size = 1 - device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) - # os.environ['CUDA_VISIBLE_DEVICES'] = device - print(num_replicas, rank, tp_size, device) - - total_size = len(questions) - questions = questions[rank:total_size:num_replicas] - args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") - else: - tp_size = 1 - - run_eval( - args.model_path, - args.model_path, - questions, - args.answer_file, - args.max_new_token, - args.temperature, - tp_size, - ) diff --git a/leanworkbook/mainpic.jpg b/leanworkbook/mainpic.jpg deleted file mode 100644 index fa98816bbf158ef16140982a96aea203affe2cb1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 63241 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 iA9afO{||iFe`ON Date: Thu, 6 Jun 2024 11:16:22 +0800 Subject: [PATCH 16/41] Add files via upload --- leanworkbook/Workbook_main.jpg | Bin 0 -> 63241 bytes leanworkbook/inference_backtranslate.py | 155 +++++++++++++++++++ leanworkbook/inference_nli.py | 165 +++++++++++++++++++++ leanworkbook/inference_translate_answer.py | 156 +++++++++++++++++++ leanworkbook/readme.md | 34 +++++ 5 files changed, 510 insertions(+) create mode 100644 leanworkbook/Workbook_main.jpg create mode 100644 leanworkbook/inference_backtranslate.py create mode 100644 leanworkbook/inference_nli.py create mode 100644 leanworkbook/inference_translate_answer.py create mode 100644 leanworkbook/readme.md diff --git a/leanworkbook/Workbook_main.jpg b/leanworkbook/Workbook_main.jpg new file mode 100644 index 0000000000000000000000000000000000000000..fa98816bbf158ef16140982a96aea203affe2cb1 GIT binary patch literal 63241 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 iA9afO{||iFe`ON 0 and model_path.find('Qwen') == -1: + tokenizer.add_special_tokens(special_tokens_dict) + + print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") + print(f"Output to {answer_file}") + print(f"Num Questions: {len(questions)}") + print(f"TP: {tp_size}") + device = 'cuda:' + os.environ['RANK'] + + + try: + model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + except RecursionError: + model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + + sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]']) + + def get_query(example): + output = example['theorem'] + output = '[UNUSED_TOKEN_146]user\nConvert the formal statement into natural language:\n```lean\n'+output+'\n```[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\n' + + return output + + prompts = [get_query(example) for example in questions] + + prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} + + outputs = model.generate(prompts, sampling_params) + print(prompts[0]) + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + + question['back_translate'] = output.replace('[UNUSED_TOKEN_145]','') + question['generator'] = model_id + + # Dump answers + os.makedirs(os.path.dirname(answer_file), exist_ok=True) + with open(os.path.expanduser(answer_file), "a") as fout: + fout.write(json.dumps(question, ensure_ascii=False) + "\n") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--model-path", + type=str, + required=True, + help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", + ) + + parser.add_argument( + "--question-file", + type=str, + default=None, + help="The name of the benchmark question set.", + ) + parser.add_argument( + "--answer-file", + type=str, + default=None, + help="The output answer file.", + ) + parser.add_argument( + "--max-new-token", + type=int, + default=1024, + help="The maximum number of new generated tokens.", + ) + parser.add_argument( + "--temperature", + type=float, + default=0.7, + ) + parser.add_argument( + "--repeat_times", + type=int, + default=1, + ) + + args = parser.parse_args() + os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) + + with open(args.question_file, 'r') as f: + questions = [json.loads(item) for item in f.readlines()] + + if args.repeat_times > 1: + questions = questions * args.repeat_times + + if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: + num_replicas = int(os.environ['WORLD_SIZE']) + rank = int(os.environ['RANK']) + + tp_size = 1 + device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) + print(num_replicas, rank, tp_size, device) + + total_size = len(questions) + questions = questions[rank:total_size:num_replicas] + args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") + else: + tp_size = 1 + + run_eval( + args.model_path, + args.model_path, + questions, + args.answer_file, + args.max_new_token, + args.temperature, + tp_size, + ) diff --git a/leanworkbook/inference_nli.py b/leanworkbook/inference_nli.py new file mode 100644 index 0000000..43d2b92 --- /dev/null +++ b/leanworkbook/inference_nli.py @@ -0,0 +1,165 @@ +import argparse +import json +import os +from tqdm import tqdm +from vllm import LLM, SamplingParams +import numpy as numpy +from transformers import AutoTokenizer + +def run_eval( + model_path, + model_id, + questions, + answer_file, + max_new_token, + temperature, + tp_size, +): + + + print(os.environ["CUDA_VISIBLE_DEVICES"]) + + tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True) + special_tokens_dict = dict() + if tokenizer.pad_token is None: + special_tokens_dict["pad_token"] = '' + if tokenizer.eos_token is None: + special_tokens_dict["eos_token"] = '' + if tokenizer.bos_token is None: + special_tokens_dict["bos_token"] = '' + if tokenizer.unk_token is None: + special_tokens_dict["unk_token"] = '' + if len(special_tokens_dict) > 0 and model_path.find('Qwen') == -1: + tokenizer.add_special_tokens(special_tokens_dict) + + print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") + print(f"Output to {answer_file}") + print(f"Num Questions: {len(questions)}") + print(f"TP: {tp_size}") + device = 'cuda:' + os.environ['RANK'] + + try: + model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + except RecursionError: + model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + + sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]']) + + def get_query(example): + sys_prompt = 'Please check following two math problems is same or different? Please consider each statement in two problems, they are different if any statement is different. Please point out any different you found. Please reply **same** or **different** at the final sentence with bold format.' + problem_origin = example['problem'] + probelm_back = example['back_translate'] + prompt = 'Problem 1:\n' + problem_origin + '\nProblem 2:\n' + probelm_back + + messages = [ + {"role": "system", "content": sys_prompt}, + {"role": "user", "content": prompt} + ] + text = tokenizer.apply_chat_template( + messages, + tokenize=False, + add_generation_prompt=True + ) + return text + + prompts = [get_query(example) for example in questions] + + prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} + + outputs = model.generate(prompts, sampling_params) + + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + + question['nli_output'] = output + question['generator_nli'] = model_id + + # Dump answers + os.makedirs(os.path.dirname(answer_file), exist_ok=True) + with open(os.path.expanduser(answer_file), "a") as fout: + fout.write(json.dumps(question, ensure_ascii=False) + "\n") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--model-path", + type=str, + required=True, + help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", + ) + + parser.add_argument( + "--question-file", + type=str, + default=None, + help="The name of the benchmark question set.", + ) + parser.add_argument( + "--answer-file", + type=str, + default=None, + help="The output answer file.", + ) + parser.add_argument( + "--max-new-token", + type=int, + default=1024, + help="The maximum number of new generated tokens.", + ) + parser.add_argument( + "--temperature", + type=float, + default=0.7, + ) + parser.add_argument( + "--repeat_times", + type=int, + default=1, + ) + + args = parser.parse_args() + os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) + + with open(args.question_file, 'r') as f: + questions = [json.loads(item) for item in f.readlines()] + + if args.repeat_times > 1: + questions = questions * args.repeat_times + + if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: + num_replicas = int(os.environ['WORLD_SIZE']) + rank = int(os.environ['RANK']) + + tp_size = 1 + device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) + print(num_replicas, rank, tp_size, device) + + total_size = len(questions) + questions = questions[rank:total_size:num_replicas] + args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") + else: + tp_size = 1 + + run_eval( + args.model_path, + args.model_path, + questions, + args.answer_file, + args.max_new_token, + args.temperature, + tp_size, + ) diff --git a/leanworkbook/inference_translate_answer.py b/leanworkbook/inference_translate_answer.py new file mode 100644 index 0000000..b6aefee --- /dev/null +++ b/leanworkbook/inference_translate_answer.py @@ -0,0 +1,156 @@ +import argparse +import json +import os +import torch +from tqdm import tqdm +from vllm import LLM, SamplingParams +import numpy as numpy +from transformers import AutoTokenizer + +def run_eval( + model_path, + model_id, + questions, + answer_file, + max_new_token, + temperature, + tp_size, +): + print('##################'+str(torch.cuda.is_available())) + #os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) + print(os.environ["CUDA_VISIBLE_DEVICES"]) + + tokenizer = AutoTokenizer.from_pretrained(model_path, use_fast=False, trust_remote_code=True) + special_tokens_dict = dict() + if tokenizer.pad_token is None: + special_tokens_dict["pad_token"] = '' + if tokenizer.eos_token is None: + special_tokens_dict["eos_token"] = '' + if tokenizer.bos_token is None: + special_tokens_dict["bos_token"] = '' + if tokenizer.unk_token is None: + special_tokens_dict["unk_token"] = '' + if len(special_tokens_dict) > 0 and model_path.find('Qwen') == -1: + tokenizer.add_special_tokens(special_tokens_dict) + + print(f"RANK: {os.environ['RANK']} | NUM_REPLICAS: {os.environ['WORLD_SIZE']} | DEVICE {os.environ['CUDA_VISIBLE_DEVICES']}") + print(f"Output to {answer_file}") + print(f"Num Questions: {len(questions)}") + print(f"TP: {tp_size}") + device = 'cuda:' + os.environ['RANK'] + + try: + model = LLM(model=model_path, tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + except RecursionError: + model = LLM(model=model_path, tokenizer_mode='slow', tensor_parallel_size=tp_size, trust_remote_code=True, dtype="bfloat16") + + sampling_params = SamplingParams(temperature=temperature, max_tokens=max_new_token, stop=['[UNUSED_TOKEN_146]', '[UNUSED_TOKEN_145]', 'by', 'sorry']) + + def get_query(example): + if 'answer' in example and 'prove' not in example['problem'].split(' ') and 'Prove' not in example['problem'].split(' ') and example['answer'] != '' and len(example['answer']) <= 30: + return "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + str(example['problem']) + "Show that it is " + str(example['answer']) + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\nHere is the formal statement in LEAN 4:\n```lean\ntheorem" + else: + return "[UNUSED_TOKEN_146]user\nConvert following problem into LEAN 4:\n" + str(example['problem']) + "[UNUSED_TOKEN_145]\n[UNUSED_TOKEN_146]assistant\nHere is the formal statement in LEAN 4:\n```lean\ntheorem" + + prompts = [get_query(example) for example in questions] + + prompt_id_map = {prompt: idx for idx, prompt in enumerate(prompts)} + + outputs = model.generate(prompts, sampling_params) + + for _, output in enumerate(outputs): + output_ids = output.outputs[0].token_ids + question = questions[prompt_id_map[output.prompt]] + + output = model.get_tokenizer().decode( + output_ids, + spaces_between_special_tokens=False, + ) + + for special_token in model.get_tokenizer().special_tokens_map.values(): + if isinstance(special_token, list): + for special_tok in special_token: + output = output.replace(special_tok, "") + else: + output = output.replace(special_token, "") + output = output.strip() + + question['output'] = output + question['generator'] = model_id + + # Dump answers + os.makedirs(os.path.dirname(answer_file), exist_ok=True) + with open(os.path.expanduser(answer_file), "a") as fout: + fout.write(json.dumps(question, ensure_ascii=False) + "\n") + +if __name__ == "__main__": + parser = argparse.ArgumentParser() + parser.add_argument( + "--model-path", + type=str, + required=True, + help="The path to the weights. This can be a local folder or a Hugging Face repo ID.", + ) + + parser.add_argument( + "--question-file", + type=str, + default=None, + help="The name of the benchmark question set.", + ) + parser.add_argument( + "--answer-file", + type=str, + default=None, + help="The output answer file.", + ) + parser.add_argument( + "--max-new-token", + type=int, + default=1024, + help="The maximum number of new generated tokens.", + ) + parser.add_argument( + "--temperature", + type=float, + default=0.7, + ) + parser.add_argument( + "--repeat_times", + type=int, + default=1, + ) + + args = parser.parse_args() + os.environ["CUDA_VISIBLE_DEVICES"] = str(os.environ['RANK']) + + with open(args.question_file, 'r') as f: + questions = [json.loads(item) for item in f.readlines()] + + if args.repeat_times > 1: + questions = questions * args.repeat_times + + if 'WORLD_SIZE' in os.environ and int(os.environ['WORLD_SIZE']) > 1: + num_replicas = int(os.environ['WORLD_SIZE']) + rank = int(os.environ['RANK']) + + tp_size = 1 + device = ','.join([str(i) for i in range(rank*tp_size, (rank+1)*tp_size)]) + + print(num_replicas, rank, tp_size, device) + + total_size = len(questions) + questions = questions[rank:total_size:num_replicas] + args.answer_file = args.answer_file.replace(".jsonl", f"_{rank}.jsonl") + else: + tp_size = 1 + + run_eval( + args.model_path, + args.model_path, + questions, + args.answer_file, + args.max_new_token, + args.temperature, + tp_size, + ) diff --git a/leanworkbook/readme.md b/leanworkbook/readme.md new file mode 100644 index 0000000..006e7a5 --- /dev/null +++ b/leanworkbook/readme.md @@ -0,0 +1,34 @@ +# Translate your natural language problem + +``` +torchrun --nproc-per-node=$NUMBER --master_port $PORT --rdzv-backend=c10d inference_translate_answer.py \ + --model-path "$MODEL_PATH" \ + --max-new-token 1000 \ + --temperature 0.01 \ + --repeat_times 1 \ + --question-file "$QUESTION_JSONL_FILE" \ + --answer-file "$OUTPUT_FILE_PATH" +``` + +Note that the python file will automatically create the output path. Your data jsonl file should use the same key as in our published datasets. + +# Running backtranslate or NLI +``` +torchrun --nproc-per-node=$NUMBER --master_port $PORT --rdzv-backend=c10d inference_backtranslate.py \ + --model-path "$MODEL_PATH" \ + --max-new-token 1000 \ + --temperature 0.01 \ + --repeat_times 1 \ + --question-file "$Translate_OUTPUT_FILE_PATH" \ + --answer-file "$BT_OUTPUT_FILE_PATH" + +torchrun --nproc-per-node=$NUMBER --master_port $PORT --rdzv-backend=c10d inference_nli.py \ + --model-path "QWEN_MODEL_PATH" \ + --max-new-token 1000 \ + --temperature 0.01 \ + --repeat_times 1 \ + --question-file "$BT_OUTPUT_FILE_PATH" \ + --answer-file "$NLI_OUTPUT_FILE_PATH" +``` + +If the NLI output contains same, then it passes the NLI test. \ No newline at end of file From 198cd267d3609fcbf02bf19aab52c70f461bd076 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 6 Jun 2024 11:50:07 +0800 Subject: [PATCH 17/41] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 3cde01e..8378306 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News +- [2024.06.06] We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) - [2024.05.24] We release updated version InternLM2-Math-Plus with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-intepreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. - [2024.02.10] We add tech reports and citation reference. - [2024.01.31] We add MiniF2F results with evaluation codes! From df88b81e2e4e45969306ba0fc7d712e8e9a8ebc8 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:00:49 +0800 Subject: [PATCH 18/41] Update readme.md --- leanworkbook/readme.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/leanworkbook/readme.md b/leanworkbook/readme.md index 006e7a5..02f648f 100644 --- a/leanworkbook/readme.md +++ b/leanworkbook/readme.md @@ -1,3 +1,8 @@ +# Lean Workbook +We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) + +![image](Workbook_main.jpg) + # Translate your natural language problem ``` @@ -26,9 +31,14 @@ torchrun --nproc-per-node=$NUMBER --master_port $PORT --rdzv-backend=c10d infere --model-path "QWEN_MODEL_PATH" \ --max-new-token 1000 \ --temperature 0.01 \ +``` + +# Citation +To be appended + --repeat_times 1 \ --question-file "$BT_OUTPUT_FILE_PATH" \ --answer-file "$NLI_OUTPUT_FILE_PATH" ``` -If the NLI output contains same, then it passes the NLI test. \ No newline at end of file +If the NLI output contains same, then it passes the NLI test. From a59e36db584dcc39fed14566488c722107820ea9 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 6 Jun 2024 12:01:08 +0800 Subject: [PATCH 19/41] Update readme.md --- leanworkbook/readme.md | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/leanworkbook/readme.md b/leanworkbook/readme.md index 02f648f..d442f0d 100644 --- a/leanworkbook/readme.md +++ b/leanworkbook/readme.md @@ -31,14 +31,12 @@ torchrun --nproc-per-node=$NUMBER --master_port $PORT --rdzv-backend=c10d infere --model-path "QWEN_MODEL_PATH" \ --max-new-token 1000 \ --temperature 0.01 \ -``` - -# Citation -To be appended - --repeat_times 1 \ --question-file "$BT_OUTPUT_FILE_PATH" \ --answer-file "$NLI_OUTPUT_FILE_PATH" ``` If the NLI output contains same, then it passes the NLI test. + +# Citation +To be appended From 84fc1c134e0db08fc13cedb466136dede0704a47 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Fri, 7 Jun 2024 10:42:43 +0800 Subject: [PATCH 20/41] Update README.md --- README.md | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/README.md b/README.md index 8378306..c12ad3e 100644 --- a/README.md +++ b/README.md @@ -288,4 +288,12 @@ Our model is still under development and will be upgraded. There are some possib archivePrefix={arXiv}, primaryClass={cs.CL} } +@misc{ying2024lean, + title={Lean Workbook: A large-scale Lean problem set formalized from natural language math problems}, + author={Huaiyuan Ying and Zijian Wu and Yihan Geng and Jiayu Wang and Dahua Lin and Kai Chen}, + year={2024}, + eprint={2406.03847}, + archivePrefix={arXiv}, + primaryClass={cs.CL} +} ``` From e59aac02d7923ab0b9a7ca14da24c0567288556c Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Fri, 7 Jun 2024 10:43:14 +0800 Subject: [PATCH 21/41] Update readme.md --- leanworkbook/readme.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/leanworkbook/readme.md b/leanworkbook/readme.md index d442f0d..e4dac76 100644 --- a/leanworkbook/readme.md +++ b/leanworkbook/readme.md @@ -36,6 +36,17 @@ torchrun --nproc-per-node=$NUMBER --master_port $PORT --rdzv-backend=c10d infere --answer-file "$NLI_OUTPUT_FILE_PATH" ``` +# Citation +``` +@misc{ying2024lean, + title={Lean Workbook: A large-scale Lean problem set formalized from natural language math problems}, + author={Huaiyuan Ying and Zijian Wu and Yihan Geng and Jiayu Wang and Dahua Lin and Kai Chen}, + year={2024}, + eprint={2406.03847}, + archivePrefix={arXiv}, + primaryClass={cs.CL} +} +``` If the NLI output contains same, then it passes the NLI test. # Citation From 5e286cc515b3a209cee85a77f47fbc7a667596da Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Fri, 7 Jun 2024 10:43:38 +0800 Subject: [PATCH 22/41] Update readme.md --- leanworkbook/readme.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/leanworkbook/readme.md b/leanworkbook/readme.md index e4dac76..e324709 100644 --- a/leanworkbook/readme.md +++ b/leanworkbook/readme.md @@ -35,6 +35,7 @@ torchrun --nproc-per-node=$NUMBER --master_port $PORT --rdzv-backend=c10d infere --question-file "$BT_OUTPUT_FILE_PATH" \ --answer-file "$NLI_OUTPUT_FILE_PATH" ``` +If the NLI output contains same, then it passes the NLI test. # Citation ``` @@ -47,7 +48,3 @@ torchrun --nproc-per-node=$NUMBER --master_port $PORT --rdzv-backend=c10d infere primaryClass={cs.CL} } ``` -If the NLI output contains same, then it passes the NLI test. - -# Citation -To be appended From f87f42d837add799ecafbf7540251975ae2b34f0 Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Sat, 8 Jun 2024 09:56:18 +0800 Subject: [PATCH 23/41] Update requirements.txt --- minif2f/requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/minif2f/requirements.txt b/minif2f/requirements.txt index eff20c0..fd4d9d6 100644 --- a/minif2f/requirements.txt +++ b/minif2f/requirements.txt @@ -1,4 +1,4 @@ -lean-dojo==1.1.2 -torch==2.1.2 -transformers==4.37.1 -vllm==0.2.7 \ No newline at end of file +lean-dojo==1.7.0 +torch==2.2.1 +transformers==4.40.1 +vllm==0.4.1 From db79f171242ef03add235e9b13547552635df9cb Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Sat, 8 Jun 2024 10:52:58 +0800 Subject: [PATCH 24/41] Update README.md --- minif2f/README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/minif2f/README.md b/minif2f/README.md index d9bb780..c9a2a35 100644 --- a/minif2f/README.md +++ b/minif2f/README.md @@ -29,3 +29,6 @@ export CONTAINER="native" cd scripts bash eval_internLM2-plus_7b.sh ``` + +#### About Lean4 version +The scripts fetch MiniF2F from [https://github.com/rah4927/lean-dojo-mew], which uses leanprover/lean4:nightly-2023-08-19. To use newer versions of Lean4, slight modifications may be needed. We provide a version of MiniF2F that works with leanprover/lean4:v4.7.0 at [https://github.com/wzj423/lean-dojo-mew]. To use a custom source for the MiniF2F dataset, change the `url` and `commit` fields in the minif2f/data/minif2f.jsonl file. From 68935c32858237c93b4cc99cea0dbf52d1f62ce3 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Sat, 8 Jun 2024 11:47:17 +0800 Subject: [PATCH 25/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index c12ad3e..23b9c02 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News -- [2024.06.06] We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) +- [2024.06.06] We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) - [2024.05.24] We release updated version InternLM2-Math-Plus with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-intepreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. - [2024.02.10] We add tech reports and citation reference. - [2024.01.31] We add MiniF2F results with evaluation codes! From ae33ed8443797185b457ded3fba10a935be5fa5b Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Sun, 9 Jun 2024 10:37:25 +0000 Subject: [PATCH 26/41] Upgrade MiniF2F's dependencies to lean v4.7.0 --- minif2f/data/minif2f-lean4.7.0.jsonl | 488 ++++++++++++++++++++++++++ minif2f/proofsearch_internLM2-plus.py | 36 +- 2 files changed, 510 insertions(+), 14 deletions(-) create mode 100644 minif2f/data/minif2f-lean4.7.0.jsonl diff --git a/minif2f/data/minif2f-lean4.7.0.jsonl b/minif2f/data/minif2f-lean4.7.0.jsonl new file mode 100644 index 0000000..4592ddb --- /dev/null +++ b/minif2f/data/minif2f-lean4.7.0.jsonl @@ -0,0 +1,488 @@ +{"full_name": "amc12a_2019_p21", "statement": "theorem amc12a_2019_p21 (z : \u2102) (h\u2080 : z = (1 + Complex.I) / Real.sqrt 2) :\n ((\u2211 k : \u2124 in Finset.Icc 1 12, z ^ k ^ 2) * (\u2211 k : \u2124 in Finset.Icc 1 12, 1 / z ^ k ^ 2)) = 36", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2015_p10", "statement": "theorem amc12a_2015_p10 (x y : \u2124) (h\u2080 : 0 < y) (h\u2081 : y < x) (h\u2082 : x + y + x * y = 80) : x = 26", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2008_p8", "statement": "theorem amc12a_2008_p8 (x y : \u211d) (h\u2080 : 0 < x \u2227 0 < y) (h\u2081 : y ^ 3 = 1)\n (h\u2082 : 6 * x ^ 2 = 2 * (6 * y ^ 2)) : x ^ 3 = 2 * Real.sqrt 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_182", "statement": "theorem mathd_algebra_182 (y : \u2102) : 7 * (3 * y + 2) = 21 * y + 14", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1984_p5", "statement": "theorem aime_1984_p5 (a b : \u211d) (h\u2080 : Real.logb 8 a + Real.logb 4 (b ^ 2) = 5)\n (h\u2081 : Real.logb 8 b + Real.logb 4 (a ^ 2) = 7) : a * b = 512", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_780", "statement": "theorem mathd_numbertheory_780 (m x : \u2115) (h\u2080 : 10 \u2264 m) (h\u2081 : m \u2264 99) (h\u2082 : 6 * x % m = 1)\n (h\u2083 : (x - 6 ^ 2) % m = 0) : m = 43", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_116", "statement": "theorem mathd_algebra_116 (k x : \u211d) (h\u2080 : x = (13 - Real.sqrt 131) / 4)\n (h\u2081 : 2 * x ^ 2 - 13 * x + k = 0) : k = 19 / 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_13", "statement": "theorem mathd_numbertheory_13 (u v : \u2115) (S : Set \u2115)\n (h\u2080 : \u2200 n : \u2115, n \u2208 S \u2194 0 < n \u2227 14 * n % 100 = 46) (h\u2081 : IsLeast S u)\n (h\u2082 : IsLeast (S \\ {u}) v) : (u + v : \u211a) / 2 = 64", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_169", "statement": "theorem mathd_numbertheory_169 : Nat.gcd 20! 200000 = 40000", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2009_p9", "statement": "theorem amc12a_2009_p9 (a b c : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f (x + 3) = 3 * x ^ 2 + 7 * x + 4)\n (h\u2081 : \u2200 x, f x = a * x ^ 2 + b * x + c) : a + b + c = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2019_p9", "statement": "theorem amc12a_2019_p9 (a : \u2115 \u2192 \u211a) (h\u2080 : a 1 = 1) (h\u2081 : a 2 = 3 / 7)\n (h\u2082 : \u2200 n, a (n + 2) = a n * a (n + 1) / (2 * a n - a (n + 1))) :\n \u2191(a 2019).den + (a 2019).num = 8078", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_13", "statement": "theorem mathd_algebra_13 (a b : \u211d)\n (h\u2080 : \u2200 x, x - 3 \u2260 0 \u2227 x - 5 \u2260 0 \u2192 4 * x / (x ^ 2 - 8 * x + 15) = a / (x - 3) + b / (x - 5)) :\n a = -6 \u2227 b = 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "induction_sum2kp1npqsqm1", "statement": "theorem induction_sum2kp1npqsqm1 (n : \u2115) :\n (\u2211 k in Finset.range n, 2 * k + 3) = (n + 1) ^ 2 - 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1991_p6", "statement": "theorem aime_1991_p6 (r : \u211d) (h\u2080 : (\u2211 k in Finset.Icc (19 : \u2115) 91, Int.floor (r + k / 100)) = 546) :\n Int.floor (100 * r) = 743", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_149", "statement": "theorem mathd_numbertheory_149 :\n (\u2211 k in Finset.filter (fun x => x % 8 = 5 \u2227 x % 6 = 3) (Finset.range 50), k) = 66", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1984_p2", "statement": "theorem imo_1984_p2 (a b : \u2115) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : \u00ac7 \u2223 a) (h\u2082 : \u00ac7 \u2223 b) (h\u2083 : \u00ac7 \u2223 a + b)\n (h\u2084 : 7 ^ 7 \u2223 (a + b) ^ 7 - a ^ 7 - b ^ 7) : 19 \u2264 a + b", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2008_p4", "statement": "theorem amc12a_2008_p4 : (\u220f k in Finset.Icc (1 : \u2115) 501, ((4 : \u211d) * k + 4) / (4 * k)) = 502", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_2006_p6", "statement": "theorem imo_2006_p6 (a b c : \u211d) :\n a * b * (a ^ 2 - b ^ 2) + b * c * (b ^ 2 - c ^ 2) + c * a * (c ^ 2 - a ^ 2) \u2264\n 9 * Real.sqrt 2 / 32 * (a ^ 2 + b ^ 2 + c ^ 2) ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_462", "statement": "theorem mathd_algebra_462 : ((1 : \u211a) / 2 + 1 / 3) * (1 / 2 - 1 / 3) = 5 / 36", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1964_p1_2", "statement": "theorem imo_1964_p1_2 (n : \u2115) : \u00ac7 \u2223 2 ^ n + 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_221", "statement": "theorem mathd_numbertheory_221 (S : Finset \u2115)\n (h\u2080 : \u2200 x : \u2115, x \u2208 S \u2194 0 < x \u2227 x < 1000 \u2227 x.divisors.card = 3) : S.card = 11", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_64", "statement": "theorem mathd_numbertheory_64 : IsLeast { x : \u2115 | 30 * x \u2261 42 [MOD 47] } 39", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1987_p4", "statement": "theorem imo_1987_p4 (f : \u2115 \u2192 \u2115) : \u2203 n, f (f n) \u2260 n + 1987", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_33", "statement": "theorem mathd_numbertheory_33 (n : \u2115) (h\u2080 : n < 398) (h\u2081 : n * 7 % 398 = 1) : n = 57", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12_2001_p9", "statement": "theorem amc12_2001_p9 (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x > 0, \u2200 y > 0, f (x * y) = f x / y) (h\u2081 : f 500 = 3) :\n f 600 = 5 / 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1965_p1", "statement": "theorem imo_1965_p1 (x : \u211d) (h\u2080 : 0 \u2264 x) (h\u2081 : x \u2264 2 * \u03c0)\n (h\u2082 :\n 2 * Real.cos x \u2264 abs (Real.sqrt (1 + Real.sin (2 * x)) - Real.sqrt (1 - Real.sin (2 * x))))\n (h\u2083 : abs (Real.sqrt (1 + Real.sin (2 * x)) - Real.sqrt (1 - Real.sin (2 * x))) \u2264 Real.sqrt 2) :\n \u03c0 / 4 \u2264 x \u2227 x \u2264 7 * \u03c0 / 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_48", "statement": "theorem mathd_numbertheory_48 (b : \u2115) (h\u2080 : 0 < b) (h\u2081 : 3 * b ^ 2 + 2 * b + 1 = 57) : b = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "numbertheory_sqmod4in01d", "statement": "theorem numbertheory_sqmod4in01d (a : \u2124) : a ^ 2 % 4 = 0 \u2228 a ^ 2 % 4 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_466", "statement": "theorem mathd_numbertheory_466 : (\u2211 k in Finset.range 11, k) % 9 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_48", "statement": "theorem mathd_algebra_48 (q e : \u2102) (h\u2080 : q = 9 - 4 * Complex.I) (h\u2081 : e = -3 - 4 * Complex.I) :\n q - e = 12", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12_2000_p15", "statement": "theorem amc12_2000_p15 (f : \u2102 \u2192 \u2102) (h\u2080 : \u2200 x, f (x / 3) = x ^ 2 + x + 1)\n (h\u2081 : Fintype (f \u207b\u00b9' {7})) : (\u2211 y in (f \u207b\u00b9' {7}).toFinset, y / 3) = -1 / 9", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_132", "statement": "theorem mathd_numbertheory_132 : 2004 % 12 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2009_p5", "statement": "theorem amc12a_2009_p5 (x : \u211d) (h\u2080 : x ^ 3 - (x + 1) * (x - 1) * x = 5) : x ^ 3 = 125", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_188", "statement": "theorem mathd_numbertheory_188 : Nat.gcd 180 168 = 12", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_224", "statement": "theorem mathd_algebra_224 (S : Finset \u2115)\n (h\u2080 : \u2200 n : \u2115, n \u2208 S \u2194 Real.sqrt n < 7 / 2 \u2227 2 < Real.sqrt n) : S.card = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "induction_divisibility_3divnto3m2n", "statement": "theorem induction_divisibility_3divnto3m2n (n : \u2115) : 3 \u2223 n ^ 3 + 2 * n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "induction_sum_1oktkp1", "statement": "theorem induction_sum_1oktkp1 (n : \u2115) :\n (\u2211 k in Finset.range n, (1 : \u211d) / ((k + 1) * (k + 2))) = n / (n + 1)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_32", "statement": "theorem mathd_numbertheory_32 (S : Finset \u2115) (h\u2080 : \u2200 n : \u2115, n \u2208 S \u2194 n \u2223 36) : (\u2211 k in S, k) = 91", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_422", "statement": "theorem mathd_algebra_422 (x : \u211d) (\u03c3 : Equiv \u211d \u211d) (h\u2080 : \u2200 x, \u03c3.1 x = 5 * x - 12)\n (h\u2081 : \u03c3.1 (x + 1) = \u03c3.2 x) : x = 47 / 24", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2002_p11", "statement": "theorem amc12b_2002_p11 (a b : \u2115) (h\u2080 : Nat.Prime a) (h\u2081 : Nat.Prime b) (h\u2082 : Nat.Prime (a + b))\n (h\u2083 : Nat.Prime (a - b)) : Nat.Prime (a + b + (a - b + (a + b)))", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_73", "statement": "theorem mathd_algebra_73 (p q r x : \u2102) (h\u2080 : (x - p) * (x - q) = (r - p) * (r - q)) (h\u2081 : x \u2260 r) :\n x = p + q - r", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_109", "statement": "theorem mathd_numbertheory_109 (v : \u2115 \u2192 \u2115) (h\u2080 : \u2200 n, v n = 2 * n - 1) :\n (\u2211 k in Finset.Icc 1 100, v k) % 7 = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_xmysqpymzsqpzmxsqeqxyz_xpypzp6dvdx3y3z3", "statement": "theorem algebra_xmysqpymzsqpzmxsqeqxyz_xpypzp6dvdx3y3z3 (x y z : \u2124)\n (h\u2080 : (x - y) ^ 2 + (y - z) ^ 2 + (z - x) ^ 2 = x * y * z) :\n x + y + z + 6 \u2223 x ^ 3 + y ^ 3 + z ^ 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1962_p4", "statement": "theorem imo_1962_p4 (S : Set \u211d)\n (h\u2080 : S = { x : \u211d | Real.cos x ^ 2 + Real.cos (2 * x) ^ 2 + Real.cos (3 * x) ^ 2 = 1 }) :\n S =\n { x : \u211d |\n \u2203 m : \u2124,\n x = \u03c0 / 2 + m * \u03c0 \u2228\n x = \u03c0 / 4 + m * \u03c0 / 2 \u2228 x = \u03c0 / 6 + m * \u03c0 / 6 \u2228 x = 5 * \u03c0 / 6 + m * \u03c0 / 6 }", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_236", "statement": "theorem mathd_numbertheory_236 : 1999 ^ 2000 % 5 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_24", "statement": "theorem mathd_numbertheory_24 : (\u2211 k in Finset.Icc 1 9, 11 ^ k) % 100 = 59", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_amgm_prod1toneq1_sum1tongeqn", "statement": "theorem algebra_amgm_prod1toneq1_sum1tongeqn (a : \u2115 \u2192 NNReal) (n : \u2115)\n (h\u2080 : Finset.prod (Finset.range n) a = 1) : Finset.sum (Finset.range n) a \u2265 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_101", "statement": "theorem mathd_algebra_101 (x : \u211d) (h\u2080 : x ^ 2 - 5 * x - 4 \u2264 10) : x \u2265 -2 \u2227 x \u2264 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_257", "statement": "theorem mathd_numbertheory_257 (x : \u2115) (h\u2080 : 1 \u2264 x \u2227 x \u2264 100)\n (h\u2081 : 77 \u2223 (\u2211 k in Finset.range 101, k) - x) : x = 45", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12_2000_p5", "statement": "theorem amc12_2000_p5 (x p : \u211d) (h\u2080 : x < 2) (h\u2081 : abs (x - 2) = p) : x - p = 2 - 2 * p", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_547", "statement": "theorem mathd_algebra_547 (x y : \u211d) (h\u2080 : x = 5) (h\u2081 : y = 2) : Real.sqrt (x ^ 3 - 2 ^ y) = 11", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_200", "statement": "theorem mathd_numbertheory_200 : 139 % 11 = 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_510", "statement": "theorem mathd_algebra_510 (x y : \u211d) (h\u2080 : x + y = 13) (h\u2081 : x * y = 24) :\n Real.sqrt (x ^ 2 + y ^ 2) = 11", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_140", "statement": "theorem mathd_algebra_140 (a b c : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c)\n (h\u2081 : \u2200 x, 24 * x ^ 2 - 19 * x - 35 = (a * x - 5) * (2 * (b * x) + c)) : a * b - 3 * c = -9", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_455", "statement": "theorem mathd_algebra_455 (x : \u211d) (h\u2080 : 2 * (2 * (2 * (2 * x))) = 48) : x = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_45", "statement": "theorem mathd_numbertheory_45 : Nat.gcd 6432 132 + 11 = 23", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1994_p4", "statement": "theorem aime_1994_p4 (n : \u2115) (h\u2080 : 0 < n)\n (h\u2080 : (\u2211 k in Finset.Icc 1 n, Int.floor (Real.logb 2 k)) = 1994) : n = 312", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_739", "statement": "theorem mathd_numbertheory_739 : 9! % 10 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_245", "statement": "theorem mathd_algebra_245 (x : \u211d) (h\u2080 : x \u2260 0) :\n (4 / x)\u207b\u00b9 * (3 * x ^ 3 / x) ^ 2 * (1 / (2 * x))\u207b\u00b9 ^ 3 = 18 * x ^ 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_apb4leq8ta4pb4", "statement": "theorem algebra_apb4leq8ta4pb4 (a b : \u211d) (h\u2080 : 0 < a \u2227 0 < b) : (a + b) ^ 4 \u2264 8 * (a ^ 4 + b ^ 4)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_28", "statement": "theorem mathd_algebra_28 (c : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = 2 * x ^ 2 + 5 * x + c)\n (h\u2081 : \u2203 x, f x \u2264 0) : c \u2264 25 / 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_543", "statement": "theorem mathd_numbertheory_543 : (\u2211 k in Nat.divisors (30 ^ 4), 1) - 2 = 123", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_480", "statement": "theorem mathd_algebra_480 (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x < 0, f x = -x ^ 2 - 1)\n (h\u2081 : \u2200 x, 0 \u2264 x \u2227 x < 4 \u2192 f x = 2) (h\u2082 : \u2200 x \u2265 4, f x = Real.sqrt x) : f \u03c0 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_69", "statement": "theorem mathd_algebra_69 (rows seats : \u2115) (h\u2080 : rows * seats = 450)\n (h\u2081 : (rows + 5) * (seats - 3) = 450) : rows = 25", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_433", "statement": "theorem mathd_algebra_433 (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = 3 * Real.sqrt (2 * x - 7) - 8) : f 8 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_126", "statement": "theorem mathd_algebra_126 (x y : \u211d) (h\u2080 : 2 * 3 = x - 9) (h\u2081 : 2 * -5 = y + 1) : x = 15 \u2227 y = -11", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aimeII_2020_p6", "statement": "theorem aimeII_2020_p6 (t : \u2115 \u2192 \u211a) (h\u2080 : t 1 = 20) (h\u2081 : t 2 = 21)\n (h\u2082 : \u2200 n \u2265 3, t n = (5 * t (n - 1) + 1) / (25 * t (n - 2))) :\n \u2191(t 2020).den + (t 2020).num = 626", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2008_p2", "statement": "theorem amc12a_2008_p2 (x : \u211d) (h\u2080 : x * (1 / 2 + 2 / 3) = 1) : x = 6 / 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_35", "statement": "theorem mathd_algebra_35 (p q : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, p x = 2 - x ^ 2)\n (h\u2081 : \u2200 (x) (_ : x \u2260 0), q x = 6 / x) : p (q 2) = -7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_amgm_faxinrrp2msqrt2geq2mxm1div2x", "statement": "theorem algebra_amgm_faxinrrp2msqrt2geq2mxm1div2x :\n \u2200 x > 0, 2 - Real.sqrt 2 \u2265 2 - x - 1 / (2 * x)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_335", "statement": "theorem mathd_numbertheory_335 (n : \u2115) (h\u2080 : n % 7 = 5) : 5 * n % 7 = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_35", "statement": "theorem mathd_numbertheory_35 (S : Finset \u2115) (h\u2080 : \u2200 n : \u2115, n \u2223 Nat.sqrt 196) :\n (\u2211 k in S, k) = 24", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2021_p7", "statement": "theorem amc12a_2021_p7 (x y : \u211d) : 1 \u2264 (x * y - 1) ^ 2 + (x + y) ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_327", "statement": "theorem mathd_algebra_327 (a : \u211d) (h\u2080 : 1 / 5 * abs (9 + 2 * a) < 1) : -7 < a \u2227 a < -2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1984_p15", "statement": "theorem aime_1984_p15 (x y z w : \u211d)\n (h\u2080 :\n x ^ 2 / (2 ^ 2 - 1) + y ^ 2 / (2 ^ 2 - 3 ^ 2) + z ^ 2 / (2 ^ 2 - 5 ^ 2) +\n w ^ 2 / (2 ^ 2 - 7 ^ 2) =\n 1)\n (h\u2081 :\n x ^ 2 / (4 ^ 2 - 1) + y ^ 2 / (4 ^ 2 - 3 ^ 2) + z ^ 2 / (4 ^ 2 - 5 ^ 2) +\n w ^ 2 / (4 ^ 2 - 7 ^ 2) =\n 1)\n (h\u2082 :\n x ^ 2 / (6 ^ 2 - 1) + y ^ 2 / (6 ^ 2 - 3 ^ 2) + z ^ 2 / (6 ^ 2 - 5 ^ 2) +\n w ^ 2 / (6 ^ 2 - 7 ^ 2) =\n 1)\n (h\u2083 :\n x ^ 2 / (8 ^ 2 - 1) + y ^ 2 / (8 ^ 2 - 3 ^ 2) + z ^ 2 / (8 ^ 2 - 5 ^ 2) +\n w ^ 2 / (8 ^ 2 - 7 ^ 2) =\n 1) :\n x ^ 2 + y ^ 2 + z ^ 2 + w ^ 2 = 36", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_amgm_sqrtxymulxmyeqxpy_xpygeq4", "statement": "theorem algebra_amgm_sqrtxymulxmyeqxpy_xpygeq4 (x y : \u211d) (h\u2080 : 0 < x \u2227 0 < y) (h\u2081 : y \u2264 x)\n (h\u2082 : Real.sqrt (x * y) * (x - y) = x + y) : x + y \u2265 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2002_p21", "statement": "theorem amc12a_2002_p21 (u : \u2115 \u2192 \u2115) (h\u2080 : u 0 = 4) (h\u2081 : u 1 = 7)\n (h\u2082 : \u2200 n \u2265 2, u (n + 2) = (u n + u (n + 1)) % 10) :\n \u2200 n, (\u2211 k in Finset.range n, u k) > 10000 \u2192 1999 \u2264 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_192", "statement": "theorem mathd_algebra_192 (q e d : \u2102) (h\u2080 : q = 11 - 5 * Complex.I) (h\u2081 : e = 11 + 5 * Complex.I)\n (h\u2082 : d = 2 * Complex.I) : q * e * d = 292 * Complex.I", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2002_p6", "statement": "theorem amc12b_2002_p6 (a b : \u211d) (h\u2080 : a \u2260 0 \u2227 b \u2260 0)\n (h\u2081 : \u2200 x, x ^ 2 + a * x + b = (x - a) * (x - b)) : a = 1 \u2227 b = -2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_102", "statement": "theorem mathd_numbertheory_102 : 2 ^ 8 % 5 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2010_p22", "statement": "theorem amc12a_2010_p22 (x : \u211d) : 49 \u2264 \u2211 k:\u2124 in Finset.Icc 1 119, abs (\u2191k * x - 1)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_81", "statement": "theorem mathd_numbertheory_81 : 71 % 3 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_155", "statement": "theorem mathd_numbertheory_155 :\n Finset.card (Finset.filter (fun x => x % 19 = 7) (Finset.Icc 100 999)) = 48", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1978_p5", "statement": "theorem imo_1978_p5 (n : \u2115) (a : \u2115 \u2192 \u2115) (h\u2080 : Function.Injective a) (h\u2081 : a 0 = 0) (h\u2082 : 0 < n) :\n (\u2211 k in Finset.Icc 1 n, (1 : \u211d) / k) \u2264 \u2211 k in Finset.Icc 1 n, a k / k ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2017_p7", "statement": "theorem amc12a_2017_p7 (f : \u2115 \u2192 \u211d) (h\u2080 : f 1 = 2) (h\u2081 : \u2200 n, 1 < n \u2227 Even n \u2192 f n = f (n - 1) + 1)\n (h\u2082 : \u2200 n, 1 < n \u2227 Odd n \u2192 f n = f (n - 2) + 2) : f 2017 = 2018", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_42", "statement": "theorem mathd_numbertheory_42 (S : Set \u2115) (u v : \u2115) (h\u2080 : \u2200 a : \u2115, a \u2208 S \u2194 0 < a \u2227 27 * a % 40 = 17)\n (h\u2081 : IsLeast S u) (h\u2082 : IsLeast (S \\ {u}) v) : u + v = 62", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_110", "statement": "theorem mathd_algebra_110 (q e : \u2102) (h\u2080 : q = 2 - 2 * Complex.I) (h\u2081 : e = 5 + 5 * Complex.I) :\n q * e = 20", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2021_p21", "statement": "theorem amc12b_2021_p21 (S : Finset \u211d)\n (h\u2080 : \u2200 x : \u211d, x \u2208 S \u2194 0 < x \u2227 x ^ (2 : \u211d) ^ Real.sqrt 2 = Real.sqrt 2 ^ (2 : \u211d) ^ x) :\n (\u21912 \u2264 \u2211 k in S, k) \u2227 (\u2211 k in S, k) < 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_405", "statement": "theorem mathd_algebra_405 (S : Finset \u2115) (h\u2080 : \u2200 x, x \u2208 S \u2194 0 < x \u2227 x ^ 2 + 4 * x + 4 < 20) :\n S.card = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "numbertheory_sumkmulnckeqnmul2pownm1", "statement": "theorem numbertheory_sumkmulnckeqnmul2pownm1 (n : \u2115) (h\u2080 : 0 < n) :\n (\u2211 k in Finset.Icc 1 n, k * Nat.choose n k) = n * 2 ^ (n - 1)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_393", "statement": "theorem mathd_algebra_393 (\u03c3 : Equiv \u211d \u211d) (h\u2080 : \u2200 x, \u03c3.1 x = 4 * x ^ 3 + 1) : \u03c3.2 33 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2004_p3", "statement": "theorem amc12b_2004_p3 (x y : \u2115) (h\u2080 : 2 ^ x * 3 ^ y = 1296) : x + y = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_303", "statement": "theorem mathd_numbertheory_303 (S : Finset \u2115)\n (h\u2080 : \u2200 n : \u2115, n \u2208 S \u2194 2 \u2264 n \u2227 171 \u2261 80 [MOD n] \u2227 468 \u2261 13 [MOD n]) : (\u2211 k in S, k) = 111", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_151", "statement": "theorem mathd_algebra_151 : Int.ceil (Real.sqrt 27) - Int.floor (Real.sqrt 26) = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2011_p18", "statement": "theorem amc12a_2011_p18 (x y : \u211d) (h\u2080 : abs (x + y) + abs (x - y) = 2) :\n x ^ 2 - 6 * x + y ^ 2 \u2264 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_15", "statement": "theorem mathd_algebra_15 (s : \u2115 \u2192 \u2115 \u2192 \u2115)\n (h\u2080 : \u2200 a b, 0 < a \u2227 0 < b \u2192 s a b = a ^ (b : \u2115) + b ^ (a : \u2115)) : s 2 6 = 100", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_211", "statement": "theorem mathd_numbertheory_211 :\n Finset.card (Finset.filter (fun n => 6 \u2223 4 * \u2191n - (2 : \u2124)) (Finset.range 60)) = 20", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_640", "statement": "theorem mathd_numbertheory_640 : (91145 + 91146 + 91147 + 91148) % 4 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2003_p6", "statement": "theorem amc12b_2003_p6 (a r : \u211d) (u : \u2115 \u2192 \u211d) (h\u2080 : \u2200 k, u k = a * r ^ k) (h\u2081 : u 1 = 2)\n (h\u2082 : u 3 = 6) : u 0 = 2 / Real.sqrt 3 \u2228 u 0 = -(2 / Real.sqrt 3)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_2rootsintpoly_am10tap11eqasqpam110", "statement": "theorem algebra_2rootsintpoly_am10tap11eqasqpam110 (a : \u2102) :\n (a - 10) * (a + 11) = a ^ 2 + a - 110", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1991_p1", "statement": "theorem aime_1991_p1 (x y : \u2115) (h\u2080 : 0 < x \u2227 0 < y) (h\u2081 : x * y + (x + y) = 71)\n (h\u2082 : x ^ 2 * y + x * y ^ 2 = 880) : x ^ 2 + y ^ 2 = 146", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_43", "statement": "theorem mathd_algebra_43 (a b : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = a * x + b) (h\u2081 : f 7 = 4)\n (h\u2082 : f 6 = 3) : f 3 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1988_p6", "statement": "theorem imo_1988_p6 (a b : \u2115) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : a * b + 1 \u2223 a ^ 2 + b ^ 2) :\n \u2203 x : \u2115, (x ^ 2 : \u211d) = (a ^ 2 + b ^ 2) / (a * b + 1)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1996_p5", "statement": "theorem aime_1996_p5 (a b c r s t : \u211d) (f g : \u211d \u2192 \u211d)\n (h\u2080 : \u2200 x, f x = x ^ 3 + 3 * x ^ 2 + 4 * x - 11) (h\u2081 : \u2200 x, g x = x ^ 3 + r * x ^ 2 + s * x + t)\n (h\u2082 : f a = 0) (h\u2083 : f b = 0) (h\u2084 : f c = 0) (h\u2085 : g (a + b) = 0) (h\u2086 : g (b + c) = 0)\n (h\u2087 : g (c + a) = 0) (h\u2088 : List.Pairwise (\u00b7 \u2260 \u00b7) [a, b, c]) : t = 23", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_55", "statement": "theorem mathd_algebra_55 (q p : \u211d) (h\u2080 : q = 2 - 4 + 6 - 8 + 10 - 12 + 14)\n (h\u2081 : p = 3 - 6 + 9 - 12 + 15 - 18 + 21) : q / p = 2 / 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_sqineq_2at2pclta2c2p41pc", "statement": "theorem algebra_sqineq_2at2pclta2c2p41pc (a c : \u211d) :\n 2 * a * (2 + c) \u2264 a ^ 2 + c ^ 2 + 4 * (1 + c)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_43", "statement": "theorem mathd_numbertheory_43 : IsGreatest { n : \u2115 | 15 ^ n \u2223 942! } 233", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_214", "statement": "theorem mathd_algebra_214 (a : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = a * (x - 2) ^ 2 + 3) (h\u2081 : f 4 = 4) :\n f 6 = 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_96", "statement": "theorem mathd_algebra_96 (x y z a : \u211d) (h\u2080 : 0 < x \u2227 0 < y \u2227 0 < z)\n (h\u2081 : Real.log x - Real.log y = a) (h\u2082 : Real.log y - Real.log z = 15)\n (h\u2083 : Real.log z - Real.log x = -7) : a = -8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12_2001_p2", "statement": "theorem amc12_2001_p2 (a b n : \u2115) (h\u2080 : 1 \u2264 a \u2227 a \u2264 9) (h\u2081 : 0 \u2264 b \u2227 b \u2264 9) (h\u2082 : n = 10 * a + b)\n (h\u2083 : n = a * b + a + b) : b = 9", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_185", "statement": "theorem mathd_algebra_185 (s : Finset \u2124) (f : \u2124 \u2192 \u2124) (h\u2080 : \u2200 x, f x = abs (x + 4))\n (h\u2081 : \u2200 x, x \u2208 s \u2194 f x < 9) : s.card = 17", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_binomnegdiscrineq_10alt28asqp1", "statement": "theorem algebra_binomnegdiscrineq_10alt28asqp1 (a : \u211d) : 10 * a \u2264 28 * a ^ 2 + 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_284", "statement": "theorem mathd_numbertheory_284 (a b : \u2115) (h\u2080 : 1 \u2264 a \u2227 a \u2264 9 \u2227 b \u2264 9)\n (h\u2081 : 10 * a + b = 2 * (a + b)) : 10 * a + b = 18", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2009_p2", "statement": "theorem amc12a_2009_p2 : 1 + 1 / (1 + 1 / (1 + 1)) = (5 : \u211a) / 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_709", "statement": "theorem mathd_numbertheory_709 (n : \u2115) (h\u2080 : 0 < n) (h\u2081 : Finset.card (Nat.divisors (2 * n)) = 28)\n (h\u2082 : Finset.card (Nat.divisors (3 * n)) = 30) : Finset.card (Nat.divisors (6 * n)) = 35", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2013_p8", "statement": "theorem amc12a_2013_p8 (x y : \u211d) (h\u2080 : x \u2260 0) (h\u2081 : y \u2260 0) (h\u2082 : x \u2260 y)\n (h\u2083 : x + 2 / x = y + 2 / y) : x * y = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_461", "statement": "theorem mathd_numbertheory_461 (n : \u2115)\n (h\u2080 : n = Finset.card (Finset.filter (fun x => Nat.gcd x 8 = 1) (Finset.Icc 1 7))) :\n 3 ^ n % 8 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_59", "statement": "theorem mathd_algebra_59 (b : \u211d) (h\u2080 : (4 : \u211d) ^ b + 2 ^ 3 = 12) : b = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_234", "statement": "theorem mathd_algebra_234 (d : \u211d) (h\u2080 : 27 / 125 * d = 9 / 25) : 3 / 5 * d ^ 3 = 25 / 9", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1973_p3", "statement": "theorem imo_1973_p3 (a b : \u211d) (h\u2080 : \u2203 x, x ^ 4 + a * x ^ 3 + b * x ^ 2 + a * x + 1 = 0) :\n 4 / 5 \u2264 a ^ 2 + b ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2020_p5", "statement": "theorem amc12b_2020_p5 (a b : \u2115) (h\u2080 : (5 : \u211a) / 8 * b = 2 / 3 * a + 7)\n (h\u2081 : (b : \u211a) - 5 / 8 * b = a - 2 / 3 * a + 7) : a = 42", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "numbertheory_sqmod3in01d", "statement": "theorem numbertheory_sqmod3in01d (a : \u2124) : a ^ 2 % 3 = 0 \u2228 a ^ 2 % 3 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_131", "statement": "theorem mathd_algebra_131 (a b : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = 2 * x ^ 2 - 7 * x + 2)\n (h\u2081 : f a = 0) (h\u2082 : f b = 0) (h\u2083 : a \u2260 b) : 1 / (a - 1) + 1 / (b - 1) = -1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2003_p17", "statement": "theorem amc12b_2003_p17 (x y : \u211d) (h\u2080 : 0 < x \u2227 0 < y) (h\u2081 : Real.log (x * y ^ 3) = 1)\n (h\u2082 : Real.log (x ^ 2 * y) = 1) : Real.log (x * y) = 3 / 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_536", "statement": "theorem mathd_algebra_536 : \u21913! * ((2 : \u211d) ^ 3 + Real.sqrt 9) / 2 = (33 : \u211d)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_22", "statement": "theorem mathd_algebra_22 : Real.logb (5 ^ 2) (5 ^ 4) = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "numbertheory_xsqpysqintdenomeq", "statement": "theorem numbertheory_xsqpysqintdenomeq (x y : \u211a) (h\u2080 : (x ^ 2 + y ^ 2).den = 1) : x.den = y.den", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aimeII_2001_p3", "statement": "theorem aimeII_2001_p3 (x : \u2115 \u2192 \u2124) (h\u2080 : x 1 = 211) (h\u2082 : x 2 = 375) (h\u2083 : x 3 = 420)\n (h\u2084 : x 4 = 523) (h\u2086 : \u2200 n \u2265 5, x n = x (n - 1) - x (n - 2) + x (n - 3) - x (n - 4)) :\n x 531 + x 753 + x 975 = 898", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_22", "statement": "theorem mathd_numbertheory_22 (b : \u2115) (h\u2080 : b < 10)\n (h\u2081 : Nat.sqrt (10 * b + 6) * Nat.sqrt (10 * b + 6) = 10 * b + 6) : b = 3 \u2228 b = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1987_p8", "statement": "theorem aime_1987_p8 :\n IsGreatest { n : \u2115 | 0 < n \u2227 \u2203! k : \u2115, (8 : \u211d) / 15 < n / (n + k) \u2227 (n : \u211d) / (n + k) < 7 / 13 }\n 112", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_136", "statement": "theorem mathd_numbertheory_136 (n : \u2115) (h\u2080 : 123 * n + 17 = 39500) : n = 321", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12_2000_p11", "statement": "theorem amc12_2000_p11 (a b : \u211d) (h\u2080 : a \u2260 0 \u2227 b \u2260 0) (h\u2081 : a * b = a - b) :\n a / b + b / a - a * b = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2003_p9", "statement": "theorem amc12b_2003_p9 (a b : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = a * x + b) (h\u2081 : f 6 - f 2 = 12) :\n f 12 - f 2 = 30", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_2complexrootspoly_xsqp49eqxp7itxpn7i", "statement": "theorem algebra_2complexrootspoly_xsqp49eqxp7itxpn7i (x : \u2102) :\n x ^ 2 + 49 = (x + 7 * Complex.I) * (x + -7 * Complex.I)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_198", "statement": "theorem mathd_numbertheory_198 : 5 ^ 2005 % 100 = 25", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_149", "statement": "theorem mathd_algebra_149 (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x < -5, f x = x ^ 2 + 5)\n (h\u2081 : \u2200 x \u2265 -5, f x = 3 * x - 8) (h\u2082 : Fintype (f \u207b\u00b9' {10})) :\n (\u2211 k in (f \u207b\u00b9' {10}).toFinset, k) = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_132", "statement": "theorem mathd_algebra_132 (x : \u211d) (f g : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = x + 2) (h\u2081 : \u2200 x, g x = x ^ 2)\n (h\u2082 : f (g x) = g (f x)) : x = -1 / 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_37", "statement": "theorem mathd_numbertheory_37 : Nat.lcm 9999 100001 = 90900909", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1983_p9", "statement": "theorem aime_1983_p9 (x : \u211d) (h\u2080 : 0 < x \u2227 x < Real.pi) :\n 12 \u2264 (9 * (x ^ 2 * Real.sin x ^ 2) + 4) / (x * Real.sin x)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_37", "statement": "theorem mathd_algebra_37 (x y : \u211d) (h\u2080 : x + y = 7) (h\u2081 : 3 * x + y = 45) : x ^ 2 - y ^ 2 = 217", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_458", "statement": "theorem mathd_numbertheory_458 (n : \u2115) (h\u2080 : n % 8 = 7) : n % 4 = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2008_p15", "statement": "theorem amc12a_2008_p15 (k : \u2115) (h\u2080 : k = 2008 ^ 2 + 2 ^ 2008) : (k ^ 2 + 2 ^ k) % 10 = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_301", "statement": "theorem mathd_numbertheory_301 (j : \u2115) (h\u2080 : 0 < j) : 3 * (7 * \u2191j + 3) % 7 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2009_p15", "statement": "theorem amc12a_2009_p15 (n : \u2115) (h\u2080 : 0 < n)\n (h\u2081 : (\u2211 k in Finset.Icc 1 n, \u2191k * Complex.I ^ k) = 48 + 49 * Complex.I) : n = 97", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_sqineq_36azm9asqle36zsq", "statement": "theorem algebra_sqineq_36azm9asqle36zsq (z a : \u211d) : 36 * (a * z) - 9 * a ^ 2 \u2264 36 * z ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2013_p7", "statement": "theorem amc12a_2013_p7 (s : \u2115 \u2192 \u211d) (h\u2080 : \u2200 n, s (n + 2) = s (n + 1) + s n) (h\u2081 : s 9 = 110)\n (h\u2082 : s 7 = 42) : s 4 = 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_104", "statement": "theorem mathd_algebra_104 (x : \u211d) (h\u2080 : 125 / 8 = x / 12) : x = 375 / 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_252", "statement": "theorem mathd_numbertheory_252 : 7! % 23 = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2020_p21", "statement": "theorem amc12a_2020_p21 (S : Finset \u2115)\n (h\u2080 : \u2200 n : \u2115, n \u2208 S \u2194 5 \u2223 n \u2227 Nat.lcm 5! n = 5 * Nat.gcd 10! n) : S.card = 48", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_493", "statement": "theorem mathd_algebra_493 (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = x ^ 2 - 4 * Real.sqrt x + 1) :\n f (f 4) = 70", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "numbertheory_nckeqnm1ckpnm1ckm1", "statement": "theorem numbertheory_nckeqnm1ckpnm1ckm1 (n k : \u2115) (h\u2080 : 0 < n \u2227 0 < k) (h\u2081 : k \u2264 n) :\n Nat.choose n k = Nat.choose (n - 1) k + Nat.choose (n - 1) (k - 1)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_3rootspoly_amdtamctambeqnasqmbpctapcbtdpasqmbpctapcbta", "statement": "theorem algebra_3rootspoly_amdtamctambeqnasqmbpctapcbtdpasqmbpctapcbta (b c d a : \u2102) :\n (a - d) * (a - c) * (a - b) =\n -((a ^ 2 - (b + c) * a + c * b) * d) + (a ^ 2 - (b + c) * a + c * b) * a", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_403", "statement": "theorem mathd_numbertheory_403 : (\u2211 k in Nat.properDivisors 198, k) = 270", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_190", "statement": "theorem mathd_algebra_190 : ((3 : \u211d) / 8 + 7 / 8) / (4 / 5) = 25 / 16", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_269", "statement": "theorem mathd_numbertheory_269 : (2005 ^ 2 + 2005 ^ 0 + 2005 ^ 0 + 2005 ^ 5) % 100 = 52", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1990_p2", "statement": "theorem aime_1990_p2 :\n (52 + 6 * Real.sqrt 43) ^ ((3 : \u211d) / 2) - (52 - 6 * Real.sqrt 43) ^ ((3 : \u211d) / 2) = 828", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_101", "statement": "theorem mathd_numbertheory_101 : 17 * 18 % 4 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_sqineq_4bap1lt4bsqpap1sq", "statement": "theorem algebra_sqineq_4bap1lt4bsqpap1sq (a b : \u211d) : 4 * b * (a + 1) \u2264 4 * b ^ 2 + (a + 1) ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_156", "statement": "theorem mathd_numbertheory_156 (n : \u2115) (h\u2080 : 0 < n) : Nat.gcd (n + 7) (2 * n + 1) \u2264 13", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_451", "statement": "theorem mathd_algebra_451 (\u03c3 : Equiv \u211d \u211d) (h\u2080 : \u03c3.2 (-15) = 0) (h\u2081 : \u03c3.2 0 = 3) (h\u2082 : \u03c3.2 3 = 9)\n (h\u2083 : \u03c3.2 9 = 20) : \u03c3.1 (\u03c3.1 9) = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_144", "statement": "theorem mathd_algebra_144 (a b c d : \u2115) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c \u2227 0 < d) (h\u2080 : (c : \u2124) - b = d)\n (h\u2081 : (b : \u2124) - a = d) (h\u2082 : a + b + c = 60) (h\u2083 : a + b > c) : d < 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_282", "statement": "theorem mathd_algebra_282 (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x : \u211d, \u00ac (Irrational x) \u2192 f x = abs (Int.floor x))\n (h\u2081 : \u2200 x, Irrational x \u2192 f x = (Int.ceil x) ^ 2) :\n f (8 ^ (1 / 3)) + f (-Real.pi) + f (Real.sqrt 50) + f (9 / 2) = 79", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_410", "statement": "theorem mathd_algebra_410 (x y : \u211d) (h\u2080 : y = x ^ 2 - 6 * x + 13) : 4 \u2264 y", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_232", "statement": "theorem mathd_numbertheory_232 (x y z : ZMod 31) (h\u2080 : x = 3\u207b\u00b9) (h\u2081 : y = 5\u207b\u00b9)\n (h\u2082 : z = (x + y)\u207b\u00b9) : z = 29", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_77", "statement": "theorem mathd_algebra_77 (a b : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : a \u2260 0 \u2227 b \u2260 0) (h\u2081 : a \u2260 b)\n (h\u2082 : \u2200 x, f x = x ^ 2 + a * x + b) (h\u2083 : f a = 0) (h\u2084 : f b = 0) : a = 1 \u2227 b = -2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1974_p5", "statement": "theorem imo_1974_p5 (a b c d s : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c \u2227 0 < d)\n (h\u2081 : s = a / (a + b + d) + b / (a + b + c) + c / (b + c + d) + d / (a + c + d)) :\n 1 < s \u2227 s < 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1988_p3", "statement": "theorem aime_1988_p3 (x : \u211d) (h\u2080 : 0 < x)\n (h\u2081 : Real.logb 2 (Real.logb 8 x) = Real.logb 8 (Real.logb 2 x)) : Real.logb 2 x ^ 2 = 27", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_530", "statement": "theorem mathd_numbertheory_530 (n k : \u2115) (h\u2080 : 0 < n \u2227 0 < k) (h\u2080 : (n : \u211d) / k < 6)\n (h\u2081 : (5 : \u211d) < n / k) : 22 \u2264 Nat.lcm n k / Nat.gcd n k", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_109", "statement": "theorem mathd_algebra_109 (a b : \u211d) (h\u2080 : 3 * a + 2 * b = 12) (h\u2081 : a = 4) : b = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1967_p3", "statement": "theorem imo_1967_p3 (k m n : \u2115) (c : \u2115 \u2192 \u2115) (h\u2080 : 0 < k \u2227 0 < m \u2227 0 < n)\n (h\u2081 : \u2200 s, c s = s * (s + 1)) (h\u2082 : Nat.Prime (k + m + 1)) (h\u2083 : n + 1 < k + m + 1) :\n (\u220f i in Finset.Icc 1 n, c i) \u2223 \u220f i in Finset.Icc 1 n, c (m + i) - c k", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_11", "statement": "theorem mathd_algebra_11 (a b : \u211d) (h\u2080 : a \u2260 b) (h\u2081 : a \u2260 2 * b)\n (h\u2082 : (4 * a + 3 * b) / (a - 2 * b) = 5) : (a + 11 * b) / (a - b) = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2003_p1", "statement": "theorem amc12a_2003_p1 (u v : \u2115 \u2192 \u2115) (h\u2080 : \u2200 n, u n = 2 * n + 2) (h\u2081 : \u2200 n, v n = 2 * n + 1) :\n ((\u2211 k in Finset.range 2003, u k) - \u2211 k in Finset.range 2003, v k) = 2003", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "numbertheory_aneqprodakp4_anmsqrtanp1eq2", "statement": "theorem numbertheory_aneqprodakp4_anmsqrtanp1eq2 (a : \u2115 \u2192 \u211d) (h\u2080 : a 0 = 1)\n (h\u2081 : \u2200 n, a (n + 1) = (\u220f k in Finset.range (n + 1), a k) + 4) :\n \u2200 n \u2265 1, a n - Real.sqrt (a (n + 1)) = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_2rootspoly_apatapbeq2asqp2ab", "statement": "theorem algebra_2rootspoly_apatapbeq2asqp2ab (a b : \u2102) :\n (a + a) * (a + b) = 2 * a ^ 2 + 2 * (a * b)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "induction_sum_odd", "statement": "theorem induction_sum_odd (n : \u2115) : (\u2211 k in Finset.range n, 2 * k) + 1 = n ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_568", "statement": "theorem mathd_algebra_568 (a : \u211d) :\n (a - 1) * (a + 1) * (a + 2) - (a - 2) * (a + 1) = a ^ 3 + a ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_616", "statement": "theorem mathd_algebra_616 (f g : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = x ^ 3 + 2 * x + 1)\n (h\u2081 : \u2200 x, g x = x - 1) : f (g 1) = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_690", "statement": "theorem mathd_numbertheory_690 :\n IsLeast { a : \u2115 | 0 < a \u2227 a \u2261 2 [MOD 3] \u2227 a \u2261 4 [MOD 5] \u2227 a \u2261 6 [MOD 7] \u2227 a \u2261 8 [MOD 9] } 314", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2016_p2", "statement": "theorem amc12a_2016_p2 (x : \u211d) (h\u2080 : (10 : \u211d) ^ x * 100 ^ (2 * x) = 1000 ^ 5) : x = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_405", "statement": "theorem mathd_numbertheory_405 (a b c : \u2115) (t : \u2115 \u2192 \u2115) (h\u2080 : t 0 = 0) (h\u2081 : t 1 = 1)\n (h\u2082 : \u2200 n > 1, t n = t (n - 2) + t (n - 1)) (h\u2083 : a \u2261 5 [MOD 16]) (h\u2084 : b \u2261 10 [MOD 16])\n (h\u2085 : c \u2261 15 [MOD 16]) : (t a + t b + t c) % 7 = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_110", "statement": "theorem mathd_numbertheory_110 (a b : \u2115) (h\u2080 : 0 < a \u2227 0 < b \u2227 b \u2264 a) (h\u2081 : (a + b) % 10 = 2)\n (h\u2082 : (2 * a + b) % 10 = 1) : (a - b) % 10 = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2003_p25", "statement": "theorem amc12a_2003_p25 (a b : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : 0 < b)\n (h\u2081 : \u2200 x, f x = Real.sqrt (a * x ^ 2 + b * x)) (h\u2082 : { x | 0 \u2264 f x } = f '' { x | 0 \u2264 f x }) :\n a = 0 \u2228 a = -4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2010_p10", "statement": "theorem amc12a_2010_p10 (p q : \u211d) (a : \u2115 \u2192 \u211d) (h\u2080 : \u2200 n, a (n + 2) - a (n + 1) = a (n + 1) - a n)\n (h\u2081 : a 1 = p) (h\u2082 : a 2 = 9) (h\u2083 : a 3 = 3 * p - q) (h\u2084 : a 4 = 3 * p + q) : a 2010 = 8041", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_509", "statement": "theorem mathd_algebra_509 :\n Real.sqrt ((5 / Real.sqrt 80 + Real.sqrt 845 / 9 + Real.sqrt 45) / Real.sqrt 5) = 13 / 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_159", "statement": "theorem mathd_algebra_159 (b : \u211d) (f : \u211d \u2192 \u211d)\n (h\u2080 : \u2200 x, f x = 3 * x ^ 4 - 7 * x ^ 3 + 2 * x ^ 2 - b * x + 1) (h\u2081 : f 1 = 1) : b = -2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1997_p11", "statement": "theorem aime_1997_p11 (x : \u211d)\n (h\u2080 :\n x =\n (\u2211 n in Finset.Icc (1 : \u2115) 44, Real.cos (n * \u03c0 / 180)) /\n \u2211 n in Finset.Icc (1 : \u2115) 44, Real.sin (n * \u03c0 / 180)) :\n Int.floor (100 * x) = 241", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aimeI_2000_p7", "statement": "theorem aimeI_2000_p7 (x y z : \u211d) (m : \u211a) (h\u2080 : 0 < x \u2227 0 < y \u2227 0 < z) (h\u2081 : x * y * z = 1)\n (h\u2082 : x + 1 / z = 5) (h\u2083 : y + 1 / x = 29) (h\u2084 : z + 1 / y = m) (h\u2085 : 0 < m) :\n \u2191m.den + m.num = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "aime_1988_p4", "statement": "theorem aime_1988_p4 (n : \u2115) (a : \u2115 \u2192 \u211d) (h\u2080 : \u2200 n, abs (a n) < 1)\n (h\u2081 : (\u2211 k in Finset.range n, abs (a k)) = 19 + abs (\u2211 k in Finset.range n, a k)) : 20 \u2264 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "induction_divisibility_9div10tonm1", "statement": "theorem induction_divisibility_9div10tonm1 (n : \u2115) (h\u2080 : 0 < n) : 9 \u2223 10 ^ n - 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_126", "statement": "theorem mathd_numbertheory_126 (x a : \u2115) (h\u2080 : 0 < x \u2227 0 < a) (h\u2081 : Nat.gcd a 40 = x + 3)\n (h\u2082 : Nat.lcm a 40 = x * (x + 3))\n (h\u2083 : \u2200 b : \u2115, 0 < b \u2192 Nat.gcd b 40 = x + 3 \u2227 Nat.lcm b 40 = x * (x + 3) \u2192 a \u2264 b) : a = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_323", "statement": "theorem mathd_algebra_323 (\u03c3 : Equiv \u211d \u211d) (h : \u2200 x, \u03c3.1 x = x ^ 3 - 8) : \u03c3.2 (\u03c3.1 (\u03c3.2 19)) = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_421", "statement": "theorem mathd_algebra_421 (a b c d : \u211d) (h\u2080 : b = a ^ 2 + 4 * a + 6)\n (h\u2081 : b = 1 / 2 * a ^ 2 + a + 6) (h\u2082 : d = c ^ 2 + 4 * c + 6) (h\u2083 : d = 1 / 2 * c ^ 2 + c + 6)\n (h\u2084 : a < c) : c - a = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1987_p6", "statement": "theorem imo_1987_p6 (p : \u2115) (f : \u2115 \u2192 \u2115) (h\u2080 : \u2200 x, f x = x ^ 2 + x + p)\n (h\u2080 : \u2200 k : \u2115, k \u2264 Nat.floor (Real.sqrt (p / 3)) \u2192 Nat.Prime (f k)) :\n \u2200 i \u2264 p - 2, Nat.Prime (f i)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2009_p25", "statement": "theorem amc12a_2009_p25 (a : \u2115 \u2192 \u211d) (h\u2080 : a 1 = 1) (h\u2081 : a 2 = 1 / Real.sqrt 3)\n (h\u2082 : \u2200 n, 1 \u2264 n \u2192 a (n + 2) = (a n + a (n + 1)) / (1 - a n * a (n + 1))) : abs (a 2009) = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1961_p1", "statement": "theorem imo_1961_p1 (x y z a b : \u211d) (h\u2080 : 0 < x \u2227 0 < y \u2227 0 < z) (h\u2081 : x \u2260 y) (h\u2082 : y \u2260 z)\n (h\u2083 : z \u2260 x) (h\u2084 : x + y + z = a) (h\u2085 : x ^ 2 + y ^ 2 + z ^ 2 = b ^ 2) (h\u2086 : x * y = z ^ 2) :\n 0 < a \u2227 b ^ 2 < a ^ 2 \u2227 a ^ 2 < 3 * b ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_31", "statement": "theorem mathd_algebra_31 (x : NNReal) (u : \u2115 \u2192 NNReal) (h\u2080 : \u2200 n, u (n + 1) = NNReal.sqrt (x + u n))\n (h\u2081 : Filter.Tendsto u Filter.atTop (\ud835\udcdd 9)) : 9 = NNReal.sqrt (x + 9)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_manipexpr_apbeq2cceqiacpbceqm2", "statement": "theorem algebra_manipexpr_apbeq2cceqiacpbceqm2 (a b c : \u2102) (h\u2080 : a + b = 2 * c)\n (h\u2081 : c = Complex.I) : a * c + b * c = -2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_370", "statement": "theorem mathd_numbertheory_370 (n : \u2115) (h\u2080 : n % 7 = 3) : (2 * n + 1) % 7 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_437", "statement": "theorem mathd_algebra_437 (x y : \u211d) (n : \u2124) (h\u2080 : x ^ 3 = -45) (h\u2081 : y ^ 3 = -101) (h\u2082 : x < n)\n (h\u2083 : \u2191n < y) : n = -4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1966_p5", "statement": "theorem imo_1966_p5 (x a : \u2115 \u2192 \u211d) (h\u2080 : a 1 \u2260 a 2) (h\u2081 : a 1 \u2260 a 3) (h\u2082 : a 1 \u2260 a 4)\n (h\u2083 : a 2 \u2260 a 3) (h\u2084 : a 2 \u2260 a 4) (h\u2085 : a 3 \u2260 a 4) (h\u2086 : a 1 > a 2) (h\u2087 : a 2 > a 3)\n (h\u2088 : a 3 > a 4)\n (h\u2089 : abs (a 1 - a 2) * x 2 + abs (a 1 - a 3) * x 3 + abs (a 1 - a 4) * x 4 = 1)\n (h\u2081\u2080 : abs (a 2 - a 1) * x 1 + abs (a 2 - a 3) * x 3 + abs (a 2 - a 4) * x 4 = 1)\n (h\u2081\u2081 : abs (a 3 - a 1) * x 1 + abs (a 3 - a 2) * x 2 + abs (a 3 - a 4) * x 4 = 1)\n (h\u2081\u2082 : abs (a 4 - a 1) * x 1 + abs (a 4 - a 2) * x 2 + abs (a 4 - a 3) * x 3 = 1) :\n x 2 = 0 \u2227 x 3 = 0 \u2227 x 1 = 1 / abs (a 1 - a 4) \u2227 x 4 = 1 / abs (a 1 - a 4)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_89", "statement": "theorem mathd_algebra_89 (b : \u211d) (h\u2080 : b \u2260 0) :\n (7 * b ^ 3) ^ 2 * (4 * b ^ 2) ^ (-(3 : \u2124)) = 49 / 64", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1966_p4", "statement": "theorem imo_1966_p4 (n : \u2115) (x : \u211d) (h\u2080 : \u2200 k : \u2115, 0 < k \u2192 \u2200 m : \u2124, x \u2260 m * \u03c0 / 2 ^ k)\n (h\u2081 : 0 < n) :\n (\u2211 k in Finset.Icc 1 n, 1 / Real.sin (2 ^ k * x)) = 1 / Real.tan x - 1 / Real.tan (2 ^ n * x)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_67", "statement": "theorem mathd_algebra_67 (f g : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = 5 * x + 3) (h\u2081 : \u2200 x, g x = x ^ 2 - 2) :\n g (f (-1)) = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_326", "statement": "theorem mathd_numbertheory_326 (n : \u2115) (h\u2080 : (\u2191n - 1) * \u2191n * (\u2191n + 1) = (720 : \u2124)) : n + 1 = 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "induction_divisibility_3div2tooddnp1", "statement": "theorem induction_divisibility_3div2tooddnp1 (n : \u2115) : 3 \u2223 2 ^ (2 * n + 1) + 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_123", "statement": "theorem mathd_algebra_123 (a b : \u2115) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : a + b = 20) (h\u2082 : a = 3 * b) :\n a - b = 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_2varlineareq_xpeeq7_2xpeeq3_eeq11_xeqn4", "statement": "theorem algebra_2varlineareq_xpeeq7_2xpeeq3_eeq11_xeqn4 (x e : \u2102) (h\u2080 : x + e = 7)\n (h\u2081 : 2 * x + e = 3) : e = 11 \u2227 x = -4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1993_p5", "statement": "theorem imo_1993_p5 : \u2203 f : \u2115 \u2192 \u2115, f 1 = 2 \u2227 \u2200 n, f (f n) = f n + n \u2227 \u2200 n, f n < f (n + 1)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "numbertheory_prmdvsneqnsqmodpeq0", "statement": "theorem numbertheory_prmdvsneqnsqmodpeq0 (n : \u2124) (p : \u2115) (h\u2080 : Nat.Prime p) :\n \u2191p \u2223 n \u2194 n ^ 2 % p = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1964_p1_1", "statement": "theorem imo_1964_p1_1 (n : \u2115) (h\u2080 : 7 \u2223 2 ^ n - 1) : 3 \u2223 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1990_p3", "statement": "theorem imo_1990_p3 (n : \u2115) (h\u2080 : 2 \u2264 n) (h\u2081 : n ^ 2 \u2223 2 ^ n + 1) : n = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "induction_ineq_nsqlefactn", "statement": "theorem induction_ineq_nsqlefactn (n : \u2115) (h\u2080 : 4 \u2264 n) : n ^ 2 \u2264 n !", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_30", "statement": "theorem mathd_numbertheory_30 :\n (33818 ^ 2 + 33819 ^ 2 + 33820 ^ 2 + 33821 ^ 2 + 33822 ^ 2) % 17 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_267", "statement": "theorem mathd_algebra_267 (x : \u211d) (h\u2080 : x \u2260 1) (h\u2081 : x \u2260 -2)\n (h\u2082 : (x + 1) / (x - 1) = (x - 2) / (x + 2)) : x = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_961", "statement": "theorem mathd_numbertheory_961 : 2003 % 11 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "induction_seq_mul2pnp1", "statement": "theorem induction_seq_mul2pnp1 (n : \u2115) (u : \u2115 \u2192 \u2115) (h\u2080 : u 0 = 0)\n (h\u2081 : \u2200 n, u (n + 1) = 2 * u n + (n + 1)) : u n = 2 ^ (n + 1) - (n + 2)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2002_p12", "statement": "theorem amc12a_2002_p12 (f : \u211d \u2192 \u211d) (k : \u211d) (a b : \u2115) (h\u2080 : \u2200 x, f x = x ^ 2 - 63 * x + k)\n (h\u2081 : f a = 0 \u2227 f b = 0) (h\u2082 : a \u2260 b) (h\u2083 : Nat.Prime a \u2227 Nat.Prime b) : k = 122", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_manipexpr_2erprsqpesqeqnrpnesq", "statement": "theorem algebra_manipexpr_2erprsqpesqeqnrpnesq (e r : \u2102) :\n 2 * (e * r) + (e ^ 2 + r ^ 2) = (-r + -e) ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_119", "statement": "theorem mathd_algebra_119 (d e : \u211d) (h\u2080 : 2 * d = 17 * e - 8) (h\u2081 : 2 * e = d - 9) : e = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2020_p13", "statement": "theorem amc12a_2020_p13 (a b c : \u2115) (n : NNReal) (h\u2080 : n \u2260 1) (h\u2081 : 1 < a \u2227 1 < b \u2227 1 < c)\n (h\u2082 : (n * (n * n ^ (1 / c)) ^ (1 / b)) ^ (1 / a) = (n ^ 25) ^ (1 / 36)) : b = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1977_p5", "statement": "theorem imo_1977_p5 (a b q r : \u2115) (h\u2080 : r < a + b) (h\u2081 : a ^ 2 + b ^ 2 = (a + b) * q + r)\n (h\u2082 : q ^ 2 + r = 1977) :\n abs ((a : \u2124) - 22) = 15 \u2227 abs ((b : \u2124) - 22) = 28 \u2228\n abs ((a : \u2124) - 22) = 28 \u2227 abs ((b : \u2124) - 22) = 15", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "numbertheory_2dvd4expn", "statement": "theorem numbertheory_2dvd4expn (n : \u2115) (h\u2080 : n \u2260 0) : 2 \u2223 4 ^ n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2010_p11", "statement": "theorem amc12a_2010_p11 (x b : \u211d) (h\u2080 : 0 < b) (h\u2081 : (7 : \u211d) ^ (x + 7) = 8 ^ x)\n (h\u2082 : x = Real.logb b (7 ^ 7)) : b = 8 / 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2003_p24", "statement": "theorem amc12a_2003_p24 :\n IsGreatest { y : \u211d | \u2203 a b : \u211d, 1 < b \u2227 b \u2264 a \u2227 y = Real.logb a (a / b) + Real.logb b (b / a) }\n 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2002_p1", "statement": "theorem amc12a_2002_p1 (f : \u2102 \u2192 \u2102) (h\u2080 : \u2200 x, f x = (2 * x + 3) * (x - 4) + (2 * x + 3) * (x - 6))\n (h\u2081 : Fintype (f \u207b\u00b9' {0})) : (\u2211 y in (f \u207b\u00b9' {0}).toFinset, y) = 7 / 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_206", "statement": "theorem mathd_algebra_206 (a b : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = x ^ 2 + a * x + b) (h\u2081 : 2 * a \u2260 b)\n (h\u2082 : f (2 * a) = 0) (h\u2083 : f b = 0) : a + b = -1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_92", "statement": "theorem mathd_numbertheory_92 (n : \u2115) (h\u2080 : 5 * n % 17 = 8) : n % 17 = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_482", "statement": "theorem mathd_algebra_482 (m n : \u2115) (k : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : Nat.Prime m) (h\u2081 : Nat.Prime n)\n (h\u2082 : \u2200 x, f x = x ^ 2 - 12 * x + k) (h\u2083 : f m = 0) (h\u2084 : f n = 0) (h\u2085 : m \u2260 n) : k = 35", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12b_2002_p3", "statement": "theorem amc12b_2002_p3 (S : Finset \u2115)\n -- note: we use (n^2 + 2 - 3 * n) over (n^2 - 3 * n + 2) because nat subtraction truncates the latter at 1 and 2\n (h\u2080 : \u2200 n : \u2115, n \u2208 S \u2194 0 < n \u2227 Nat.Prime (n ^ 2 + 2 - 3 * n)) :\n S.card = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_668", "statement": "theorem mathd_numbertheory_668 (l r : ZMod 7) (h\u2080 : l = (2 + 3)\u207b\u00b9) (h\u2081 : r = 2\u207b\u00b9 + 3\u207b\u00b9) :\n l - r = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_251", "statement": "theorem mathd_algebra_251 (x : \u211d) (h\u2080 : x \u2260 0) (h\u2081 : 3 + 1 / x = 7 / x) : x = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_84", "statement": "theorem mathd_numbertheory_84 : Int.floor ((9 : \u211d) / 160 * 100) = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_412", "statement": "theorem mathd_numbertheory_412 (x y : \u2115) (h\u2080 : x % 19 = 4) (h\u2081 : y % 19 = 7) :\n (x + 1) ^ 2 * (y + 5) ^ 3 % 19 = 13", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_181", "statement": "theorem mathd_algebra_181 (n : \u211d) (h\u2080 : n \u2260 3) (h\u2081 : (n + 5) / (n - 3) = 2) : n = 11", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2016_p3", "statement": "theorem amc12a_2016_p3 (f : \u211d \u2192 \u211d \u2192 \u211d)\n (h\u2080 : \u2200 x, \u2200 (y) (_ : y \u2260 0), f x y = x - y * Int.floor (x / y)) :\n f (3 / 8) (-(2 / 5)) = -(1 / 40)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_247", "statement": "theorem mathd_algebra_247 (t s : \u211d) (n : \u2124) (h\u2080 : t = 2 * s - s ^ 2) (h\u2081 : s = n ^ 2 - 2 ^ n + 1)\n (n) (_ : n = 3) : t = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_sqineq_2unitcircatblt1", "statement": "theorem algebra_sqineq_2unitcircatblt1 (a b : \u211d) (h\u2080 : a ^ 2 + b ^ 2 = 2) : a * b \u2264 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_629", "statement": "theorem mathd_numbertheory_629 : IsLeast { t : \u2115 | 0 < t \u2227 Nat.lcm 12 t ^ 3 = (12 * t) ^ 2 } 18", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "amc12a_2017_p2", "statement": "theorem amc12a_2017_p2 (x y : \u211d) (h\u2080 : x \u2260 0) (h\u2081 : y \u2260 0) (h\u2082 : x + y = 4 * (x * y)) :\n 1 / x + 1 / y = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "algebra_amgm_sumasqdivbsqgeqsumbdiva", "statement": "theorem algebra_amgm_sumasqdivbsqgeqsumbdiva (a b c : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c) :\n a ^ 2 / b ^ 2 + b ^ 2 / c ^ 2 + c ^ 2 / a ^ 2 \u2265 b / a + c / b + a / c", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_numbertheory_202", "statement": "theorem mathd_numbertheory_202 : (19 ^ 19 + 99 ^ 99) % 10 = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "imo_1979_p1", "statement": "theorem imo_1979_p1 (p q : \u2115) (h\u2080 : 0 < q)\n (h\u2081 : (\u2211 k in Finset.Icc (1 : \u2115) 1319, (-1) ^ (k + 1) * ((1 : \u211d) / k)) = p / q) : 1979 \u2223 p", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_51", "statement": "theorem mathd_algebra_51 (a b : \u211d) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : a + b = 35) (h\u2082 : a = 2 / 5 * b) :\n b - a = 15", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_10", "statement": "theorem mathd_algebra_10 : abs ((120 : \u211d) / 100 * 30 - 130 / 100 * 20) = 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Validation.lean", "split": "valid"} +{"full_name": "mathd_algebra_478", "statement": "theorem mathd_algebra_478 (b h v : \u211d) (h\u2080 : 0 < b \u2227 0 < h \u2227 0 < v) (h\u2081 : v = 1 / 3 * (b * h))\n (h\u2082 : b = 30) (h\u2083 : h = 13 / 2) : v = 65", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "numbertheory_4x3m7y3neq2003", "statement": "theorem numbertheory_4x3m7y3neq2003 (x y : \u2124) : 4 * x ^ 3 - 7 * y ^ 3 \u2260 2003", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1983_p1", "statement": "theorem aime_1983_p1 (x y z w : \u2115) (ht : 1 < x \u2227 1 < y \u2227 1 < z) (hw : 0 \u2264 w)\n (h0 : Real.log w / Real.log x = 24) (h1 : Real.log w / Real.log y = 40)\n (h2 : Real.log w / Real.log (x * y * z) = 12) : Real.log w / Real.log z = 60", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12_2001_p5", "statement": "theorem amc12_2001_p5 :\n Finset.prod (Finset.filter (fun x => \u00acEven x) (Finset.range 10000)) (id : \u2115 \u2192 \u2115) =\n 10000! / (2 ^ 5000 * 5000!)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_141", "statement": "theorem mathd_algebra_141 (a b : \u211d) (h\u2081 : a * b = 180) (h\u2082 : 2 * (a + b) = 54) :\n a ^ 2 + b ^ 2 = 369", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_3", "statement": "theorem mathd_numbertheory_3 : (\u2211 x in Finset.range 10, (x + 1) ^ 2) % 10 = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1969_p2", "statement": "theorem imo_1969_p2 (m n : \u211d) (k : \u2115) (a : \u2115 \u2192 \u211d) (y : \u211d \u2192 \u211d) (h\u2080 : 0 < k)\n (h\u2081 : \u2200 x, y x = \u2211 i in Finset.range k, Real.cos (a i + x) / 2 ^ i) (h\u2082 : y m = 0)\n (h\u2083 : y n = 0) : \u2203 t : \u2124, m - n = t * \u03c0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_209", "statement": "theorem mathd_algebra_209 (\u03c3 : Equiv \u211d \u211d) (h\u2080 : \u03c3.2 2 = 10) (h\u2081 : \u03c3.2 10 = 1) (h\u2082 : \u03c3.2 1 = 2) :\n \u03c3.1 (\u03c3.1 10) = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_1124", "statement": "theorem mathd_numbertheory_1124 (n : \u2115) (h\u2080 : n \u2264 9) (h\u2081 : 18 \u2223 374 * 10 + n) : n = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1983_p6", "statement": "theorem imo_1983_p6 (a b c : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c) (h\u2081 : c < a + b) (h\u2082 : b < a + c)\n (h\u2083 : a < b + c) : 0 \u2264 a ^ 2 * b * (a - b) + b ^ 2 * c * (b - c) + c ^ 2 * a * (c - a)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_237", "statement": "theorem mathd_numbertheory_237 : (\u2211 k in Finset.range 101, k) % 6 = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_33", "statement": "theorem mathd_algebra_33 (x y z : \u211d) (h\u2080 : x \u2260 0) (h\u2081 : 2 * x = 5 * y) (h\u2082 : 7 * y = 10 * z) :\n z / x = 7 / 25", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2021_p3", "statement": "theorem amc12b_2021_p3 (x : \u211d) (h\u2080 : 2 + 1 / (1 + 1 / (2 + 2 / (3 + x))) = 144 / 53) : x = 3 / 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_299", "statement": "theorem mathd_numbertheory_299 : 1 * 3 * 5 * 7 * 9 * 11 * 13 % 10 = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2020_p2", "statement": "theorem amc12b_2020_p2 :\n (100 ^ 2 - 7 ^ 2 : \u211d) / (70 ^ 2 - 11 ^ 2) * ((70 - 11) * (70 + 11) / ((100 - 7) * (100 + 7))) =\n 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_sqineq_unitcircatbpabsamblt1", "statement": "theorem algebra_sqineq_unitcircatbpabsamblt1 (a b : \u211d) (h\u2080 : a ^ 2 + b ^ 2 = 1) :\n a * b + abs (a - b) \u2264 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1977_p6", "statement": "theorem imo_1977_p6 (f : \u2115 \u2192 \u2115) (h\u2080 : \u2200 n, 0 < f n) (h\u2081 : \u2200 n, 0 < n \u2192 f (f n) < f (n + 1)) :\n \u2200 n, 0 < n \u2192 f n = n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_419", "statement": "theorem mathd_algebra_419 (a b : \u211d) (h\u2080 : a = -1) (h\u2081 : b = 5) : -a - b ^ 2 + 3 * (a * b) = -39", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2020_p10", "statement": "theorem amc12a_2020_p10 (n : \u2115) (h\u2080 : 0 < n)\n (h\u2081 : Real.logb 2 (Real.logb 16 n) = Real.logb 4 (Real.logb 4 n)) :\n (Nat.digits 10 n).sum = 13", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1960_p2", "statement": "theorem imo_1960_p2 (x : \u211d) (h\u2080 : 0 \u2264 1 + 2 * x) (h\u2081 : (1 - Real.sqrt (1 + 2 * x)) ^ 2 \u2260 0)\n (h\u2082 : 4 * x ^ 2 / (1 - Real.sqrt (1 + 2 * x)) ^ 2 < 2 * x + 9) : -(1 / 2) \u2264 x \u2227 x < 45 / 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_427", "statement": "theorem mathd_numbertheory_427 (a : \u2115) (h\u2080 : a = \u2211 k in Nat.divisors 500, k) :\n (\u2211 k in Finset.filter (fun x => Nat.Prime x) (Nat.divisors a), k) = 25", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "numbertheory_x5neqy2p4", "statement": "theorem numbertheory_x5neqy2p4 (x y : \u2124) : x ^ 5 \u2260 y ^ 2 + 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imosl_2007_algebra_p6", "statement": "theorem imosl_2007_algebra_p6 (a : \u2115 \u2192 NNReal) (h\u2080 : (\u2211 x in Finset.range 100, a (x + 1) ^ 2) = 1) :\n (\u2211 x in Finset.range 99, a (x + 1) ^ 2 * a (x + 2)) + a 100 ^ 2 * a 1 < 12 / 25", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_398", "statement": "theorem mathd_algebra_398 (a b c : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c) (h\u2081 : 9 * b = 20 * c)\n (h\u2082 : 7 * a = 4 * b) : 63 * a = 80 * c", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1963_p5", "statement": "theorem imo_1963_p5 : Real.cos (\u03c0 / 7) - Real.cos (2 * \u03c0 / 7) + Real.cos (3 * \u03c0 / 7) = 1 / 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_430", "statement": "theorem mathd_numbertheory_430 (a b c : \u2115) (h\u2080 : 1 \u2264 a \u2227 a \u2264 9) (h\u2081 : 1 \u2264 b \u2227 b \u2264 9)\n (h\u2082 : 1 \u2264 c \u2227 c \u2264 9) (h\u2083 : a \u2260 b) (h\u2084 : a \u2260 c) (h\u2085 : b \u2260 c) (h\u2086 : a + b = c)\n (h\u2087 : 10 * a + a - b = 2 * c) (h\u2088 : c * b = 10 * a + a + a) : a + b + c = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_459", "statement": "theorem mathd_algebra_459 (a b c d : \u211a) (h\u2080 : 3 * a = b + c + d) (h\u2081 : 4 * b = a + c + d)\n (h\u2082 : 2 * c = a + b + d) (h\u2083 : 8 * a + 10 * b + 6 * c = 24) : \u2191d.den + d.num = 28", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "induction_12dvd4expnp1p20", "statement": "theorem induction_12dvd4expnp1p20 (n : \u2115) : 12 \u2223 4 ^ (n + 1) + 20", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_320", "statement": "theorem mathd_algebra_320 (x : \u211d) (a b c : \u2115) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c \u2227 0 \u2264 x)\n (h\u2081 : 2 * x ^ 2 = 4 * x + 9) (h\u2082 : x = (a + Real.sqrt b) / c) (h\u2083 : c = 2) : a + b + c = 26", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_137", "statement": "theorem mathd_algebra_137 (x : \u2115) (h\u2080 : \u2191x + (4 : \u211d) / (100 : \u211d) * \u2191x = 598) : x = 575", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1997_p5", "statement": "theorem imo_1997_p5 (x y : \u2115) (h\u2080 : 0 < x \u2227 0 < y) (h\u2081 : x ^ y ^ 2 = y ^ x) :\n (x, y) = (1, 1) \u2228 (x, y) = (16, 2) \u2228 (x, y) = (27, 3)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_277", "statement": "theorem mathd_numbertheory_277 (m n : \u2115) (h\u2080 : Nat.gcd m n = 6) (h\u2081 : Nat.lcm m n = 126) :\n 60 \u2264 m + n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_559", "statement": "theorem mathd_numbertheory_559 (x y : \u2115) (h\u2080 : x % 3 = 2) (h\u2081 : y % 5 = 4) (h\u2082 : x % 10 = y % 10) :\n 14 \u2264 x", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_160", "statement": "theorem mathd_algebra_160 (n x : \u211d) (h\u2080 : n + x = 97) (h\u2081 : n + 5 * x = 265) : n + 2 * x = 139", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_24", "statement": "theorem mathd_algebra_24 (x : \u211d) (h\u2080 : x / 50 = 40) : x = 2000", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_176", "statement": "theorem mathd_algebra_176 (x : \u211d) : (x + 1) ^ 2 * x = x ^ 3 + 2 * x ^ 2 + x", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "induction_nfactltnexpnm1ngt3", "statement": "theorem induction_nfactltnexpnm1ngt3 (n : \u2115) (h\u2080 : 3 \u2264 n) : n ! < n ^ (n - 1)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_208", "statement": "theorem mathd_algebra_208 : Real.sqrt 1000000 - 1000000 ^ ((1 : \u211d) / 3) = 900", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_353", "statement": "theorem mathd_numbertheory_353 (s : \u2115) (h\u2080 : s = \u2211 k in Finset.Icc 2010 4018, k) : s % 2009 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "numbertheory_notequiv2i2jasqbsqdiv8", "statement": "theorem numbertheory_notequiv2i2jasqbsqdiv8 :\n \u00ac\u2200 a b : \u2124, (\u2203 i j, a = 2 * i \u2227 b = 2 * j) \u2194 \u2203 k, a ^ 2 + b ^ 2 = 8 * k", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_156", "statement": "theorem mathd_algebra_156 (x y : \u211d) (f g : \u211d \u2192 \u211d) (h\u2080 : \u2200 t, f t = t ^ 4)\n (h\u2081 : \u2200 t, g t = 5 * t ^ 2 - 6) (h\u2082 : f x = g x) (h\u2083 : f y = g y) (h\u2084 : x ^ 2 < y ^ 2) :\n y ^ 2 - x ^ 2 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_12", "statement": "theorem mathd_numbertheory_12 :\n Finset.card (Finset.filter (fun x => 20 \u2223 x) (Finset.Icc 15 85)) = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_345", "statement": "theorem mathd_numbertheory_345 : (2000 + 2001 + 2002 + 2003 + 2004 + 2005 + 2006) % 7 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_447", "statement": "theorem mathd_numbertheory_447 :\n (\u2211 k in Finset.filter (fun x => 3 \u2223 x) (Finset.Icc 1 49), k % 10) = 78", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_328", "statement": "theorem mathd_numbertheory_328 : 5 ^ 999999 % 7 = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_451", "statement": "theorem mathd_numbertheory_451 (S : Finset \u2115)\n (h\u2080 :\n \u2200 n : \u2115,\n n \u2208 S \u2194\n 2010 \u2264 n \u2227 n \u2264 2019 \u2227 \u2203 m, (Nat.divisors m).card = 4 \u2227 (\u2211 p in Nat.divisors m, p) = n) :\n (\u2211 k in S, k) = 2016", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1997_p9", "statement": "theorem aime_1997_p9 (a : \u211d) (h\u2080 : 0 < a)\n (h\u2081 : 1 / a - Int.floor (1 / a) = a ^ 2 - Int.floor (a ^ 2)) (h\u2082 : 2 < a ^ 2) (h\u2083 : a ^ 2 < 3) :\n a ^ 12 - 144 * (1 / a) = 233", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_sqineq_at2malt1", "statement": "theorem algebra_sqineq_at2malt1 (a : \u211d) : a * (2 - a) \u2264 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_apbmpcneq0_aeq0anbeq0anceq0", "statement": "theorem algebra_apbmpcneq0_aeq0anbeq0anceq0 (a b c : \u211a) (m n : \u211d) (h\u2080 : 0 < m \u2227 0 < n)\n (h\u2081 : m ^ 3 = 2) (h\u2082 : n ^ 3 = 4) (h\u2083 : (a : \u211d) + b * m + c * n = 0) : a = 0 \u2227 b = 0 \u2227 c = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_171", "statement": "theorem mathd_algebra_171 (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = 5 * x + 4) : f 1 = 9", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_227", "statement": "theorem mathd_numbertheory_227 (x y n : \u2115+) (h\u2080 : \u2191x / (4 : \u211d) + y / 6 = (x + y) / n) : n = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_188", "statement": "theorem mathd_algebra_188 (\u03c3 : Equiv \u211d \u211d) (h : \u03c3.1 2 = \u03c3.2 2) : \u03c3.1 (\u03c3.1 2) = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_765", "statement": "theorem mathd_numbertheory_765 (x : \u2124) (h\u2080 : x < 0) (h\u2081 : 24 * x % 1199 = 15) : x \u2264 -449", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1959_p1", "statement": "theorem imo_1959_p1 (n : \u2115) (h\u2080 : 0 < n) : Nat.gcd (21 * n + 4) (14 * n + 3) = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_175", "statement": "theorem mathd_numbertheory_175 : 2 ^ 2010 % 10 = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "induction_sumkexp3eqsumksq", "statement": "theorem induction_sumkexp3eqsumksq (n : \u2115) :\n (\u2211 k in Finset.range n, k ^ 3) = (\u2211 k in Finset.range n, k) ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "numbertheory_fxeq4powxp6powxp9powx_f2powmdvdf2pown", "statement": "theorem numbertheory_fxeq4powxp6powxp9powx_f2powmdvdf2pown (m n : \u2115) (f : \u2115 \u2192 \u2115)\n (h\u2080 : \u2200 x, f x = 4 ^ x + 6 ^ x + 9 ^ x) (h\u2081 : 0 < m \u2227 0 < n) (h\u2082 : m \u2264 n) :\n f (2 ^ m) \u2223 f (2 ^ n)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1992_p1", "statement": "theorem imo_1992_p1 (p q r : \u2124) (h\u2080 : 1 < p \u2227 p < q \u2227 q < r)\n (h\u2081 : (p - 1) * (q - 1) * (r - 1) \u2223 p * q * r - 1) :\n (p, q, r) = (2, 4, 8) \u2228 (p, q, r) = (3, 5, 15)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1982_p1", "statement": "theorem imo_1982_p1 (f : \u2115 \u2192 \u2115)\n (h\u2080 : \u2200 m n, 0 < m \u2227 0 < n \u2192 f (m + n) - f m - f n = 0 \u2228 f (m + n) - f m - f n = 1)\n (h\u2081 : f 2 = 0) (h\u2082 : 0 < f 3) (h\u2083 : f 9999 = 3333) : f 1982 = 660", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1987_p5", "statement": "theorem aime_1987_p5 (x y : \u2124) (h\u2080 : y ^ 2 + 3 * (x ^ 2 * y ^ 2) = 30 * x ^ 2 + 517) :\n 3 * (x ^ 2 * y ^ 2) = 588", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_346", "statement": "theorem mathd_algebra_346 (f g : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = 2 * x - 3) (h\u2081 : \u2200 x, g x = x + 1) :\n g (f 5 - 1) = 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_487", "statement": "theorem mathd_algebra_487 (a b c d : \u211d) (h\u2080 : b = a ^ 2) (h\u2081 : a + b = 1) (h\u2082 : d = c ^ 2)\n (h\u2083 : c + d = 1) (h\u2084 : a \u2260 c) : Real.sqrt ((a - c) ^ 2 + (b - d) ^ 2) = Real.sqrt 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_728", "statement": "theorem mathd_numbertheory_728 : (29 ^ 13 - 5 ^ 13) % 7 = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_184", "statement": "theorem mathd_algebra_184 (a b : NNReal) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : a ^ 2 = 6 * b)\n (h\u2082 : a ^ 2 = 54 / b) : a = 3 * NNReal.sqrt 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_552", "statement": "theorem mathd_numbertheory_552 (f g h : \u2115+ \u2192 \u2115) (h\u2080 : \u2200 x, f x = 12 * x + 7)\n (h\u2081 : \u2200 x, g x = 5 * x + 2) (h\u2082 : \u2200 x, h x = Nat.gcd (f x) (g x)) (h\u2083 : Fintype (Set.range h)) :\n (\u2211 k in (Set.range h).toFinset, k) = 12", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2021_p9", "statement": "theorem amc12b_2021_p9 :\n Real.log 80 / Real.log 2 / (Real.log 2 / Real.log 40) -\n Real.log 160 / Real.log 2 / (Real.log 2 / Real.log 20) =\n 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1994_p3", "statement": "theorem aime_1994_p3 (x : \u2124) (f : \u2124 \u2192 \u2124) (h0 : f x + f (x - 1) = x ^ 2) (h1 : f 19 = 94) :\n f 94 % 1000 = 561", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_44", "statement": "theorem mathd_algebra_44 (s t : \u211d) (h\u2080 : s = 9 - 2 * t) (h\u2081 : t = 3 * s + 1) : s = 1 \u2227 t = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_215", "statement": "theorem mathd_algebra_215 (S : Finset \u211d) (h\u2080 : \u2200 x : \u211d, x \u2208 S \u2194 (x + 3) ^ 2 = 121) :\n (\u2211 k in S, k) = -6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_293", "statement": "theorem mathd_numbertheory_293 (n : \u2115) (h\u2080 : n \u2264 9) (h\u2081 : 11 \u2223 20 * 100 + 10 * n + 7) : n = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_769", "statement": "theorem mathd_numbertheory_769 : (129 ^ 34 + 96 ^ 38) % 11 = 9", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_452", "statement": "theorem mathd_algebra_452 (a : \u2115 \u2192 \u211d) (h\u2080 : \u2200 n, a (n + 2) - a (n + 1) = a (n + 1) - a n)\n (h\u2081 : a 1 = 2 / 3) (h\u2082 : a 9 = 4 / 5) : a 5 = 11 / 15", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_5", "statement": "theorem mathd_numbertheory_5 (n : \u2115) (h\u2080 : 10 \u2264 n) (h\u2081 : \u2203 x, x ^ 2 = n) (h\u2082 : \u2203 t, t ^ 3 = n) :\n 64 \u2264 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_207", "statement": "theorem mathd_numbertheory_207 : 8 * 9 ^ 2 + 5 * 9 + 2 = 695", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_342", "statement": "theorem mathd_numbertheory_342 : 54 % 6 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_483", "statement": "theorem mathd_numbertheory_483 (a : \u2115 \u2192 \u2115) (h\u2080 : a 1 = 1) (h\u2081 : a 2 = 1)\n (h\u2082 : \u2200 n, a (n + 2) = a (n + 1) + a n) : a 100 % 4 = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2020_p21", "statement": "theorem amc12b_2020_p21 (S : Finset \u2115)\n (h\u2080 : \u2200 n : \u2115, n \u2208 S \u2194 0 < n \u2227 (\u2191n + (1000 : \u211d)) / 70 = Int.floor (Real.sqrt n)) : S.card = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2003_p5", "statement": "theorem amc12a_2003_p5 (A M C : \u2115) (h\u2080 : A \u2264 9 \u2227 M \u2264 9 \u2227 C \u2264 9)\n (h\u2081 : Nat.ofDigits 10 [0, 1, C, M, A] + Nat.ofDigits 10 [2, 1, C, M, A] = 123422) :\n A + M + C = 14", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_495", "statement": "theorem mathd_numbertheory_495 (a b : \u2115) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : a % 10 = 2) (h\u2082 : b % 10 = 4)\n (h\u2083 : Nat.gcd a b = 6) : 108 \u2264 Nat.lcm a b", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_296", "statement": "theorem mathd_algebra_296 : abs ((3491 - 60) * (3491 + 60) - 3491 ^ 2 : \u2124) = 3600", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_abpbcpcageq3_sumaonsqrtapbgeq3onsqrt2", "statement": "theorem algebra_abpbcpcageq3_sumaonsqrtapbgeq3onsqrt2 (a b c : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c)\n (h\u2081 : 3 \u2264 a * b + b * c + c * a) :\n 3 / Real.sqrt 2 \u2264 a / Real.sqrt (a + b) + b / Real.sqrt (b + c) + c / Real.sqrt (c + a)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_2varlineareq_fp3zeq11_3tfm1m5zeqn68_feqn10_zeq7", "statement": "theorem algebra_2varlineareq_fp3zeq11_3tfm1m5zeqn68_feqn10_zeq7 (f z : \u2102) (h\u2080 : f + 3 * z = 11)\n (h\u2081 : 3 * (f - 1) - 5 * z = -68) : f = -10 \u2227 z = 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_247", "statement": "theorem mathd_numbertheory_247 (n : \u2115) (h\u2080 : 3 * n % 2 = 11) : n % 11 = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "induction_pord1p1on2powklt5on2", "statement": "theorem induction_pord1p1on2powklt5on2 (n : \u2115) (h\u2080 : 0 < n) :\n (\u220f k in Finset.Icc 1 n, 1 + (1 : \u211d) / 2 ^ k) < 5 / 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_107", "statement": "theorem mathd_algebra_107 (x y : \u211d) (h\u2080 : x ^ 2 + 8 * x + y ^ 2 - 6 * y = 0) :\n (x + 4) ^ 2 + (y - 3) ^ 2 = 5 ^ 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "numbertheory_2pownm1prime_nprime", "statement": "theorem numbertheory_2pownm1prime_nprime (n : \u2115) (h\u2080 : 0 < n) (h\u2081 : Nat.Prime (2 ^ n - 1)) :\n Nat.Prime n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_412", "statement": "theorem mathd_algebra_412 (x y : \u211d) (h\u2080 : x + y = 25) (h\u2081 : x - y = 11) : x = 18", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2013_p4", "statement": "theorem amc12a_2013_p4 : (2 ^ 2014 + 2 ^ 2012) / (2 ^ 2014 - 2 ^ 2012) = (5 : \u211d) / 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_392", "statement": "theorem mathd_algebra_392 (n : \u2115) (h\u2080 : Even n)\n (h\u2081 : (\u2191n - 2) ^ 2 + \u2191n ^ 2 + (\u2191n + 2) ^ 2 = (12296 : \u2115)) :\n (\u2191n - 2) * \u2191n * (\u2191n + 2) / 8 = (32736 : \u2115)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_314", "statement": "theorem mathd_numbertheory_314 (r n : \u2115) (h\u2080 : r = 1342 % 13) (h\u2081 : 0 < n) (h\u2082 : 1342 \u2223 n)\n (h\u2083 : n % 13 < r) : 6710 \u2264 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "induction_prod1p1onk3le3m1onn", "statement": "theorem induction_prod1p1onk3le3m1onn (n : \u2115) (h\u2080 : 0 < n) :\n (\u220f k in Finset.Icc 1 n, 1 + (1 : \u211d) / k ^ 3) \u2264 (3 : \u211d) - 1 / \u2191n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_343", "statement": "theorem mathd_numbertheory_343 : (\u220f k in Finset.range 6, 2 * k + 1) % 10 = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_756", "statement": "theorem mathd_algebra_756 (a b : \u211d) (h\u2080 : (2 : \u211d) ^ a = 32) (h\u2081 : a ^ b = 125) : b ^ a = 243", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2002_p7", "statement": "theorem amc12b_2002_p7 (a b c : \u2115) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c) (h\u2081 : b = a + 1) (h\u2082 : c = b + 1)\n (h\u2083 : a * b * c = 8 * (a + b + c)) : a ^ 2 + (b ^ 2 + c ^ 2) = 77", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_80", "statement": "theorem mathd_algebra_80 (x : \u211d) (h\u2080 : x \u2260 -1) (h\u2081 : (x - 9) / (x + 1) = 2) : x = -11", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_457", "statement": "theorem mathd_numbertheory_457 (n : \u2115) (h\u2080 : 0 < n) (h\u2081 : 80325 \u2223 n !) : 17 \u2264 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12_2000_p12", "statement": "theorem amc12_2000_p12 (a m c : \u2115) (h\u2080 : a + m + c = 12) :\n a * m * c + a * m + m * c + a * c \u2264 112", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_135", "statement": "theorem mathd_numbertheory_135 (n A B C : \u2115) (h\u2080 : n = 3 ^ 17 + 3 ^ 10) (h\u2081 : 11 \u2223 n + 1)\n (h\u2082 : [A, B, C].Pairwise (\u00b7 \u2260 \u00b7)) (h\u2083 : {A, B, C} \u2282 Finset.Icc 0 9) (h\u2084 : Odd A \u2227 Odd C)\n (h\u2085 : \u00ac3 \u2223 B) (h\u2086 : Nat.digits 10 n = [B, A, B, C, C, A, C, B, A]) :\n 100 * A + 10 * B + C = 129", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_275", "statement": "theorem mathd_algebra_275 (x : \u211d) (h : ((11 : \u211d) ^ (1 / 4)) ^ (3 * x - 3) = 1 / 5) :\n ((11 : \u211d) ^ (1 / 4)) ^ (6 * x + 2) = 121 / 25", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_388", "statement": "theorem mathd_algebra_388 (x y z : \u211d) (h\u2080 : 3 * x + 4 * y - 12 * z = 10)\n (h\u2081 : -2 * x - 3 * y + 9 * z = -4) : x = 14", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2020_p7", "statement": "theorem amc12a_2020_p7 (a : \u2115 \u2192 \u2115) (h\u2080 : a 0 ^ 3 = 1) (h\u2081 : a 1 ^ 3 = 8) (h\u2082 : a 2 ^ 3 = 27)\n (h\u2083 : a 3 ^ 3 = 64) (h\u2084 : a 4 ^ 3 = 125) (h\u2085 : a 5 ^ 3 = 216) (h\u2086 : a 6 ^ 3 = 343) :\n \u2191(\u2211 k in Finset.range 7, 6 * a k ^ 2) - \u2191(2 * \u2211 k in Finset.range 6, a k ^ 2) = (658 : \u2124)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1981_p6", "statement": "theorem imo_1981_p6 (f : \u2115 \u2192 \u2115 \u2192 \u2115) (h\u2080 : \u2200 y, f 0 y = y + 1) (h\u2081 : \u2200 x, f (x + 1) 0 = f x 1)\n (h\u2082 : \u2200 x y, f (x + 1) (y + 1) = f x (f (x + 1) y)) : \u2200 y, f 4 (y + 1) = 2 ^ (f 4 y + 3) - 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_263", "statement": "theorem mathd_algebra_263 (y : \u211d) (h\u2080 : 0 \u2264 19 + 3 * y) (h\u2081 : Real.sqrt (19 + 3 * y) = 7) :\n y = 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_34", "statement": "theorem mathd_numbertheory_34 (x : \u2115) (h\u2080 : x < 100) (h\u2081 : x * 9 % 100 = 1) : x = 89", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_764", "statement": "theorem mathd_numbertheory_764 (p : \u2115) (h\u2080 : Nat.Prime p) (h\u2081 : 7 \u2264 p) :\n (\u2211 k in Finset.Icc 1 (p - 2), (k : ZMod p)\u207b\u00b9 * ((k : ZMod p) + 1)\u207b\u00b9) = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2021_p4", "statement": "theorem amc12b_2021_p4 (m a : \u2115) (h\u2080 : 0 < m \u2227 0 < a) (h\u2081 : \u2191m / \u2191a = (3 : \u211d) / 4) :\n (84 * \u2191m + 70 * \u2191a) / (\u2191m + \u2191a) = (76 : \u211d)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1962_p2", "statement": "theorem imo_1962_p2 (x : \u211d) (h\u2080 : 0 \u2264 3 - x) (h\u2081 : 0 \u2264 x + 1)\n (h\u2082 : 1 / 2 < Real.sqrt (3 - x) - Real.sqrt (x + 1)) : -1 \u2264 x \u2227 x < 1 - Real.sqrt 31 / 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_170", "statement": "theorem mathd_algebra_170 (S : Finset \u2124) (h\u2080 : \u2200 n : \u2124, n \u2208 S \u2194 abs (n - 2) \u2264 5 + 6 / 10) :\n S.card = 11", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_432", "statement": "theorem mathd_algebra_432 (x : \u211d) : (x + 3) * (2 * x - 6) = 2 * x ^ 2 - 18", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_598", "statement": "theorem mathd_algebra_598 (a b c d : \u211d) (h\u2081 : (4 : \u211d) ^ a = 5) (h\u2082 : (5 : \u211d) ^ b = 6)\n (h\u2083 : (6 : \u211d) ^ c = 7) (h\u2084 : (7 : \u211d) ^ d = 8) : a * b * c * d = 3 / 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_bleqa_apbon2msqrtableqambsqon8b", "statement": "theorem algebra_bleqa_apbon2msqrtableqambsqon8b (a b : \u211d) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : b \u2264 a) :\n (a + b) / 2 - Real.sqrt (a * b) \u2264 (a - b) ^ 2 / (8 * b)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_276", "statement": "theorem mathd_algebra_276 (a b : \u2124)\n (h\u2080 : \u2200 x : \u211d, 10 * x ^ 2 - x - 24 = (a * x - 8) * (b * x + 3)) : a * b + b = 12", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p14", "statement": "theorem amc12a_2021_p14 :\n ((\u2211 k:\u2124 in Finset.Icc 1 20, Real.logb (5 ^ k) (3 ^ k ^ 2)) *\n \u2211 k:\u2124 in Finset.Icc 1 100, Real.logb (9 ^ k) (25 ^ k)) =\n 21000", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_sum1onsqrt2to1onsqrt10000lt198", "statement": "theorem algebra_sum1onsqrt2to1onsqrt10000lt198 :\n (\u2211 k in Finset.Icc (2 : \u2115) 10000, 1 / Real.sqrt k) < 198", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_618", "statement": "theorem mathd_numbertheory_618 (n : \u2115) (p : \u2115 \u2192 \u2115) (h\u2080 : \u2200 x, p x = x ^ 2 - x + 41)\n (h\u2081 : 1 < Nat.gcd (p n) (p (n + 1))) : 41 \u2264 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2020_p4", "statement": "theorem amc12a_2020_p4 (S : Finset \u2115)\n (h\u2080 : \u2200 n : \u2115, n \u2208 S \u2194 1000 \u2264 n \u2227 n \u2264 9999 \u2227 (\u2200 d : \u2115, d \u2208 Nat.digits 10 n \u2192 Even d) \u2227 5 \u2223 n) :\n S.card = 100", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2020_p6", "statement": "theorem amc12b_2020_p6 (n : \u2115) (h\u2080 : 9 \u2264 n) : \u2203 x : \u2115, (x : \u211d) ^ 2 = ((n + 2)! - (n + 1)!) / n !", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_435", "statement": "theorem mathd_numbertheory_435 (k : \u2115) (h\u2080 : 0 < k) (h\u2081 : \u2200 n, Nat.gcd (6 * n + k) (6 * n + 3) = 1)\n (h\u2082 : \u2200 n, Nat.gcd (6 * n + k) (6 * n + 2) = 1) (h\u2083 : \u2200 n, Nat.gcd (6 * n + k) (6 * n + 1) = 1) :\n 5 \u2264 k", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_others_exirrpowirrrat", "statement": "theorem algebra_others_exirrpowirrrat : \u2203 a b : \u211d, (Irrational a) \u2227 (Irrational b) \u2227 \u00ac(Irrational (a ^ b))", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_427", "statement": "theorem mathd_algebra_427 (x y z : \u211d) (h\u2080 : 3 * x + y = 17) (h\u2081 : 5 * y + z = 14)\n (h\u2082 : 3 * x + 5 * z = 41) : x + y + z = 12", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_76", "statement": "theorem mathd_algebra_76 (f : \u2124 \u2192 \u2124) (h\u2080 : \u2200 n, Odd n \u2192 f n = n ^ 2)\n (h\u2081 : \u2200 n, Even n \u2192 f n = n ^ 2 - 4 * n - 1) : f 4 = -1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_99", "statement": "theorem mathd_numbertheory_99 (n : \u2115) (h\u2080 : 2 * n % 47 = 15) : n % 47 = 31", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_9onxpypzleqsum2onxpy", "statement": "theorem algebra_9onxpypzleqsum2onxpy (x y z : \u211d) (h\u2080 : 0 < x \u2227 0 < y \u2227 0 < z) :\n 9 / (x + y + z) \u2264 2 / (x + y) + 2 / (y + z) + 2 / (z + x)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_233", "statement": "theorem mathd_numbertheory_233 (b : ZMod (11 ^ 2)) (h\u2080 : b = 24\u207b\u00b9) : b = 116", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_absapbon1pabsapbleqsumabsaon1pabsa", "statement": "theorem algebra_absapbon1pabsapbleqsumabsaon1pabsa (a b : \u211d) :\n abs (a + b) / (1 + abs (a + b)) \u2264 abs a / (1 + abs a) + abs b / (1 + abs b)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1984_p6", "statement": "theorem imo_1984_p6 (a b c d k m : \u2115) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c \u2227 0 < d)\n (h\u2081 : Odd a \u2227 Odd b \u2227 Odd c \u2227 Odd d) (h\u2082 : a < b \u2227 b < c \u2227 c < d) (h\u2083 : a * d = b * c)\n (h\u2084 : a + d = 2 ^ k) (h\u2085 : b + c = 2 ^ m) : a = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_2001_p6", "statement": "theorem imo_2001_p6 (a b c d : \u2115) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c \u2227 0 < d) (h\u2081 : d < c) (h\u2082 : c < b)\n (h\u2083 : b < a) (h\u2084 : a * c + b * d = (b + d + a - c) * (b + d + c - a)) :\n \u00acNat.Prime (a * b + c * d)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_321", "statement": "theorem mathd_numbertheory_321 (n : ZMod 1399) (h\u2081 : n = 160\u207b\u00b9) : n = 1058", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_17", "statement": "theorem mathd_algebra_17 (a : \u211d)\n (h\u2080 : Real.sqrt (4 + Real.sqrt (16 + 16 * a)) + Real.sqrt (1 + Real.sqrt (1 + a)) = 6) :\n a = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_153", "statement": "theorem mathd_algebra_153 (n : \u211d) (h\u2080 : n = 1 / 3) :\n Int.floor (10 * n) + Int.floor (100 * n) + Int.floor (1000 * n) + Int.floor (10000 * n) =\n 3702", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_sqineq_unitcircatbpamblt1", "statement": "theorem algebra_sqineq_unitcircatbpamblt1 (a b : \u211d) (h\u2080 : a ^ 2 + b ^ 2 = 1) :\n a * b + (a - b) \u2264 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p18", "statement": "theorem amc12a_2021_p18 (f : \u211a \u2192 \u211d) (h\u2080 : \u2200 x > 0, \u2200 y > 0, f (x * y) = f x + f y)\n (h\u2081 : \u2200 p, Nat.Prime p \u2192 f p = p) : f (25 /. 11) < 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_329", "statement": "theorem mathd_algebra_329 (x y : \u211d) (h\u2080 : 3 * y = x) (h\u2081 : 2 * x + 5 * y = 11) : x + y = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "induction_pprime_pdvdapowpma", "statement": "theorem induction_pprime_pdvdapowpma (p a : \u2115) (h\u2080 : 0 < a) (h\u2081 : Nat.Prime p) : p \u2223 a ^ p - a", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p9", "statement": "theorem amc12a_2021_p9 : (\u220f k in Finset.range 7, 2 ^ 2 ^ k + 3 ^ 2 ^ k) = 3 ^ 128 - 2 ^ 128", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1984_p1", "statement": "theorem aime_1984_p1 (u : \u2115 \u2192 \u211a) (h\u2080 : \u2200 n, u (n + 1) = u n + 1)\n (h\u2081 : (\u2211 k in Finset.range 98, u k.succ) = 137) :\n (\u2211 k in Finset.range 49, u (2 * k.succ)) = 93", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p22", "statement": "theorem amc12a_2021_p22 (a b c : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = x ^ 3 + a * x ^ 2 + b * x + c)\n (h\u2081 :\n f \u207b\u00b9' {0} =\n {Real.cos (2 * Real.pi / 7), Real.cos (4 * Real.pi / 7), Real.cos (6 * Real.pi / 7)}) :\n a * b * c = 1 / 32", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_229", "statement": "theorem mathd_numbertheory_229 : 5 ^ 30 % 7 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_100", "statement": "theorem mathd_numbertheory_100 (n : \u2115) (h\u2080 : 0 < n) (h\u2081 : Nat.gcd n 40 = 10)\n (h\u2082 : Nat.lcm n 40 = 280) : n = 70", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_313", "statement": "theorem mathd_algebra_313 (v i z : \u2102) (h\u2080 : v = i * z) (h\u2081 : v = 1 + Complex.I)\n (h\u2082 : z = 2 - Complex.I) : i = 1 / 5 + 3 / 5 * Complex.I", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2002_p4", "statement": "theorem amc12b_2002_p4 (n : \u2115) (h\u2080 : 0 < n) (h\u2081 : (1 /. 2 + 1 /. 3 + 1 /. 7 + 1 /. \u2191n).den = 1) :\n n = 42", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2002_p6", "statement": "theorem amc12a_2002_p6 (n : \u2115) (h\u2080 : 0 < n) : \u2203 m, m > n \u2227 \u2203 p, m * p \u2264 m + p", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2003_p23", "statement": "theorem amc12a_2003_p23 (S : Finset \u2115)\n (h\u2080 : \u2200 k : \u2115, k \u2208 S \u2194 0 < k \u2227 (k * k : \u2115) \u2223 \u220f i in Finset.Icc 1 9, i !) : S.card = 672", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_129", "statement": "theorem mathd_algebra_129 (a : \u211d) (h\u2080 : a \u2260 0) (h\u2081 : 8\u207b\u00b9 / 4\u207b\u00b9 - a\u207b\u00b9 = 1) : a = -2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2021_p18", "statement": "theorem amc12b_2021_p18 (z : \u2102)\n (h\u2080 : 12 * Complex.normSq z = 2 * Complex.normSq (z + 2) + Complex.normSq (z ^ 2 + 1) + 31) :\n z + 6 / z = -2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_484", "statement": "theorem mathd_algebra_484 : Real.log 27 / Real.log 3 = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_551", "statement": "theorem mathd_numbertheory_551 : 1529 % 6 = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_304", "statement": "theorem mathd_algebra_304 : 91 ^ 2 = 8281", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p8", "statement": "theorem amc12a_2021_p8 (d : \u2115 \u2192 \u2115) (h\u2080 : d 0 = 0) (h\u2081 : d 1 = 0) (h\u2082 : d 2 = 1)\n (h\u2083 : \u2200 n \u2265 3, d n = d (n - 1) + d (n - 3)) : Even (d 2021) \u2227 Odd (d 2022) \u2227 Even (d 2023)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_ineq_nto1onlt2m1on", "statement": "theorem algebra_ineq_nto1onlt2m1on (n : \u2115) : (n : \u211d) ^ ((1 : \u211d) / n) < 2 - 1 / n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2002_p19", "statement": "theorem amc12b_2002_p19 (a b c : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c) (h\u2081 : a * (b + c) = 152)\n (h\u2082 : b * (c + a) = 162) (h\u2083 : c * (a + b) = 170) : a * b * c = 720", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_341", "statement": "theorem mathd_numbertheory_341 (a b c : \u2115) (h\u2080 : a \u2264 9 \u2227 b \u2264 9 \u2227 c \u2264 9)\n (h\u2081 : Nat.digits 10 (5 ^ 100 % 1000) = [c, b, a]) : a + b + c = 13", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_711", "statement": "theorem mathd_numbertheory_711 (m n : \u2115) (h\u2080 : 0 < m \u2227 0 < n) (h\u2081 : Nat.gcd m n = 8)\n (h\u2082 : Nat.lcm m n = 112) : 72 \u2264 m + n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2020_p22", "statement": "theorem amc12b_2020_p22 (t : \u211d) : (2 ^ t - 3 * t) * t / 4 ^ t \u2264 1 / 12", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_113", "statement": "theorem mathd_algebra_113 (x : \u211d) : x ^ 2 - 14 * x + 3 \u2265 7 ^ 2 - 14 * 7 + 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2020_p9", "statement": "theorem amc12a_2020_p9 (S : Finset \u211d)\n (h\u2080 : \u2200 x : \u211d, x \u2208 S \u2194 0 \u2264 x \u2227 x \u2264 2 * Real.pi \u2227 Real.tan (2 * x) = Real.cos (x / 2)) :\n S.card = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12_2000_p1", "statement": "theorem amc12_2000_p1 (i m o : \u2115) (h\u2080 : i \u2260 m \u2227 m \u2260 o \u2227 o \u2260 i) (h\u2081 : i * m * o = 2001) :\n i + m + o \u2264 671", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p19", "statement": "theorem amc12a_2021_p19 (S : Finset \u211d)\n (h\u2080 :\n \u2200 x : \u211d,\n x \u2208 S \u2194\n 0 \u2264 x \u2227\n x \u2264 Real.pi \u2227\n Real.sin (Real.pi / 2 * Real.cos x) = Real.cos (Real.pi / 2 * Real.sin x)) :\n S.card = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_amgm_sumasqdivbgeqsuma", "statement": "theorem algebra_amgm_sumasqdivbgeqsuma (a b c d : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c \u2227 0 < d) :\n a ^ 2 / b + b ^ 2 / c + c ^ 2 / d + d ^ 2 / a \u2265 a + b + c + d", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_212", "statement": "theorem mathd_numbertheory_212 : 16 ^ 17 * 17 ^ 18 * 18 ^ 19 % 10 = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_320", "statement": "theorem mathd_numbertheory_320 (n : \u2115) (h\u2080 : n < 101) (h\u2081 : 101 \u2223 123456 - n) : n = 34", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_125", "statement": "theorem mathd_algebra_125 (x y : \u2115) (h\u2080 : 0 < x \u2227 0 < y) (h\u2081 : 5 * x = y)\n (h\u2082 : \u2191x - (3 : \u2124) + (y - (3 : \u2124)) = 30) : x = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "induction_1pxpownlt1pnx", "statement": "theorem induction_1pxpownlt1pnx (x : \u211d) (n : \u2115) (h\u2080 : -1 < x) (h\u2081 : 0 < n) :\n 1 + \u2191n * x \u2264 (1 + x) ^ (n : \u2115)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_148", "statement": "theorem mathd_algebra_148 (c : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = c * x ^ 3 - 9 * x + 3)\n (h\u2081 : f 2 = 9) : c = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2019_p12", "statement": "theorem amc12a_2019_p12 (x y : \u211d) (h\u2080 : x \u2260 1 \u2227 y \u2260 1)\n (h\u2081 : Real.log x / Real.log 2 = Real.log 16 / Real.log y) (h\u2082 : x * y = 64) :\n (Real.log (x / y) / Real.log 2) ^ 2 = 20", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "induction_11div10tonmn1ton", "statement": "theorem induction_11div10tonmn1ton (n : \u2115) : 11 \u2223 10 ^ n - (-1 : \u2124) ^ n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_amgm_sum1toneqn_prod1tonleq1", "statement": "theorem algebra_amgm_sum1toneqn_prod1tonleq1 (a : \u2115 \u2192 NNReal) (n : \u2115)\n (h\u2080 : (\u2211 x in Finset.range n, a x) = n) : (\u220f x in Finset.range n, a x) \u2264 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1985_p6", "statement": "theorem imo_1985_p6 (f : \u2115 \u2192 NNReal \u2192 \u211d) (h\u2080 : \u2200 x, f 1 x = x)\n (h\u2081 : \u2200 x n, f (n + 1) x = f n x * (f n x + 1 / n)) :\n \u2203! a, \u2200 n, 0 < n \u2192 0 < f n a \u2227 f n a < f (n + 1) a \u2227 f (n + 1) a < 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2020_p15", "statement": "theorem amc12a_2020_p15 (a b : \u2102) (h\u2080 : a ^ 3 - 8 = 0) (h\u2081 : b ^ 3 - 8 * b ^ 2 - 8 * b + 64 = 0) :\n Complex.abs (a - b) \u2264 2 * Real.sqrt 21", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_332", "statement": "theorem mathd_algebra_332 (x y : \u211d) (h\u2080 : (x + y) / 2 = 7) (h\u2081 : Real.sqrt (x * y) = Real.sqrt 19) :\n x ^ 2 + y ^ 2 = 158", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_cubrtrp1oncubrtreq3_rcubp1onrcubeq5778", "statement": "theorem algebra_cubrtrp1oncubrtreq3_rcubp1onrcubeq5778 (r : \u211d)\n (h\u2080 : r ^ ((1 : \u211d) / 3) + 1 / r ^ ((1 : \u211d) / 3) = 3) : r ^ 3 + 1 / r ^ 3 = 5778", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_293", "statement": "theorem mathd_algebra_293 (x : NNReal) :\n Real.sqrt (60 * x) * Real.sqrt (12 * x) * Real.sqrt (63 * x) = 36 * x * Real.sqrt (35 * x)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_440", "statement": "theorem mathd_algebra_440 (x : \u211d) (h\u2080 : 3 / 2 / 3 = x / 10) : x = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_254", "statement": "theorem mathd_numbertheory_254 : (239 + 174 + 83) % 10 = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12_2000_p6", "statement": "theorem amc12_2000_p6 (p q : \u2115) (h\u2080 : Nat.Prime p \u2227 Nat.Prime q) (h\u2081 : 4 \u2264 p \u2227 p \u2264 18)\n (h\u2082 : 4 \u2264 q \u2227 q \u2264 18) : p * q - (p + q) \u2260 194", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1988_p8", "statement": "theorem aime_1988_p8 (f : \u2115 \u2192 \u2115 \u2192 \u211d) (h\u2080 : \u2200 x, 0 < x \u2192 f x x = x)\n (h\u2081 : \u2200 x y, 0 < x \u2227 0 < y \u2192 f x y = f y x)\n (h\u2082 : \u2200 x y, 0 < x \u2227 0 < y \u2192 (\u2191x + \u2191y) * f x y = y * f x (x + y)) : f 14 52 = 364", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_114", "statement": "theorem mathd_algebra_114 (a : \u211d) (h\u2080 : a = 8) :\n (16 * (a ^ 2) ^ ((1 : \u211d) / 3)) ^ ((1 : \u211d) / 3) = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_2019_p1", "statement": "theorem imo_2019_p1 (f : \u2124 \u2192 \u2124) :\n (\u2200 a b, f (2 * a) + 2 * f b = f (f (a + b))) \u2194 \u2200 z, f z = 0 \u2228 \u2203 c, \u2200 z, f z = 2 * z + c", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_513", "statement": "theorem mathd_algebra_513 (a b : \u211d) (h\u2080 : 3 * a + 2 * b = 5) (h\u2081 : a + b = 2) : a = 1 \u2227 b = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_143", "statement": "theorem mathd_algebra_143 (f g : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = x + 1) (h\u2081 : \u2200 x, g x = x ^ 2 + 3) :\n f (g 2) = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_354", "statement": "theorem mathd_algebra_354 (a d : \u211d) (h\u2080 : a + 6 * d = 30) (h\u2081 : a + 10 * d = 60) :\n a + 20 * d = 135", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1984_p7", "statement": "theorem aime_1984_p7 (f : \u2124 \u2192 \u2124) (h\u2080 : \u2200 n, 1000 \u2264 n \u2192 f n = n - 3)\n (h\u2081 : \u2200 n, n < 1000 \u2192 f n = f (f (n + 5))) : f 84 = 997", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_246", "statement": "theorem mathd_algebra_246 (a b : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 x, f x = a * x ^ 4 - b * x ^ 2 + x + 5)\n (h\u2082 : f (-3) = 2) : f 3 = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1983_p3", "statement": "theorem aime_1983_p3 (f : \u211d \u2192 \u211d)\n (h\u2080 : \u2200 x, f x = x ^ 2 + (18 * x + 30) - 2 * Real.sqrt (x ^ 2 + (18 * x + 45)))\n (h\u2081 : Fintype (f \u207b\u00b9' {0})) : (\u220f x in (f \u207b\u00b9' {0}).toFinset, x) = 20", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "numbertheory_3pow2pownm1mod2pownp3eq2pownp2", "statement": "theorem numbertheory_3pow2pownm1mod2pownp3eq2pownp2 (n : \u2115) (h\u2080 : 0 < n) :\n (3 ^ 2 ^ n - 1) % 2 ^ (n + 3) = 2 ^ (n + 2)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_85", "statement": "theorem mathd_numbertheory_85 : 1 * 3 ^ 3 + 2 * 3 ^ 2 + 2 * 3 + 2 = 53", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12_2001_p21", "statement": "theorem amc12_2001_p21 (a b c d : \u2115) (h\u2080 : a * b * c * d = 8!) (h\u2081 : a * b + a + b = 524)\n (h\u2082 : b * c + b + c = 146) (h\u2083 : c * d + c + d = 104) : \u2191a - \u2191d = (10 : \u2124)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_239", "statement": "theorem mathd_numbertheory_239 : (\u2211 k in Finset.Icc 1 12, k) % 4 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2002_p2", "statement": "theorem amc12b_2002_p2 (x : \u2124) (h\u2080 : x = 4) :\n (3 * x - 2) * (4 * x + 1) - (3 * x - 2) * (4 * x) + 1 = 11", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_196", "statement": "theorem mathd_algebra_196 (S : Finset \u211d) (h\u2080 : \u2200 x : \u211d, x \u2208 S \u2194 abs (2 - x) = 3) :\n (\u2211 k in S, k) = 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_342", "statement": "theorem mathd_algebra_342 (a d : \u211d) (h\u2080 : (\u2211 k in Finset.range 5, a + k * d) = 70)\n (h\u2081 : (\u2211 k in Finset.range 10, a + k * d) = 210) : a = 42 / 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_517", "statement": "theorem mathd_numbertheory_517 : 121 * 122 * 123 % 4 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2009_p7", "statement": "theorem amc12a_2009_p7 (x : \u211d) (n : \u2115) (a : \u2115 \u2192 \u211d)\n (h\u2081 : \u2200 m, a (m + 1) - a m = a (m + 2) - a (m + 1)) (h\u2082 : a 1 = 2 * x - 3)\n (h\u2083 : a 2 = 5 * x - 11) (h\u2084 : a 3 = 3 * x + 1) (h\u2085 : a n = 2009) : n = 502", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_270", "statement": "theorem mathd_algebra_270 (f : \u211d \u2192 \u211d) (h\u2080 : \u2200 (x) (_ : x \u2260 -2), f x = 1 / (x + 2)) :\n f (f 1) = 3 / 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p12", "statement": "theorem amc12a_2021_p12 (a b c d : \u211d) (f : \u2102 \u2192 \u2102)\n (h\u2080 : \u2200 z, f z = z ^ 6 - 10 * z ^ 5 + a * z ^ 4 + b * z ^ 3 + c * z ^ 2 + d * z + 16)\n (h\u2081 : \u2200 z, f z = 0 \u2192 z.im = 0 \u2227 0 < z.re \u2227 \u2191(Int.floor z.re) = z.re) : b = -88", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_362", "statement": "theorem mathd_algebra_362 (a b : \u211d) (h\u2080 : a ^ 2 * b ^ 3 = 32 / 27) (h\u2081 : a / b ^ 3 = 27 / 4) :\n a + b = 8 / 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_521", "statement": "theorem mathd_numbertheory_521 (m n : \u2115) (h\u2080 : Even m) (h\u2081 : Even n) (h\u2082 : m - n = 2)\n (h\u2083 : m * n = 288) : m = 18", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2002_p13", "statement": "theorem amc12a_2002_p13 (a b : \u211d) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : a \u2260 b) (h\u2082 : abs (a - 1 / a) = 1)\n (h\u2083 : abs (b - 1 / b) = 1) : a + b = Real.sqrt 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1964_p2", "statement": "theorem imo_1964_p2 (a b c : \u211d) (h\u2080 : 0 < a \u2227 0 < b \u2227 0 < c) (h\u2081 : c < a + b) (h\u2082 : b < a + c)\n (h\u2083 : a < b + c) :\n a ^ 2 * (b + c - a) + b ^ 2 * (c + a - b) + c ^ 2 * (a + b - c) \u2264 3 * a * b * c", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_289", "statement": "theorem mathd_algebra_289 (k t m n : \u2115) (h\u2080 : Nat.Prime m \u2227 Nat.Prime n) (h\u2081 : t < k)\n (h\u2082 : k ^ 2 - m * k + n = 0) (h\u2083 : t ^ 2 - m * t + n = 0) :\n m ^ n + n ^ m + k ^ t + t ^ k = 20", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p3", "statement": "theorem amc12a_2021_p3 (x y : \u2115) (h\u2080 : x + y = 17402) (h\u2081 : 10 \u2223 x) (h\u2082 : x / 10 = y) :\n \u2191x - \u2191y = (14238 : \u2124)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2008_p25", "statement": "theorem amc12a_2008_p25 (a b : \u2115 \u2192 \u211d) (h\u2080 : \u2200 n, a (n + 1) = Real.sqrt 3 * a n - b n)\n (h\u2081 : \u2200 n, b (n + 1) = Real.sqrt 3 * b n + a n) (h\u2082 : a 100 = 2) (h\u2083 : b 100 = 4) :\n a 1 + b 1 = 1 / 2 ^ 98", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_apbpceq2_abpbcpcaeq1_aleq1on3anbleq1ancleq4on3", "statement": "theorem algebra_apbpceq2_abpbcpcaeq1_aleq1on3anbleq1ancleq4on3 (a b c : \u211d) (h\u2080 : a \u2264 b \u2227 b \u2264 c)\n (h\u2081 : a + b + c = 2) (h\u2082 : a * b + b * c + c * a = 1) :\n 0 \u2264 a \u2227 a \u2264 1 / 3 \u2227 1 / 3 \u2264 b \u2227 b \u2264 1 \u2227 1 \u2264 c \u2227 c \u2264 4 / 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_66", "statement": "theorem mathd_numbertheory_66 : 194 % 11 = 7", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2021_p1", "statement": "theorem amc12b_2021_p1 (S : Finset \u2124) (h\u2080 : \u2200 x : \u2124, x \u2208 S \u2194 \u2191(abs x) < 3 * Real.pi) :\n S.card = 19", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_apbon2pownleqapownpbpowon2", "statement": "theorem algebra_apbon2pownleqapownpbpowon2 (a b : \u211d) (n : \u2115) (h\u2080 : 0 < a \u2227 0 < b) (h\u2081 : 0 < n) :\n ((a + b) / 2) ^ n \u2264 (a ^ n + b ^ n) / 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1968_p5_1", "statement": "theorem imo_1968_p5_1 (a : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : 0 < a)\n (h\u2081 : \u2200 x, f (x + a) = 1 / 2 + Real.sqrt (f x - f x ^ 2)) : \u2203 b > 0, \u2200 x, f (x + b) = f x", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1990_p15", "statement": "theorem aime_1990_p15 (a b x y : \u211d) (h\u2080 : a * x + b * y = 3) (h\u2081 : a * x ^ 2 + b * y ^ 2 = 7)\n (h\u2082 : a * x ^ 3 + b * y ^ 3 = 16) (h\u2083 : a * x ^ 4 + b * y ^ 4 = 42) :\n a * x ^ 5 + b * y ^ 5 = 20", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_235", "statement": "theorem mathd_numbertheory_235 : (29 * 79 + 31 * 81) % 10 = 2", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2020_p13", "statement": "theorem amc12b_2020_p13 :\n Real.sqrt (Real.log 6 / Real.log 2 + Real.log 6 / Real.log 3) =\n Real.sqrt (Real.log 3 / Real.log 2) + Real.sqrt (Real.log 2 / Real.log 3)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12b_2021_p13", "statement": "theorem amc12b_2021_p13 (S : Finset \u211d)\n (h\u2080 :\n \u2200 x : \u211d, x \u2208 S \u2194 0 < x \u2227 x \u2264 2 * Real.pi \u2227 1 - 3 * Real.sin x + 5 * Real.cos (3 * x) = 0) :\n S.card = 6", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_234", "statement": "theorem mathd_numbertheory_234 (a b : \u2115) (h\u2080 : 1 \u2264 a \u2227 a \u2264 9 \u2227 b \u2264 9)\n (h\u2081 : (10 * a + b) ^ 3 = 912673) : a + b = 16", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "numbertheory_aoddbdiv4asqpbsqmod8eq1", "statement": "theorem numbertheory_aoddbdiv4asqpbsqmod8eq1 (a : \u2124) (b : \u2115) (h\u2080 : Odd a) (h\u2081 : 4 \u2223 b) :\n (a ^ 2 + (b ^ 2 : \u2115)) % 8 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_222", "statement": "theorem mathd_numbertheory_222 (b : \u2115) (h\u2080 : Nat.lcm 120 b = 3720) (h\u2081 : Nat.gcd 120 b = 8) :\n b = 248", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1999_p11", "statement": "theorem aime_1999_p11 (m : \u211a) (h\u2080 : 0 < m)\n (h\u2081 : (\u2211 k in Finset.Icc (1 : \u2115) 35, Real.sin (5 * k * \u03c0 / 180)) = Real.tan (m * \u03c0 / 180))\n (h\u2082 : (m.num : \u211d) / m.den < 90) : \u2191m.den + m.num = 177", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_359", "statement": "theorem mathd_algebra_359 (y : \u211d) (h\u2080 : y + 6 + y = 2 * 12) : y = 9", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1965_p2", "statement": "theorem imo_1965_p2 (x y z : \u211d) (a : \u2115 \u2192 \u211d) (h\u2080 : 0 < a 0 \u2227 0 < a 4 \u2227 0 < a 8)\n (h\u2081 : a 1 < 0 \u2227 a 2 < 0) (h\u2082 : a 3 < 0 \u2227 a 5 < 0) (h\u2083 : a 6 < 0 \u2227 a 7 < 0)\n (h\u2084 : 0 < a 0 + a 1 + a 2) (h\u2085 : 0 < a 3 + a 4 + a 5) (h\u2086 : 0 < a 6 + a 7 + a 8)\n (h\u2087 : a 0 * x + a 1 * y + a 2 * z = 0) (h\u2088 : a 3 * x + a 4 * y + a 5 * z = 0)\n (h\u2089 : a 6 * x + a 7 * y + a 8 * z = 0) : x = 0 \u2227 y = 0 \u2227 z = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_288", "statement": "theorem mathd_algebra_288 (x y : \u211d) (n : NNReal) (h\u2080 : x < 0 \u2227 y < 0) (h\u2081 : abs y = 6)\n (h\u2082 : Real.sqrt ((x - 8) ^ 2 + (y - 3) ^ 2) = 15)\n (h\u2083 : Real.sqrt (x ^ 2 + y ^ 2) = Real.sqrt n) : n = 52", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_127", "statement": "theorem mathd_numbertheory_127 : (\u2211 k in Finset.range 101, 2 ^ k) % 7 = 3", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "imo_1974_p3", "statement": "theorem imo_1974_p3 (n : \u2115) :\n \u00ac5 \u2223 \u2211 k in Finset.range (n + 1), Nat.choose (2 * n + 1) (2 * k + 1) * 2 ^ (3 * k)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1991_p9", "statement": "theorem aime_1991_p9 (x : \u211d) (m : \u211a) (h\u2080 : 1 / Real.cos x + Real.tan x = 22 / 7)\n (h\u2081 : 1 / Real.sin x + 1 / Real.tan x = m) : \u2191m.den + m.num = 44", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2009_p6", "statement": "theorem amc12a_2009_p6 (m n p q : \u211d) (h\u2080 : p = 2 ^ m) (h\u2081 : q = 3 ^ n) :\n p ^ (2 * n) * q ^ m = 12 ^ (m * n)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_158", "statement": "theorem mathd_algebra_158 (a : \u2115) (h\u2080 : Even a)\n (h\u2081 : \u2191(\u2211 k in Finset.range 8, 2 * k + 1) - \u2191(\u2211 k in Finset.range 5, a + 2 * k) = (4 : \u2124)) :\n a = 8", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "algebra_absxm1pabsxpabsxp1eqxp2_0leqxleq1", "statement": "theorem algebra_absxm1pabsxpabsxp1eqxp2_0leqxleq1 (x : \u211d)\n (h\u2080 : abs (x - 1) + abs x + abs (x + 1) = x + 2) : 0 \u2264 x \u2227 x \u2264 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1990_p4", "statement": "theorem aime_1990_p4 (x : \u211d) (h\u2080 : 0 < x) (h\u2081 : x ^ 2 - 10 * x - 29 \u2260 0)\n (h\u2082 : x ^ 2 - 10 * x - 45 \u2260 0) (h\u2083 : x ^ 2 - 10 * x - 69 \u2260 0)\n (h\u2084 : 1 / (x ^ 2 - 10 * x - 29) + 1 / (x ^ 2 - 10 * x - 45) - 2 / (x ^ 2 - 10 * x - 69) = 0) :\n x = 13", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_541", "statement": "theorem mathd_numbertheory_541 (m n : \u2115) (h\u2080 : 1 < m) (h\u2081 : 1 < n) (h\u2082 : m * n = 2005) :\n m + n = 406", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_314", "statement": "theorem mathd_algebra_314 (n : \u2115) (h\u2080 : n = 11) : (1 / 4) ^ (n + 1) * 2 ^ (2 * n) = 1 / 4", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12_2000_p20", "statement": "theorem amc12_2000_p20 (x y z : \u211d) (h\u2080 : 0 < x \u2227 0 < y \u2227 0 < z) (h\u2081 : x + 1 / y = 4)\n (h\u2082 : y + 1 / z = 1) (h\u2083 : z + 1 / x = 7 / 3) : x * y * z = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_302", "statement": "theorem mathd_algebra_302 : (Complex.I / 2) ^ 2 = -(1 / 4)", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1983_p2", "statement": "theorem aime_1983_p2 (x p : \u211d) (f : \u211d \u2192 \u211d) (h\u2080 : 0 < p \u2227 p < 15) (h\u2081 : p \u2264 x \u2227 x \u2264 15)\n (h\u2082 : f x = abs (x - p) + abs (x - 15) + abs (x - p - 15)) : 15 \u2264 f x", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_139", "statement": "theorem mathd_algebra_139 (s : \u211d \u2192 \u211d \u2192 \u211d)\n (h\u2080 : \u2200 (x) (_ : x \u2260 0), \u2200 (y) (_ : y \u2260 0), s x y = (1 / y - 1 / x) / (x - y)) :\n s 3 11 = 1 / 33", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2021_p25", "statement": "theorem amc12a_2021_p25 (N : \u2115) (f : \u2115 \u2192 \u211d)\n (h\u2080 : \u2200 n, 0 < n \u2192 f n = (Nat.divisors n).card / n ^ ((1 : \u211d) / 3))\n (h\u2081 : \u2200 (n) (_ : n \u2260 N), 0 < n \u2192 f n < f N) : (Nat.digits 10 N).sum = 9", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "amc12a_2020_p25", "statement": "theorem amc12a_2020_p25 (a : \u211a) (S : Finset \u211d)\n (h\u2080 : \u2200 x : \u211d, x \u2208 S \u2194 \u2191\u230ax\u230b * (x - \u2191\u230ax\u230b) = \u2191a * x ^ 2) (h\u2081 : (\u2211 k in S, k) = 420) :\n \u2191a.den + a.num = 929", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_150", "statement": "theorem mathd_numbertheory_150 (n : \u2115) (h\u2080 : \u00acNat.Prime (7 + 30 * n)) : 6 \u2264 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1989_p8", "statement": "theorem aime_1989_p8 (a b c d e f g : \u211d)\n (h\u2080 : a + 4 * b + 9 * c + 16 * d + 25 * e + 36 * f + 49 * g = 1)\n (h\u2081 : 4 * a + 9 * b + 16 * c + 25 * d + 36 * e + 49 * f + 64 * g = 12)\n (h\u2082 : 9 * a + 16 * b + 25 * c + 36 * d + 49 * e + 64 * f + 81 * g = 123) :\n 16 * a + 25 * b + 36 * c + 49 * d + 64 * e + 81 * f + 100 * g = 334", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_296", "statement": "theorem mathd_numbertheory_296 (n : \u2115) (h\u2080 : 2 \u2264 n) (h\u2081 : \u2203 x, x ^ 3 = n) (h\u2082 : \u2203 t, t ^ 4 = n) :\n 4096 \u2264 n", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_142", "statement": "theorem mathd_algebra_142 (m b : \u211d) (h\u2080 : m * 7 + b = -1) (h\u2081 : m * -1 + b = 7) : m + b = 5", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "numbertheory_exk2powkeqapb2mulbpa2_aeq1", "statement": "theorem numbertheory_exk2powkeqapb2mulbpa2_aeq1 (a b : \u2115) (h\u2080 : 0 < a \u2227 0 < b)\n (h\u2081 : \u2203 k > 0, 2 ^ k = (a + b ^ 2) * (b + a ^ 2)) : a = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_400", "statement": "theorem mathd_algebra_400 (x : \u211d) (h\u2080 : 5 + 500 / 100 * 10 = 110 / 100 * x) : x = 50", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "aime_1995_p7", "statement": "theorem aime_1995_p7 (k m n : \u2115) (t : \u211d) (h\u2080 : 0 < k \u2227 0 < m \u2227 0 < n) (h\u2081 : Nat.gcd m n = 1)\n (h\u2082 : (1 + Real.sin t) * (1 + Real.cos t) = 5 / 4)\n (h\u2083 : (1 - Real.sin t) * (1 - Real.cos t) = m / n - Real.sqrt k) : k + m + n = 27", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_185", "statement": "theorem mathd_numbertheory_185 (n : \u2115) (h\u2080 : n % 5 = 3) : 2 * n % 5 = 1", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_441", "statement": "theorem mathd_algebra_441 (x : \u211d) (h\u2080 : x \u2260 0) :\n 12 / (x * x) * (x ^ 4 / (14 * x)) * (35 / (3 * x)) = 10", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_numbertheory_582", "statement": "theorem mathd_numbertheory_582 (n : \u2115) (h\u2080 : 0 < n) (h\u2081 : 3 \u2223 n) :\n (n + 4 + (n + 6) + (n + 8)) % 9 = 0", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} +{"full_name": "mathd_algebra_338", "statement": "theorem mathd_algebra_338 (a b c : \u211d) (h\u2080 : 3 * a + b + c = -3) (h\u2081 : a + 3 * b + c = 9)\n (h\u2082 : a + b + 3 * c = 19) : a * b * c = -56", "url": "https://github.com/wzj423/lean-dojo-mew", "commit": "1ef4e4cac9dd370b7be6d648ce135a06aa6fce5f", "file_path": "MiniF2F/Test.lean", "split": "test"} diff --git a/minif2f/proofsearch_internLM2-plus.py b/minif2f/proofsearch_internLM2-plus.py index 09f39e5..2adf796 100644 --- a/minif2f/proofsearch_internLM2-plus.py +++ b/minif2f/proofsearch_internLM2-plus.py @@ -1,6 +1,6 @@ # Lean proof search with LeanDojo interaction # Author: Sean Welleck -import json +import json, os import heapq import subprocess import time @@ -46,6 +46,7 @@ def generate_vllm(prompt, model, tokenizer, temperatures, num_samples, stop, max use_beam_search=temperature==0.0, max_tokens=max_tokens, stop=stop, + length_penalty=0.0 ) outputs = model.generate([prompt], params, use_tqdm=False) if len(outputs) == 0: @@ -101,12 +102,12 @@ def best_first_search( """Best first search.""" attempt_results = [] try: - with Dojo(theorem, hard_timeout=timeout) as (dojo, init_state): + with Dojo(theorem, hard_timeout=timeout,additional_imports=["Mathlib.Tactic"]) as (dojo, init_state): start = time.time() proof_finished = False queue = [(0.0, [], init_state, [])] - visited = set() + visited = dict() for iteration in trange(max_iters): if len(queue) == 0 or proof_finished: @@ -114,7 +115,7 @@ def best_first_search( total_score, steps, state, trace = heapq.heappop(queue) ts = _tactic_state(state) - visited.add(ts) + visited[ts] = visited.get(ts,0)+1 step_cands, step_scores = generate_vllm( prompt_fn(ts), @@ -150,8 +151,9 @@ def best_first_search( proof_finished = True break elif isinstance(result, TacticState): - if _tactic_state(result) not in visited: + if visited.get(_tactic_state(result),0) <= 1: #_tactic_state(result) not in visited: # Score is negative log probability summed across steps + visited[_tactic_state(result)] = visited.get(_tactic_state(result),0) + 1 new_score = (total_score - score) heapq.heappush( queue, (new_score, steps+[step], result, trace+[step_trace]) @@ -207,7 +209,6 @@ def _load_data(dataset_name, dataset_path): with open(dataset_path) as f: for line in f.readlines(): data_ = json.loads(line) - assert data_['commit'] == 'd00c776260c77de7e70125ef0cd119de6c0ff1de' data.append(data_) if 'valid' in dataset_name: @@ -225,12 +226,19 @@ def print_stats(results): print(len([x for x in results if x['success']]) / len(results)) print("# successes: ", len([x for x in results if x['success']]), sep="\t") - -def resume_from(results_filename, data): - results = json.load(open(results_filename))['results'] - data = data[len(results):] - print("=== Resuming from %d" % (len(results))) - return results, data +import pathlib +from pathlib import Path +def resume_from(results_filename, data, model_name, shard): + results_path = Path(results_filename) + if results_path.is_dir(): + results_path = results_path / ('results__%s__%s.json' % (model_name.replace('/', '_'), shard)) + if results_path.exists(): + results = json.load(open(results_path))['results'] + data = data[len(results):] + print("=== Resuming from %d" % (len(results))) + return results, data + else: + return [],data def make_output_dir(output_dir): @@ -261,7 +269,7 @@ def make_output_dir(output_dir): ) parser.add_argument('--shard', type=int, required=True) parser.add_argument('--resume-from', type=str, default=None) - parser.add_argument('--dataset-path', default='data/minif2f.jsonl') + parser.add_argument('--dataset-path', default='data/minif2f-lean4.7.0.jsonl') parser.add_argument('--output-dir', default='output/minif2f') parser.add_argument('--early-stop', action='store_true') parser.add_argument('--tp-degree', type=int, default=1) @@ -282,7 +290,7 @@ def make_output_dir(output_dir): print("Shard size: %d" % (len(data))) if args.resume_from is not None: - results, data = resume_from(args.resume_from, data) + results, data = resume_from(args.resume_from, data, args.model_name,args.shard) else: results = [] From 64740943bb18766c9cba6cd9577b0da37fb5155d Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:25:08 +0800 Subject: [PATCH 27/41] Create header.lean --- leanworkbook/header.lean | 104 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 leanworkbook/header.lean diff --git a/leanworkbook/header.lean b/leanworkbook/header.lean new file mode 100644 index 0000000..661dc80 --- /dev/null +++ b/leanworkbook/header.lean @@ -0,0 +1,104 @@ +import Mathlib.Algebra.Algebra.Basic +import Mathlib.Algebra.Order.Floor +import Mathlib.Algebra.Associated +import Mathlib.Algebra.BigOperators.Basic + +import Mathlib.Algebra.BigOperators.Pi +import Mathlib.Algebra.GeomSum +import Mathlib.Algebra.Group.Pi.Basic +import Mathlib.Algebra.Group.Pi.Lemmas +import Mathlib.Algebra.Group.Commute.Basic +import Mathlib.Algebra.Group.Commute.Defs +import Mathlib.Algebra.Group.Commute.Hom +import Mathlib.Algebra.Group.Commute.Units +import Mathlib.Algebra.GroupPower.Basic +import Mathlib.Algebra.GroupPower.Identities +import Mathlib.Algebra.Order.Floor +import Mathlib.Algebra.QuadraticDiscriminant +import Mathlib.Algebra.Ring.Basic +import Mathlib.Analysis.MeanInequalitiesPow +import Mathlib.Analysis.Asymptotics.AsymptoticEquivalent +import Mathlib.Analysis.NormedSpace.Basic +import Mathlib.Analysis.SpecialFunctions.Log.Basic +import Mathlib.Analysis.SpecialFunctions.Log.Base +import Mathlib.Combinatorics.SimpleGraph.Basic +import Mathlib.Data.Complex.Basic +import Mathlib.Data.Complex.Exponential +import Mathlib.Data.Finset.Basic +import Mathlib.Data.Fintype.Card + +import Mathlib.Data.Int.GCD +import Mathlib.Data.Int.ModEq +import Mathlib.Data.Int.Parity +import Mathlib.Data.List.Intervals +import Mathlib.Data.List.Palindrome +import Mathlib.Data.Multiset.Basic + +import Mathlib.Data.Nat.Choose.Basic +import Mathlib.Data.Nat.Digits +import Mathlib.Data.Nat.Factorial.Basic +import Mathlib.Data.Nat.Fib.Basic +import Mathlib.Data.Nat.Fib.Zeckendorf +import Mathlib.Data.Nat.ModEq +import Mathlib.Data.Nat.Multiplicity +import Mathlib.Data.Nat.Parity +import Mathlib.Data.Nat.Prime +import Mathlib.Data.PNat.Basic +import Mathlib.Data.PNat.Prime + +import Mathlib.Data.Rat.BigOperators +import Mathlib.Data.Rat.Cast.CharZero +import Mathlib.Data.Rat.Cast.Defs +import Mathlib.Data.Rat.Cast.Lemmas +import Mathlib.Data.Rat.Cast.Order +import Mathlib.Data.Rat.Defs +import Mathlib.Data.Rat.Denumerable +import Mathlib.Data.Rat.Encodable +import Mathlib.Data.Rat.Field +import Mathlib.Data.Rat.Floor +import Mathlib.Data.Rat.Init +import Mathlib.Data.Rat.Lemmas +import Mathlib.Data.Rat.Order +import Mathlib.Data.Rat.Sqrt + +import Mathlib.Data.Rat.Star +import Mathlib.Data.Real.Basic +import Mathlib.Data.ENNReal.Basic +import Mathlib.Data.ENNReal.Inv +import Mathlib.Data.ENNReal.Operations +import Mathlib.Data.ENNReal.Real +import Mathlib.Data.Real.ENatENNReal +import Mathlib.Data.Real.Irrational +import Mathlib.Data.Real.NNReal +import Mathlib.Data.Real.Sqrt + +import Mathlib.Data.Set.Finite +import Mathlib.Data.Sym.Sym2 +import Mathlib.Data.ZMod.Basic +import Mathlib.Dynamics.FixedPoints.Basic + +import Mathlib.LinearAlgebra.AffineSpace.AffineMap +import Mathlib.LinearAlgebra.AffineSpace.Independent +import Mathlib.LinearAlgebra.AffineSpace.Ordered +import Mathlib.LinearAlgebra.FiniteDimensional +import Mathlib.Logic.Equiv.Basic + +import Mathlib.Order.Filter.Basic + +import Mathlib.Order.WellFounded +import Mathlib.Topology.Basic +import Mathlib.Topology.Instances.NNReal + +import Mathlib.Data.ZMod.Basic +import Mathlib.RingTheory.Int.Basic + + +import Aesop +import ProofWidgets +open BigOperators + +open Nat + +open Real + +open Rat From bcf391776cfed0be1c99de9d43b47ba82f8c4214 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 27 Jun 2024 10:25:48 +0800 Subject: [PATCH 28/41] Update readme.md --- leanworkbook/readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/leanworkbook/readme.md b/leanworkbook/readme.md index e324709..3afc594 100644 --- a/leanworkbook/readme.md +++ b/leanworkbook/readme.md @@ -3,6 +3,8 @@ We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K sea ![image](Workbook_main.jpg) +Find import header in **header.lean**, use Lean v4.7.0. + # Translate your natural language problem ``` From 66c887b5c2fca31fbb27601e8c6135492516a002 Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Wed, 24 Jul 2024 10:18:04 +0000 Subject: [PATCH 29/41] Add code for internlm/internlm2-step-prover --- minif2f/proofsearch_internLM2-StepProver.py | 338 ++++++++++++++++++ minif2f/scripts/eval_internLM2-step-prover.sh | 23 ++ 2 files changed, 361 insertions(+) create mode 100644 minif2f/proofsearch_internLM2-StepProver.py create mode 100755 minif2f/scripts/eval_internLM2-step-prover.sh diff --git a/minif2f/proofsearch_internLM2-StepProver.py b/minif2f/proofsearch_internLM2-StepProver.py new file mode 100644 index 0000000..bcaf0c9 --- /dev/null +++ b/minif2f/proofsearch_internLM2-StepProver.py @@ -0,0 +1,338 @@ +# Lean proof search with LeanDojo interaction +# Author: Sean Welleck +import json, os +import heapq +import subprocess +import time +import transformers +import vllm +from datetime import datetime +from lean_dojo import * +from pathlib import Path +from tqdm import tqdm, trange + +os.environ['TOKENIZERS_PARALLELISM'] = 'false' + + +def chat_template_to_prompt(prompt_list): + result = "" + total_step = len(prompt_list) + for i, message in enumerate(prompt_list): + result += ('<|im_start|>' + message['role'] + + '\n' + message['content']) + if i+1 != total_step: + result += '<|im_end|>\n' + elif message['role'] == 'user': + result += '<|im_end|>\n<|im_start|>assistant\n' + return result + +def prompt_style_internlm_chat_stepprover_extractor(result:str): + START_STR="PROOFSTEP " + if result.startswith(START_STR): + result=result[len(START_STR):] + return result + +def _prompt_function(theorem, state): + input_template = ( f"DECL {theorem.full_name}\n" + f"GOAL {state}\n" + ) + prompt = [{"role": "user", "content": input_template}] + return prompt + + +def generate_vllm(prompt, model, tokenizer, temperatures, num_samples, stop, max_tokens=256): + if not isinstance(prompt, str): + prompt = chat_template_to_prompt(prompt) + texts, scores = [], [] + for temperature in temperatures: + params = vllm.SamplingParams( + n=num_samples, + temperature=temperature, + use_beam_search=temperature==0.0, + max_tokens=max_tokens, + stop=stop, + length_penalty=0.0 if temperature==0.0 else 1.0, + logprobs=True, + ) + outputs = model.generate([prompt], params, use_tqdm=False) + if len(outputs) == 0: + return [], [] + for output in outputs[0].outputs: + text = output.text.replace(tokenizer.eos_token, '') + score = output.cumulative_logprob/max(len(output.token_ids), 1) + texts.append(text) + scores.append(score) + + texts = list(map(prompt_style_internlm_chat_stepprover_extractor,texts)) + texts, scores = _unique_sorted(texts, scores) + return texts, scores + + +def _unique_sorted(texts, scores): + texts_ = [] + scores_ = [] + for t, s in sorted(zip(texts, scores), key=lambda x: -x[1]): + if t not in texts_: + texts_.append(t) + scores_.append(s) + return texts_, scores_ + + +def _tactic_state(state): + if isinstance(state, TacticState): + ts = state.pp + else: + ts = state.unsolved_tactic_state + return ts + + + +def best_first_search( + theorem, + model, + tokenizer, + max_iters, + temperatures, + num_samples, + prompt_fn, + timeout=600, + early_stop=False, + max_tokens=256 +) -> dict: + """Best first search.""" + attempt_results = [] + try: + with Dojo(theorem, hard_timeout=timeout,additional_imports=["Mathlib.Tactic"]) as (dojo, init_state): + + start = time.time() + proof_finished = False + queue = [(0.0, [], init_state, [])] + visited = dict() + + for iteration in trange(max_iters): + if len(queue) == 0 or proof_finished: + break + + total_score, steps, state, trace = heapq.heappop(queue) + ts = _tactic_state(state) + visited[ts] = visited.get(ts,0)+1 + # State de-duplication needs re-compile Lean 4, whose code will be released soon. + # Here we are tolerating duplicated states, should not impact performance on miniF2F. + + step_cands, step_scores = generate_vllm( + prompt_fn(theorem, ts), + model, + tokenizer, + temperatures, + num_samples, + stop=['<|im_end|>',], + max_tokens=max_tokens + ) + step_cands = [s.strip() for s in step_cands] + + for step, score in zip(step_cands, step_scores): + result = dojo.run_tac(state, step) + step_trace = { + "tactic": step, + "state_before": _tactic_state(state) + } + if isinstance(result, ProofFinished): + attempt_results.append({ + 'theorem': theorem.full_name, + 'proof': steps + [step], + 'score': total_score - score, + 'success': True, + 'failure_reason': '', + 'trace': trace + [step_trace], + 'temperature': temperatures, + 'elapsed': start - time.time(), + 'iteration': iteration + }) + if early_stop: + return attempt_results + proof_finished = True + break + elif isinstance(result, TacticState): + if visited.get(_tactic_state(result),0) <= 1: #_tactic_state(result) not in visited: + # Score is negative log probability summed across steps + visited[_tactic_state(result)] = visited.get(_tactic_state(result),0) + 1 + new_score = (total_score - score) + heapq.heappush( + queue, (new_score, steps+[step], result, trace+[step_trace]) + ) + except (DojoInitError, DojoHardTimeoutError, DojoCrashError, subprocess.CalledProcessError) as e: + if len(attempt_results) == 0: + attempt_results.append({ + 'theorem': theorem.full_name, + 'success': False, + 'failure_reason': type(e).__name__ + }) + + if len(attempt_results) == 0: + attempt_results.append({ + 'theorem': theorem.full_name, + 'success': False, + 'failure_reason': 'SearchEnded' + }) + + return attempt_results + + +def _save(model_name, results, args_dict, output_dir, shard): + Path(output_dir).mkdir(parents=True, exist_ok=True) + output_file = os.path.join( + output_dir, + 'results__%s__%s.json' % (model_name.replace('/', '_'), shard) + ) + with open(output_file, 'w') as f: + json.dump({ + 'results': results, + 'args': args_dict + }, f, indent=4) + print(output_file) + + +def _load_model(model_name, tp_degree): + model = vllm.LLM( + model=model_name, + tensor_parallel_size=tp_degree, + dtype='float16', + max_num_batched_tokens=32768, + trust_remote_code=True, + enforce_eager=True + ) + tokenizer = transformers.AutoTokenizer.from_pretrained(model_name,trust_remote_code=True) + return model, tokenizer + + +def _load_data(dataset_name, dataset_path): + if 'minif2f' in dataset_name: + data = [] + with open(dataset_path) as f: + for line in f.readlines(): + data_ = json.loads(line) + data.append(data_) + + if 'valid' in dataset_name: + data = [x for x in data if x['split'] == 'valid'] + else: + data = [x for x in data if x['split'] == 'test'] + repo = LeanGitRepo(data[0]['url'], data[0]['commit']) + else: + raise NotImplementedError(dataset_name) + + return repo, data + + +def print_stats(results): + print(len([x for x in results if x['success']]) / len(results)) + print("# successes: ", len([x for x in results if x['success']]), sep="\t") + +import pathlib +from pathlib import Path +def resume_from(results_filename, data, model_name, shard): + results_path = Path(results_filename) + if results_path.is_dir(): + results_path = results_path / ('results__%s__%s.json' % (model_name.replace('/', '_'), shard)) + if results_path.exists(): + results = json.load(open(results_path))['results'] + data = data[len(results):] + print("=== Resuming from %d" % (len(results))) + return results, data + else: + return [],data + + +def make_output_dir(output_dir): + dt = datetime.now().strftime("%d-%m-%Y-%H-%M") + output_dir = os.path.join(output_dir, dt) + Path(output_dir).mkdir(parents=True, exist_ok=True) + return output_dir + + +if __name__ == '__main__': + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( + '--model-name', + choices=[ + 'internlm/internlm2-math-base-7b', + "internlm/internlm2-math-base-20b", + "internlm/internlm2-math-plus-7b", + "internlm/internlm2-math-plus-20b", + "internlm/internlm2-step-prover" + ], + required=True + ) + parser.add_argument( + '--dataset-name', + default='minif2f-test', + choices=['minif2f-valid', 'minif2f-test'] + ) + parser.add_argument('--shard', type=int, required=True) + parser.add_argument('--resume-from', type=str, default=None) + parser.add_argument('--dataset-path', default='data/minif2f-lean4.7.0.jsonl') + parser.add_argument('--output-dir', default='output/minif2f') + parser.add_argument('--early-stop', action='store_true') + parser.add_argument('--tp-degree', type=int, default=1) + parser.add_argument('--num-shards', type=int, default=8) + parser.add_argument('--max-iters', type=int, default=100) + parser.add_argument('--timeout', type=int, default=1200) + parser.add_argument('--num-examples', type=int, default=-1) + parser.add_argument('--num-samples', type=int, default=32) + parser.add_argument('--clear-process-hours', type=int, default=3) + parser.add_argument('--temperatures', type=float, nargs='+', default=[0.0]) + args = parser.parse_args() + model, tokenizer = _load_model(args.model_name, args.tp_degree) + output_dir = make_output_dir(args.output_dir) + + repo, data = _load_data(args.dataset_name, args.dataset_path) + shard_size = len(data) // args.num_shards + data = data[args.shard*shard_size:(args.shard+1)*shard_size] if args.num_shards > 1+ args.shard else data[args.shard*shard_size:] + print("Shard size: %d" % (len(data))) + + if args.resume_from is not None: + results, data = resume_from(args.resume_from, data, args.model_name,args.shard) + else: + results = [] + + start = time.time() + for example in tqdm(data, total=len(data)): + file_path = example['file_path'] + theorem_name = example['full_name'] + theorem = Theorem(repo, file_path, theorem_name) + attempt_results = best_first_search( + theorem, model, tokenizer, + max_iters=args.max_iters, + prompt_fn=_prompt_function, + temperatures=args.temperatures, + num_samples=args.num_samples, + timeout=args.timeout, + early_stop=args.early_stop + ) + + result = { + 'attempt_results': attempt_results, + 'success': any([x['success'] for x in attempt_results]), + 'example': example + } + + results.append(result) + + _save( + model_name=args.model_name, + results=results, + args_dict=args.__dict__, + output_dir=output_dir, + shard=args.shard + ) + print_stats(results) + # The proof search occasionally leaves Lean processes open. As a workaround, + # we periodically kill all Lean processes. Note that this may cause a proof search failure. + if args.shard == 0: + hours = 60*60*args.clear_process_hours + if time.time() - start > hours: + print("=== Killing active leanprover processes to mitigate leak") + os.system("ps aux | grep leanprover | awk '{print $2}' | xargs kill -9") + start = time.time() diff --git a/minif2f/scripts/eval_internLM2-step-prover.sh b/minif2f/scripts/eval_internLM2-step-prover.sh new file mode 100755 index 0000000..c4266ec --- /dev/null +++ b/minif2f/scripts/eval_internLM2-step-prover.sh @@ -0,0 +1,23 @@ +MAX_ITERS=4000 +NUM_SAMPLES=32 + +TEMPERATURES="0.0" # For pass@1 test, beam-search(t=0.0) is often the most performant choice. If pass@32 is wanted, change temperature to 0.7 or 0.9. + +TIMEOUT=1500 +NUM_SHARDS=8 +DATASET="minif2f-test" +DATA="data/minif2f-lean4.7.0.jsonl" + +MODEL="internlm/internlm2-step-prover" +NAME="internLM2-step-prover" + +OUTPUT_DIR="output/${NAME}_minif2f_test" +mkdir -p logs +for SHARD in 0 1 2 3 4 5 6 7 +do + CUDA_VISIBLE_DEVICES=${SHARD} python proofsearch_internLM2-plus.py --dataset-name ${DATASET} \ + --temperatures ${TEMPERATURES} --timeout ${TIMEOUT} --num-shards ${NUM_SHARDS} \ + --shard ${SHARD} --model-name ${MODEL} --max-iters ${MAX_ITERS} --dataset-path ${DATA} \ + --num-samples ${NUM_SAMPLES} --early-stop --output-dir ${OUTPUT_DIR} \ + &> logs/${NAME}_shard${SHARD}.out & +done \ No newline at end of file From 1429783f588d771f135efb2b2c2c979156858c80 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:27:35 +0800 Subject: [PATCH 30/41] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 23b9c02..df4a7dd 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News +- [2024.07.25] We release Lean-Github and InternLM2-Step-Prover with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/) - [2024.06.06] We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) - [2024.05.24] We release updated version InternLM2-Math-Plus with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-intepreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. - [2024.02.10] We add tech reports and citation reference. From c6754f3babf2de792fd574bb5b01b6e6dafaca8d Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:29:43 +0800 Subject: [PATCH 31/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index df4a7dd..57ae18e 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News -- [2024.07.25] We release Lean-Github and InternLM2-Step-Prover with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/) +- [2024.07.25] We release Lean-Github and InternLM2-Step-Prover with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/) [📖 README]() - [2024.06.06] We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) - [2024.05.24] We release updated version InternLM2-Math-Plus with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-intepreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. - [2024.02.10] We add tech reports and citation reference. From c518acdfd4296ae270efbe254c002029ee9758a5 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:30:25 +0800 Subject: [PATCH 32/41] Create README.md --- lean-github/README.md | 82 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 lean-github/README.md diff --git a/lean-github/README.md b/lean-github/README.md new file mode 100644 index 0000000..6447a9e --- /dev/null +++ b/lean-github/README.md @@ -0,0 +1,82 @@ +# InternLM-Step-Prover + +

+ + +
+
+ InternLM-Math + + + HOT + + +
+
+ +A state-of-the-art LEAN4 step prover. + +[💻 Github](https://github.com/InternLM/InternLM-Math) [📊Dataset](https://huggingface.co/datasets/internlm/Lean-Github) +
+ +InternLM-Step-Prover is a 7B language model trained on Lean-Github and multiple sythesis datasets. InternLM-Step-Prover achieves state-of-the-art performances on MiniF2F, ProofNet, and Putnam math benchmarks, showing its formal math proving ability in multiple domains. + +# Dialogue Example +``` +### Input Example +DECL MyNat.mul_pow +GOAL a b n : N +⊢ (a * b) ^ n = a ^ n * b ^ n +### Output Example +PROOFSTEP induction n with t Ht +``` + +# Performance + +## MiniF2F +| Method | Model size | Pass | miniF2F-valid | miniF2F-test | +|--------|------------|------|---------------|--------------| +| **Whole-Proof Generation Methods** | +| GPT-4-turbo 0409 | - | 64 | 25.4% | 23.0% | +| DeepSeekMath-Base | 7B | 128 | 25.4% | 27.5% | +| DeepSeek-Prover | 7B | 1 | - | 30.0% | +| | | 64 | - | 46.3% | +| | | 128 | - | 46.3% | +| | | 8192 | - | 48.8% | +| | | 65536 | - | 50.0% | +| | | cumulative | *60.2%* | *52.0%* | +| TheoremLlama | - | cumulative | 36.5% | 33.6% | +| **Tree Search Methods** | +| COPRA (GPT-3.5) | - | 1 | - | 9.0% | +| COPRA (GPT-4) | - | 1 | - | 26.6% | +| DSP(Isabelle) | 540B | 100 | 42.6% | 38.9% | +| Proof Artifact Co-Training | 837M | 1 | 23.9% | 24.6% | +| | | 8 | 29.3% | 29.2% | +| ReProver | 229M | 1 | - | 25.0% | +| Llemma | 7B | 1 | 26.2% | 26.2% | +| Llemma | 34B | 1 | 27.9% | 25.8% | +| Curriculum Learning | 837M | 1 | 33.6% | 29.6% | +| | | 8 | 41.2% | 34.5% | +| | | 64 | 47.3% | 36.6% | +| Hypertree Proof Search | 600M | cumulative | 58.6% | - | +| | | 64 | - | 41.0% | +| Lean-STaR | 7B | 64 | - | 46.3% | +| InternLM2-Math | 7B | 1 | 29.9% | 30.3% | +| InternLM2-Math-Plus | 7B | 1 | - | 43.4% | +| InternLM2-Step-Prover | 7B | 1 | 59.8% | 48.8% | +| InternLM2-Step-Prover | 7B | 64 | **63.9%** | **54.5%** | + +## Proofnet & Putnam +| Method | Model size | Pass | result | +|--------|------------|------|--------| +| **ProofNet benchmark** | +| ReProver | 229M | 1 | 13.8% | +| InternLM2-Step-Prover | 7B | 1 | **18.1%** | +| **Putnam benchmark** | +| GPT-4 | - | 10 | 1/640 | +| COPRA (GPT-4) | - | 10 | 1/640 | +| DSP(Isabelle) | 540B | 10 | 4/640 | +| ReProver | 229M | 1 | 0/640 | +| InternLM2-Step-Prover | 7B | 1 | **5/640** | + +# Citation and Tech Report From f375a62967e2d7007d33d719976b0003759787e6 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:31:04 +0800 Subject: [PATCH 33/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 57ae18e..aa65548 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News -- [2024.07.25] We release Lean-Github and InternLM2-Step-Prover with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/) [📖 README]() +- [2024.07.25] We release Lean-Github and InternLM2-Step-Prover with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/) [📖 README](https://github.com/InternLM/InternLM-Math/blob/main/lean-github/README.md) - [2024.06.06] We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) - [2024.05.24] We release updated version InternLM2-Math-Plus with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-intepreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. - [2024.02.10] We add tech reports and citation reference. From 152efaf5271932f7c1515d080d06c655c41b8112 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:42:26 +0800 Subject: [PATCH 34/41] Update README.md --- README.md | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index aa65548..dd30569 100644 --- a/README.md +++ b/README.md @@ -25,12 +25,12 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News -- [2024.07.25] We release Lean-Github and InternLM2-Step-Prover with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/) [📖 README](https://github.com/InternLM/InternLM-Math/blob/main/lean-github/README.md) +- [2024.07.25] We release Lean-Github and InternLM2-Step-Prover with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/2407.17227) [📖 README](https://github.com/InternLM/InternLM-Math/blob/main/lean-github/README.md) - [2024.06.06] We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) -- [2024.05.24] We release updated version InternLM2-Math-Plus with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-intepreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. -- [2024.02.10] We add tech reports and citation reference. +- [2024.05.24] We release updated version InternLM2-Math-Plus with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-interpreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. +- [2024.02.10] We add tech reports and citation references. - [2024.01.31] We add MiniF2F results with evaluation codes! -- [2024.01.29] We add checkpoints from ModelScope. Update results about majority voting and Code Intepreter. Tech report is on the way! +- [2024.01.29] We add checkpoints from ModelScope. Update results about majority voting and Code Interpreter. Tech report is on the way! - [2024.01.26] We add checkpoints from OpenXLab, which ease Chinese users to download! # InternLM2-Math-Plus @@ -297,4 +297,13 @@ Our model is still under development and will be upgraded. There are some possib archivePrefix={arXiv}, primaryClass={cs.CL} } +@misc{wu2024leangithubcompilinggithublean, + title={LEAN-GitHub: Compiling GitHub LEAN repositories for a versatile LEAN prover}, + author={Zijian Wu and Jiayu Wang and Dahua Lin and Kai Chen}, + year={2024}, + eprint={2407.17227}, + archivePrefix={arXiv}, + primaryClass={cs.AI}, + url={https://arxiv.org/abs/2407.17227}, +} ``` From 846ff7b4d3ee15be766f586f3ae5030caa4c4ab7 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 25 Jul 2024 09:43:07 +0800 Subject: [PATCH 35/41] Update README.md --- lean-github/README.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/lean-github/README.md b/lean-github/README.md index 6447a9e..f1d6a43 100644 --- a/lean-github/README.md +++ b/lean-github/README.md @@ -80,3 +80,14 @@ PROOFSTEP induction n with t Ht | InternLM2-Step-Prover | 7B | 1 | **5/640** | # Citation and Tech Report +``` +@misc{wu2024leangithubcompilinggithublean, + title={LEAN-GitHub: Compiling GitHub LEAN repositories for a versatile LEAN prover}, + author={Zijian Wu and Jiayu Wang and Dahua Lin and Kai Chen}, + year={2024}, + eprint={2407.17227}, + archivePrefix={arXiv}, + primaryClass={cs.AI}, + url={https://arxiv.org/abs/2407.17227}, +} +``` From 833e1efd1116920b98f42141ce6ca18cbe009c59 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Thu, 25 Jul 2024 10:07:12 +0800 Subject: [PATCH 36/41] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index dd30569..de40a26 100644 --- a/README.md +++ b/README.md @@ -25,9 +25,9 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News -- [2024.07.25] We release Lean-Github and InternLM2-Step-Prover with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/2407.17227) [📖 README](https://github.com/InternLM/InternLM-Math/blob/main/lean-github/README.md) -- [2024.06.06] We release Lean-Workbook with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) -- [2024.05.24] We release updated version InternLM2-Math-Plus with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-interpreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. +- [2024.07.25] We release **Lean-Github** and **InternLM2-Step-Prover** with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/2407.17227) [📖 README](https://github.com/InternLM/InternLM-Math/blob/main/lean-github/README.md) +- [2024.06.06] We release **Lean-Workbook** with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) +- [2024.05.24] We release updated version **InternLM2-Math-Plus** with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-interpreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. - [2024.02.10] We add tech reports and citation references. - [2024.01.31] We add MiniF2F results with evaluation codes! - [2024.01.29] We add checkpoints from ModelScope. Update results about majority voting and Code Interpreter. Tech report is on the way! From 9f18bdc1df11fb54db55a686df0949de51851e42 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Mon, 21 Oct 2024 14:19:09 +0800 Subject: [PATCH 37/41] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index de40a26..a645d93 100644 --- a/README.md +++ b/README.md @@ -25,6 +25,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News +- [2024.10.22] We release **InternLM2.5-Step-Prover** policy and critic models with 14k proves found in Lean-Workbook. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [🤗Model](TBA) [📑 Paper](TBA) - [2024.07.25] We release **Lean-Github** and **InternLM2-Step-Prover** with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/2407.17227) [📖 README](https://github.com/InternLM/InternLM-Math/blob/main/lean-github/README.md) - [2024.06.06] We release **Lean-Workbook** with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) - [2024.05.24] We release updated version **InternLM2-Math-Plus** with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-interpreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. From 1aa24182ccd7a07b7469e61f534246f1926551af Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Mon, 21 Oct 2024 15:26:07 +0800 Subject: [PATCH 38/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index a645d93..22a1fa7 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News -- [2024.10.22] We release **InternLM2.5-Step-Prover** policy and critic models with 14k proves found in Lean-Workbook. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [🤗Model](TBA) [📑 Paper](TBA) +- [2024.10.22] We release **InternLM2.5-Step-Prover** policy and critic models with 14k proves found in Lean-Workbook. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [🤗Policy-model](https://huggingface.co/internlm/internlm2_5-step-prover) [🤗Critic-model](https://huggingface.co/internlm/internlm2_5-step-prover-critic) [📑 Paper](TBA) - [2024.07.25] We release **Lean-Github** and **InternLM2-Step-Prover** with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/2407.17227) [📖 README](https://github.com/InternLM/InternLM-Math/blob/main/lean-github/README.md) - [2024.06.06] We release **Lean-Workbook** with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) - [2024.05.24] We release updated version **InternLM2-Math-Plus** with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-interpreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. From a4196fa06eeabd651ef46628d5fa37709ec20f91 Mon Sep 17 00:00:00 2001 From: wzj423 <15925613010@163.com> Date: Mon, 21 Oct 2024 16:34:42 +0800 Subject: [PATCH 39/41] Add prompt template for interlm2.5-StepProver --- minif2f/proofsearch_internLM2.5-StepProver.py | 330 ++++++++++++++++++ 1 file changed, 330 insertions(+) create mode 100644 minif2f/proofsearch_internLM2.5-StepProver.py diff --git a/minif2f/proofsearch_internLM2.5-StepProver.py b/minif2f/proofsearch_internLM2.5-StepProver.py new file mode 100644 index 0000000..70a6ee9 --- /dev/null +++ b/minif2f/proofsearch_internLM2.5-StepProver.py @@ -0,0 +1,330 @@ +# Lean proof search with LeanDojo interaction +# Author: Sean Welleck +import json, os +import heapq +import subprocess +import time +import transformers +import vllm +from datetime import datetime +from lean_dojo import * +from pathlib import Path +from tqdm import tqdm, trange + +os.environ['TOKENIZERS_PARALLELISM'] = 'false' + + +def chat_template_to_prompt(prompt_list): + result = "" + total_step = len(prompt_list) + for i, message in enumerate(prompt_list): + result += ('<|im_start|>' + message['role'] + + '\n' + message['content']) + if i+1 != total_step: + result += '<|im_end|>\n' + elif message['role'] == 'user': + result += '<|im_end|>\n<|im_start|>assistant\n' + return result + +def prompt_style_internlm_chat_stepprover_extractor(result:str): + return result + +def _prompt_function(theorem, state, proof_before=""): + input_template = ( f"---\nNAME: {theorem.full_name}\n\n" + # f"---\nFILE:{theorem.file_path}\n\n" + f"---\nPROOF_BEFORE: {proof_before}\n\n" + f"---\nSTATE_BEFORE: {state}\n\n" + f"---\nTACTIC: " + ) + prompt = [{"role": "user", "content": input_template}] + return prompt + +def generate_vllm(prompt, model, tokenizer, temperatures, num_samples, stop, max_tokens=256): + if not isinstance(prompt, str): + prompt = chat_template_to_prompt(prompt) + texts, scores = [], [] + for temperature in temperatures: + params = vllm.SamplingParams( + n=num_samples, + temperature=temperature, + use_beam_search=temperature==0.0, + max_tokens=max_tokens, + stop=stop, + length_penalty=0.0 if temperature==0.0 else 1.0, + logprobs=True, + ) + outputs = model.generate([prompt], params, use_tqdm=False) + if len(outputs) == 0: + return [], [] + for output in outputs[0].outputs: + text = output.text.replace(tokenizer.eos_token, '') + score = output.cumulative_logprob/max(len(output.token_ids), 1) + texts.append(text) + scores.append(score) + + texts = list(map(prompt_style_internlm_chat_stepprover_extractor,texts)) + texts, scores = _unique_sorted(texts, scores) + return texts, scores + + +def _unique_sorted(texts, scores): + texts_ = [] + scores_ = [] + for t, s in sorted(zip(texts, scores), key=lambda x: -x[1]): + if t not in texts_: + texts_.append(t) + scores_.append(s) + return texts_, scores_ + + +def _tactic_state(state): + if isinstance(state, TacticState): + ts = state.pp + else: + ts = state.unsolved_tactic_state + return ts + + + +def best_first_search( + theorem, + model, + tokenizer, + max_iters, + temperatures, + num_samples, + prompt_fn, + timeout=600, + early_stop=False, + max_tokens=256 +) -> dict: + """Best first search.""" + attempt_results = [] + try: + with Dojo(theorem, hard_timeout=timeout,additional_imports=["Mathlib.Tactic"]) as (dojo, init_state): + + start = time.time() + proof_finished = False + queue = [(0.0, [], init_state, [])] + visited = dict() + + for iteration in trange(max_iters): + if len(queue) == 0 or proof_finished: + break + + total_score, steps, state, trace = heapq.heappop(queue) + ts = _tactic_state(state) + visited[ts] = visited.get(ts,0)+1 + # State de-duplication needs re-compile Lean 4, whose code will be released soon. + # Here we are tolerating duplicated states, should not impact performance on miniF2F. + proof_before = "\n".join(steps) + step_cands, step_scores = generate_vllm( + prompt_fn(theorem, ts, proof_before), + model, + tokenizer, + temperatures, + num_samples, + stop=['<|im_end|>',], + max_tokens=max_tokens + ) + step_cands = [s.strip() for s in step_cands] + + for step, score in zip(step_cands, step_scores): + result = dojo.run_tac(state, step) + step_trace = { + "tactic": step, + "state_before": _tactic_state(state) + } + if isinstance(result, ProofFinished): + attempt_results.append({ + 'theorem': theorem.full_name, + 'proof': steps + [step], + 'score': total_score - score, + 'success': True, + 'failure_reason': '', + 'trace': trace + [step_trace], + 'temperature': temperatures, + 'elapsed': start - time.time(), + 'iteration': iteration + }) + if early_stop: + return attempt_results + proof_finished = True + break + elif isinstance(result, TacticState): + if visited.get(_tactic_state(result),0) <= 1: #_tactic_state(result) not in visited: + # Score is negative log probability summed across steps + visited[_tactic_state(result)] = visited.get(_tactic_state(result),0) + 1 + new_score = (total_score - score) + heapq.heappush( + queue, (new_score, steps+[step], result, trace+[step_trace]) + ) + except (DojoInitError, DojoHardTimeoutError, DojoCrashError, subprocess.CalledProcessError) as e: + if len(attempt_results) == 0: + attempt_results.append({ + 'theorem': theorem.full_name, + 'success': False, + 'failure_reason': type(e).__name__ + }) + + if len(attempt_results) == 0: + attempt_results.append({ + 'theorem': theorem.full_name, + 'success': False, + 'failure_reason': 'SearchEnded' + }) + + return attempt_results + + +def _save(model_name, results, args_dict, output_dir, shard): + Path(output_dir).mkdir(parents=True, exist_ok=True) + output_file = os.path.join( + output_dir, + 'results__%s__%s.json' % (model_name.replace('/', '_'), shard) + ) + with open(output_file, 'w') as f: + json.dump({ + 'results': results, + 'args': args_dict + }, f, indent=4) + print(output_file) + + +def _load_model(model_name, tp_degree): + model = vllm.LLM( + model=model_name, + tensor_parallel_size=tp_degree, + dtype='float16', + max_num_batched_tokens=32768, + trust_remote_code=True, + enforce_eager=True + ) + tokenizer = transformers.AutoTokenizer.from_pretrained(model_name,trust_remote_code=True) + return model, tokenizer + + +def _load_data(dataset_name, dataset_path): + if 'minif2f' in dataset_name: + data = [] + with open(dataset_path) as f: + for line in f.readlines(): + data_ = json.loads(line) + data.append(data_) + + if 'valid' in dataset_name: + data = [x for x in data if x['split'] == 'valid'] + else: + data = [x for x in data if x['split'] == 'test'] + repo = LeanGitRepo(data[0]['url'], data[0]['commit']) + else: + raise NotImplementedError(dataset_name) + + return repo, data + + +def print_stats(results): + print(len([x for x in results if x['success']]) / len(results)) + print("# successes: ", len([x for x in results if x['success']]), sep="\t") + +import pathlib +from pathlib import Path +def resume_from(results_filename, data, model_name, shard): + results_path = Path(results_filename) + if results_path.is_dir(): + results_path = results_path / ('results__%s__%s.json' % (model_name.replace('/', '_'), shard)) + if results_path.exists(): + results = json.load(open(results_path))['results'] + data = data[len(results):] + print("=== Resuming from %d" % (len(results))) + return results, data + else: + return [],data + + +def make_output_dir(output_dir): + dt = datetime.now().strftime("%d-%m-%Y-%H-%M") + output_dir = os.path.join(output_dir, dt) + Path(output_dir).mkdir(parents=True, exist_ok=True) + return output_dir + + +if __name__ == '__main__': + import argparse + + parser = argparse.ArgumentParser() + parser.add_argument( + '--model-name', + required=True + ) + parser.add_argument( + '--dataset-name', + default='minif2f-test', + choices=['minif2f-valid', 'minif2f-test'] + ) + parser.add_argument('--shard', type=int, required=True) + parser.add_argument('--resume-from', type=str, default=None) + parser.add_argument('--dataset-path', default='data/minif2f-lean4.7.0.jsonl') + parser.add_argument('--output-dir', default='output/minif2f') + parser.add_argument('--early-stop', action='store_true') + parser.add_argument('--tp-degree', type=int, default=1) + parser.add_argument('--num-shards', type=int, default=8) + parser.add_argument('--max-iters', type=int, default=100) + parser.add_argument('--timeout', type=int, default=1200) + parser.add_argument('--num-examples', type=int, default=-1) + parser.add_argument('--num-samples', type=int, default=32) + parser.add_argument('--clear-process-hours', type=int, default=3) + parser.add_argument('--temperatures', type=float, nargs='+', default=[0.0]) + args = parser.parse_args() + model, tokenizer = _load_model(args.model_name, args.tp_degree) + output_dir = make_output_dir(args.output_dir) + + repo, data = _load_data(args.dataset_name, args.dataset_path) + shard_size = len(data) // args.num_shards + data = data[args.shard*shard_size:(args.shard+1)*shard_size] if args.num_shards > 1+ args.shard else data[args.shard*shard_size:] + print("Shard size: %d" % (len(data))) + + if args.resume_from is not None: + results, data = resume_from(args.resume_from, data, args.model_name,args.shard) + else: + results = [] + + start = time.time() + for example in tqdm(data, total=len(data)): + file_path = example['file_path'] + theorem_name = example['full_name'] + theorem = Theorem(repo, file_path, theorem_name) + attempt_results = best_first_search( + theorem, model, tokenizer, + max_iters=args.max_iters, + prompt_fn=_prompt_function, + temperatures=args.temperatures, + num_samples=args.num_samples, + timeout=args.timeout, + early_stop=args.early_stop + ) + + result = { + 'attempt_results': attempt_results, + 'success': any([x['success'] for x in attempt_results]), + 'example': example + } + + results.append(result) + + _save( + model_name=args.model_name, + results=results, + args_dict=args.__dict__, + output_dir=output_dir, + shard=args.shard + ) + print_stats(results) + # The proof search occasionally leaves Lean processes open. As a workaround, + # we periodically kill all Lean processes. Note that this may cause a proof search failure. + if args.shard == 0: + hours = 60*60*args.clear_process_hours + if time.time() - start > hours: + print("=== Killing active leanprover processes to mitigate leak") + os.system("ps aux | grep leanprover | awk '{print $2}' | xargs kill -9") + start = time.time() From df8e67949e1cf6a5565a92da6a3a2af90275b1e4 Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Tue, 22 Oct 2024 15:52:14 +0800 Subject: [PATCH 40/41] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 22a1fa7..c6579da 100644 --- a/README.md +++ b/README.md @@ -25,7 +25,7 @@ A **solver**, **prover**, **verifier**, **augmentor**. # News -- [2024.10.22] We release **InternLM2.5-Step-Prover** policy and critic models with 14k proves found in Lean-Workbook. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [🤗Policy-model](https://huggingface.co/internlm/internlm2_5-step-prover) [🤗Critic-model](https://huggingface.co/internlm/internlm2_5-step-prover-critic) [📑 Paper](TBA) +- [2024.10.22] We release **InternLM2.5-Step-Prover** policy and critic models with 14k proves found in Lean-Workbook. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [🤗Policy-model](https://huggingface.co/internlm/internlm2_5-step-prover) [🤗Critic-model](https://huggingface.co/internlm/internlm2_5-step-prover-critic) [📑 Paper](https://arxiv.org/abs/2410.15700) - [2024.07.25] We release **Lean-Github** and **InternLM2-Step-Prover** with 29K theorems compiled from 100+ Lean 4 repos and a 7B models fine-tuned on Lean-Github and Lean-Workbook with SOTA performance on MiniF2F-test (54.5%), ProofNet (18.1%), and Putnam (5 problems). [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Github) [🤗Model](https://huggingface.co/internlm/internlm2-step-prover) [📑 Paper](https://arxiv.org/abs/2407.17227) [📖 README](https://github.com/InternLM/InternLM-Math/blob/main/lean-github/README.md) - [2024.06.06] We release **Lean-Workbook** with 57K math problems formalized in Lean 4 with 5K searched proof for autoformalization and auto theorem proving. [🤗Dataset](https://huggingface.co/datasets/internlm/Lean-Workbook) [📑 Paper](https://arxiv.org/abs/2406.03847) - [2024.05.24] We release updated version **InternLM2-Math-Plus** with 4 sizes and state-of-the-art performances including 1.8B, 7B, 20B, and 8x22B. We improve informal math reasoning performance (chain-of-thought and code-interpreter) and formal math reasoning performance (LEAN 4 translation and LEAN 4 theorem proving) significantly. From eaead17b7b95670f0592f5b818080fb6762f3fdf Mon Sep 17 00:00:00 2001 From: objecti0n <151615279+objecti0n@users.noreply.github.com> Date: Wed, 23 Oct 2024 00:18:00 +0800 Subject: [PATCH 41/41] Update README.md --- README.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/README.md b/README.md index c6579da..a8d905e 100644 --- a/README.md +++ b/README.md @@ -307,4 +307,13 @@ Our model is still under development and will be upgraded. There are some possib primaryClass={cs.AI}, url={https://arxiv.org/abs/2407.17227}, } +@misc{wu2024internlm25stepproveradvancingautomatedtheorem, + title={InternLM2.5-StepProver: Advancing Automated Theorem Proving via Expert Iteration on Large-Scale LEAN Problems}, + author={Zijian Wu and Suozhi Huang and Zhejian Zhou and Huaiyuan Ying and Jiayu Wang and Dahua Lin and Kai Chen}, + year={2024}, + eprint={2410.15700}, + archivePrefix={arXiv}, + primaryClass={cs.AI}, + url={https://arxiv.org/abs/2410.15700}, +} ```