5

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

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

任何帮助将不胜感激...

4

2 回答 2

6

使用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.
于 2008-12-03T21:07:42.037 回答
1

你熟悉统一的概念吗?您要做的是:只需调用一个看起来像您要查找的谓词。

所以,在你的数据库中说是:

father(abraham,isaac).

现在你想调用类似的东西:

verify(father,[abraham,isaac]).

然后,您的谓词主体将必须包含一个调用机制,father(abraham,isaac).然后应该返回true.Callingfather(abraham,adam)应该失败。

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

我希望我没有破坏你的任务。您仍然需要找出如何处理部分实例化的谓词(因此,verify(father,[abraham,X]).您可以自己说一些类似的话,但从这里开始应该不难。

祝你好运。

于 2008-11-26T21:03:23.263 回答