/* Evaluation Picat from command line in Picat. As of Picat version 0.1, there is no way of doing more advanced stuff via Picat's command line. Here are som examples: $ picat picat_eval.pi "foreach(I in 1..5) println(I) end" 1 2 3 4 5 % There is no automatic printing of variables so one have to % use println/1 etc. $ picat picat_eval.pi "println(cond(prime(1322223333332),yes,no))" no % Using my CP model queens.pi $ picat picat_eval.pi "cl(queens),queens3(5,Q), println(Q),fail" [1,3,5,2,4] [1,4,2,5,3] [2,4,1,3,5] [2,5,3,1,4] [3,1,4,2,5] [3,5,2,4,1] [4,1,3,5,2] [4,2,5,3,1] [5,2,4,1,3] [5,3,1,4,2] % Testing a model. The printing is "x=...." so we can count just the relevant lines. $ picat picat_eval.pi "cl(queens),queens3(8,Q), println(x=Q),fail" | fgrep "x=" | wc 92 92 1840 $ picat picat_eval.pi "L=new_list(4),L::1..4,all_different(L),L[2]#<3,All=solve_all(L),println(All)" [[1,2,3,4],[1,2,4,3],[2,1,3,4],[2,1,4,3],[3,1,2,4],[3,1,4,2],[3,2,1,4],[3,2,4,1],[4,1,2,3],[4,1,3,2],[4,2,1,3],[4,2,3,1]] % This one use some predicates from utils_me.pi: occurrences/1 and sort_map/2 $ picat picat_eval.pi "L=[sum(S):S in power_set(1..5)].occurrences().sort_map(values).reverse(),println(L)" [10=3,9=3,8=3,7=3,6=3,5=3,12=2,11=2,4=2,3=2,15=1,14=1,13=1,2=1,1=1,0=1] This Picat model was created by Hakan Kjellerstrand, hakank@gmail.com See also my Picat page: http://www.hakank.org/picat/ */ import util. import string_util_me. main => println("Syntax: picat_eval.pi \"Picat statements\"\n"), halt. main(Input) => run(Input.join(',').flatten()). run(Input) => TmpFile = "picat_eval_tmp2.pi", % See http://www.hakank.org/picat/ for my modules. Modules = ["cp","util","apl_util","ordset","utils_me","cp_utils"], % Modules = ["cp","util","apl_util","set_util","utils_me","cp_utils"], Import = ["import " ++ Module ++ "." : Module in Modules].join('\n'), Main = "main => eval_tmp.\n", EvalTmp = "eval_tmp => " ++ Input ++ ",nl.\n", Out = Import ++ "\n" ++ Main ++ "\n" ++ EvalTmp, FD = open(TmpFile,write), print(FD,Out.flatten()), flush(FD), close(FD), cl(picat_eval_tmp2), time2(eval_tmp()), nl.