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