获取用户输入的日期并在prolog中解析它

时间:2014-04-26 15:08:56

标签: prolog swi-prolog

我希望将用户生日作为输入并打入部分。像年,月,日。 怎么做。请帮我。我不知道该怎么做。

提前致谢。

2 个答案:

答案 0 :(得分:2)

这是另一种选择,但我必须说我更喜欢Grzegorz指出的方法:

?- read_line_to_codes(user_input,L), phrase((integer(Y),"-",integer(M),"-",integer(D)),L).
|: 2012-12-22
L = [50, 48, 49, 50, 45, 49, 50, 45, 50|...],
Y = 2012,
M = 12,
D = 22.

你必须包括'合适的图书馆......

?- [library(dcg/basics)].

答案 1 :(得分:1)

让用户输入日期作为字符串并使用parse_time/2stamp_date_time/3

示例:

?- parse_time('2012-05-05 12:56:33', Stamp), 
stamp_date_time(Stamp, DateTime, 'UTC'), 
DateTime = date(Year, Month, Day, Hour, Minute, Seconds, _, _, _).

Stamp = 1336222593.0,
DateTime = date(2012, 5, 5, 12, 56, 33.0, 0, 'UTC', -),
Year = 2012,
Month = Day, Day = 5,
Hour = 12,
Minute = 56,
Seconds = 33.0.

用户无需输入完整的日期和时间。年,月和日足以让parse_time / 2工作。还有其他谓词来操纵日期和时间。请参阅此处的SWI-Prolog文档:Time and date predicates

<强>更新

go :-
    write('Please enter your birthday [YYYY-MM-DD]'), nl,
    read_string(Birthday),
    parse_time(Birthday, Stamp),
    stamp_date_time(Stamp, DateTime, 'UTC'),
    DateTime = date(Year, Month, Day, _, _, _, _, _, _),
    print('Year: '), print(Year), nl,
    print('Month: '), print(Month), nl,
    print('Day: '), print(Day), nl.

read_string(String) :-
    current_input(Input),
    read_line_to_codes(Input, Codes),
    string_codes(String, Codes).

示例输入和输出:

?- go.
Please enter your birthday [YYYY-MM-DD]
|: 1985-01-09
Year: 1985
Month: 1
Day: 9
true.