Использование call/1
не очень хорошая идея, потому что call/1
на самом деле вызывает цель, но вы просто хотите узнать, существует ли факт / правило , и вы не хотите ждать после долгий расчет того, что вызов может сработать, и вы не хотите, чтобы что-то печаталось на экране, если вызываемое правило в свою очередь вызывает, например, writeln/1
. Кроме того, вы бы хотели, чтобы verify/2
был успешным, даже если вызов не удался (но факт / правило в другом месте).
В качестве решения SWI-Prolog предлагает callable/1
callable(+Term)
True if Term is bound to an atom or a compound term,
so it can be handed without type-error to call/1, functor/3 and =../2.
Здесь представлены две версии verify/2
, одна из которых использует call/1
, а другая - callable/1
.
verify1(Name, Arguments) :-
Term =.. [Name | Arguments],
call(Term).
verify2(Name, Arguments) :-
Term =.. [Name | Arguments],
callable(Term).
father(abraham, isaac) :-
writeln('hello').
father(abraham, adam) :-
fail.