如何验证prolog文件子句数据库中是否存在规则

时间:2008-11-26 20:07:38

标签: prolog

我正在进行大学作业,我必须验证当前子句数据库中是否存在某个子句(作为事实或规则)。

这个想法是使用头部为verify的规则(+ name,+ arguments)。如果在数据库中存在另一个头部为name(arguments)

的规则,则此规则应为true

非常感谢任何帮助......

2 个答案:

答案 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)失败。

您需要两个谓词:=../2call/2。如果您使用的是SWI-Prolog,请从解释器的命令行中调用help(=..).help(call)以访问文档。

我希望我没有破坏你的任务。你仍然需要找出如何处理部分实例化的谓词(所以,你自己说verify(father,[abraham,X]).之类的东西,但是从这里开始就不难了。

祝你好运。