src/HOL/Tools/Predicate_Compile/code_prolog.ML
changeset 41940 a3b68a7a0e15
parent 41472 f6ab14e61604
child 41941 f823f7fae9a2
equal deleted inserted replaced
41939:eb9fb5a4d27f 41940:a3b68a7a0e15
   780         error "No support for querying multiple solutions in the prolog system yap"
   780         error "No support for querying multiple solutions in the prolog system yap"
   781 
   781 
   782 fun prelude system =
   782 fun prelude system =
   783   case system of SWI_PROLOG => swi_prolog_prelude | YAP => yap_prelude
   783   case system of SWI_PROLOG => swi_prolog_prelude | YAP => yap_prelude
   784 
   784 
   785 fun invoke system file_name =
   785 fun invoke system file =
   786   let
   786   let
   787     val env_var =
   787     val (env_var, cmd) =
   788       (case system of SWI_PROLOG => "EXEC_SWIPL"| YAP => "EXEC_YAP")
   788       (case system of
   789     val prog = getenv env_var
   789         SWI_PROLOG => ("EXEC_SWIPL", "\"$EXEC_SWIPL\" -f ")
   790     val cmd =
   790       | YAP => ("EXEC_YAP", "\"$EXEC_YAP\" -L "))
   791       case system of SWI_PROLOG => prog ^ " -f " | YAP => prog ^ " -L "
   791   in
   792   in
   792     if getenv env_var = "" then
   793     if prog = "" then
       
   794       (warning (env_var ^ " not set; could not execute code for " ^ string_of_system system); "")
   793       (warning (env_var ^ " not set; could not execute code for " ^ string_of_system system); "")
   795     else fst (bash_output (cmd ^ file_name))
   794     else fst (bash_output (cmd ^ File.shell_path file))
   796   end
   795   end
   797 
   796 
   798 (* parsing prolog solution *)
   797 (* parsing prolog solution *)
   799 
   798 
   800 val scan_number =
   799 val scan_number =
   855     val args' = map (rename_vars_term renaming) args
   854     val args' = map (rename_vars_term renaming) args
   856     val prog = prelude system ^ query system nsols (query_rel, args') vnames' ^ write_program p
   855     val prog = prelude system ^ query system nsols (query_rel, args') vnames' ^ write_program p
   857     val _ = tracing ("Generated prolog program:\n" ^ prog)
   856     val _ = tracing ("Generated prolog program:\n" ^ prog)
   858     val solution = TimeLimit.timeLimit timeout (fn prog =>
   857     val solution = TimeLimit.timeLimit timeout (fn prog =>
   859       Isabelle_System.with_tmp_file "prolog_file" (fn prolog_file =>
   858       Isabelle_System.with_tmp_file "prolog_file" (fn prolog_file =>
   860         (File.write prolog_file prog; invoke system (Path.implode prolog_file)))) prog
   859         (File.write prolog_file prog; invoke system prolog_file))) prog
   861     val _ = tracing ("Prolog returned solution(s):\n" ^ solution)
   860     val _ = tracing ("Prolog returned solution(s):\n" ^ solution)
   862     val tss = parse_solutions solution
   861     val tss = parse_solutions solution
   863   in
   862   in
   864     tss
   863     tss
   865   end
   864   end