Prolog - Reduce the knowledge base by deduction

匿名 (未验证) 提交于 2019-12-03 01:05:01

问题:

I need to create a rule that will search for the facts that matches my_rule. These facts will be use to change the knowledge base. (my_rule (Conclusion, Premise)).

I have this knowledge base to start with :

:- 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 ) ). 

When a rule is found, the code will search if a Conclusion and its Premise exist in the database.

I have no idea how to achieve this, and yes this is for a homework. I just want someone to point out where to start.

Thanks.

回答1:

Firstly, you need to pick a different predicate name, since is/2 is a built-in to evaluate arithmetic expressions, e.g.

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

Your code leads to the following error if you try to consult the sourcefile:

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

Let's rename it to is_a/2. Then your code looks like:

:- 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). 

Then you could define a predicate to describe pairs of conclusions and premises like so:

conclusion_premise(is_a(X, thing), is_a(X, house)). conclusion_premise(is_a(X, house), is_a(X, niche)). 

Building on this you could define my_rule/2 to describe that C and P must be a corresponding pair of conclusion and premise and to subsequently call both as goals:

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

Now you can query my_rule/2 to search for corresponding conclusion-premise pairs:

?- 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. 


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!