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
相关产品推荐
相关产品推荐

