itp-interface 1.0.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- itp_interface/__init__.py +0 -0
- itp_interface/agent/__init__.py +0 -0
- itp_interface/agent/simple_proof_agent.py +100 -0
- itp_interface/coq_ser_api/__init__.py +165 -0
- itp_interface/coq_ser_api/contexts.py +283 -0
- itp_interface/coq_ser_api/coq_agent.py +459 -0
- itp_interface/coq_ser_api/coq_backend.py +135 -0
- itp_interface/coq_ser_api/coq_util.py +839 -0
- itp_interface/coq_ser_api/example.py +67 -0
- itp_interface/coq_ser_api/lsp_backend.py +375 -0
- itp_interface/coq_ser_api/py.typed +0 -0
- itp_interface/coq_ser_api/serapi_backend.py +841 -0
- itp_interface/coq_ser_api/util.py +145 -0
- itp_interface/coq_ser_api_old/__init__.py +2583 -0
- itp_interface/coq_ser_api_old/contexts.py +172 -0
- itp_interface/coq_ser_api_old/util.py +146 -0
- itp_interface/lean_server/__init__.py +0 -0
- itp_interface/lean_server/commands.py +484 -0
- itp_interface/lean_server/lean3_search_tool.py +358 -0
- itp_interface/lean_server/lean4_repl_interface.py +151 -0
- itp_interface/lean_server/lean4_utils.py +255 -0
- itp_interface/lean_server/lean_cmd_server.py +111 -0
- itp_interface/lean_server/lean_context.py +60 -0
- itp_interface/lean_server/lean_sync_server.py +174 -0
- itp_interface/lean_server/lean_utils.py +199 -0
- itp_interface/lean_server/py.typed +1 -0
- itp_interface/main/__init__.py +0 -0
- itp_interface/main/config/afp_data_gen.yaml +14 -0
- itp_interface/main/config/benchmark/CompCert.yaml +366 -0
- itp_interface/main/config/benchmark/GeoCoq.yaml +930 -0
- itp_interface/main/config/benchmark/UniMath.yaml +2690 -0
- itp_interface/main/config/benchmark/afp_isabelle.yaml +29200 -0
- itp_interface/main/config/benchmark/agent_proverbot_hard.yaml +247 -0
- itp_interface/main/config/benchmark/category-theory.yaml +470 -0
- itp_interface/main/config/benchmark/compcert_118_subset.yaml +148 -0
- itp_interface/main/config/benchmark/compcert_benchmark.yaml +36 -0
- itp_interface/main/config/benchmark/compcert_benchmark_hard.yaml +498 -0
- itp_interface/main/config/benchmark/compcert_benchmark_hard_1.yaml +55 -0
- itp_interface/main/config/benchmark/compcert_benchmark_hard_2.yaml +24 -0
- itp_interface/main/config/benchmark/compcert_benchmark_hard_3.yaml +95 -0
- itp_interface/main/config/benchmark/compcert_benchmark_hard_7_per_cent.yaml +78 -0
- itp_interface/main/config/benchmark/compcert_benchmark_test.yaml +38 -0
- itp_interface/main/config/benchmark/compcert_benchmark_train.yaml +340 -0
- itp_interface/main/config/benchmark/leandojo_novel_premises_test.yaml +2908 -0
- itp_interface/main/config/benchmark/leandojo_novel_premises_train.yaml +98645 -0
- itp_interface/main/config/benchmark/leandojo_novel_premises_val.yaml +2912 -0
- itp_interface/main/config/benchmark/leandojo_random.yaml +2889 -0
- itp_interface/main/config/benchmark/leandojo_random_test.yaml +2421 -0
- itp_interface/main/config/benchmark/leandojo_random_train.yaml +62729 -0
- itp_interface/main/config/benchmark/leandojo_random_val.yaml +2504 -0
- itp_interface/main/config/benchmark/math-comp.yaml +200 -0
- itp_interface/main/config/benchmark/miniF2F_test.yaml +12 -0
- itp_interface/main/config/benchmark/miniF2F_test_aime.yaml +27 -0
- itp_interface/main/config/benchmark/miniF2F_test_algebra.yaml +30 -0
- itp_interface/main/config/benchmark/miniF2F_test_amc12.yaml +57 -0
- itp_interface/main/config/benchmark/miniF2F_test_few_shot_hard.yaml +231 -0
- itp_interface/main/config/benchmark/miniF2F_test_imo.yaml +32 -0
- itp_interface/main/config/benchmark/miniF2F_test_induction.yaml +20 -0
- itp_interface/main/config/benchmark/miniF2F_test_mathd_algebra.yaml +82 -0
- itp_interface/main/config/benchmark/miniF2F_test_mathd_algebra_hard.yaml +72 -0
- itp_interface/main/config/benchmark/miniF2F_test_mathd_numbertheory.yaml +72 -0
- itp_interface/main/config/benchmark/miniF2F_test_numbertheory.yaml +20 -0
- itp_interface/main/config/benchmark/minicompcert_benchmark_1.yaml +14 -0
- itp_interface/main/config/benchmark/proverbot_hard.yaml +104 -0
- itp_interface/main/config/benchmark/re_prover.yaml +66 -0
- itp_interface/main/config/benchmark/re_prover_hard.yaml +41 -0
- itp_interface/main/config/benchmark/re_prover_very_hard.yaml +22 -0
- itp_interface/main/config/benchmark/reprover_with_retrieval.yaml +73 -0
- itp_interface/main/config/benchmark/reprover_with_retrieval_hard.yaml +30 -0
- itp_interface/main/config/benchmark/reprover_with_retrieval_neg.yaml +195 -0
- itp_interface/main/config/benchmark/simple_benchmark_1.yaml +24 -0
- itp_interface/main/config/benchmark/simple_benchmark_8.yaml +50 -0
- itp_interface/main/config/benchmark/simple_benchmark_9.yaml +65 -0
- itp_interface/main/config/benchmark/simple_benchmark_isabelle.yaml +18 -0
- itp_interface/main/config/benchmark/simple_benchmark_lean.yaml +12 -0
- itp_interface/main/config/benchmark/simple_benchmark_lean_training_data.yaml +12 -0
- itp_interface/main/config/benchmark/simple_rl_benchmark_lean.yaml +14 -0
- itp_interface/main/config/benchmark/stack_machine.yaml +13 -0
- itp_interface/main/config/benchmark/stack_machine_hard.yaml +15 -0
- itp_interface/main/config/category_theory_data_gen.yaml +14 -0
- itp_interface/main/config/category_theory_data_gen_random.yaml +16 -0
- itp_interface/main/config/compcert_data_gen_test.yaml +10 -0
- itp_interface/main/config/compcert_data_gen_train.yaml +7 -0
- itp_interface/main/config/env_settings/bm25_retrieval.yaml +2 -0
- itp_interface/main/config/env_settings/bm25_retrieval_no_dfns.yaml +2 -0
- itp_interface/main/config/env_settings/bm25_retrieval_only_local_no_dfns.yaml +2 -0
- itp_interface/main/config/env_settings/bm25_retrieval_with_print.yaml +2 -0
- itp_interface/main/config/env_settings/bm25_retrieval_with_print_only_local.yaml +2 -0
- itp_interface/main/config/env_settings/bm25_retrieval_with_print_only_local_no_dfns.yaml +2 -0
- itp_interface/main/config/env_settings/no_retrieval.yaml +2 -0
- itp_interface/main/config/experiments.yaml +12 -0
- itp_interface/main/config/geo_coq_data_gen.yaml +14 -0
- itp_interface/main/config/geo_coq_data_gen_random.yaml +16 -0
- itp_interface/main/config/leandojo_random_data_gen.yaml +16 -0
- itp_interface/main/config/math_comp_data_gen.yaml +14 -0
- itp_interface/main/config/math_comp_data_gen_random.yaml +16 -0
- itp_interface/main/config/mathlib_data_gen.yaml +14 -0
- itp_interface/main/config/repo/coq_repos.yaml +191 -0
- itp_interface/main/config/run_settings/default_coq_data_generation_transforms.yaml +24 -0
- itp_interface/main/config/run_settings/default_isabelle_data_generation_transforms.yaml +24 -0
- itp_interface/main/config/run_settings/default_lean4_data_generation_transforms.yaml +24 -0
- itp_interface/main/config/run_settings/default_lean_data_generation_transforms.yaml +24 -0
- itp_interface/main/config/simple_coq_data_gen.yaml +12 -0
- itp_interface/main/config/simple_coq_data_gen_random.yaml +17 -0
- itp_interface/main/config/simple_lean_data_gen.yaml +12 -0
- itp_interface/main/config/simple_rl_lean_data_gen.yaml +12 -0
- itp_interface/main/config/uni_math_data_gen.yaml +14 -0
- itp_interface/main/config.py +192 -0
- itp_interface/main/extract_benchmark_dataset.py +106 -0
- itp_interface/main/filter_dataset.py +107 -0
- itp_interface/main/install.py +92 -0
- itp_interface/main/merge_dataset.py +96 -0
- itp_interface/main/run_tool.py +444 -0
- itp_interface/pisa/.git +1 -0
- itp_interface/pisa/.gitignore +125 -0
- itp_interface/pisa/.idea/.gitignore +8 -0
- itp_interface/pisa/.idea/ClojureProjectResolveSettings.xml +6 -0
- itp_interface/pisa/.idea/codeStyles/Project.xml +7 -0
- itp_interface/pisa/.idea/codeStyles/codeStyleConfig.xml +5 -0
- itp_interface/pisa/.idea/inspectionProfiles/Project_Default.xml +16 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_android_annotations_4_1_1_4_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_api_grpc_proto_google_common_protos_1_17_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_code_findbugs_jsr305_3_0_2_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_code_gson_gson_2_8_6_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_errorprone_error_prone_annotations_2_3_4_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_guava_failureaccess_1_0_1_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_guava_guava_30_0_jre_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava_jar.xml +9 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_j2objc_j2objc_annotations_1_3_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_protobuf_protobuf_java_3_12_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_google_protobuf_protobuf_java_util_3_12_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_lihaoyi_fastparse_2_13_2_3_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_lihaoyi_geny_2_13_0_6_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_lihaoyi_sourcecode_2_13_0_2_1_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_thesamet_scalapb_lenses_2_13_0_10_9_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_thesamet_scalapb_scalapb_runtime_2_13_0_10_9_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_thesamet_scalapb_scalapb_runtime_grpc_2_13_0_10_9_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_thesamet_scalapb_zio_grpc_zio_grpc_core_2_13_0_4_2_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__com_thoughtworks_paranamer_paranamer_2_8_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__commons_io_commons_io_2_8_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__de_unruh_java_patterns_0_1_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__de_unruh_scala_isabelle_2_13_master_SNAPSHOT_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__dev_zio_izumi_reflect_2_13_1_0_0_M9_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__dev_zio_izumi_reflect_thirdparty_boopickle_shaded_2_13_1_0_0_M9_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__dev_zio_zio_2_13_1_0_3_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__dev_zio_zio_stacktracer_2_13_1_0_3_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__dev_zio_zio_streams_2_13_1_0_3_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_api_1_34_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_context_1_34_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_core_1_34_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_netty_1_34_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_protobuf_1_34_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_protobuf_lite_1_34_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_services_1_34_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_stub_1_34_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_buffer_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_codec_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_codec_http2_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_codec_http_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_codec_socks_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_common_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_handler_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_handler_proxy_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_resolver_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_transport_4_1_51_Final_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__io_perfmark_perfmark_api_0_19_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__net_java_dev_jna_jna_5_3_1_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__net_liftweb_lift_json_2_13_3_4_3_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_apache_commons_commons_lang3_3_11_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_apache_commons_commons_text_1_9_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_checkerframework_checker_qual_3_5_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_codehaus_mojo_animal_sniffer_annotations_1_18_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_jetbrains_annotations_20_1_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_jline_jline_3_16_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_log4s_log4s_2_13_1_9_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_modules_scala_collection_compat_2_13_2_1_6_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_modules_scala_xml_2_13_1_3_0_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_scala_compiler_2_13_4_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_scala_library_2_13_4_jar.xml +23 -0
- itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_scala_reflect_2_13_4_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_scalap_2_13_4_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_scalaz_scalaz_core_2_13_7_3_2_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_slf4j_slf4j_api_1_7_30_jar.xml +13 -0
- itp_interface/pisa/.idea/libraries/sbt__org_slf4j_slf4j_simple_1_7_30_jar.xml +13 -0
- itp_interface/pisa/.idea/misc.xml +7 -0
- itp_interface/pisa/.idea/modules/PISA-build.iml +127 -0
- itp_interface/pisa/.idea/modules/PISA.iml +94 -0
- itp_interface/pisa/.idea/modules.xml +9 -0
- itp_interface/pisa/.idea/other.xml +6 -0
- itp_interface/pisa/.idea/sbt.xml +20 -0
- itp_interface/pisa/.idea/scala_compiler.xml +6 -0
- itp_interface/pisa/.idea/uiDesigner.xml +124 -0
- itp_interface/pisa/.idea/vcs.xml +6 -0
- itp_interface/pisa/.scalafmt.conf +2 -0
- itp_interface/pisa/LICENSE +29 -0
- itp_interface/pisa/README.md +262 -0
- itp_interface/pisa/build.sbt +49 -0
- itp_interface/pisa/build.sh +26 -0
- itp_interface/pisa/command_generation/close_gaps.py +44 -0
- itp_interface/pisa/command_generation/conjecture_normal_order.py +62 -0
- itp_interface/pisa/command_generation/conjecturer_command_generator.py +36 -0
- itp_interface/pisa/command_generation/create_dirs.py +11 -0
- itp_interface/pisa/command_generation/find_std.py +67 -0
- itp_interface/pisa/command_generation/generate_build_commands_afp.py +15 -0
- itp_interface/pisa/command_generation/generate_build_commands_std.py +15 -0
- itp_interface/pisa/command_generation/generate_commands_afp.py +103 -0
- itp_interface/pisa/command_generation/generate_commands_mini.py +73 -0
- itp_interface/pisa/command_generation/generate_commands_std.py +69 -0
- itp_interface/pisa/command_generation/generate_hammer_extraction_text.py +5 -0
- itp_interface/pisa/command_generation/hammer_command_generator.py +40 -0
- itp_interface/pisa/command_generation/hp_search_command_generator.py +63 -0
- itp_interface/pisa/command_generation/oracle_command_generator.py +56 -0
- itp_interface/pisa/command_generation/search_command_generator.py +69 -0
- itp_interface/pisa/command_generation/summarise_problem_names.py +45 -0
- itp_interface/pisa/command_generation/tpu_hp_search.py +75 -0
- itp_interface/pisa/docker/Dockerfile +34 -0
- itp_interface/pisa/docker/docker_tutorial.md +64 -0
- itp_interface/pisa/eval_setup/copy_isabelle.py +42 -0
- itp_interface/pisa/eval_setup/copy_pisa_jars.py +18 -0
- itp_interface/pisa/mesh_transformer_utils/tokenization.py +86 -0
- itp_interface/pisa/project/build.properties +1 -0
- itp_interface/pisa/project/plugins.sbt +5 -0
- itp_interface/pisa/requirements.txt +4 -0
- itp_interface/pisa/scripts/extract_last_k_steps.py +28 -0
- itp_interface/pisa/scripts/extract_proof_corpus.py +26 -0
- itp_interface/pisa/scripts/gather_hammer_results.py +27 -0
- itp_interface/pisa/scripts/length_in_char_stats.py +20 -0
- itp_interface/pisa/scripts/mix.py +127 -0
- itp_interface/pisa/scripts/results_stat.py +52 -0
- itp_interface/pisa/scripts/test_array_job.sh +34 -0
- itp_interface/pisa/setup.sh +25 -0
- itp_interface/pisa/src/main/protobuf/server.proto +60 -0
- itp_interface/pisa/src/main/python/.idea/.gitignore +8 -0
- itp_interface/pisa/src/main/python/.idea/inspectionProfiles/Project_Default.xml +18 -0
- itp_interface/pisa/src/main/python/.idea/inspectionProfiles/profiles_settings.xml +6 -0
- itp_interface/pisa/src/main/python/.idea/misc.xml +4 -0
- itp_interface/pisa/src/main/python/.idea/modules.xml +8 -0
- itp_interface/pisa/src/main/python/.idea/python.iml +12 -0
- itp_interface/pisa/src/main/python/.idea/vcs.xml +6 -0
- itp_interface/pisa/src/main/python/conjecturing_parsing/conjecturer_postprocessing.py +59 -0
- itp_interface/pisa/src/main/python/data_extraction/extract_data.py +184 -0
- itp_interface/pisa/src/main/python/data_extraction/find_premises.py +221 -0
- itp_interface/pisa/src/main/python/data_extraction/process_data.py +129 -0
- itp_interface/pisa/src/main/python/legacy/PisaFlexibleClient.py +167 -0
- itp_interface/pisa/src/main/python/legacy/autof_test.py +74 -0
- itp_interface/pisa/src/main/python/legacy/cmd_client.py +23 -0
- itp_interface/pisa/src/main/python/legacy/convert_scala_dump_to_test_name_jsons.py +14 -0
- itp_interface/pisa/src/main/python/legacy/create_data_txt.py +72 -0
- itp_interface/pisa/src/main/python/legacy/create_finetune_tfrecords.py +311 -0
- itp_interface/pisa/src/main/python/legacy/demo.py +49 -0
- itp_interface/pisa/src/main/python/legacy/evaluate.py +108 -0
- itp_interface/pisa/src/main/python/legacy/extract_first_step.py +25 -0
- itp_interface/pisa/src/main/python/legacy/get_global_facts.py +35 -0
- itp_interface/pisa/src/main/python/legacy/mix_data.py +19 -0
- itp_interface/pisa/src/main/python/legacy/one_stage_extraction.py +111 -0
- itp_interface/pisa/src/main/python/legacy/prepare_episodic_transitions.py +137 -0
- itp_interface/pisa/src/main/python/legacy/prepare_translation_pairs.py +277 -0
- itp_interface/pisa/src/main/python/pisa_client.py +322 -0
- itp_interface/pisa/src/main/python/server_pb2.py +394 -0
- itp_interface/pisa/src/main/python/server_pb2_grpc.py +230 -0
- itp_interface/pisa/src/main/python/test_client.py +17 -0
- itp_interface/pisa/src/main/python/test_client2.py +79 -0
- itp_interface/pisa/src/main/python/utils/filters.py +59 -0
- itp_interface/pisa/src/main/python/utils/pisa_server_control.py +29 -0
- itp_interface/pisa/src/main/scala/pisa/agent/CheckSyntax.scala +257 -0
- itp_interface/pisa/src/main/scala/pisa/agent/DepThms.scala +29 -0
- itp_interface/pisa/src/main/scala/pisa/agent/PisaStat.scala +46 -0
- itp_interface/pisa/src/main/scala/pisa/agent/RefactorTest.scala +40 -0
- itp_interface/pisa/src/main/scala/pisa/agent/RepHammer.scala +95 -0
- itp_interface/pisa/src/main/scala/pisa/server/HammFacts.scala +63 -0
- itp_interface/pisa/src/main/scala/pisa/server/PisaOS.scala +881 -0
- itp_interface/pisa/src/main/scala/pisa/server/PisaOneStage.scala +540 -0
- itp_interface/pisa/src/main/scala/pisa/server/PisaOneStageServers.scala +1048 -0
- itp_interface/pisa/src/main/scala/pisa/utils/TheoryManager.scala +95 -0
- itp_interface/pisa/src/test/python/analyse_debug.py +33 -0
- itp_interface/pisa/src/test/python/extract_test_seq2seq.py +53 -0
- itp_interface/pisa/src/test/python/extract_test_theorem_ground_truth_indices.py +31 -0
- itp_interface/pisa/src/test/python/proof_originality.py +24 -0
- itp_interface/pisa/src/test/python/test_command_generator.py +25 -0
- itp_interface/pisa/src/test/python/test_model_sequence_accuracy.py +70 -0
- itp_interface/pisa/src/test/scala/pisa/Easy.scala +26 -0
- itp_interface/pisa/src/test/scala/pisa/TestCurl.scala +82 -0
- itp_interface/pisa/src/test/scala/pisa/TestIsa.scala +27 -0
- itp_interface/pisa/test.sh +19 -0
- itp_interface/pisa/universal_test_theorems.tar.gz +0 -0
- itp_interface/repo/build.py +78 -0
- itp_interface/repo/clone.py +79 -0
- itp_interface/repo/dataset_discovery.py +99 -0
- itp_interface/retrieval/__init__.py +0 -0
- itp_interface/retrieval/abstraction.py +35 -0
- itp_interface/retrieval/coq_bm25_reranker.py +153 -0
- itp_interface/retrieval/isabelle_bm25_reranker.py +86 -0
- itp_interface/retrieval/lean3_bm25_reranker.py +86 -0
- itp_interface/rl/__init__.py +0 -0
- itp_interface/rl/abstraction.py +168 -0
- itp_interface/rl/proof_action.py +172 -0
- itp_interface/rl/proof_state.py +149 -0
- itp_interface/rl/proof_tree.py +109 -0
- itp_interface/rl/simpl_proof_env_pool.py +16 -0
- itp_interface/rl/simple_proof_env.py +713 -0
- itp_interface/rl/simple_proof_env_pool.py +591 -0
- itp_interface/scripts/setup.sh +228 -0
- itp_interface/tools/__init__.py +0 -0
- itp_interface/tools/basic_utils.py +172 -0
- itp_interface/tools/bin_packing.py +61 -0
- itp_interface/tools/cache.py +93 -0
- itp_interface/tools/coq_build_spec.py +31 -0
- itp_interface/tools/coq_build_tool.py +319 -0
- itp_interface/tools/coq_context_helper.py +354 -0
- itp_interface/tools/coq_executor.py +508 -0
- itp_interface/tools/coq_local_data_generation_transform.py +158 -0
- itp_interface/tools/coq_parse_utils.py +154 -0
- itp_interface/tools/coq_raw_proofs.py +193 -0
- itp_interface/tools/coq_theorem_proof_pair_generation_transform.py +146 -0
- itp_interface/tools/coq_training_data_generator.py +76 -0
- itp_interface/tools/dynamic_coq_proof_exec.py +220 -0
- itp_interface/tools/dynamic_isabelle_proof_exec.py +229 -0
- itp_interface/tools/dynamic_lean4_proof_exec.py +236 -0
- itp_interface/tools/dynamic_lean_proof_exec.py +228 -0
- itp_interface/tools/isabelle_context_helper.py +66 -0
- itp_interface/tools/isabelle_executor.py +862 -0
- itp_interface/tools/isabelle_local_data_generation_transform.py +149 -0
- itp_interface/tools/isabelle_parse_utils.py +131 -0
- itp_interface/tools/isabelle_server.py +106 -0
- itp_interface/tools/lean4_context_helper.py +72 -0
- itp_interface/tools/lean4_local_data_generation_transform.py +122 -0
- itp_interface/tools/lean4_sync_executor.py +1193 -0
- itp_interface/tools/lean_cmd_executor.py +804 -0
- itp_interface/tools/lean_context_helper.py +327 -0
- itp_interface/tools/lean_dojo_data_generation_transform.py +206 -0
- itp_interface/tools/lean_executor.py +687 -0
- itp_interface/tools/lean_local_data_generation_transform.py +136 -0
- itp_interface/tools/lean_parse_utils.py +32 -0
- itp_interface/tools/log_utils.py +20 -0
- itp_interface/tools/proof_exec_callback.py +76 -0
- itp_interface/tools/ray_utils.py +265 -0
- itp_interface/tools/repl/.git +1 -0
- itp_interface/tools/repl/.github/workflows/ci.yml +24 -0
- itp_interface/tools/repl/.gitignore +7 -0
- itp_interface/tools/repl/.vscode/copyright.code-snippets +13 -0
- itp_interface/tools/repl/.vscode/extensions.json +13 -0
- itp_interface/tools/repl/.vscode/module-docstring.code-snippets +35 -0
- itp_interface/tools/repl/.vscode/settings.json +11 -0
- itp_interface/tools/repl/README.md +174 -0
- itp_interface/tools/repl/REPL/Frontend.lean +47 -0
- itp_interface/tools/repl/REPL/JSON.lean +186 -0
- itp_interface/tools/repl/REPL/Lean/ContextInfo.lean +9 -0
- itp_interface/tools/repl/REPL/Lean/Environment.lean +31 -0
- itp_interface/tools/repl/REPL/Lean/InfoTree/ToJson.lean +114 -0
- itp_interface/tools/repl/REPL/Lean/InfoTree.lean +272 -0
- itp_interface/tools/repl/REPL/Main.lean +323 -0
- itp_interface/tools/repl/REPL/Snapshots.lean +306 -0
- itp_interface/tools/repl/REPL/Util/Path.lean +36 -0
- itp_interface/tools/repl/REPL/Util/Pickle.lean +44 -0
- itp_interface/tools/repl/REPL.lean +4 -0
- itp_interface/tools/repl/lake-manifest.json +5 -0
- itp_interface/tools/repl/lakefile.lean +15 -0
- itp_interface/tools/repl/lean-toolchain +1 -0
- itp_interface/tools/repl/test/Mathlib/.gitignore +5 -0
- itp_interface/tools/repl/test/Mathlib/H20231110.sh +2 -0
- itp_interface/tools/repl/test/Mathlib/ReplMathlibTests.lean +1 -0
- itp_interface/tools/repl/test/Mathlib/lake-manifest.json +68 -0
- itp_interface/tools/repl/test/Mathlib/lakefile.lean +11 -0
- itp_interface/tools/repl/test/Mathlib/lean-toolchain +1 -0
- itp_interface/tools/repl/test/Mathlib/test/20240209.expected.out +20 -0
- itp_interface/tools/repl/test/Mathlib/test/20240209.in +3 -0
- itp_interface/tools/repl/test/Mathlib/test/20240209.lean +4 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231020.expected.out +8 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231020.in +8 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231020.lean +22 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231110.expected.out +4 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231110.in +4 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231115.expected.out +19 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231115.in +5 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231115_2.expected.out +18 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231115_2.in +4 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231115_3.expected.out +10 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231115_3.in +4 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231214.in +9 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231214.lean +30 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231215.expected.out +4 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231215.in +4 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231215_2.expected.out +14 -0
- itp_interface/tools/repl/test/Mathlib/test/H20231215_2.in +3 -0
- itp_interface/tools/repl/test/Mathlib/test/exact.expected.out +37 -0
- itp_interface/tools/repl/test/Mathlib/test/exact.in +10 -0
- itp_interface/tools/repl/test/Mathlib/test/import_Mathlib.lean +1 -0
- itp_interface/tools/repl/test/Mathlib/test/induction.expected.out +29 -0
- itp_interface/tools/repl/test/Mathlib/test/induction.in +10 -0
- itp_interface/tools/repl/test/Mathlib/test/induction.lean +6 -0
- itp_interface/tools/repl/test/Mathlib/test/on_goal.expected.out +22 -0
- itp_interface/tools/repl/test/Mathlib/test/on_goal.in +5 -0
- itp_interface/tools/repl/test/Mathlib/test/pickle.expected.out +16 -0
- itp_interface/tools/repl/test/Mathlib/test/pickle.in +6 -0
- itp_interface/tools/repl/test/Mathlib/test/pickle_2.expected.out +4 -0
- itp_interface/tools/repl/test/Mathlib/test/pickle_2.in +4 -0
- itp_interface/tools/repl/test/Mathlib/test.sh +41 -0
- itp_interface/tools/repl/test/all_tactics.expected.out +13 -0
- itp_interface/tools/repl/test/all_tactics.in +1 -0
- itp_interface/tools/repl/test/by_cases.expected.out +25 -0
- itp_interface/tools/repl/test/by_cases.in +8 -0
- itp_interface/tools/repl/test/by_cases.lean +4 -0
- itp_interface/tools/repl/test/calc.expected.out +32 -0
- itp_interface/tools/repl/test/calc.in +1 -0
- itp_interface/tools/repl/test/def_eval.expected.out +9 -0
- itp_interface/tools/repl/test/def_eval.in +3 -0
- itp_interface/tools/repl/test/enableInitializersExecution.expected.out +2 -0
- itp_interface/tools/repl/test/enableInitializersExecution.in +1 -0
- itp_interface/tools/repl/test/file.expected.out +8 -0
- itp_interface/tools/repl/test/file.in +1 -0
- itp_interface/tools/repl/test/file.lean +5 -0
- itp_interface/tools/repl/test/have_by_sorry.expected.out +28 -0
- itp_interface/tools/repl/test/have_by_sorry.in +6 -0
- itp_interface/tools/repl/test/import_lean.in +1 -0
- itp_interface/tools/repl/test/incomplete.expected.out +18 -0
- itp_interface/tools/repl/test/incomplete.in +3 -0
- itp_interface/tools/repl/test/incomplete.lean +0 -0
- itp_interface/tools/repl/test/infotree.expected.out +20 -0
- itp_interface/tools/repl/test/infotree.in +2 -0
- itp_interface/tools/repl/test/invalid_tactic.expected.out +20 -0
- itp_interface/tools/repl/test/invalid_tactic.in +3 -0
- itp_interface/tools/repl/test/name_generator.expected.out +53 -0
- itp_interface/tools/repl/test/name_generator.in +18 -0
- itp_interface/tools/repl/test/no_goal_sorry.expected.out +11 -0
- itp_interface/tools/repl/test/no_goal_sorry.in +1 -0
- itp_interface/tools/repl/test/no_goal_sorry_2.expected.out +12 -0
- itp_interface/tools/repl/test/no_goal_sorry_2.in +1 -0
- itp_interface/tools/repl/test/options.expected.out +17 -0
- itp_interface/tools/repl/test/options.in +6 -0
- itp_interface/tools/repl/test/pickle_environment.expected.out +8 -0
- itp_interface/tools/repl/test/pickle_environment.in +7 -0
- itp_interface/tools/repl/test/pickle_environment_with_imports.expected.out +10 -0
- itp_interface/tools/repl/test/pickle_environment_with_imports.in +9 -0
- itp_interface/tools/repl/test/pickle_open.expected.out +8 -0
- itp_interface/tools/repl/test/pickle_open.in +7 -0
- itp_interface/tools/repl/test/pickle_open_2.expected.out +4 -0
- itp_interface/tools/repl/test/pickle_open_2.in +3 -0
- itp_interface/tools/repl/test/pickle_open_scoped.expected.out +18 -0
- itp_interface/tools/repl/test/pickle_open_scoped.in +8 -0
- itp_interface/tools/repl/test/pickle_open_scoped_2.expected.out +14 -0
- itp_interface/tools/repl/test/pickle_open_scoped_2.in +3 -0
- itp_interface/tools/repl/test/pickle_proof_state_1.expected.out +26 -0
- itp_interface/tools/repl/test/pickle_proof_state_1.in +15 -0
- itp_interface/tools/repl/test/pickle_proof_state_2.expected.out +4 -0
- itp_interface/tools/repl/test/pickle_proof_state_2.in +3 -0
- itp_interface/tools/repl/test/pickle_proof_state_env.expected.out +26 -0
- itp_interface/tools/repl/test/pickle_proof_state_env.in +15 -0
- itp_interface/tools/repl/test/pickle_scoped_notation.in +16 -0
- itp_interface/tools/repl/test/pickle_scoped_notation_2.in +3 -0
- itp_interface/tools/repl/test/proof_step.expected.out +18 -0
- itp_interface/tools/repl/test/proof_step.in +7 -0
- itp_interface/tools/repl/test/readme.expected.out +16 -0
- itp_interface/tools/repl/test/readme.in +5 -0
- itp_interface/tools/repl/test/sorry_hypotheses.expected.out +16 -0
- itp_interface/tools/repl/test/sorry_hypotheses.in +4 -0
- itp_interface/tools/repl/test/synthesize_placeholder.expected.out +7 -0
- itp_interface/tools/repl/test/synthesize_placeholder.in +1 -0
- itp_interface/tools/repl/test/tactic_mode_sorry.expected.out +14 -0
- itp_interface/tools/repl/test/tactic_mode_sorry.in +3 -0
- itp_interface/tools/repl/test/tactic_sorry.expected.out +12 -0
- itp_interface/tools/repl/test/tactic_sorry.in +1 -0
- itp_interface/tools/repl/test/term_sorry.expected.out +12 -0
- itp_interface/tools/repl/test/term_sorry.in +1 -0
- itp_interface/tools/repl/test/trace_simp.expected.out +41 -0
- itp_interface/tools/repl/test/trace_simp.in +15 -0
- itp_interface/tools/repl/test/unfinished_tactic_block.expected.out +11 -0
- itp_interface/tools/repl/test/unfinished_tactic_block.in +1 -0
- itp_interface/tools/repl/test/unknown_environment.expected.out +2 -0
- itp_interface/tools/repl/test/unknown_environment.in +1 -0
- itp_interface/tools/repl/test/unknown_proof_state.expected.out +14 -0
- itp_interface/tools/repl/test/unknown_proof_state.in +3 -0
- itp_interface/tools/repl/test/unknown_tactic.expected.out +14 -0
- itp_interface/tools/repl/test/unknown_tactic.in +3 -0
- itp_interface/tools/repl/test/variables.expected.out +26 -0
- itp_interface/tools/repl/test/variables.in +5 -0
- itp_interface/tools/repl/test.sh +43 -0
- itp_interface/tools/run_data_generation_transforms.py +350 -0
- itp_interface/tools/theorem_details.py +25 -0
- itp_interface/tools/training_data.py +358 -0
- itp_interface/tools/training_data_format.py +599 -0
- itp_interface-1.0.0.dist-info/METADATA +78 -0
- itp_interface-1.0.0.dist-info/RECORD +485 -0
- itp_interface-1.0.0.dist-info/WHEEL +4 -0
- itp_interface-1.0.0.dist-info/entry_points.txt +3 -0
- itp_interface-1.0.0.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,804 @@
|
|
|
1
|
+
#!/usr/bin/env python3
|
|
2
|
+
|
|
3
|
+
import sys
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
root_dir = f"{__file__.split('itp_interface')[0]}"
|
|
7
|
+
if root_dir not in sys.path:
|
|
8
|
+
sys.path.append(root_dir)
|
|
9
|
+
import subprocess
|
|
10
|
+
import os
|
|
11
|
+
import logging
|
|
12
|
+
import typing
|
|
13
|
+
import time
|
|
14
|
+
import random
|
|
15
|
+
import re
|
|
16
|
+
import copy
|
|
17
|
+
from collections import OrderedDict
|
|
18
|
+
from itp_interface.tools.lean_parse_utils import LeanLineByLineReader
|
|
19
|
+
from itp_interface.lean_server.lean_cmd_server import LeanCmdServer
|
|
20
|
+
from itp_interface.lean_server.lean_context import Obligation, ProofContext
|
|
21
|
+
from itp_interface.lean_server.lean_utils import Lean3Utils
|
|
22
|
+
from itp_interface.lean_server.lean3_search_tool import Constants, Lean3Lemma, Lean3SearchTool
|
|
23
|
+
logger = logging.getLogger()
|
|
24
|
+
|
|
25
|
+
class Lean3Executor(object):
|
|
26
|
+
# Write now this doesn't do the best job of capturing each state changing
|
|
27
|
+
# tactic separately. It relies on the fact the tactics are usually written in an
|
|
28
|
+
# atomic way. For example, if the user writes:
|
|
29
|
+
# intros,
|
|
30
|
+
# split,
|
|
31
|
+
# cases a,...
|
|
32
|
+
# However for a simple REPL doesn't need to capture changes of every state change
|
|
33
|
+
# (which can be done by a tideous character by character comparision of the state on lean --server
|
|
34
|
+
# and the state after running the tactic). Instead, we can just assume that the user is intelligent
|
|
35
|
+
# enough to write tactics in an atomic way. This is a reasonable assumption for a simple REPL.
|
|
36
|
+
# The keywords below are taken from https://github.com/leanprover/lean-mode/blob/master/lean-syntax.el
|
|
37
|
+
keywords = {
|
|
38
|
+
"import", "prelude", "protected", "private", "noncomputable", "definition", "meta", "renaming",
|
|
39
|
+
"hiding", "exposing", "parameter", "parameters", "begin", "constant", "constants",
|
|
40
|
+
"lemma", "variable", "variables", "theorem", "example", "abbreviation",
|
|
41
|
+
"open", "export", "axiom", "axioms", "inductive", "coinductive", "with", "without",
|
|
42
|
+
"structure", "universe", "universes", "hide", "precedence", "reserve", "declare_trace", "add_key_equivalence",
|
|
43
|
+
"match", "infix", "infixl", "infixr", "notation", "postfix", "prefix", "instance",
|
|
44
|
+
"end", "this", "using", "using_well_founded", "namespace", "section",
|
|
45
|
+
"attribute", "local", "set_option", "extends", "include", "omit", "classes", "class",
|
|
46
|
+
"attributes", "raw", "replacing", "calc", "have", "show", "suffices", "by", "in", "at",
|
|
47
|
+
"do", "let", "forall", #"Pi",
|
|
48
|
+
"fun", "exists", "if", "then", "else", "assume", "from", "mutual", "def", "run_cmd"
|
|
49
|
+
# Note that there are UTF-8 characters in the following list
|
|
50
|
+
# "#", "@", "!", "$", "->", "∼", "↔", "/", "==", "=", ":=", "<->", "/\\", "\\/", "∧", "∨",
|
|
51
|
+
# "≠", "<", ">", "≤", "≥", "¬", "<=", ">=", "⁻¹", "⬝", "▸", "+", "*", "-", "/", "λ",
|
|
52
|
+
# "→", "∃", "∀", "∘", "×", "Σ", "Π", "~", "||", "&&", "≃", "≡", "≅",
|
|
53
|
+
# "ℕ", "ℤ", "ℚ", "ℝ", "ℂ", "𝔸",
|
|
54
|
+
# "⬝e", "⬝i", "⬝o", "⬝op", "⬝po", "⬝h", "⬝v", "⬝hp", "⬝vp", "⬝ph", "⬝pv", "⬝r", "◾", "◾o",
|
|
55
|
+
# "∘n", "∘f", "∘fi", "∘nf", "∘fn", "∘n1f", "∘1nf", "∘f1n", "∘fn1",
|
|
56
|
+
# "^c", "≃c", "≅c", "×c", "×f", "×n", "+c", "+f", "+n", "ℕ₋₂"
|
|
57
|
+
}
|
|
58
|
+
theorem_regex = r"(((theorem ([\w+|\d+]*))|example)([\S|\s]*?):=[\S|\s]*?)(begin|by|calc)"
|
|
59
|
+
proof_context_separator = "⊢"
|
|
60
|
+
proof_context_regex = r"((\d+) goals)*([\s|\S]*?)\n\n"
|
|
61
|
+
goal_regex = rf"([\s|\S]*?){proof_context_separator}([\s|\S]*)"
|
|
62
|
+
theorem_match = re.compile(theorem_regex, re.MULTILINE)
|
|
63
|
+
proof_context_match = re.compile(proof_context_regex, re.MULTILINE)
|
|
64
|
+
goal_match = re.compile(goal_regex, re.MULTILINE)
|
|
65
|
+
proof_context_generation_tactic = "\nend"
|
|
66
|
+
proof_context_generation_tactic_curlies = "\n}"
|
|
67
|
+
proof_state_running_message = "tactic failed, there are unsolved goals\nstate:"
|
|
68
|
+
search_tools: typing.Dict[str, typing.Any] = {}
|
|
69
|
+
def __init__(self, project_root: str = None, prefix: str = None, main_file: str = None, use_hammer: bool = False, timeout_in_sec: int = 60, use_human_readable_proof_context: bool = False, proof_step_iter: typing.Iterator[str] = None, suppress_error_log: bool = False, mathlib_root: typing.Optional[str] = None, enable_search: bool = False, namespaces: typing.List[str] = None, keep_local_context: bool = False):
|
|
70
|
+
assert proof_step_iter is None or isinstance(proof_step_iter, typing.Iterator), \
|
|
71
|
+
"proof_step_iter must be an iterator"
|
|
72
|
+
assert main_file is not None or proof_step_iter is not None, \
|
|
73
|
+
"Either main_file or proof_step_iter must be provided"
|
|
74
|
+
assert main_file is None or proof_step_iter is None, \
|
|
75
|
+
"Only one of main_file or proof_step_iter must be provided"
|
|
76
|
+
assert main_file is None or (os.path.exists(main_file) and main_file.endswith(".lean")), \
|
|
77
|
+
"main_file must be a valid path to a '.lean' file"
|
|
78
|
+
assert project_root is None or (os.path.exists(project_root) and os.path.isdir(project_root)), \
|
|
79
|
+
"project_root must be a valid path to a directory"
|
|
80
|
+
assert not use_hammer, "Hammer is not supported for Lean3"
|
|
81
|
+
self.use_human_readable_proof_context = use_human_readable_proof_context
|
|
82
|
+
self.project_root = project_root if project_root is not None else "."
|
|
83
|
+
self.main_file = main_file
|
|
84
|
+
self.ticks = str(time.time()).replace(".", "") # This ensures that the temp file name is unique and doesn't clash with other temp files
|
|
85
|
+
# This helps in running parallel instances of prover
|
|
86
|
+
self.random_num = str(random.randint(0, 100000000))
|
|
87
|
+
self.temp_filename_suffix = f"temptodel{self.ticks}{self.random_num}.lean"
|
|
88
|
+
self.temp_file = os.path.join(prefix, self.temp_filename_suffix) if prefix is not None else self.temp_filename_suffix
|
|
89
|
+
self.temp_file_full_path = os.path.join(self.project_root, self.temp_file)
|
|
90
|
+
self.use_hammer = use_hammer
|
|
91
|
+
self.timeout_in_sec = min(timeout_in_sec, 120) # Maximum 120s timeout
|
|
92
|
+
self.current_stmt = None
|
|
93
|
+
self.line_num = 0
|
|
94
|
+
self.main_file_iter = proof_step_iter
|
|
95
|
+
self.suppress_error_log = suppress_error_log
|
|
96
|
+
self.lean_server : LeanCmdServer = None
|
|
97
|
+
self.execution_complete = False
|
|
98
|
+
self._max_memory_in_mib = 40000 # 40 GiB is needed for mathlib to work seemlessly
|
|
99
|
+
self._lines_executed = []
|
|
100
|
+
self.proof_context : ProofContext = None
|
|
101
|
+
self.curr_lemma_name : typing.Optional[str] = None
|
|
102
|
+
self.curr_lemma : typing.Optional[str] = None
|
|
103
|
+
self.lean_error_messages : typing.List[str] = []
|
|
104
|
+
self._proof_running = False
|
|
105
|
+
self._file_content = ""
|
|
106
|
+
self.local_file_lemmas: typing.OrderedDict[str, str] = OrderedDict()
|
|
107
|
+
self.local_theorem_lemma_description: typing.OrderedDict[str, str] = OrderedDict()
|
|
108
|
+
self._proof_start_idx: typing.Optional[int] = None
|
|
109
|
+
self._import_end_idx: typing.Optional[int] = None
|
|
110
|
+
if mathlib_root is not None:
|
|
111
|
+
self._mathlib_root = mathlib_root
|
|
112
|
+
else:
|
|
113
|
+
self._mathlib_root = os.path.join(self.project_root, "_target", "deps", "mathlib")
|
|
114
|
+
self._mathlib_src_root = os.path.join(self._mathlib_root, "src")
|
|
115
|
+
self._enable_search = enable_search
|
|
116
|
+
self._comments_removed = False
|
|
117
|
+
self._keep_local_context = keep_local_context
|
|
118
|
+
self._namespaces = namespaces if namespaces is not None else Constants.lean_useful_imports + Constants.mathlib_useful_imports
|
|
119
|
+
if self._enable_search:
|
|
120
|
+
self._search_tool = Lean3Executor._init_search(self._mathlib_root, self._namespaces)
|
|
121
|
+
assert self._search_tool is not None, "Search tool cannot be None"
|
|
122
|
+
else:
|
|
123
|
+
self._search_tool = Lean3SearchTool()
|
|
124
|
+
|
|
125
|
+
def _init_search(mathlib_root: str, namespaces: typing.List[str]) -> Lean3SearchTool:
|
|
126
|
+
assert os.path.exists(mathlib_root), f"Mathlib root {mathlib_root} does not exist"
|
|
127
|
+
assert os.path.isdir(mathlib_root), f"Mathlib root {mathlib_root} is not a directory"
|
|
128
|
+
if mathlib_root in Lean3Executor.search_tools:
|
|
129
|
+
search_tool = Lean3Executor.search_tools[mathlib_root]
|
|
130
|
+
else:
|
|
131
|
+
search_tool = Lean3SearchTool(mathlib_root, imports=namespaces)
|
|
132
|
+
search_tool.initialize()
|
|
133
|
+
Lean3Executor.search_tools[mathlib_root] = search_tool
|
|
134
|
+
deep_copy = copy.deepcopy(search_tool)
|
|
135
|
+
return deep_copy
|
|
136
|
+
|
|
137
|
+
def __enter__(self):
|
|
138
|
+
self.lean_server = LeanCmdServer(memory_in_mibs=self._max_memory_in_mib, cwd=self.project_root, debug=False)
|
|
139
|
+
if self.main_file_iter is None:
|
|
140
|
+
self._comments_removed = True
|
|
141
|
+
self.main_file_iter = LeanLineByLineReader(self.main_file, remove_comments=True).instruction_step_generator()
|
|
142
|
+
return self
|
|
143
|
+
|
|
144
|
+
def __exit__(self, exc_type, exc_value, traceback):
|
|
145
|
+
try:
|
|
146
|
+
self.main_file_iter.close() # Close the file handle
|
|
147
|
+
except:
|
|
148
|
+
pass
|
|
149
|
+
# delete if the main file is a temporary file
|
|
150
|
+
if os.path.exists(self.temp_file_full_path):
|
|
151
|
+
os.remove(self.temp_file_full_path)
|
|
152
|
+
|
|
153
|
+
@property
|
|
154
|
+
def token_separator_set(self):
|
|
155
|
+
return set(" ()[]{}.,;:+-*/=<>!~?@#$%^&|`\"\\")
|
|
156
|
+
|
|
157
|
+
@property
|
|
158
|
+
def token_separator(self):
|
|
159
|
+
return " ()[]{}.,;:+-*/=<>!~?@#$%^&|`\"\\"
|
|
160
|
+
|
|
161
|
+
@property
|
|
162
|
+
def token_separator_regex(self):
|
|
163
|
+
return "\s+|\(|\)|\[|\]|\{|\}|\.|,|;|:|\?|@|#|\$|%|\^|&|\||`|\"|\\\\" +\
|
|
164
|
+
""#"|\+|-|\*|/|=|<|>|!|~"
|
|
165
|
+
|
|
166
|
+
@staticmethod
|
|
167
|
+
def get_token_separator_set():
|
|
168
|
+
return set(" ()[]{}.,;:+-*/=<>!~?@#$%^&|`\"\\")
|
|
169
|
+
|
|
170
|
+
@staticmethod
|
|
171
|
+
def get_token_separators():
|
|
172
|
+
return " ()[]{}.,;:+-*/=<>!~?@#$%^&|`\"\\"
|
|
173
|
+
|
|
174
|
+
@staticmethod
|
|
175
|
+
def get_token_separator_regex():
|
|
176
|
+
return "\s+|\(|\)|\[|\]|\{|\}|\.|,|;|:|\?|@|#|\$|%|\^|&|\||`|\"|\\\\" +\
|
|
177
|
+
""#"|\+|-|\*|/|=|<|>|!|~"
|
|
178
|
+
|
|
179
|
+
def is_in_proof_mode(self):
|
|
180
|
+
return True if self.proof_context else False
|
|
181
|
+
|
|
182
|
+
def needs_qed(self):
|
|
183
|
+
return self.proof_context is not None and len(self.proof_context.all_goals) == 0
|
|
184
|
+
|
|
185
|
+
def needs_cut_close(self):
|
|
186
|
+
return self.proof_context is not None and len(self.proof_context.fg_goals) == 0 and len(self.proof_context.all_goals) > 0
|
|
187
|
+
|
|
188
|
+
def run_next(self) -> bool:
|
|
189
|
+
try:
|
|
190
|
+
stmt = next(self.main_file_iter)
|
|
191
|
+
except StopIteration:
|
|
192
|
+
self.execution_complete = True
|
|
193
|
+
return False
|
|
194
|
+
self.current_stmt = stmt
|
|
195
|
+
self.line_num += 1
|
|
196
|
+
try:
|
|
197
|
+
idx = len(self._lines_executed)
|
|
198
|
+
self._run_stmt_on_lean_server(idx, stmt)
|
|
199
|
+
except:
|
|
200
|
+
if not self.suppress_error_log:
|
|
201
|
+
logger.error(f"Got an exception while running '{stmt}' on lean. File name: {self.main_file}")
|
|
202
|
+
logger.exception(f"Exception Log")
|
|
203
|
+
raise
|
|
204
|
+
self._lines_executed.append(stmt)
|
|
205
|
+
return True
|
|
206
|
+
|
|
207
|
+
def run_next_without_exec(self) -> bool:
|
|
208
|
+
try:
|
|
209
|
+
stmt = next(self.main_file_iter)
|
|
210
|
+
except StopIteration:
|
|
211
|
+
self.execution_complete = True
|
|
212
|
+
return False
|
|
213
|
+
self.current_stmt = stmt
|
|
214
|
+
self.line_num += 1
|
|
215
|
+
try:
|
|
216
|
+
self._set_content_to_run(stmt)
|
|
217
|
+
except:
|
|
218
|
+
if not self.suppress_error_log:
|
|
219
|
+
logger.error(f"Got an exception while running '{stmt}' on lean. File name: {self.main_file}")
|
|
220
|
+
logger.exception(f"Exception Log")
|
|
221
|
+
raise
|
|
222
|
+
self._lines_executed.append(stmt)
|
|
223
|
+
return True
|
|
224
|
+
|
|
225
|
+
def run_all_without_exec(self) -> bool:
|
|
226
|
+
next_cmd_ran = self.run_next_without_exec()
|
|
227
|
+
while next_cmd_ran:
|
|
228
|
+
next_cmd_ran = self.run_next_without_exec()
|
|
229
|
+
|
|
230
|
+
def find_all_theorems_names(self) -> typing.List[str]:
|
|
231
|
+
theorem_names = []
|
|
232
|
+
matches = Lean3Executor.theorem_match.findall(self._file_content)
|
|
233
|
+
for _, _, _, thm_name, _, _ in matches:
|
|
234
|
+
theorem_names.append(thm_name)
|
|
235
|
+
return theorem_names
|
|
236
|
+
|
|
237
|
+
def get_tokens_in_given_stmt(self, stmt: str, ignore_first_token: bool = False) -> typing.Generator[str, None, None]:
|
|
238
|
+
idx = -1
|
|
239
|
+
for tok in re.split(self.token_separator_regex, stmt):
|
|
240
|
+
idx += 1
|
|
241
|
+
# skip the first token as it is usually a keyword
|
|
242
|
+
if idx == 0 and ignore_first_token:
|
|
243
|
+
continue
|
|
244
|
+
tok1 = tok.strip()
|
|
245
|
+
if len(tok1) > 0:
|
|
246
|
+
yield tok1
|
|
247
|
+
|
|
248
|
+
def tokenize(stmt: str) -> typing.Generator[str, None, None]:
|
|
249
|
+
for tok in re.split(Lean3Executor.get_token_separator_regex(), stmt):
|
|
250
|
+
tok1 = tok.strip()
|
|
251
|
+
if len(tok1) > 0 and \
|
|
252
|
+
tok1 not in Lean3Executor.keywords and \
|
|
253
|
+
not (len(tok1) == 1 and tok1.isascii() and tok1.isalpha()):
|
|
254
|
+
yield tok1
|
|
255
|
+
|
|
256
|
+
# Make this chacheable
|
|
257
|
+
# @functools.lru_cache(maxsize=10000)
|
|
258
|
+
def search_type_matching_defns(self, name: str) -> typing.List[Lean3Lemma]:
|
|
259
|
+
if name in Lean3Executor.keywords:
|
|
260
|
+
return []
|
|
261
|
+
return self._search_tool.lemmas
|
|
262
|
+
|
|
263
|
+
def get_all_type_matching_defns(self, name: str) -> typing.Generator[Lean3Lemma, None, None]:
|
|
264
|
+
return self.search_type_matching_defns(name)
|
|
265
|
+
|
|
266
|
+
def search_exact(self, name: str) -> typing.List[Lean3Lemma]:
|
|
267
|
+
return self.search_type_matching_defns(name)
|
|
268
|
+
|
|
269
|
+
def search_defn(self, name: str, match_until: typing.Tuple[str], max_search_res: typing.Optional[int] = None) -> typing.List[typing.Tuple[str, str, bool]]:
|
|
270
|
+
return self.search_type_matching_defns(name)
|
|
271
|
+
|
|
272
|
+
def run_without_executing(self, stmt: str):
|
|
273
|
+
while True:
|
|
274
|
+
try:
|
|
275
|
+
stmt = next(self.main_file_iter)
|
|
276
|
+
except StopIteration:
|
|
277
|
+
return
|
|
278
|
+
idx = len(self._lines_executed)
|
|
279
|
+
self._set_content_to_run(stmt)
|
|
280
|
+
if stmt.startswith("theorem") and self._import_end_idx is None:
|
|
281
|
+
self._import_end_idx = idx
|
|
282
|
+
self.current_stmt = stmt
|
|
283
|
+
self.line_num += 1
|
|
284
|
+
self._set_content_to_run(stmt)
|
|
285
|
+
self._lines_executed.append(stmt)
|
|
286
|
+
|
|
287
|
+
def run_lemma_without_executing(self):
|
|
288
|
+
while True:
|
|
289
|
+
try:
|
|
290
|
+
stmt = next(self.main_file_iter)
|
|
291
|
+
self.current_stmt = stmt
|
|
292
|
+
self.line_num += 1
|
|
293
|
+
if "Qed." in stmt or "Defined." in stmt or "Admitted." in stmt:
|
|
294
|
+
return True
|
|
295
|
+
except StopIteration:
|
|
296
|
+
return False
|
|
297
|
+
|
|
298
|
+
def rewind_proof_steps(self) -> str:
|
|
299
|
+
raise NotImplementedError("rewind_proof_steps is not implemented")
|
|
300
|
+
|
|
301
|
+
def run_till_next_lemma(self) -> typing.Tuple[bool, typing.Optional[str]]:
|
|
302
|
+
# Run the coq file until the next lemma is found
|
|
303
|
+
next_stmt = None
|
|
304
|
+
in_proof_mode = self.is_in_proof_mode()
|
|
305
|
+
if in_proof_mode or self.execution_complete:
|
|
306
|
+
# If we are already in proof mode, then we have already found a lemma
|
|
307
|
+
return False, next_stmt
|
|
308
|
+
prev_stmt = self.current_stmt
|
|
309
|
+
ran_last_cmd = self.run_next()
|
|
310
|
+
next_stmt = self.current_stmt
|
|
311
|
+
if not ran_last_cmd:
|
|
312
|
+
return False, None
|
|
313
|
+
assigned = False
|
|
314
|
+
while ran_last_cmd and not in_proof_mode:
|
|
315
|
+
if not assigned:
|
|
316
|
+
prev_stmt = next_stmt
|
|
317
|
+
ran_last_cmd = self.run_next()
|
|
318
|
+
in_proof_mode = self.is_in_proof_mode()
|
|
319
|
+
if not assigned:
|
|
320
|
+
next_stmt = self.current_stmt
|
|
321
|
+
if in_proof_mode:
|
|
322
|
+
assigned = True
|
|
323
|
+
lemma_name = next_stmt if next_stmt.startswith("Theorem") or next_stmt.startswith("Lemma") else prev_stmt
|
|
324
|
+
return in_proof_mode, lemma_name
|
|
325
|
+
|
|
326
|
+
def run_till_next_lemma_return_exec_stmt(self) -> typing.Generator[str, None, None]:
|
|
327
|
+
# Run the coq file until the next lemma is found
|
|
328
|
+
next_stmt = None
|
|
329
|
+
in_proof_mode = self.is_in_proof_mode()
|
|
330
|
+
if in_proof_mode or self.execution_complete:
|
|
331
|
+
# If we are already in proof mode, then we have already found a lemma
|
|
332
|
+
yield from []
|
|
333
|
+
else:
|
|
334
|
+
ran_last_cmd = self.run_next()
|
|
335
|
+
next_stmt = self.current_stmt
|
|
336
|
+
if not ran_last_cmd:
|
|
337
|
+
yield from []
|
|
338
|
+
else:
|
|
339
|
+
yield next_stmt
|
|
340
|
+
while ran_last_cmd and not in_proof_mode:
|
|
341
|
+
ran_last_cmd = self.run_next()
|
|
342
|
+
next_stmt = self.current_stmt
|
|
343
|
+
if ran_last_cmd:
|
|
344
|
+
yield next_stmt
|
|
345
|
+
in_proof_mode = self.is_in_proof_mode()
|
|
346
|
+
|
|
347
|
+
def run_to_finish_lemma_return_exec(self) -> typing.Generator[str, None, None]:
|
|
348
|
+
# Run the coq file until the next lemma is found
|
|
349
|
+
next_stmt = None
|
|
350
|
+
in_proof_mode = self.is_in_proof_mode()
|
|
351
|
+
if not in_proof_mode or self.execution_complete:
|
|
352
|
+
# If we are already in proof mode, then we have already found a lemma
|
|
353
|
+
yield from []
|
|
354
|
+
else:
|
|
355
|
+
ran_last_cmd = self.run_next()
|
|
356
|
+
next_stmt = self.current_stmt
|
|
357
|
+
if not ran_last_cmd:
|
|
358
|
+
yield from []
|
|
359
|
+
else:
|
|
360
|
+
yield next_stmt
|
|
361
|
+
while ran_last_cmd and in_proof_mode:
|
|
362
|
+
ran_last_cmd = self.run_next()
|
|
363
|
+
next_stmt = self.current_stmt
|
|
364
|
+
if ran_last_cmd:
|
|
365
|
+
yield next_stmt
|
|
366
|
+
in_proof_mode = self.is_in_proof_mode()
|
|
367
|
+
|
|
368
|
+
def run_to_finish_lemma(self) -> bool:
|
|
369
|
+
# Run the coq file and finish the current lemma
|
|
370
|
+
in_proof_mode = self.is_in_proof_mode()
|
|
371
|
+
if not in_proof_mode or self.execution_complete:
|
|
372
|
+
# If we are not in proof mode, then we are not finishing a lemma
|
|
373
|
+
return False
|
|
374
|
+
ran_last_cmd = self.run_next()
|
|
375
|
+
if not ran_last_cmd:
|
|
376
|
+
return False
|
|
377
|
+
while ran_last_cmd and in_proof_mode:
|
|
378
|
+
ran_last_cmd = self.run_next()
|
|
379
|
+
in_proof_mode = self.is_in_proof_mode()
|
|
380
|
+
return not in_proof_mode
|
|
381
|
+
|
|
382
|
+
def run_till_line_num(self, line_num: int):
|
|
383
|
+
assert line_num >= self.line_num
|
|
384
|
+
ran_last_cmd = True
|
|
385
|
+
while ran_last_cmd and self.line_num < line_num:
|
|
386
|
+
ran_last_cmd = self.run_next()
|
|
387
|
+
return self.line_num
|
|
388
|
+
|
|
389
|
+
def run_to_finish(self):
|
|
390
|
+
ran_last_cmd = True
|
|
391
|
+
while ran_last_cmd:
|
|
392
|
+
ran_last_cmd = self.run_next()
|
|
393
|
+
|
|
394
|
+
def get_lemma_name_if_running(self) -> typing.Optional[str]:
|
|
395
|
+
if not self.is_in_proof_mode():
|
|
396
|
+
return None
|
|
397
|
+
else:
|
|
398
|
+
try:
|
|
399
|
+
return self.curr_lemma_name
|
|
400
|
+
except:
|
|
401
|
+
return None
|
|
402
|
+
|
|
403
|
+
def get_lemma_stmt_if_running(self) -> typing.Optional[str]:
|
|
404
|
+
if not self.is_in_proof_mode():
|
|
405
|
+
return None
|
|
406
|
+
else:
|
|
407
|
+
try:
|
|
408
|
+
return self.local_theorem_lemma_description[self.curr_lemma_name]
|
|
409
|
+
except:
|
|
410
|
+
return None
|
|
411
|
+
|
|
412
|
+
def get_current_lemma_name(self) -> typing.Optional[str]:
|
|
413
|
+
if self.curr_lemma_name is None:
|
|
414
|
+
return None
|
|
415
|
+
else:
|
|
416
|
+
return self.curr_lemma_name
|
|
417
|
+
|
|
418
|
+
def _set_content_to_run(self, stmt: str) -> str:
|
|
419
|
+
# Now add this new line to the context
|
|
420
|
+
if len(self._file_content) > 0:
|
|
421
|
+
# First create a context of all the lines executed so far
|
|
422
|
+
self._file_content += "\n" + stmt.strip()
|
|
423
|
+
else:
|
|
424
|
+
self._file_content = stmt.strip()
|
|
425
|
+
# Remove comments
|
|
426
|
+
self._file_content = Lean3Utils.remove_comments(self._file_content) if not self._comments_removed else self._file_content
|
|
427
|
+
|
|
428
|
+
def _check_matching_end(self, file_content: str) -> bool:
|
|
429
|
+
# The file_content must end with a matching end
|
|
430
|
+
# TODO: This is a hack, since we are not tokenizing if there are variables which have suffix or prefix
|
|
431
|
+
# of begin or end, then this won't be correct. But this is a rare case, so we can ignore it for now
|
|
432
|
+
if not file_content.endswith("end"):
|
|
433
|
+
return False # no need to check if we are no where near a closing of a proof
|
|
434
|
+
return file_content.count("begin") == file_content.count("end")
|
|
435
|
+
|
|
436
|
+
def _check_curlies(self, file_content: str) -> bool:
|
|
437
|
+
# The file_content must end with a matching end
|
|
438
|
+
# TODO: This is a hack, since we are not tokenizing if there are variables which have suffix or prefix
|
|
439
|
+
# of begin or end, then this won't be correct. But this is a rare case, so we can ignore it for now
|
|
440
|
+
return file_content.count("{") == file_content.count("}")
|
|
441
|
+
|
|
442
|
+
def _diff_begin_end(self, file_content: str) -> int:
|
|
443
|
+
return file_content.count("begin") - file_content.count("end")
|
|
444
|
+
|
|
445
|
+
def _diff_curlies(self, file_content: str) -> int:
|
|
446
|
+
return file_content.count("{") - file_content.count("}")
|
|
447
|
+
|
|
448
|
+
def _close_unmatched_subproofs(self, file_content: str) -> typing.Tuple[bool, str]:
|
|
449
|
+
stack = []
|
|
450
|
+
idx = 0
|
|
451
|
+
matched_end = file_content.endswith("end")
|
|
452
|
+
while idx < len(file_content):
|
|
453
|
+
# scan at most 5 characters
|
|
454
|
+
if file_content[idx:].startswith("begin"):
|
|
455
|
+
stack.append("begin")
|
|
456
|
+
idx += 5
|
|
457
|
+
elif file_content[idx:].startswith("end"):
|
|
458
|
+
if len(stack) > 0 and stack[-1] == "begin":
|
|
459
|
+
stack.pop()
|
|
460
|
+
idx += 3
|
|
461
|
+
else:
|
|
462
|
+
raise Exception("Unmatched 'end', proof is not well formed")
|
|
463
|
+
elif file_content[idx:].startswith("{"):
|
|
464
|
+
stack.append("{")
|
|
465
|
+
idx += 1
|
|
466
|
+
elif file_content[idx:].startswith("}"):
|
|
467
|
+
if len(stack) > 0 and stack[-1] == "{":
|
|
468
|
+
stack.pop()
|
|
469
|
+
idx += 1
|
|
470
|
+
else:
|
|
471
|
+
raise Exception("Unmatched '}', proof is not well formed")
|
|
472
|
+
else:
|
|
473
|
+
idx += 1
|
|
474
|
+
while len(stack) > 0:
|
|
475
|
+
top = stack.pop()
|
|
476
|
+
if top == "begin":
|
|
477
|
+
file_content += Lean3Executor.proof_context_generation_tactic
|
|
478
|
+
matched_end = False
|
|
479
|
+
elif top == "{":
|
|
480
|
+
file_content += Lean3Executor.proof_context_generation_tactic_curlies
|
|
481
|
+
else:
|
|
482
|
+
raise Exception("Bad stack")
|
|
483
|
+
return matched_end, file_content
|
|
484
|
+
|
|
485
|
+
def _run_stmt_on_lean_server(self, idx : int, stmt: str):
|
|
486
|
+
self._set_content_to_run(stmt)
|
|
487
|
+
content = self._file_content
|
|
488
|
+
# Check if the temporary file exists
|
|
489
|
+
if not os.path.exists(self.temp_file_full_path):
|
|
490
|
+
with open(self.temp_file_full_path, "w") as f:
|
|
491
|
+
f.write("")
|
|
492
|
+
# Now add the contents to the file
|
|
493
|
+
# Use regex to match the last theorem start
|
|
494
|
+
if (stmt.startswith("theorem") or stmt.startswith("lemma")) and self._import_end_idx is None:
|
|
495
|
+
self._import_end_idx = idx - 1
|
|
496
|
+
if not self._proof_running:
|
|
497
|
+
last_thm_details = Lean3Executor.theorem_match.findall(content)
|
|
498
|
+
else:
|
|
499
|
+
last_thm_details = []
|
|
500
|
+
if last_thm_details:
|
|
501
|
+
# We might have found a new theorem
|
|
502
|
+
full_thm_stmt, _, _, thm_name, thm_value, _ = last_thm_details[-1]
|
|
503
|
+
full_thm_stmt = full_thm_stmt.strip()
|
|
504
|
+
thm_name = thm_name.strip()
|
|
505
|
+
thm_value = thm_value.strip()
|
|
506
|
+
thm_value = thm_value.lstrip(":")
|
|
507
|
+
if thm_name in self.local_file_lemmas:
|
|
508
|
+
# We have already discovered this theorem
|
|
509
|
+
# The state got added probably because of the end of a proof
|
|
510
|
+
# So we need to remove the state
|
|
511
|
+
self.proof_context = None
|
|
512
|
+
self._proof_running = False
|
|
513
|
+
self.curr_lemma_name, self.curr_lemma = None, None
|
|
514
|
+
self._proof_start_idx = None
|
|
515
|
+
else:
|
|
516
|
+
self.local_theorem_lemma_description[thm_name] = full_thm_stmt
|
|
517
|
+
self.local_file_lemmas[thm_name] = thm_value
|
|
518
|
+
self._proof_running = True
|
|
519
|
+
self.curr_lemma_name, self.curr_lemma = thm_name, thm_value
|
|
520
|
+
self._proof_start_idx = idx
|
|
521
|
+
if self._proof_running:
|
|
522
|
+
content = content.rstrip()
|
|
523
|
+
assert self._proof_start_idx is not None
|
|
524
|
+
# end_diff = self._diff_begin_end(content)
|
|
525
|
+
# if end_diff > 1:
|
|
526
|
+
# # We have multiple begin-end pairs in between the proof
|
|
527
|
+
# # So we just forcefully finish all the proofs in between
|
|
528
|
+
# end_diff -= 1
|
|
529
|
+
# content += "\nend" * end_diff
|
|
530
|
+
# curlies_diff = self._diff_curlies(content)
|
|
531
|
+
# if curlies_diff > 1:
|
|
532
|
+
# # We have multiple begin-end pairs in between the proof
|
|
533
|
+
# # So we just forcefully finish all the proofs in between
|
|
534
|
+
# curlies_diff -= 1
|
|
535
|
+
# content += Lean3Executor.proof_context_generation_tactic_curlies * curlies_diff
|
|
536
|
+
matching_end, content = self._close_unmatched_subproofs(content)
|
|
537
|
+
# matching_curlies = self._check_curlies(content)
|
|
538
|
+
# if not matching_curlies:
|
|
539
|
+
# content += Lean3Executor.proof_context_generation_tactic_curlies
|
|
540
|
+
# if not matching_end:
|
|
541
|
+
# content += Lean3Executor.proof_context_generation_tactic
|
|
542
|
+
idx += 1
|
|
543
|
+
with open(self.temp_file_full_path, "w") as f:
|
|
544
|
+
f.write(content)
|
|
545
|
+
|
|
546
|
+
timed_out = False
|
|
547
|
+
try:
|
|
548
|
+
response = self.lean_server.run(self.temp_file, self.timeout_in_sec)
|
|
549
|
+
except subprocess.TimeoutExpired:
|
|
550
|
+
timed_out = True
|
|
551
|
+
if os.path.exists(self.temp_file_full_path):
|
|
552
|
+
os.remove(self.temp_file_full_path)
|
|
553
|
+
pass
|
|
554
|
+
except:
|
|
555
|
+
if os.path.exists(self.temp_file_full_path):
|
|
556
|
+
os.remove(self.temp_file_full_path)
|
|
557
|
+
raise
|
|
558
|
+
|
|
559
|
+
if not timed_out:
|
|
560
|
+
prev_proof_context = self.proof_context
|
|
561
|
+
if not matching_end:
|
|
562
|
+
self.proof_context = self._parse_proof_context(response.state)
|
|
563
|
+
else:
|
|
564
|
+
self.proof_context = None
|
|
565
|
+
|
|
566
|
+
if len(response.messages) > 0:
|
|
567
|
+
lines = content.split("\n")
|
|
568
|
+
self.lean_error_messages = [
|
|
569
|
+
f"Got {msg.level} in '{lines[msg.line_num - 1][:25]}{'...' if len(lines[msg.line_num - 1]) > 25 else ''}': \n {msg.level}: {msg.text}" for msg in response.messages
|
|
570
|
+
if msg.line_num <= len(lines)
|
|
571
|
+
]
|
|
572
|
+
else:
|
|
573
|
+
self.lean_error_messages = []
|
|
574
|
+
|
|
575
|
+
if self.proof_context is None and prev_proof_context is not None:
|
|
576
|
+
if len(response.messages) > 0 and not matching_end: # This has to be on the response messages not the error message
|
|
577
|
+
# Never give up the proof context because of an error
|
|
578
|
+
self.proof_context = prev_proof_context
|
|
579
|
+
elif len(response.messages) == 0 and not matching_end:
|
|
580
|
+
# No more goals
|
|
581
|
+
self.proof_context = ProofContext.empty()
|
|
582
|
+
|
|
583
|
+
# Don't give up the proof context because someone tried to end early
|
|
584
|
+
if prev_proof_context is not None and self.proof_context is None:
|
|
585
|
+
# We have finished a proof
|
|
586
|
+
self._proof_running = False
|
|
587
|
+
self.curr_lemma_name, self.curr_lemma = None, None
|
|
588
|
+
self._proof_start_idx = None
|
|
589
|
+
else:
|
|
590
|
+
self.lean_error_messages = ["The tactic timed out, probably because of repeated application of a tactic which created a very big goal."]
|
|
591
|
+
pass
|
|
592
|
+
pass
|
|
593
|
+
|
|
594
|
+
def _skip_to_theorem(self, theorem: str):
|
|
595
|
+
found_thm = False
|
|
596
|
+
while not found_thm:
|
|
597
|
+
try:
|
|
598
|
+
stmt = next(self.main_file_iter)
|
|
599
|
+
except StopIteration:
|
|
600
|
+
if not self.suppress_error_log:
|
|
601
|
+
logger.error(f"Could not find theorem '{theorem}' in the file '{self.main_file}'")
|
|
602
|
+
raise Exception(f"Could not find theorem '{theorem}' in the file '{self.main_file}'")
|
|
603
|
+
return
|
|
604
|
+
self.current_stmt = stmt
|
|
605
|
+
self.line_num += 1
|
|
606
|
+
file_content = self._file_content
|
|
607
|
+
self._lines_executed = file_content.split("\n")
|
|
608
|
+
idx = len(self._lines_executed)
|
|
609
|
+
if (stmt.startswith("theorem") or stmt.startswith("lemma")) and self._import_end_idx is None:
|
|
610
|
+
self._import_end_idx = idx - 1
|
|
611
|
+
# Now add this new line to the context
|
|
612
|
+
if len(file_content) > 0:
|
|
613
|
+
# First create a context of all the lines executed so far
|
|
614
|
+
file_content += "\n" + stmt.strip()
|
|
615
|
+
else:
|
|
616
|
+
file_content = stmt.strip()
|
|
617
|
+
file_content = Lean3Utils.remove_comments(file_content) if not self._comments_removed else file_content
|
|
618
|
+
last_thm_details = Lean3Executor.theorem_match.findall(file_content)
|
|
619
|
+
if last_thm_details:
|
|
620
|
+
# We might have found a new theorem
|
|
621
|
+
full_thm_stmt, _, _, thm_name, thm_value, _ = last_thm_details[-1]
|
|
622
|
+
full_thm_stmt = full_thm_stmt.strip()
|
|
623
|
+
thm_name = thm_name.strip()
|
|
624
|
+
thm_value = thm_value.strip()
|
|
625
|
+
thm_value = thm_value.lstrip(":")
|
|
626
|
+
if thm_name not in self.local_file_lemmas:
|
|
627
|
+
if theorem != thm_name:
|
|
628
|
+
self.local_theorem_lemma_description[thm_name] = full_thm_stmt
|
|
629
|
+
self.local_file_lemmas[thm_name] = thm_value
|
|
630
|
+
else:
|
|
631
|
+
found_thm = True
|
|
632
|
+
if found_thm:
|
|
633
|
+
# Capture the proof context
|
|
634
|
+
assert self._import_end_idx is not None
|
|
635
|
+
# Remove all the theorems before the current theorem
|
|
636
|
+
if not self._keep_local_context:
|
|
637
|
+
self._lines_executed = self._lines_executed[:self._import_end_idx + 1]
|
|
638
|
+
full_thm_stmts = full_thm_stmt.split("\n")
|
|
639
|
+
self._lines_executed.extend(full_thm_stmts)
|
|
640
|
+
# Reset the file content to completely ignore the previous theorems
|
|
641
|
+
self._file_content = '\n'.join(self._lines_executed)
|
|
642
|
+
# Now change the idx
|
|
643
|
+
idx = len(self._lines_executed)
|
|
644
|
+
self.line_num = idx
|
|
645
|
+
# Remove all the theorems discovered before the current theorem
|
|
646
|
+
self.local_file_lemmas.clear()
|
|
647
|
+
self.local_theorem_lemma_description.clear()
|
|
648
|
+
self._run_stmt_on_lean_server(idx, stmt)
|
|
649
|
+
self._lines_executed.append(stmt)
|
|
650
|
+
self.line_num += 1 # This needs to be reset because the begin was ignored
|
|
651
|
+
else:
|
|
652
|
+
# Now run the lines till the theorem is found
|
|
653
|
+
self._set_content_to_run(stmt)
|
|
654
|
+
self._lines_executed.append(stmt)
|
|
655
|
+
pass
|
|
656
|
+
|
|
657
|
+
def get_all_theorems(self) -> typing.List[str]:
|
|
658
|
+
self.run_without_executing()
|
|
659
|
+
|
|
660
|
+
def _parse_proof_context(self, proof_context_str: str) -> ProofContext:
|
|
661
|
+
if self.use_human_readable_proof_context:
|
|
662
|
+
return self._parse_proof_context_human_readable(proof_context_str)
|
|
663
|
+
else:
|
|
664
|
+
raise NotImplementedError("Parsing of non-human readable proof context is not implemented")
|
|
665
|
+
|
|
666
|
+
def _parse_proof_context_human_readable(self, proof_context_str: str) -> ProofContext:
|
|
667
|
+
if proof_context_str is None or len(proof_context_str) == 0 or Lean3Executor.proof_context_separator not in proof_context_str:
|
|
668
|
+
return None
|
|
669
|
+
if proof_context_str == "no goals":
|
|
670
|
+
return ProofContext.empty()
|
|
671
|
+
proof_context_str = proof_context_str.strip()
|
|
672
|
+
proof_context_str += "\n\n"
|
|
673
|
+
all_matches = re.findall(Lean3Executor.proof_context_regex, proof_context_str, re.MULTILINE)
|
|
674
|
+
goal_strs = []
|
|
675
|
+
total_goal_cnt = 0
|
|
676
|
+
for _, goal_cnt, goal_str in all_matches:
|
|
677
|
+
if len(goal_cnt) > 0:
|
|
678
|
+
total_goal_cnt = int(goal_cnt)
|
|
679
|
+
goal_str = goal_str.strip()
|
|
680
|
+
goal_strs.append(goal_str)
|
|
681
|
+
if total_goal_cnt > 0:
|
|
682
|
+
assert len(goal_strs) == total_goal_cnt, f"Total goal count {total_goal_cnt} does not match the number of goals {len(goal_strs)}"
|
|
683
|
+
else:
|
|
684
|
+
assert len(goal_strs) == 1, f"Total goal count {total_goal_cnt} does not match the number of goals {len(goal_strs)}"
|
|
685
|
+
total_goal_cnt = 1
|
|
686
|
+
assert len(goal_strs) == total_goal_cnt, f"Total goal count {total_goal_cnt} does not match the number of goals {len(goal_strs)}"
|
|
687
|
+
goals = []
|
|
688
|
+
for goal_str in goal_strs:
|
|
689
|
+
goal = self._parse_goal(goal_str)
|
|
690
|
+
goals.append(goal)
|
|
691
|
+
return ProofContext(goals, [], [], [])
|
|
692
|
+
|
|
693
|
+
def _parse_goal(self, goal_str: str):
|
|
694
|
+
goal_str = goal_str.strip()
|
|
695
|
+
goal = ""
|
|
696
|
+
hyps_goals = re.findall(Lean3Executor.goal_regex, goal_str, re.MULTILINE)
|
|
697
|
+
assert len(hyps_goals) == 1, f"Found more than one goal in the goal string: {goal_str}"
|
|
698
|
+
hypotheses_str, goal = hyps_goals[0]
|
|
699
|
+
hypotheses_str = hypotheses_str.strip()
|
|
700
|
+
goal = goal.strip()
|
|
701
|
+
hypotheses = [hyp.rstrip(',') for hyp in hypotheses_str.split("\n")]
|
|
702
|
+
# Get rid of all the empty hypotheses
|
|
703
|
+
hypotheses = [hyp for hyp in hypotheses if len(hyp) > 0]
|
|
704
|
+
goal = Obligation(hypotheses, goal)
|
|
705
|
+
return goal
|
|
706
|
+
|
|
707
|
+
class LeanStdInOutExecutor:
|
|
708
|
+
def __init__(self):
|
|
709
|
+
self.lean_stdin_reader = LeanLineByLineReader()
|
|
710
|
+
self.lean_exec : Lean3Executor = Lean3Executor(
|
|
711
|
+
use_human_readable_proof_context=True,
|
|
712
|
+
proof_step_iter=self.lean_stdin_reader.instruction_step_generator())
|
|
713
|
+
|
|
714
|
+
def __enter__(self):
|
|
715
|
+
self.lean_exec.__enter__()
|
|
716
|
+
return self
|
|
717
|
+
|
|
718
|
+
def __exit__(self, exc_type, exc_value, traceback):
|
|
719
|
+
self.lean_exec.__exit__(exc_type, exc_value, traceback)
|
|
720
|
+
|
|
721
|
+
def run_in_loop(self):
|
|
722
|
+
print("In> ", end="")
|
|
723
|
+
while True:
|
|
724
|
+
try:
|
|
725
|
+
cmd_ran = self.lean_exec.run_next()
|
|
726
|
+
if not cmd_ran:
|
|
727
|
+
break
|
|
728
|
+
print(f"Lean> {self.lean_exec.current_stmt}")
|
|
729
|
+
print(f"{self.lean_exec.lean_server.proof_context}")
|
|
730
|
+
print("In> ", end="")
|
|
731
|
+
except:
|
|
732
|
+
pass
|
|
733
|
+
pass
|
|
734
|
+
|
|
735
|
+
class LeanCustomFileExec:
|
|
736
|
+
def __init__(self, file_path: str, project_root: str = '.'):
|
|
737
|
+
self.lean_stdin_reader = LeanLineByLineReader(file_path)
|
|
738
|
+
self.lean_exec : Lean3Executor = Lean3Executor(
|
|
739
|
+
project_root=project_root,
|
|
740
|
+
use_human_readable_proof_context=True,
|
|
741
|
+
proof_step_iter=self.lean_stdin_reader.instruction_step_generator())
|
|
742
|
+
|
|
743
|
+
def __enter__(self):
|
|
744
|
+
self.lean_exec.__enter__()
|
|
745
|
+
return self
|
|
746
|
+
|
|
747
|
+
def __exit__(self, exc_type, exc_value, traceback):
|
|
748
|
+
self.lean_exec.__exit__(exc_type, exc_value, traceback)
|
|
749
|
+
|
|
750
|
+
def run_in_loop(self, opt: str = None):
|
|
751
|
+
print("In> Press 'Enter' for running next line, \n" +
|
|
752
|
+
"'c' + 'Enter' to cancel the last command and 're-run', \n" +
|
|
753
|
+
"'e' + 'Enter' to run over all lines one-by-one. ", end="")
|
|
754
|
+
last_stmt = None
|
|
755
|
+
run_all = False
|
|
756
|
+
while True:
|
|
757
|
+
try:
|
|
758
|
+
if not run_all:
|
|
759
|
+
if opt is None or opt != "e":
|
|
760
|
+
opt = input()
|
|
761
|
+
if opt == "e":
|
|
762
|
+
run_all = True
|
|
763
|
+
print("Running all lines one-by-one")
|
|
764
|
+
elif opt == "c" and last_stmt is not None:
|
|
765
|
+
if self.lean_exec.is_in_proof_mode():
|
|
766
|
+
print(f"Goals before cancelling")
|
|
767
|
+
print(self.lean_exec.proof_context.all_goals)
|
|
768
|
+
else:
|
|
769
|
+
print("No goals before cancelling")
|
|
770
|
+
self.lean_exec.lean_server.cancel_last()
|
|
771
|
+
if self.lean_exec.is_in_proof_mode():
|
|
772
|
+
print(f"Goals after cancelling")
|
|
773
|
+
print(self.lean_exec.proof_context.all_goals)
|
|
774
|
+
else:
|
|
775
|
+
print("No goals after cancelling")
|
|
776
|
+
print(f"Canceled last statement: {last_stmt}")
|
|
777
|
+
print(f"Re-running: {last_stmt}")
|
|
778
|
+
self.lean_exec.lean_server.run_stmt(last_stmt)
|
|
779
|
+
print(f"Lean> Ran {last_stmt} again")
|
|
780
|
+
continue
|
|
781
|
+
cmd_ran = self.lean_exec.run_next()
|
|
782
|
+
last_stmt = self.lean_exec.current_stmt
|
|
783
|
+
print(f"Lean> {self.lean_exec.current_stmt}")
|
|
784
|
+
if self.lean_exec.is_in_proof_mode():
|
|
785
|
+
print(f"Goals after running {last_stmt}")
|
|
786
|
+
print(self.lean_exec.proof_context.all_goals)
|
|
787
|
+
if self.lean_exec.lean_error_messages:
|
|
788
|
+
for msg_idx, lean_msgs in enumerate(self.lean_exec.lean_error_messages):
|
|
789
|
+
print(f"Lean [Message {msg_idx}]> {lean_msgs.text}")
|
|
790
|
+
if not cmd_ran:
|
|
791
|
+
break
|
|
792
|
+
# print(f"{self.lean_exec.proof_context}")
|
|
793
|
+
print("In> ", end="")
|
|
794
|
+
except:
|
|
795
|
+
pass
|
|
796
|
+
pass
|
|
797
|
+
|
|
798
|
+
if __name__ == "__main__":
|
|
799
|
+
logging.basicConfig(filename='lean_executor.log', filemode='w', level=logging.INFO)
|
|
800
|
+
os.chdir(root_dir)
|
|
801
|
+
project = "data/test/lean_proj"
|
|
802
|
+
file = "data/test/lean_proj/src/simple.lean"
|
|
803
|
+
with LeanCustomFileExec(file, project) as lean_exec:
|
|
804
|
+
lean_exec.run_in_loop()
|