3

首先感谢您的帮助。

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

some_fact:- true.

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

some_fact:- fail, !.

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

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

asserta(some_fact:- fail, !).

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

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

有任何想法吗?再次感谢!

4

2 回答 2

3

只需添加括号:

?- asserta((some_fact:- fail, !)).
true.
于 2013-10-01T14:22:33.900 回答
1

断言事实:

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.
于 2013-10-01T10:30:54.643 回答