我正在进行大学任务,我必须验证当前子句数据库中是否存在某个子句(作为事实或规则).
我们的想法是使用头部为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.
这是两个版本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.