这个问题与此问题有关:Prolog - Reduce the knowledge base by deduction
我已经删除了可以扣除的所有事实和规则,但我现在必须编写已被扣除的新事实。
举个例子:
is_a( X, thing) :- is_a( X, house).
将成为:conclusion_premise(A,B)
在某种程度上,我需要拆分规则A = is_a(X, thing)
,但我如何才能获得B = is_a(X, house)
和clean_database:-
findall( Conclusion, ( conclusion_premise( Conclusion, Premise ), Premise ), L ),
list_to_set( L, L_no_duplicate),
removeFactcs(L_no_duplicate),
conclusion_premise(A,B), B, retract(conclusion_premise(A,B)).
% need somehow to add the rule that have been deducted.
removeFactcs([]).
removeFactcs([X|XS]) :-
retract(X),
removeFactcs(XS).
。
再次感谢。
EDITED
到目前为止,我有这个来清理数据库:
javascript:x1
答案 0 :(得分:0)
如果要根据示例代码
将新规则动态添加到数据库中:- dynamic( is_a/2 ).
is_a( m1, house ).
is_a( m1, thing ).
is_a( m2, house ).
is_a( m2, thing ).
is_a( m3, niche ).
is_a( m3, house ).
is_a( m3, thing ).
is_a( m4, car ).
is_a( m4, mobile).
is_a( m4, house ).
is_a( m4, thing ).
conclusion_premise(is_a(X, thing), is_a(X, house)).
conclusion_premise(is_a(X, house), is_a(X, niche)).
添加
my_rule() :-
conclusion_premise(Goal,Premise),
call(Goal),
call(Premise),
dynamic(Goal),
assert(Goal :- Premise).
首先通过咨询加载事实和规则,然后使用listing / 1查看当前的is_a / 2事实和规则。
?- consult("xyz.pl").
true.
?- listing(is_a).
:- dynamic is_a/2.
is_a(m1, house).
is_a(m1, thing).
is_a(m2, house).
is_a(m2, thing).
is_a(m3, niche).
is_a(m3, house).
is_a(m3, thing).
is_a(m4, car).
is_a(m4, mobile).
is_a(m4, house).
is_a(m4, thing).
true.
现在运行my_rule / 0添加新规则
?- my_rule().
true ;
true ;
true ;
true ;
true ;
false.
验证添加了新规则。
?- listing(is_a).
:- dynamic is_a/2.
is_a(m1, house).
is_a(m1, thing).
is_a(m2, house).
is_a(m2, thing).
is_a(m3, niche).
is_a(m3, house).
is_a(m3, thing).
is_a(m4, car).
is_a(m4, mobile).
is_a(m4, house).
is_a(m4, thing).
is_a(m1, thing) :-
is_a(m1, house).
is_a(m2, thing) :-
is_a(m2, house).
is_a(m3, thing) :-
is_a(m3, house).
is_a(m4, thing) :-
is_a(m4, house).
is_a(m3, house) :-
is_a(m3, niche).
true.