3

まず第一に、あなたの助けに感謝します.

私の問題について:私が持っているとしましょう:

some_fact:- true.

その上に、次のようなルールをアサートしたいと思います。

some_fact:- fail, !.

これはsome_fact:- true.、ルールを削除せずに " " を強制的に false に変換したいためです ( を使用したくありませんabolish(some_fact,0).) 。

問題は、asserta/1 にコンマを配置できないため、それを行う方法が見つからないことです。私が言いたいのは、私が置くとき:

asserta(some_fact:- fail, !).

間のコンマは、ルール全体で asserta/1 ではなく asserta/2 への呼び出しを強制します。これは文字列をアサートするため、引用符を使用してそれを防ぐことはできません。

もちろんasserta(some_fact:- fail).、プロローグは 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 に答える