如何在另一个谓词中使用谓词值?Prolog代码异常排查
关于Prolog
is_faster谓词变量未返回值的问题解答 这其实是Prolog查询机制的正常行为,核心原因在于变量是否出现在你的查询目标中:
问题根源
当你调用is_faster(ferrari)时,你的查询只关心这个谓词是否能成功匹配(即法拉利是否满足速度>250的条件),而谓词定义里的X是一个内部临时变量——它只在谓词内部用于判断条件,并没有出现在你提交的查询目标里。所以Prolog只需要验证X > 250这个条件是否成立,不需要把X的绑定值返回给你,哪怕trace过程中它确实被赋值为320了。
而直接调用cars(ferrari,X)时,X是你查询里的显式变量,Prolog需要找到能让谓词成立的X值,所以会返回X=320。
解决办法
有两种方式可以让你同时验证车型是否更快,并且获取它的速度值:
修改谓词,让它返回速度参数
调整is_faster的定义,把速度作为第二个参数暴露出来:is_faster(Carmodel, Speed) :- cars(Carmodel, Speed), Speed > 250.现在调用
is_faster(ferrari, X),Prolog就会返回X=320,同时确认该车型满足更快的条件。在查询中显式引入变量
如果不想修改原谓词,可以在查询时同时调用cars谓词来获取速度:?- is_faster(ferrari), cars(ferrari, X).这样Prolog会先验证
is_faster(ferrari)成立,然后返回X=320。
额外提示
如果你用trace调试时想查看内部变量X的绑定,可以在trace过程中关注变量的赋值步骤——虽然查询结果不会输出它,但trace日志里应该能看到X被绑定为320的过程,只是因为查询目标里没有这个变量,最终结果不会展示它。
内容的提问来源于stack exchange,提问作者David Edgar
相关产品推荐
相关产品推荐

