我正在进行大学任务,我必须验证当前子句数据库中是否存在某个子句(作为事实或规则).
我们的想法是使用头部为verify的规则(+ name,+ arguments).如果在数据库中存在另一个头部为name(arguments)的规则,则此规则应为true
任何帮助将不胜感激...
使用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.
Run Code Online (Sandbox Code Playgroud)
这是两个版本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.
Run Code Online (Sandbox Code Playgroud)