Prolog - 通过演绎减少知识库



我需要创建一个规则来搜索与my_rule匹配的事实。这些事实将用于更改知识库。(my_rule (Conclusion, Premise)(。

我有这个知识库开始:

:- dynamic( is/2 ).
is( m1, house ).
is( m1, thing ).
is( m2, house ).
is( m2, thing ).
is( m3, niche ).
is( m3, house ).
is( m3, thing ).
is( m4, car ).
is( m4, mobile ).
is( m4, house ).
is( m4, thing ).
my_rule( is( X, thing ), is( X, house ) ).
my_rule( is( X, house ), is( X, niche ) ).

找到规则后,代码将搜索数据库中是否存在结论及其前提。

我不知道如何实现这一目标,是的,这是为了家庭作业。我只是想有人指出从哪里开始。

谢谢。

首先,您需要选择一个不同的谓词名称,因为is/2是用于计算算术表达式的内置名称,例如

?- X is 3+2.
X = 5.

如果尝试查阅源文件,代码会导致以下错误:

?- [myfile].
ERROR: /home/someuser/code/myfile.pl:1:
        dynamic/1: No permission to modify static procedure `(is)/2'

让我们将其重命名为 is_a/2 .然后你的代码看起来像:

:- 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/2来描述CP必须是一对相应的结论和前提,并随后将两者称为目标:

my_rule(C,P) :-
   conclusion_premise(C,P),
   call(C),
   call(P).

现在你可以查询my_rule/2来搜索相应的结论-前提对:

?- my_rule(Conclusion,Premise).
Conclusion = is_a(m1, thing),
Premise = is_a(m1, house) ;
Conclusion = is_a(m2, thing),
Premise = is_a(m2, house) ;
Conclusion = is_a(m3, thing),
Premise = is_a(m3, house) ;
Conclusion = is_a(m4, thing),
Premise = is_a(m4, house) ;
Conclusion = is_a(m3, house),
Premise = is_a(m3, niche) ;
false.

最新更新