clpz:monotonic.
tree(tree(A,Prs)) --> number(X), "x", number(Y), ": ", sequence(number," ",Prs), { #A #= #X * #Y }.
input(Trees) :- phrase_from_file((...,sequence(tree,"\n",Trees)),"i/12.in").
solvable(tree(A,Prs),T) :- sum(Prs,NPrs), clpz_t(#NPrs*9 #=< #A,T).
solve(P1,":D") :- input(Trees), tfilter(solvable,Trees,STrees), length(STrees,P1).
test :- make_test(day(12),solve,492,":D").
I didn't initially like this problem, but in hindsight, it's pretty fun :D! Happy AoC, and here's to many more!
~/aoc25pl/12