我根据问题中提供的信息建立了这个知识库:
student(jill,12071992,computer_science,[tennis,lacrosse]).
student(joe,14021993,mathematics,[tennis,rugby,football]).
代表学生的姓名,出生日期,主题以及他们所参加的运动。
问题1 -
born_before(N,Y) -
名为N的学生在Y年之前出生。
born_before(N,Y):-student(N,____X,_,_), Y > X.
显然上面不起作用,我的问题是我不知道如何在prolog中将YYYY与DDMMYYYY术语分开,然后将其设置为X,因此可以将其与Y值进行比较。
问题2 -
plays_sport(N,S) -
名为N的学生参加体育赛事。
我的尝试
plays_sport(N,S):-student(N,_,_,[S|Sx]), plays_sport(N,Sx).
这总是返回false。我试图使用尾递归,以便从知识库中的运动列表中匹配这项运动。
答案 0 :(得分:0)
对于问题的第一部分,您可以编写规则,从表示ddmmyyyy格式的日期的整数中提取年份,月份和日期,如下所示:
extract_year(DDMMYYYY, YYYY) :- YYYY is mod(DDMMYYYY, 10000).
extract_day(DDMMYYYY, DD) :- DD is DDMMYYYY // 1000000.
extract_month(DDMMMYYYY, MM) :- DDMM is DDMMMYYYY // 10000, MM is mod(DDMM, 100).
当从答案中删除小数部分时, //
运算符表示整数除法。 mod/3
是用于查找整数除法的余数的操作。
然后您可以将它们组合回yyyymmdd格式,并作为整数进行比较(demo)。
对于第二部分,您可以使用memberchk(Element, List)
检查列表中是否存在所需的运动:
plays_sport(N,S) :- student(N,_,_,AllSports), memberchk(S, AllSports).