You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prolog谓词编写求助:判断X是否比Y年长的代码排查

问题排查与修正

你的older/2谓词思路没问题,但核心的before/2谓词在处理同年同月的日期比较时,规则写反啦!

错误原因分析

原代码里的第三个before规则:

before(date(Day1, Month, Year ), date(Day2, Month, Year)) :- Day1 > Day2.

这个逻辑完全搞反了——要判断date(Day1, ...)在date(Day2, ...)之前,同年同月的情况下应该是Day1 < Day2,比如20号肯定比25号更早,而不是反过来。

修正后的完整代码

把第三个规则的比较符号改成<就可以解决问题:

born(jan, date(20, 3, 1977)).
born(joris, date(17, 3, 1995)).
born(jesus, date(24, 12, 0)).
born(joop, date(30, 4, 1989)).

before(date(_, _, Year1), date(_, _, Year2)) :- Year1 < Year2.
before(date(_, Month1, Year ), date(_, Month2, Year)) :- Month1 < Month2.
before(date(Day1, Month, Year ), date(Day2, Month, Year)) :- Day1 < Day2.  % 这里修正为<

older(X, Y) :- X \= Y, born(X, B1), born(Y, B2), before(B1, B2).

验证结果

现在执行查询?- older(jesus, Y).,就能得到你预期的结果:

Y = jan ;
Y = joris ;
Y = joop.

内容的提问来源于stack exchange,提问作者taikikun

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 06:37:55