Is this behaviour wanted? I get a kind of explosion, one when/2 statement becomes two when/2 statements, then three when/2 statements and so on…
Using an initial goal:
?- when((nonvar(X), nonvar(Z);nonvar(Y)), (write(f(X, Y, Z)), nl)).
when((nonvar(X), nonvar(Z)), when:check_disj(-, [(nonvar(X), nonvar(Z)), nonvar(Y)], user:(write(f(X, Y, Z)), nl))),
when((nonvar(X), nonvar(Z);nonvar(Y)), (write(f(X, Y, Z)), nl)).
And then use the displayed goal again:
?- when((nonvar(X), nonvar(Z)), when:check_disj(-, [(nonvar(X), nonvar(Z)), nonvar(Y)], user:(write(f(X, Y, Z)), nl))),
when((nonvar(X), nonvar(Z);nonvar(Y)), (write(f(X, Y, Z)), nl)).
when((nonvar(X), nonvar(Z)), when:check_disj(-, [(nonvar(X), nonvar(Z)), nonvar(Y)], user:(write(f(X, Y, Z)), nl))),
when((nonvar(X), nonvar(Z)), when:check_disj(-, [(nonvar(X), nonvar(Z)), nonvar(Y)], user:(write(f(X, Y, Z)), nl))),
when((nonvar(X), nonvar(Z);nonvar(Y)), (write(f(X, Y, Z)), nl)).