选择数字的一部分并在Prolog中检查列表

时间:2015-01-07 18:10:18

标签: prolog

我根据问题中提供的信息建立了这个知识库:

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。我试图使用尾递归,以便从知识库中的运动列表中匹配这项运动。

1 个答案:

答案 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).