Prolog - 通过演绎减少知识库
Prolog - Reduce the knowledge base by deduction
我需要创建一个规则来搜索匹配 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
来描述 C
和 P
必须是一对相应的结论和前提,随后将两者称为目标:
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.
我需要创建一个规则来搜索匹配 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
来描述 C
和 P
必须是一对相应的结论和前提,随后将两者称为目标:
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.