Prolog返回免费日的清单

时间:2015-02-19 00:16:31

标签: prolog

我有一个问题(再次:))。我们假设我们有以下数据: 第一个数字是月份的第二天,第三个是事件

day(1,1, 'New Year')
day(1,1, 'The day after the new year')
day(23,1, 'The day i will finally understand this language :)')
day(14,2, 'Valentin's day')
day(16,2, 'Family day')
day(22,2, 'hein.. dont now lol')

nday(1,31).
nday(2,28).
nday(3,31).
nday(4,30).
nday(5,31).

我要求创建一个谓词,以便给定Day,它返回一个月(仅当给定的一天没有事件时。例如freeDay(23,X)。{{1}如果X等于4,它应该保持为1(如果我们进入半冒号,它将返回2,因为第4天也没有2月的任何事件。我有更多的数据。所以我做了以下但我得到了值0.

X

你能告诉我我做错了吗?

1 个答案:

答案 0 :(得分:1)

您的代码的作用:

  1. 致电freeDay(23,X)freeDay(X,Answer)成功拨打freeDay(X, 1, Answer)
  2. Prolog首先检查哪些谓词可以用当前输入执行。
  3. 它发现freeDay(_, Month,0):- Month > 12, !.不适用,因为月份是1,它会移动到下一个谓词。
  4. freeDay(Day, Month,X)适用,它的作用是增加月份并调用自身(递归)。
  5. 当最终超过12时,月份不断增加。记住每次调用谓词时prolog会检查第一个谓词是否适用。因此,这次freeDay(_, Month,0):- Month > 12, !成功。
  6. freeDay(_, Month,0):- Month > 12, !.通过使用剪切注释!来中断循环(递归)并返回在这种情况下为0的Answer。 (用简单的英语在这里你说无论哪一天,如果月份大于12,则返回0.这是最后执行的语句。)
  7. 我希望你明白什么是错的。一般来说,逻辑编程需要在框外思考。你需要第一次理解这个问题,然后以简单的方式尝试解决