Вы можете использовать оператор univ =../2
для создания термина перед его утверждением (обратите внимание, что рассматриваемый предикат должен быть объявлен динамическим, чтобы он работал):
ifNotAdd(X,Y):-
not(call(X,Y)),
!,
Term =.. [X, Y],
assert(Term).
Кстати, если вы хотите, чтобы ifNotAdd/2
не потерпел неудачу, когда нет необходимости добавлять факт в базу данных, вы должны заключить его в структуру if, плюс, not/1
устарела, предпочтительным является (\+)/1
:- dynamic(mammal/1).
mammal(dolphin).
ifNotAdd(X, Y):-
( \+ call(X, Y)
-> Term =.. [X, Y],
assert(Term)
; true).
Но я не уверен, что вы пытаетесь сделать прямо здесь. Очень часто, когда новичок в прологе хочет манипулировать базой данных, это происходит из-за того, что конкретный механизм пролога не понят должным образом. Опять же, вы не можете быть новичком, и мое замечание может быть глупым, в таком случае, просто забудьте об этом! Но если вы новичок, вы можете уточнить, чего вы пытаетесь достичь, чтобы мы могли подтвердить, что эти манипуляции необходимы!