Я использую этот шаблон для «аргументов по умолчанию» (особенность C ++, вроде). В зависимости от вашего варианта использования и системы Prolog, вы должны адаптироваться по мере необходимости. Помните, что var / 1, nonvar / 1,! / 0 являются встроенными нечистыми , которые могут неожиданно помешать процессу разрешения. Сокращение (то есть! / 0) неявно в -> / 2.
termCat(X,Y,T) :-
(var(X) -> X=with;true),
(var(Y) -> Y=spaghetti;true),
etc etc.
В SWI-Prolog вы можете требовать, чтобы аргументы не были свободными, например, используя утверждение / 1 из библиотеки (отладка):
:- use_module(library(debug)).
termCat(X,Y,T) :-
assertion((nonvar(X),nonvar(Y))),
etc etc.