首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog -通过演绎减少知识库

Prolog -通过演绎减少知识库
EN

Stack Overflow用户
提问于 2018-04-16 19:08:51
回答 1查看 229关注 0票数 2

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

首先,我有一个知识库:

代码语言:javascript
复制
:- 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 ) ).

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

我不知道如何做到这一点,是的,这是一个家庭作业。我只想要有人指出从哪里开始。

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-04-16 21:21:53

首先,您需要选择一个不同的谓词名,因为is/2是计算算术表达式的内置程序。

代码语言:javascript
复制
?- X is 3+2.
X = 5.

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

代码语言:javascript
复制
?- [myfile].
ERROR: /home/someuser/code/myfile.pl:1:
        dynamic/1: No permission to modify static procedure `(is)/2'

让我们把它重命名为is_a/2。那么您的代码看起来是:

代码语言:javascript
复制
:- 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).

然后,您可以定义一个谓词来描述这样的结论和前提对:

代码语言:javascript
复制
conclusion_premise(is_a(X, thing), is_a(X, house)).
conclusion_premise(is_a(X, house), is_a(X, niche)).

在此基础上,您可以定义my_rule/2来描述CP必须是对应的结论和前提,然后将两者称为目标:

代码语言:javascript
复制
my_rule(C,P) :-
   conclusion_premise(C,P),
   call(C),
   call(P).

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

代码语言:javascript
复制
?- 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.
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49864583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档