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.
Files changed (485) hide show
  1. itp_interface/__init__.py +0 -0
  2. itp_interface/agent/__init__.py +0 -0
  3. itp_interface/agent/simple_proof_agent.py +100 -0
  4. itp_interface/coq_ser_api/__init__.py +165 -0
  5. itp_interface/coq_ser_api/contexts.py +283 -0
  6. itp_interface/coq_ser_api/coq_agent.py +459 -0
  7. itp_interface/coq_ser_api/coq_backend.py +135 -0
  8. itp_interface/coq_ser_api/coq_util.py +839 -0
  9. itp_interface/coq_ser_api/example.py +67 -0
  10. itp_interface/coq_ser_api/lsp_backend.py +375 -0
  11. itp_interface/coq_ser_api/py.typed +0 -0
  12. itp_interface/coq_ser_api/serapi_backend.py +841 -0
  13. itp_interface/coq_ser_api/util.py +145 -0
  14. itp_interface/coq_ser_api_old/__init__.py +2583 -0
  15. itp_interface/coq_ser_api_old/contexts.py +172 -0
  16. itp_interface/coq_ser_api_old/util.py +146 -0
  17. itp_interface/lean_server/__init__.py +0 -0
  18. itp_interface/lean_server/commands.py +484 -0
  19. itp_interface/lean_server/lean3_search_tool.py +358 -0
  20. itp_interface/lean_server/lean4_repl_interface.py +151 -0
  21. itp_interface/lean_server/lean4_utils.py +255 -0
  22. itp_interface/lean_server/lean_cmd_server.py +111 -0
  23. itp_interface/lean_server/lean_context.py +60 -0
  24. itp_interface/lean_server/lean_sync_server.py +174 -0
  25. itp_interface/lean_server/lean_utils.py +199 -0
  26. itp_interface/lean_server/py.typed +1 -0
  27. itp_interface/main/__init__.py +0 -0
  28. itp_interface/main/config/afp_data_gen.yaml +14 -0
  29. itp_interface/main/config/benchmark/CompCert.yaml +366 -0
  30. itp_interface/main/config/benchmark/GeoCoq.yaml +930 -0
  31. itp_interface/main/config/benchmark/UniMath.yaml +2690 -0
  32. itp_interface/main/config/benchmark/afp_isabelle.yaml +29200 -0
  33. itp_interface/main/config/benchmark/agent_proverbot_hard.yaml +247 -0
  34. itp_interface/main/config/benchmark/category-theory.yaml +470 -0
  35. itp_interface/main/config/benchmark/compcert_118_subset.yaml +148 -0
  36. itp_interface/main/config/benchmark/compcert_benchmark.yaml +36 -0
  37. itp_interface/main/config/benchmark/compcert_benchmark_hard.yaml +498 -0
  38. itp_interface/main/config/benchmark/compcert_benchmark_hard_1.yaml +55 -0
  39. itp_interface/main/config/benchmark/compcert_benchmark_hard_2.yaml +24 -0
  40. itp_interface/main/config/benchmark/compcert_benchmark_hard_3.yaml +95 -0
  41. itp_interface/main/config/benchmark/compcert_benchmark_hard_7_per_cent.yaml +78 -0
  42. itp_interface/main/config/benchmark/compcert_benchmark_test.yaml +38 -0
  43. itp_interface/main/config/benchmark/compcert_benchmark_train.yaml +340 -0
  44. itp_interface/main/config/benchmark/leandojo_novel_premises_test.yaml +2908 -0
  45. itp_interface/main/config/benchmark/leandojo_novel_premises_train.yaml +98645 -0
  46. itp_interface/main/config/benchmark/leandojo_novel_premises_val.yaml +2912 -0
  47. itp_interface/main/config/benchmark/leandojo_random.yaml +2889 -0
  48. itp_interface/main/config/benchmark/leandojo_random_test.yaml +2421 -0
  49. itp_interface/main/config/benchmark/leandojo_random_train.yaml +62729 -0
  50. itp_interface/main/config/benchmark/leandojo_random_val.yaml +2504 -0
  51. itp_interface/main/config/benchmark/math-comp.yaml +200 -0
  52. itp_interface/main/config/benchmark/miniF2F_test.yaml +12 -0
  53. itp_interface/main/config/benchmark/miniF2F_test_aime.yaml +27 -0
  54. itp_interface/main/config/benchmark/miniF2F_test_algebra.yaml +30 -0
  55. itp_interface/main/config/benchmark/miniF2F_test_amc12.yaml +57 -0
  56. itp_interface/main/config/benchmark/miniF2F_test_few_shot_hard.yaml +231 -0
  57. itp_interface/main/config/benchmark/miniF2F_test_imo.yaml +32 -0
  58. itp_interface/main/config/benchmark/miniF2F_test_induction.yaml +20 -0
  59. itp_interface/main/config/benchmark/miniF2F_test_mathd_algebra.yaml +82 -0
  60. itp_interface/main/config/benchmark/miniF2F_test_mathd_algebra_hard.yaml +72 -0
  61. itp_interface/main/config/benchmark/miniF2F_test_mathd_numbertheory.yaml +72 -0
  62. itp_interface/main/config/benchmark/miniF2F_test_numbertheory.yaml +20 -0
  63. itp_interface/main/config/benchmark/minicompcert_benchmark_1.yaml +14 -0
  64. itp_interface/main/config/benchmark/proverbot_hard.yaml +104 -0
  65. itp_interface/main/config/benchmark/re_prover.yaml +66 -0
  66. itp_interface/main/config/benchmark/re_prover_hard.yaml +41 -0
  67. itp_interface/main/config/benchmark/re_prover_very_hard.yaml +22 -0
  68. itp_interface/main/config/benchmark/reprover_with_retrieval.yaml +73 -0
  69. itp_interface/main/config/benchmark/reprover_with_retrieval_hard.yaml +30 -0
  70. itp_interface/main/config/benchmark/reprover_with_retrieval_neg.yaml +195 -0
  71. itp_interface/main/config/benchmark/simple_benchmark_1.yaml +24 -0
  72. itp_interface/main/config/benchmark/simple_benchmark_8.yaml +50 -0
  73. itp_interface/main/config/benchmark/simple_benchmark_9.yaml +65 -0
  74. itp_interface/main/config/benchmark/simple_benchmark_isabelle.yaml +18 -0
  75. itp_interface/main/config/benchmark/simple_benchmark_lean.yaml +12 -0
  76. itp_interface/main/config/benchmark/simple_benchmark_lean_training_data.yaml +12 -0
  77. itp_interface/main/config/benchmark/simple_rl_benchmark_lean.yaml +14 -0
  78. itp_interface/main/config/benchmark/stack_machine.yaml +13 -0
  79. itp_interface/main/config/benchmark/stack_machine_hard.yaml +15 -0
  80. itp_interface/main/config/category_theory_data_gen.yaml +14 -0
  81. itp_interface/main/config/category_theory_data_gen_random.yaml +16 -0
  82. itp_interface/main/config/compcert_data_gen_test.yaml +10 -0
  83. itp_interface/main/config/compcert_data_gen_train.yaml +7 -0
  84. itp_interface/main/config/env_settings/bm25_retrieval.yaml +2 -0
  85. itp_interface/main/config/env_settings/bm25_retrieval_no_dfns.yaml +2 -0
  86. itp_interface/main/config/env_settings/bm25_retrieval_only_local_no_dfns.yaml +2 -0
  87. itp_interface/main/config/env_settings/bm25_retrieval_with_print.yaml +2 -0
  88. itp_interface/main/config/env_settings/bm25_retrieval_with_print_only_local.yaml +2 -0
  89. itp_interface/main/config/env_settings/bm25_retrieval_with_print_only_local_no_dfns.yaml +2 -0
  90. itp_interface/main/config/env_settings/no_retrieval.yaml +2 -0
  91. itp_interface/main/config/experiments.yaml +12 -0
  92. itp_interface/main/config/geo_coq_data_gen.yaml +14 -0
  93. itp_interface/main/config/geo_coq_data_gen_random.yaml +16 -0
  94. itp_interface/main/config/leandojo_random_data_gen.yaml +16 -0
  95. itp_interface/main/config/math_comp_data_gen.yaml +14 -0
  96. itp_interface/main/config/math_comp_data_gen_random.yaml +16 -0
  97. itp_interface/main/config/mathlib_data_gen.yaml +14 -0
  98. itp_interface/main/config/repo/coq_repos.yaml +191 -0
  99. itp_interface/main/config/run_settings/default_coq_data_generation_transforms.yaml +24 -0
  100. itp_interface/main/config/run_settings/default_isabelle_data_generation_transforms.yaml +24 -0
  101. itp_interface/main/config/run_settings/default_lean4_data_generation_transforms.yaml +24 -0
  102. itp_interface/main/config/run_settings/default_lean_data_generation_transforms.yaml +24 -0
  103. itp_interface/main/config/simple_coq_data_gen.yaml +12 -0
  104. itp_interface/main/config/simple_coq_data_gen_random.yaml +17 -0
  105. itp_interface/main/config/simple_lean_data_gen.yaml +12 -0
  106. itp_interface/main/config/simple_rl_lean_data_gen.yaml +12 -0
  107. itp_interface/main/config/uni_math_data_gen.yaml +14 -0
  108. itp_interface/main/config.py +192 -0
  109. itp_interface/main/extract_benchmark_dataset.py +106 -0
  110. itp_interface/main/filter_dataset.py +107 -0
  111. itp_interface/main/install.py +92 -0
  112. itp_interface/main/merge_dataset.py +96 -0
  113. itp_interface/main/run_tool.py +444 -0
  114. itp_interface/pisa/.git +1 -0
  115. itp_interface/pisa/.gitignore +125 -0
  116. itp_interface/pisa/.idea/.gitignore +8 -0
  117. itp_interface/pisa/.idea/ClojureProjectResolveSettings.xml +6 -0
  118. itp_interface/pisa/.idea/codeStyles/Project.xml +7 -0
  119. itp_interface/pisa/.idea/codeStyles/codeStyleConfig.xml +5 -0
  120. itp_interface/pisa/.idea/inspectionProfiles/Project_Default.xml +16 -0
  121. itp_interface/pisa/.idea/libraries/sbt__com_google_android_annotations_4_1_1_4_jar.xml +13 -0
  122. itp_interface/pisa/.idea/libraries/sbt__com_google_api_grpc_proto_google_common_protos_1_17_0_jar.xml +13 -0
  123. itp_interface/pisa/.idea/libraries/sbt__com_google_code_findbugs_jsr305_3_0_2_jar.xml +13 -0
  124. itp_interface/pisa/.idea/libraries/sbt__com_google_code_gson_gson_2_8_6_jar.xml +13 -0
  125. itp_interface/pisa/.idea/libraries/sbt__com_google_errorprone_error_prone_annotations_2_3_4_jar.xml +13 -0
  126. itp_interface/pisa/.idea/libraries/sbt__com_google_guava_failureaccess_1_0_1_jar.xml +13 -0
  127. itp_interface/pisa/.idea/libraries/sbt__com_google_guava_guava_30_0_jre_jar.xml +13 -0
  128. itp_interface/pisa/.idea/libraries/sbt__com_google_guava_listenablefuture_9999_0_empty_to_avoid_conflict_with_guava_jar.xml +9 -0
  129. itp_interface/pisa/.idea/libraries/sbt__com_google_j2objc_j2objc_annotations_1_3_jar.xml +13 -0
  130. itp_interface/pisa/.idea/libraries/sbt__com_google_protobuf_protobuf_java_3_12_0_jar.xml +13 -0
  131. itp_interface/pisa/.idea/libraries/sbt__com_google_protobuf_protobuf_java_util_3_12_0_jar.xml +13 -0
  132. itp_interface/pisa/.idea/libraries/sbt__com_lihaoyi_fastparse_2_13_2_3_0_jar.xml +13 -0
  133. itp_interface/pisa/.idea/libraries/sbt__com_lihaoyi_geny_2_13_0_6_0_jar.xml +13 -0
  134. itp_interface/pisa/.idea/libraries/sbt__com_lihaoyi_sourcecode_2_13_0_2_1_jar.xml +13 -0
  135. itp_interface/pisa/.idea/libraries/sbt__com_thesamet_scalapb_lenses_2_13_0_10_9_jar.xml +13 -0
  136. itp_interface/pisa/.idea/libraries/sbt__com_thesamet_scalapb_scalapb_runtime_2_13_0_10_9_jar.xml +13 -0
  137. itp_interface/pisa/.idea/libraries/sbt__com_thesamet_scalapb_scalapb_runtime_grpc_2_13_0_10_9_jar.xml +13 -0
  138. itp_interface/pisa/.idea/libraries/sbt__com_thesamet_scalapb_zio_grpc_zio_grpc_core_2_13_0_4_2_jar.xml +13 -0
  139. itp_interface/pisa/.idea/libraries/sbt__com_thoughtworks_paranamer_paranamer_2_8_jar.xml +13 -0
  140. itp_interface/pisa/.idea/libraries/sbt__commons_io_commons_io_2_8_0_jar.xml +13 -0
  141. itp_interface/pisa/.idea/libraries/sbt__de_unruh_java_patterns_0_1_0_jar.xml +13 -0
  142. itp_interface/pisa/.idea/libraries/sbt__de_unruh_scala_isabelle_2_13_master_SNAPSHOT_jar.xml +13 -0
  143. itp_interface/pisa/.idea/libraries/sbt__dev_zio_izumi_reflect_2_13_1_0_0_M9_jar.xml +13 -0
  144. itp_interface/pisa/.idea/libraries/sbt__dev_zio_izumi_reflect_thirdparty_boopickle_shaded_2_13_1_0_0_M9_jar.xml +13 -0
  145. itp_interface/pisa/.idea/libraries/sbt__dev_zio_zio_2_13_1_0_3_jar.xml +13 -0
  146. itp_interface/pisa/.idea/libraries/sbt__dev_zio_zio_stacktracer_2_13_1_0_3_jar.xml +13 -0
  147. itp_interface/pisa/.idea/libraries/sbt__dev_zio_zio_streams_2_13_1_0_3_jar.xml +13 -0
  148. itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_api_1_34_0_jar.xml +13 -0
  149. itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_context_1_34_0_jar.xml +13 -0
  150. itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_core_1_34_0_jar.xml +13 -0
  151. itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_netty_1_34_0_jar.xml +13 -0
  152. itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_protobuf_1_34_0_jar.xml +13 -0
  153. itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_protobuf_lite_1_34_0_jar.xml +13 -0
  154. itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_services_1_34_0_jar.xml +13 -0
  155. itp_interface/pisa/.idea/libraries/sbt__io_grpc_grpc_stub_1_34_0_jar.xml +13 -0
  156. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_buffer_4_1_51_Final_jar.xml +13 -0
  157. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_codec_4_1_51_Final_jar.xml +13 -0
  158. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_codec_http2_4_1_51_Final_jar.xml +13 -0
  159. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_codec_http_4_1_51_Final_jar.xml +13 -0
  160. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_codec_socks_4_1_51_Final_jar.xml +13 -0
  161. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_common_4_1_51_Final_jar.xml +13 -0
  162. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_handler_4_1_51_Final_jar.xml +13 -0
  163. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_handler_proxy_4_1_51_Final_jar.xml +13 -0
  164. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_resolver_4_1_51_Final_jar.xml +13 -0
  165. itp_interface/pisa/.idea/libraries/sbt__io_netty_netty_transport_4_1_51_Final_jar.xml +13 -0
  166. itp_interface/pisa/.idea/libraries/sbt__io_perfmark_perfmark_api_0_19_0_jar.xml +13 -0
  167. itp_interface/pisa/.idea/libraries/sbt__net_java_dev_jna_jna_5_3_1_jar.xml +13 -0
  168. itp_interface/pisa/.idea/libraries/sbt__net_liftweb_lift_json_2_13_3_4_3_jar.xml +13 -0
  169. itp_interface/pisa/.idea/libraries/sbt__org_apache_commons_commons_lang3_3_11_jar.xml +13 -0
  170. itp_interface/pisa/.idea/libraries/sbt__org_apache_commons_commons_text_1_9_jar.xml +13 -0
  171. itp_interface/pisa/.idea/libraries/sbt__org_checkerframework_checker_qual_3_5_0_jar.xml +13 -0
  172. itp_interface/pisa/.idea/libraries/sbt__org_codehaus_mojo_animal_sniffer_annotations_1_18_jar.xml +13 -0
  173. itp_interface/pisa/.idea/libraries/sbt__org_jetbrains_annotations_20_1_0_jar.xml +13 -0
  174. itp_interface/pisa/.idea/libraries/sbt__org_jline_jline_3_16_0_jar.xml +13 -0
  175. itp_interface/pisa/.idea/libraries/sbt__org_log4s_log4s_2_13_1_9_0_jar.xml +13 -0
  176. itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_modules_scala_collection_compat_2_13_2_1_6_jar.xml +13 -0
  177. itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_modules_scala_xml_2_13_1_3_0_jar.xml +13 -0
  178. itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_scala_compiler_2_13_4_jar.xml +13 -0
  179. itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_scala_library_2_13_4_jar.xml +23 -0
  180. itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_scala_reflect_2_13_4_jar.xml +13 -0
  181. itp_interface/pisa/.idea/libraries/sbt__org_scala_lang_scalap_2_13_4_jar.xml +13 -0
  182. itp_interface/pisa/.idea/libraries/sbt__org_scalaz_scalaz_core_2_13_7_3_2_jar.xml +13 -0
  183. itp_interface/pisa/.idea/libraries/sbt__org_slf4j_slf4j_api_1_7_30_jar.xml +13 -0
  184. itp_interface/pisa/.idea/libraries/sbt__org_slf4j_slf4j_simple_1_7_30_jar.xml +13 -0
  185. itp_interface/pisa/.idea/misc.xml +7 -0
  186. itp_interface/pisa/.idea/modules/PISA-build.iml +127 -0
  187. itp_interface/pisa/.idea/modules/PISA.iml +94 -0
  188. itp_interface/pisa/.idea/modules.xml +9 -0
  189. itp_interface/pisa/.idea/other.xml +6 -0
  190. itp_interface/pisa/.idea/sbt.xml +20 -0
  191. itp_interface/pisa/.idea/scala_compiler.xml +6 -0
  192. itp_interface/pisa/.idea/uiDesigner.xml +124 -0
  193. itp_interface/pisa/.idea/vcs.xml +6 -0
  194. itp_interface/pisa/.scalafmt.conf +2 -0
  195. itp_interface/pisa/LICENSE +29 -0
  196. itp_interface/pisa/README.md +262 -0
  197. itp_interface/pisa/build.sbt +49 -0
  198. itp_interface/pisa/build.sh +26 -0
  199. itp_interface/pisa/command_generation/close_gaps.py +44 -0
  200. itp_interface/pisa/command_generation/conjecture_normal_order.py +62 -0
  201. itp_interface/pisa/command_generation/conjecturer_command_generator.py +36 -0
  202. itp_interface/pisa/command_generation/create_dirs.py +11 -0
  203. itp_interface/pisa/command_generation/find_std.py +67 -0
  204. itp_interface/pisa/command_generation/generate_build_commands_afp.py +15 -0
  205. itp_interface/pisa/command_generation/generate_build_commands_std.py +15 -0
  206. itp_interface/pisa/command_generation/generate_commands_afp.py +103 -0
  207. itp_interface/pisa/command_generation/generate_commands_mini.py +73 -0
  208. itp_interface/pisa/command_generation/generate_commands_std.py +69 -0
  209. itp_interface/pisa/command_generation/generate_hammer_extraction_text.py +5 -0
  210. itp_interface/pisa/command_generation/hammer_command_generator.py +40 -0
  211. itp_interface/pisa/command_generation/hp_search_command_generator.py +63 -0
  212. itp_interface/pisa/command_generation/oracle_command_generator.py +56 -0
  213. itp_interface/pisa/command_generation/search_command_generator.py +69 -0
  214. itp_interface/pisa/command_generation/summarise_problem_names.py +45 -0
  215. itp_interface/pisa/command_generation/tpu_hp_search.py +75 -0
  216. itp_interface/pisa/docker/Dockerfile +34 -0
  217. itp_interface/pisa/docker/docker_tutorial.md +64 -0
  218. itp_interface/pisa/eval_setup/copy_isabelle.py +42 -0
  219. itp_interface/pisa/eval_setup/copy_pisa_jars.py +18 -0
  220. itp_interface/pisa/mesh_transformer_utils/tokenization.py +86 -0
  221. itp_interface/pisa/project/build.properties +1 -0
  222. itp_interface/pisa/project/plugins.sbt +5 -0
  223. itp_interface/pisa/requirements.txt +4 -0
  224. itp_interface/pisa/scripts/extract_last_k_steps.py +28 -0
  225. itp_interface/pisa/scripts/extract_proof_corpus.py +26 -0
  226. itp_interface/pisa/scripts/gather_hammer_results.py +27 -0
  227. itp_interface/pisa/scripts/length_in_char_stats.py +20 -0
  228. itp_interface/pisa/scripts/mix.py +127 -0
  229. itp_interface/pisa/scripts/results_stat.py +52 -0
  230. itp_interface/pisa/scripts/test_array_job.sh +34 -0
  231. itp_interface/pisa/setup.sh +25 -0
  232. itp_interface/pisa/src/main/protobuf/server.proto +60 -0
  233. itp_interface/pisa/src/main/python/.idea/.gitignore +8 -0
  234. itp_interface/pisa/src/main/python/.idea/inspectionProfiles/Project_Default.xml +18 -0
  235. itp_interface/pisa/src/main/python/.idea/inspectionProfiles/profiles_settings.xml +6 -0
  236. itp_interface/pisa/src/main/python/.idea/misc.xml +4 -0
  237. itp_interface/pisa/src/main/python/.idea/modules.xml +8 -0
  238. itp_interface/pisa/src/main/python/.idea/python.iml +12 -0
  239. itp_interface/pisa/src/main/python/.idea/vcs.xml +6 -0
  240. itp_interface/pisa/src/main/python/conjecturing_parsing/conjecturer_postprocessing.py +59 -0
  241. itp_interface/pisa/src/main/python/data_extraction/extract_data.py +184 -0
  242. itp_interface/pisa/src/main/python/data_extraction/find_premises.py +221 -0
  243. itp_interface/pisa/src/main/python/data_extraction/process_data.py +129 -0
  244. itp_interface/pisa/src/main/python/legacy/PisaFlexibleClient.py +167 -0
  245. itp_interface/pisa/src/main/python/legacy/autof_test.py +74 -0
  246. itp_interface/pisa/src/main/python/legacy/cmd_client.py +23 -0
  247. itp_interface/pisa/src/main/python/legacy/convert_scala_dump_to_test_name_jsons.py +14 -0
  248. itp_interface/pisa/src/main/python/legacy/create_data_txt.py +72 -0
  249. itp_interface/pisa/src/main/python/legacy/create_finetune_tfrecords.py +311 -0
  250. itp_interface/pisa/src/main/python/legacy/demo.py +49 -0
  251. itp_interface/pisa/src/main/python/legacy/evaluate.py +108 -0
  252. itp_interface/pisa/src/main/python/legacy/extract_first_step.py +25 -0
  253. itp_interface/pisa/src/main/python/legacy/get_global_facts.py +35 -0
  254. itp_interface/pisa/src/main/python/legacy/mix_data.py +19 -0
  255. itp_interface/pisa/src/main/python/legacy/one_stage_extraction.py +111 -0
  256. itp_interface/pisa/src/main/python/legacy/prepare_episodic_transitions.py +137 -0
  257. itp_interface/pisa/src/main/python/legacy/prepare_translation_pairs.py +277 -0
  258. itp_interface/pisa/src/main/python/pisa_client.py +322 -0
  259. itp_interface/pisa/src/main/python/server_pb2.py +394 -0
  260. itp_interface/pisa/src/main/python/server_pb2_grpc.py +230 -0
  261. itp_interface/pisa/src/main/python/test_client.py +17 -0
  262. itp_interface/pisa/src/main/python/test_client2.py +79 -0
  263. itp_interface/pisa/src/main/python/utils/filters.py +59 -0
  264. itp_interface/pisa/src/main/python/utils/pisa_server_control.py +29 -0
  265. itp_interface/pisa/src/main/scala/pisa/agent/CheckSyntax.scala +257 -0
  266. itp_interface/pisa/src/main/scala/pisa/agent/DepThms.scala +29 -0
  267. itp_interface/pisa/src/main/scala/pisa/agent/PisaStat.scala +46 -0
  268. itp_interface/pisa/src/main/scala/pisa/agent/RefactorTest.scala +40 -0
  269. itp_interface/pisa/src/main/scala/pisa/agent/RepHammer.scala +95 -0
  270. itp_interface/pisa/src/main/scala/pisa/server/HammFacts.scala +63 -0
  271. itp_interface/pisa/src/main/scala/pisa/server/PisaOS.scala +881 -0
  272. itp_interface/pisa/src/main/scala/pisa/server/PisaOneStage.scala +540 -0
  273. itp_interface/pisa/src/main/scala/pisa/server/PisaOneStageServers.scala +1048 -0
  274. itp_interface/pisa/src/main/scala/pisa/utils/TheoryManager.scala +95 -0
  275. itp_interface/pisa/src/test/python/analyse_debug.py +33 -0
  276. itp_interface/pisa/src/test/python/extract_test_seq2seq.py +53 -0
  277. itp_interface/pisa/src/test/python/extract_test_theorem_ground_truth_indices.py +31 -0
  278. itp_interface/pisa/src/test/python/proof_originality.py +24 -0
  279. itp_interface/pisa/src/test/python/test_command_generator.py +25 -0
  280. itp_interface/pisa/src/test/python/test_model_sequence_accuracy.py +70 -0
  281. itp_interface/pisa/src/test/scala/pisa/Easy.scala +26 -0
  282. itp_interface/pisa/src/test/scala/pisa/TestCurl.scala +82 -0
  283. itp_interface/pisa/src/test/scala/pisa/TestIsa.scala +27 -0
  284. itp_interface/pisa/test.sh +19 -0
  285. itp_interface/pisa/universal_test_theorems.tar.gz +0 -0
  286. itp_interface/repo/build.py +78 -0
  287. itp_interface/repo/clone.py +79 -0
  288. itp_interface/repo/dataset_discovery.py +99 -0
  289. itp_interface/retrieval/__init__.py +0 -0
  290. itp_interface/retrieval/abstraction.py +35 -0
  291. itp_interface/retrieval/coq_bm25_reranker.py +153 -0
  292. itp_interface/retrieval/isabelle_bm25_reranker.py +86 -0
  293. itp_interface/retrieval/lean3_bm25_reranker.py +86 -0
  294. itp_interface/rl/__init__.py +0 -0
  295. itp_interface/rl/abstraction.py +168 -0
  296. itp_interface/rl/proof_action.py +172 -0
  297. itp_interface/rl/proof_state.py +149 -0
  298. itp_interface/rl/proof_tree.py +109 -0
  299. itp_interface/rl/simpl_proof_env_pool.py +16 -0
  300. itp_interface/rl/simple_proof_env.py +713 -0
  301. itp_interface/rl/simple_proof_env_pool.py +591 -0
  302. itp_interface/scripts/setup.sh +228 -0
  303. itp_interface/tools/__init__.py +0 -0
  304. itp_interface/tools/basic_utils.py +172 -0
  305. itp_interface/tools/bin_packing.py +61 -0
  306. itp_interface/tools/cache.py +93 -0
  307. itp_interface/tools/coq_build_spec.py +31 -0
  308. itp_interface/tools/coq_build_tool.py +319 -0
  309. itp_interface/tools/coq_context_helper.py +354 -0
  310. itp_interface/tools/coq_executor.py +508 -0
  311. itp_interface/tools/coq_local_data_generation_transform.py +158 -0
  312. itp_interface/tools/coq_parse_utils.py +154 -0
  313. itp_interface/tools/coq_raw_proofs.py +193 -0
  314. itp_interface/tools/coq_theorem_proof_pair_generation_transform.py +146 -0
  315. itp_interface/tools/coq_training_data_generator.py +76 -0
  316. itp_interface/tools/dynamic_coq_proof_exec.py +220 -0
  317. itp_interface/tools/dynamic_isabelle_proof_exec.py +229 -0
  318. itp_interface/tools/dynamic_lean4_proof_exec.py +236 -0
  319. itp_interface/tools/dynamic_lean_proof_exec.py +228 -0
  320. itp_interface/tools/isabelle_context_helper.py +66 -0
  321. itp_interface/tools/isabelle_executor.py +862 -0
  322. itp_interface/tools/isabelle_local_data_generation_transform.py +149 -0
  323. itp_interface/tools/isabelle_parse_utils.py +131 -0
  324. itp_interface/tools/isabelle_server.py +106 -0
  325. itp_interface/tools/lean4_context_helper.py +72 -0
  326. itp_interface/tools/lean4_local_data_generation_transform.py +122 -0
  327. itp_interface/tools/lean4_sync_executor.py +1193 -0
  328. itp_interface/tools/lean_cmd_executor.py +804 -0
  329. itp_interface/tools/lean_context_helper.py +327 -0
  330. itp_interface/tools/lean_dojo_data_generation_transform.py +206 -0
  331. itp_interface/tools/lean_executor.py +687 -0
  332. itp_interface/tools/lean_local_data_generation_transform.py +136 -0
  333. itp_interface/tools/lean_parse_utils.py +32 -0
  334. itp_interface/tools/log_utils.py +20 -0
  335. itp_interface/tools/proof_exec_callback.py +76 -0
  336. itp_interface/tools/ray_utils.py +265 -0
  337. itp_interface/tools/repl/.git +1 -0
  338. itp_interface/tools/repl/.github/workflows/ci.yml +24 -0
  339. itp_interface/tools/repl/.gitignore +7 -0
  340. itp_interface/tools/repl/.vscode/copyright.code-snippets +13 -0
  341. itp_interface/tools/repl/.vscode/extensions.json +13 -0
  342. itp_interface/tools/repl/.vscode/module-docstring.code-snippets +35 -0
  343. itp_interface/tools/repl/.vscode/settings.json +11 -0
  344. itp_interface/tools/repl/README.md +174 -0
  345. itp_interface/tools/repl/REPL/Frontend.lean +47 -0
  346. itp_interface/tools/repl/REPL/JSON.lean +186 -0
  347. itp_interface/tools/repl/REPL/Lean/ContextInfo.lean +9 -0
  348. itp_interface/tools/repl/REPL/Lean/Environment.lean +31 -0
  349. itp_interface/tools/repl/REPL/Lean/InfoTree/ToJson.lean +114 -0
  350. itp_interface/tools/repl/REPL/Lean/InfoTree.lean +272 -0
  351. itp_interface/tools/repl/REPL/Main.lean +323 -0
  352. itp_interface/tools/repl/REPL/Snapshots.lean +306 -0
  353. itp_interface/tools/repl/REPL/Util/Path.lean +36 -0
  354. itp_interface/tools/repl/REPL/Util/Pickle.lean +44 -0
  355. itp_interface/tools/repl/REPL.lean +4 -0
  356. itp_interface/tools/repl/lake-manifest.json +5 -0
  357. itp_interface/tools/repl/lakefile.lean +15 -0
  358. itp_interface/tools/repl/lean-toolchain +1 -0
  359. itp_interface/tools/repl/test/Mathlib/.gitignore +5 -0
  360. itp_interface/tools/repl/test/Mathlib/H20231110.sh +2 -0
  361. itp_interface/tools/repl/test/Mathlib/ReplMathlibTests.lean +1 -0
  362. itp_interface/tools/repl/test/Mathlib/lake-manifest.json +68 -0
  363. itp_interface/tools/repl/test/Mathlib/lakefile.lean +11 -0
  364. itp_interface/tools/repl/test/Mathlib/lean-toolchain +1 -0
  365. itp_interface/tools/repl/test/Mathlib/test/20240209.expected.out +20 -0
  366. itp_interface/tools/repl/test/Mathlib/test/20240209.in +3 -0
  367. itp_interface/tools/repl/test/Mathlib/test/20240209.lean +4 -0
  368. itp_interface/tools/repl/test/Mathlib/test/H20231020.expected.out +8 -0
  369. itp_interface/tools/repl/test/Mathlib/test/H20231020.in +8 -0
  370. itp_interface/tools/repl/test/Mathlib/test/H20231020.lean +22 -0
  371. itp_interface/tools/repl/test/Mathlib/test/H20231110.expected.out +4 -0
  372. itp_interface/tools/repl/test/Mathlib/test/H20231110.in +4 -0
  373. itp_interface/tools/repl/test/Mathlib/test/H20231115.expected.out +19 -0
  374. itp_interface/tools/repl/test/Mathlib/test/H20231115.in +5 -0
  375. itp_interface/tools/repl/test/Mathlib/test/H20231115_2.expected.out +18 -0
  376. itp_interface/tools/repl/test/Mathlib/test/H20231115_2.in +4 -0
  377. itp_interface/tools/repl/test/Mathlib/test/H20231115_3.expected.out +10 -0
  378. itp_interface/tools/repl/test/Mathlib/test/H20231115_3.in +4 -0
  379. itp_interface/tools/repl/test/Mathlib/test/H20231214.in +9 -0
  380. itp_interface/tools/repl/test/Mathlib/test/H20231214.lean +30 -0
  381. itp_interface/tools/repl/test/Mathlib/test/H20231215.expected.out +4 -0
  382. itp_interface/tools/repl/test/Mathlib/test/H20231215.in +4 -0
  383. itp_interface/tools/repl/test/Mathlib/test/H20231215_2.expected.out +14 -0
  384. itp_interface/tools/repl/test/Mathlib/test/H20231215_2.in +3 -0
  385. itp_interface/tools/repl/test/Mathlib/test/exact.expected.out +37 -0
  386. itp_interface/tools/repl/test/Mathlib/test/exact.in +10 -0
  387. itp_interface/tools/repl/test/Mathlib/test/import_Mathlib.lean +1 -0
  388. itp_interface/tools/repl/test/Mathlib/test/induction.expected.out +29 -0
  389. itp_interface/tools/repl/test/Mathlib/test/induction.in +10 -0
  390. itp_interface/tools/repl/test/Mathlib/test/induction.lean +6 -0
  391. itp_interface/tools/repl/test/Mathlib/test/on_goal.expected.out +22 -0
  392. itp_interface/tools/repl/test/Mathlib/test/on_goal.in +5 -0
  393. itp_interface/tools/repl/test/Mathlib/test/pickle.expected.out +16 -0
  394. itp_interface/tools/repl/test/Mathlib/test/pickle.in +6 -0
  395. itp_interface/tools/repl/test/Mathlib/test/pickle_2.expected.out +4 -0
  396. itp_interface/tools/repl/test/Mathlib/test/pickle_2.in +4 -0
  397. itp_interface/tools/repl/test/Mathlib/test.sh +41 -0
  398. itp_interface/tools/repl/test/all_tactics.expected.out +13 -0
  399. itp_interface/tools/repl/test/all_tactics.in +1 -0
  400. itp_interface/tools/repl/test/by_cases.expected.out +25 -0
  401. itp_interface/tools/repl/test/by_cases.in +8 -0
  402. itp_interface/tools/repl/test/by_cases.lean +4 -0
  403. itp_interface/tools/repl/test/calc.expected.out +32 -0
  404. itp_interface/tools/repl/test/calc.in +1 -0
  405. itp_interface/tools/repl/test/def_eval.expected.out +9 -0
  406. itp_interface/tools/repl/test/def_eval.in +3 -0
  407. itp_interface/tools/repl/test/enableInitializersExecution.expected.out +2 -0
  408. itp_interface/tools/repl/test/enableInitializersExecution.in +1 -0
  409. itp_interface/tools/repl/test/file.expected.out +8 -0
  410. itp_interface/tools/repl/test/file.in +1 -0
  411. itp_interface/tools/repl/test/file.lean +5 -0
  412. itp_interface/tools/repl/test/have_by_sorry.expected.out +28 -0
  413. itp_interface/tools/repl/test/have_by_sorry.in +6 -0
  414. itp_interface/tools/repl/test/import_lean.in +1 -0
  415. itp_interface/tools/repl/test/incomplete.expected.out +18 -0
  416. itp_interface/tools/repl/test/incomplete.in +3 -0
  417. itp_interface/tools/repl/test/incomplete.lean +0 -0
  418. itp_interface/tools/repl/test/infotree.expected.out +20 -0
  419. itp_interface/tools/repl/test/infotree.in +2 -0
  420. itp_interface/tools/repl/test/invalid_tactic.expected.out +20 -0
  421. itp_interface/tools/repl/test/invalid_tactic.in +3 -0
  422. itp_interface/tools/repl/test/name_generator.expected.out +53 -0
  423. itp_interface/tools/repl/test/name_generator.in +18 -0
  424. itp_interface/tools/repl/test/no_goal_sorry.expected.out +11 -0
  425. itp_interface/tools/repl/test/no_goal_sorry.in +1 -0
  426. itp_interface/tools/repl/test/no_goal_sorry_2.expected.out +12 -0
  427. itp_interface/tools/repl/test/no_goal_sorry_2.in +1 -0
  428. itp_interface/tools/repl/test/options.expected.out +17 -0
  429. itp_interface/tools/repl/test/options.in +6 -0
  430. itp_interface/tools/repl/test/pickle_environment.expected.out +8 -0
  431. itp_interface/tools/repl/test/pickle_environment.in +7 -0
  432. itp_interface/tools/repl/test/pickle_environment_with_imports.expected.out +10 -0
  433. itp_interface/tools/repl/test/pickle_environment_with_imports.in +9 -0
  434. itp_interface/tools/repl/test/pickle_open.expected.out +8 -0
  435. itp_interface/tools/repl/test/pickle_open.in +7 -0
  436. itp_interface/tools/repl/test/pickle_open_2.expected.out +4 -0
  437. itp_interface/tools/repl/test/pickle_open_2.in +3 -0
  438. itp_interface/tools/repl/test/pickle_open_scoped.expected.out +18 -0
  439. itp_interface/tools/repl/test/pickle_open_scoped.in +8 -0
  440. itp_interface/tools/repl/test/pickle_open_scoped_2.expected.out +14 -0
  441. itp_interface/tools/repl/test/pickle_open_scoped_2.in +3 -0
  442. itp_interface/tools/repl/test/pickle_proof_state_1.expected.out +26 -0
  443. itp_interface/tools/repl/test/pickle_proof_state_1.in +15 -0
  444. itp_interface/tools/repl/test/pickle_proof_state_2.expected.out +4 -0
  445. itp_interface/tools/repl/test/pickle_proof_state_2.in +3 -0
  446. itp_interface/tools/repl/test/pickle_proof_state_env.expected.out +26 -0
  447. itp_interface/tools/repl/test/pickle_proof_state_env.in +15 -0
  448. itp_interface/tools/repl/test/pickle_scoped_notation.in +16 -0
  449. itp_interface/tools/repl/test/pickle_scoped_notation_2.in +3 -0
  450. itp_interface/tools/repl/test/proof_step.expected.out +18 -0
  451. itp_interface/tools/repl/test/proof_step.in +7 -0
  452. itp_interface/tools/repl/test/readme.expected.out +16 -0
  453. itp_interface/tools/repl/test/readme.in +5 -0
  454. itp_interface/tools/repl/test/sorry_hypotheses.expected.out +16 -0
  455. itp_interface/tools/repl/test/sorry_hypotheses.in +4 -0
  456. itp_interface/tools/repl/test/synthesize_placeholder.expected.out +7 -0
  457. itp_interface/tools/repl/test/synthesize_placeholder.in +1 -0
  458. itp_interface/tools/repl/test/tactic_mode_sorry.expected.out +14 -0
  459. itp_interface/tools/repl/test/tactic_mode_sorry.in +3 -0
  460. itp_interface/tools/repl/test/tactic_sorry.expected.out +12 -0
  461. itp_interface/tools/repl/test/tactic_sorry.in +1 -0
  462. itp_interface/tools/repl/test/term_sorry.expected.out +12 -0
  463. itp_interface/tools/repl/test/term_sorry.in +1 -0
  464. itp_interface/tools/repl/test/trace_simp.expected.out +41 -0
  465. itp_interface/tools/repl/test/trace_simp.in +15 -0
  466. itp_interface/tools/repl/test/unfinished_tactic_block.expected.out +11 -0
  467. itp_interface/tools/repl/test/unfinished_tactic_block.in +1 -0
  468. itp_interface/tools/repl/test/unknown_environment.expected.out +2 -0
  469. itp_interface/tools/repl/test/unknown_environment.in +1 -0
  470. itp_interface/tools/repl/test/unknown_proof_state.expected.out +14 -0
  471. itp_interface/tools/repl/test/unknown_proof_state.in +3 -0
  472. itp_interface/tools/repl/test/unknown_tactic.expected.out +14 -0
  473. itp_interface/tools/repl/test/unknown_tactic.in +3 -0
  474. itp_interface/tools/repl/test/variables.expected.out +26 -0
  475. itp_interface/tools/repl/test/variables.in +5 -0
  476. itp_interface/tools/repl/test.sh +43 -0
  477. itp_interface/tools/run_data_generation_transforms.py +350 -0
  478. itp_interface/tools/theorem_details.py +25 -0
  479. itp_interface/tools/training_data.py +358 -0
  480. itp_interface/tools/training_data_format.py +599 -0
  481. itp_interface-1.0.0.dist-info/METADATA +78 -0
  482. itp_interface-1.0.0.dist-info/RECORD +485 -0
  483. itp_interface-1.0.0.dist-info/WHEEL +4 -0
  484. itp_interface-1.0.0.dist-info/entry_points.txt +3 -0
  485. 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()