Prolog返回日期和与之相关的事件

时间:2015-02-18 03:21:00

标签: prolog

那么大家好,我已经在这个问题上工作了几个小时,但我可以解决它,如果你们能给我一些很棒的提示! 这个问题很长,但我相信我所看到的解决方案不会超过5行。

所以我给了一堆数据,让我们说:

day(1,1, 'New Year')
day(2,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).

如果我输入DayofTheMonth(1,L),那么L是List和1月1日, 我应该返回一个列表,列出该月的所有日期和事件。 在这种情况下,它应该是:[(1,'New year', (2,'The day after the new year'), (23, 'The day i will finally understand this language :)')]。这就是我所做的:(我甚至不知道基本情况smh)我很抱歉,我知道 这个解决方案是错的,它甚至没有处理没有事件的日子, 但我只是不知道去哪里,我只是提供反馈或其他东西

dayoftheMonth(X, L):- nday(X,Answer), 
                  dayMonth(X, Answer, L).
dayMonth(X,Y,[_|B]):- 
    X=<Y,
    day(Day, X, Event),
    W is Day + 1,
    dayMonth(X,W,[(Day,Event)|B]). 

1 个答案:

答案 0 :(得分:0)

您可以使用谓词findall/3。谓词有三个参数:

  • template,输出格式
  • goal,您调用的谓词应匹配
  • bag,返回谓词列表。

所以dayofTheMonth只读:

dayofTheMonth(Month,List) :-
    findall((Day,Event),day(Month,Day,Event),List).

如果你想在没有findall的情况下解决它,你可以通过迭代所有天来解决它,直到天数。因此基本已超过该月的天数。

dayofTheMonth(Month,Day,[]) :-
    nday(Month,Threshold),
    Day > Threshold,
    !.

归纳案例总是查看当天是否有计划的事件,如果是,你把它作为列表的头部并在第二天附上事件,如果没有这样的事件,结果列表是接下来几天的清单。所以:

dayofTheMonth(Month,Day,[(Day,Event)|T]) :-
    day(Day,Month,Event),
    !,
    Day1 is Day+1,
    dayofTheMonth(Month,Day1,T).
dayofTheMonth(Month,Day,T) :-
    Day1 is Day+1,
    dayofTheMonth(Month,Day1,T).

最后,您只需将谓词dayOfTheMonth/2dayOfTheMonth/3关联起来 - 明显地 - 按天1开始。

dayofTheMonth(Month,Events) :-
    dayofTheMonth(Month,1,Events).

所以完整的代码是:

day(1,1, 'New Year').
day(2,1, 'The day after the new year').
day(23,1, 'The day i will finally understand this language :)').
day(14,2, 'Valentins 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).

dayofTheMonth(Month,Day,[]) :-
    nday(Month,Threshold),
    Day > Threshold,
    !.

dayofTheMonth(Month,Day,[(Day,Event)|T]) :-
    day(Day,Month,Event),
    !,
    Day1 is Day+1,
    dayofTheMonth(Month,Day1,T).
dayofTheMonth(Month,Day,T) :-
    Day1 is Day+1,
    dayofTheMonth(Month,Day1,T).
dayofTheMonth(Month,Events) :-
    dayofTheMonth(Month,1,Events).