那么大家好,我已经在这个问题上工作了几个小时,但我可以解决它,如果你们能给我一些很棒的提示! 这个问题很长,但我相信我所看到的解决方案不会超过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]).
答案 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/2
与dayOfTheMonth/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).