【问题标题】:How to generate an assert that forces a false?如何生成强制错误的断言?
【发布时间】:2013-10-01 06:18:44
【问题描述】:

首先感谢您的帮助。

关于我的问题:假设我有:

some_fact:- true.

我想在它上面声明一个规则,如下所示:

some_fact:- fail, !.

这是因为我想在不删除规则的情况下将“@​​987654323@”转换为强制为假(我不想使用abolish(some_fact,0).

问题是我找不到方法,因为我无法将逗号放在 asserta/1 上。我的意思是,当我输入:

asserta(some_fact:- fail, !).

中间的逗号强制调用 asserta/2 而不是 asserta/1 与整个规则,我不能阻止使用引号,因为它断言一个字符串。

当然我不能简单地输入asserta(some_fact:- fail).,因为 prolog 会搜索下一个返回 true 的 some_fact。

有什么想法吗?再次感谢!

【问题讨论】:

    标签: prolog prolog-assert


    【解决方案1】:

    只需添加括号:

    ?- asserta((some_fact:- fail, !)).
    true.
    

    【讨论】:

    • 天哪,我不敢相信事情就这么简单。我在任何地方都找不到它。谢谢!!
    • 如果是 asserta((some_fact:- !, fail)) 会更好。
    【解决方案2】:

    断言事实:

    asserta(zoo(zebra)).

    当事实不再正确时:

    retract(zoo(zebra)).

    更笼统的:

    asserting(Fact) :-
        asserta(Fact).
    
    retracting(Fact) :-
        retract(Fact).
    

    例子:

    ?- asserting(zoo(zebra)).
    true.
    
    ?- zoo(zebra).
    true.
    
    ?- retracting(zoo(zebra)).
    true.
    
    ?- zoo(zebra).
    false.
    

    【讨论】:

    • 我已经说过我不想做 abolish (撤回不起作用顺便说一句,因为它是 arity 0 的规则,而不是事实)。还是谢谢。
    • 您似乎在询问一个事实,因为您在问题中一直使用名称“some_fact”。无论如何,它确实适用于 arity 0 的规则。你试过我的例子吗?另外,像 mbratch 我不明白你为什么要避免删除规则。你能解释一下吗?
    • 是的...我应该使用“some_rule:- true”。对不起哈哈。实际上,我并不是想避免删除规则,我只是想知道如何断言,因为我在这里简化了一个更复杂的场景。谢谢!
    • 哦,出于某种原因,我的老师说了同样的话:retract 适用于 arity 0 的规则。但是,当我们都在程序上尝试它时,它不起作用!所以我们用 abolish 代替。非常感谢朋友!
    • 为回复干杯!顺便说一句:如果谓词已经在使用并且您想要断言/撤回,则必须首先将其声明为“动态”。所以这可能是它不起作用的原因。
    猜你喜欢
    • 1970-01-01
    • 2019-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多