Here's my - quite subjective - comparison of Picat and MiniZinc as systems for modelling constraint models. Note that this also includes things that might be considered non-modelling issues, but are important when trying to solve a problem.
Integrated system
------------------------
Compared to MiniZinc, it cannot be ignored that Picat is an integrated system where the model and both post- and pre-processing can be done in the same system, as well as doing any other (non constraint) stuff that's needed using logic programming, imperative foreach/while loops, functions, list comprehension, etc (though one should be careful in how one mix these with the constraints) .
In MiniZinc, one has to - for more complex models - pre / post process indata/output in some other system, or even generate the model. The MiniZinc-Python system is a great tool for this, but some of it can be done in any programming language (for example I've written some Picat programs that generate MiniZinc models or data files to be used by MiniZinc models).
Picat is a full fledged programming language, whereas the MiniZinc language is not.
Supported solvers
-----------------------
Picat has four solvers (or eight depending how you count): one CP solver, two SAT solvers (the built-in and the external maxsat), three MIP solvers (the external Cbc, GLPK, and Gurobi), and two SMT solvers (the external z3 and cvc4). They all share the same syntax, and it's easy to change the solver (e.g. changing "import cp." to "import sat."). There are some exceptions, however, for example that the MIP solver is the only solver that can handle float decision variables, and some constraints are only available for the CP or SAT solvers.
Since MiniZinc is a plain modelling language, one has to use a specific FlatZinc solver. Included in the MiniZincIDE package there are some great solvers (e.g. Chuffed, Cbc, Gecode, and - recently - Google OR-tool CP-SAT solver), and there's a lot of other FlatZinc solvers, including the powerful PicatSAT solver. Changing to a different solver is quite simple, either via the IDE or via command line (I almost exclusively use the command line). One drawback of this is that the individual flags to tweak a specific solver are not standardized so one has to check the documentation for each individual solver. Note that the general flags such as -a for getting all solutions, -f for free search etc are standardized in MiniZinc.
Some FlatZinc solvers, such as Gecode, JacoP, Choco, and OptiMathSAT, support non-linear float constraints (though one often needs to tweak the precision) combined with integer based decision variables. Picat's MIP solvers are more restricted.
Constraints
---------------
Even though Picat supports many constraints, the list of supported constraints for MiniZinc is quite impressive. A nice feature is that an individual FlatZinc.solver can override the MiniZinc definition and replace it with a constraint that's tailored for the solver, which speeds up the solution time (though this is not something an ordinary MiniZinc modeller do; it's the task for the solver creator ).
In general, I would say that the MiniZinc language is a bit higher level than Picat's constraint language. For example MiniZinc supports some constraints (syntax sugar) that can make modeling a little easier especially for people new in constraint modelling:
* indexing with decision variables
Picat's handing of indexing in a list or a matrix when Index and I, J are decision variables
element(Index, List, Value)
matrix_element(Matrix, I, J, Value)
are easier to state in MiniZinc by the syntax:
Value = List[Index]
Value = Matrix[I,J]
* exists
MiniZinc has an "exist" function which makes modelling certain things quite easy, e.g. to ensure that there is at least one instance in a list that satisfies a constraint. In Picat, I tend to use use "sum([...]) #>= 1" for this; it works, but exists() is neater,
* functions
MiniZinc supports user defined predicates as well as user defined functions. Statiing constraints as a function can be more natural or easier to use than using constraints as predicates. Picat only supports user defined predicates (Picat functions cannot return a decision variable or a constraint).
It would be great if Picat would also have these features.
Picat's SAT solver supports some great graph based constraints which to my knowledge are not in MiniZinc, e.g. hcp/3, hcp_grid/1, scc/2, scc/3, and scc_grid/1, See the Picat Guide for more on these constraints.
In MiniZinc, one can create constraints (as predicates or functions as mentioned above), but there's no way to use traditional ("low level"/"imperative") algorithms for speeding up a constraint using the MiniZinc language. In Picat, one can implement constraints using a combination of constraints and for loops/maps etc. See for example Neng-Fa's implementations of the graph constraints mentioned above in the file lib/sat.pi (found in the Picat distribution).
In MiniZinc there is basically one approach of writing a model: one uses "forall" loops (and/or its list comprehension variant) to loop through the elements in the lists/matrices to generate the constraints. In Picat, one can use the loop approach (with a "foreach" loop), using list comprehensions. Or use logic programming - think Prolog + CLP(FD) - which might be more natural depending on the problem. This is the advantage of using a multi-paradigmatic system.
One feature in Picat that I like - though it's only for the CP solver - is that it evaluates the constraints in linear order and does domain reduction "incrementally". This means that one can do some print debugging of the model for checking how the domains are changed etc (debugging a constraint model is hard in any CP system). It also means that it might be possible to speed up the model by rearranging the constraints. e.g. by moving that all_different/1 constraint before that foreach loop instead of after..
Arrays
--------
One drawback of MiniZinc is that the size of the arrays must be declared with a fixed size and it does not support "rugged arrays" (one way to fix this is to create a fixed size matrix with dummy values for the missing values in a row but it can be messy to handle). In Picat there is no such restriction of the arrays/matrices, for example one can create a list (of unknown size) of decision variables via a foreach loop or handling weird shaped matrices.
Note: MiniZinc supports input data in JSON format, which can make input handling a little easier, though it probably means that the input has been created by an external system.
Output
---------
MiniZinc has support for output, but that is quite restricted and thus not especially fun to work with, and this is one other reason one wants to use e.g. MiniZinc-Python. In Picat, it's much easier to write the output of a model, again since everything is integrated.
Summary
-------------
Even though I like MiniZinc - especially the syntax of "element"/"exists" and functions, and for the support of constraints and the diversity of the solvers - I almost always write my constraint models in Picat, because the constraints are integrated within the system so I can use Picat's other great features.
Another thing: One neat thing with Picat is that it's very easy to - beside constraint modelling - test other (non CP) approaches for solving a problem, for example using logic programming, using functions, imperative programming, perhaps together with tabling. And for certain problems, perhaps it's better to use the planning module. MiniZinc is a great system for constraint modelling only, but Picat has many ways to solve a problem.
I should also mention that for my professional consultancy jobs, the customers have requested CP systems other than Picat or MiniZinc (all are Python based). That being said, when modelling in these systems, I occasionally prototype/test more complex constraints in Picat.
Hope this helps
Hakan