为何调用depends(boole,expression)返回false?知识库依赖规则排查
为什么
depends(boole, expression)返回false? 咱们来一步步拆解这个问题:
首先,按逻辑预期的依赖链路应该是:boole → literal → expression,毕竟:
- 从
implements(literal, boole)能看出来boole是literal的实现类 - 从
extends(expression, literal)能看出来literal继承了expression
照理说boole应该间接依赖expression,但当前规则就是走不通,问题出在dep规则和implements条目的方向不匹配上。
核心问题:依赖规则的方向搞反了
看你定义的dep规则里处理实现关系的子句:
dep(X,Y):- implements(X,Y).
这条规则的逻辑是:如果X实现了Y,那么X依赖Y。但你的知识库中写的是implements(literal, boole)——这表示的是literal被boole实现(也就是boole是literal的子类),而不是boole实现了literal。
这就导致dep(boole, literal)根本无法成立,因为规则要找的是implements(boole, literal),但你的知识库中没有这条记录。
传递依赖的链路断了
depends规则需要通过中间节点传递依赖,但现在dep(boole, Z)只有当Z=boole时成立(也就是X=Y的子句),找不到能连接到literal的路径,自然无法继续传递到expression,最终返回false。
怎么修复?
你有两种可选的修正方式:
- 调整
implements条目的参数顺序,让实现者在前,被实现的接口在后:
将implements(literal, boole).改为implements(boole, literal). - 调整
dep规则的子句参数顺序,适配现有知识库的定义:
将dep(X,Y):- implements(X,Y).改为dep(X,Y):- implements(Y,X).
修改后,dep(boole, literal)会成立,接着dep(literal, expression)通过extends(Y,X)子句(Y=expression,X=literal,匹配extends(expression, literal))也会成立,最终depends(boole, expression)就能返回true了。
内容的提问来源于stack exchange,提问作者tom dinh
相关产品推荐
相关产品推荐

