如何在Prolog中查询指定参数(如sokrates)对应的有效谓词?
在Prolog中查询适用于
sokrates的所有谓词 嘿,这个问题问得很实用!直接写X(sokrates)确实没法直接得到结果,因为Prolog不会自动枚举所有可能的谓词来匹配这个目标,但我们可以借助元编程的特性来实现你想要的效果。下面给你两种可行的方案:
方法1:使用clause/2谓词
clause/2是Prolog中用于访问子句的元谓词,它的格式是clause(Head, Body),可以匹配所有头为Head、体为Body的子句。因为你定义的都是无体的事实(相当于Body为true),所以可以用这个查询:
?- clause(X(sokrates), true).
运行这个查询后,Prolog会依次返回所有符合条件的谓词:
X = musician ; X = philosopher ; X = two_legged ; X = dead.
方法2:结合current_predicate/2和call/1
current_predicate/2可以枚举当前存在的谓词,我们先筛选出所有一元谓词(因为你的事实都是接受一个参数的),再用call/1验证这个谓词是否对sokrates成立:
?- current_predicate(X/1, _), call(X(sokrates)).
这个查询同样会返回所有适用于sokrates的谓词,和方法1的结果一致。
为什么直接X(sokrates)不行?
Prolog的变量绑定机制是“按需绑定”,它不会主动去遍历所有可能的谓词来匹配X(sokrates),必须通过元编程谓词(比如上面提到的clause/2、current_predicate/2)来主动枚举或查询谓词信息,才能实现你的需求。
内容的提问来源于stack exchange,提问作者Prodiction
相关产品推荐
相关产品推荐

