我正在做一项大学作业,我必须验证当前子句数据库中是否存在某个子句(作为事实或规则)。
这个想法是使用一个头部为 verify(+name, +arguments) 的规则。如果数据库中存在另一个头部为名称(参数)的规则,则此规则应为真
任何帮助将不胜感激...
我正在做一项大学作业,我必须验证当前子句数据库中是否存在某个子句(作为事实或规则)。
这个想法是使用一个头部为 verify(+name, +arguments) 的规则。如果数据库中存在另一个头部为名称(参数)的规则,则此规则应为真
任何帮助将不胜感激...
使用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.
你熟悉统一的概念吗?您要做的是:只需调用一个看起来像您要查找的谓词。
所以,在你的数据库中说是:
father(abraham,isaac).
现在你想调用类似的东西:
verify(father,[abraham,isaac]).
然后,您的谓词主体将必须包含一个调用机制,father(abraham,isaac).
然后应该返回true.
Callingfather(abraham,adam)
应该失败。
为此,您将需要两个谓词:=../2
和call/2
。如果您使用的是 SWI-Prolog,请从解释器的命令行调用help(=..).
和help(call)
访问文档。
我希望我没有破坏你的任务。您仍然需要找出如何处理部分实例化的谓词(因此,verify(father,[abraham,X]).
您可以自己说一些类似的话,但从这里开始应该不难。
祝你好运。