定义用户无法查询的规则
如何定义用户无法查询的规则?
我只希望程序本身通过另一个规则调用此规则。
例如:
rule1(): - rule2()。
rule2(): - 1< 5。
?-规则1()。
真正
?-rule2()。
(我不知道答案是什么,我只是希望这个查询失败!)
没有找到相关结果
已邀请:
3 个回复
芜任亮蜡
编译并加载上面的对象后:
如果你编辑目标代码并明确地将rule2 / 1声明为私有,那么你会得到错误:
http://logtalk.org/上的更多信息和大量示例
娜拐赐巫潭
在现代Prolog中,我们不再经常发现祖先/ 1谓词。 但它可以按以下方式进行模拟。只是抛出错误,然后 如果错误是用堆栈跟踪装饰的,那么您将获得所需的一切:
但要注意堆栈消除优化可能会减少堆栈,从而减少堆栈 祖先/ 1返回的列表。 最好的祝福 P.S。:已经解释了堆栈消除优化: [4] Warren,D.H.D。 (1983):抽象Prolog指令集,技术说明309,SRI国际,1983年10月 在这里可以找到Jekejeke Prolog的讨论: http://www.jekejeke.ch/idatab/doclet/prod/en/docs/10_pro08/13_press/03_bench/05_optimizations/03_stack.html
魄龟呸筹
的东西,如
(和
是另一个)并且可以有多个子句,其中包括事实和规则,例如
(事实)和
(规则)是一个谓词
的两个子句。 不要对没有参数的谓词使用空括号 - 至少在SWI-Prolog中,这根本不起作用。只需在所有地方使用
而不是
。 如果你试图调用一个未定义的谓词,SWI-Prolog会说
而Sicstus-Prolog会说
现在,回答。我想到了两个想法。 (1)这是一个hack,但你可以在每次需要时断言谓词并在之后立即收回它们:
如果你想要一个身体和arguments11ѭ的论据,那就做
。 (2)实现此目的的另一种方法是为谓词引入一个额外的参数,您不希望用户调用该参数并将其用于用户无法提供的标识,但您可以通过调用提供该标识。谓语。这可能是一个大的常数,看起来是随机的,甚至是一个句子。这甚至可以让您在提供错误标识的情况下输出自定义错误消息。 例:
我没有使用等效的
作为
的第一个子句,因为我不确定该子句的头部可能出现在Prolog消息中的哪个部分,而你不希望这样。我在第二个句子的末尾使用了
,只是为了让Prolog在错误信息之后打印
而不是
。最后,我不知道如何阻止用户使用
查找源代码,这样如果他/她真的想要,仍然可以简单地查找正确的识别码。如果仅仅是为了防止用户意外受到伤害,它应该足以作为保护。