定义用户无法查询的规则

And*_*iau 1 prolog logtalk

如何定义用户无法查询的规则?我只希望程序本身通过另一个规则调用此规则.

例如:

rule1(): - rule2().

rule2(): - 1 <5.

?-规则1().

真正

?-rule2().

(我不知道答案是什么,我只是希望这个查询失败!)

Pau*_*ura 6

使用Logtalk对象封装谓词.只能调用您声明为public的谓词(从对象外部).Prolog模块不会阻止调用任何谓词,因为使用explcit限定会绕过显式导出的谓词列表.

一个简单的例子:

:- object(rules).

    :- public(rule1/1).
    rule1(X) :-
        rule2(X).

    rule2(X) :-
        X < 5.

:- end_object.
Run Code Online (Sandbox Code Playgroud)

编译并加载上面的对象后:

?- rules::rule1(3).
true.

?- rules::rule2(3).
error(existence_error(predicate_declaration,rule2(3)),rules::rule2(3),user)
Run Code Online (Sandbox Code Playgroud)

如果你编辑目标代码并明确地将rule2/1声明为私有,那么你会得到错误:

?- rules::rule2(3).
error(permission_error(access,private_predicate,rule2(3)),rules::rule2(3),user)
Run Code Online (Sandbox Code Playgroud)

http://logtalk.org/上的更多信息和大量示例