首先,您需要选择一个不同的谓词名称,因为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.