无法从函数中提取日期(Y、M、D)

Unable to extract date(Y,M,D) from function

我是 Prolog(具体来说是 SWI-Prolog)的极端初学者,我在获取当前工作日时遇到了很多麻烦,尽管我已经能够获取当前的年份、月份、和天数就好了。

currentDate(Today) :-
    get_time(Stamp),
    stamp_date_time(Stamp,DateTime,local),
    date_time_value(date,DateTime,Today).

currentWeekday(Wday) :- day_of_the_week(currentDate(_Today), Wday).

当我在控制台中 运行 currentDate(Today) 时,我得到

Today = date(2016, 11, 30).

所以据我所知,我得到了一个 date() 对象(或者你怎么称呼它)。但是当我尝试在控制台中 运行 currentWeekday(W) 时,它只是 returns false.

您的问题出在这个谓词中:

currentWeekday(Wday) :- day_of_the_week(currentDate(_Today), Wday).

您期望 Prolog 像命令式语言一样工作,就好像 currentDate(_Today) returns 一个值,并且您将该值传递给 day_of_the_week。 Prolog 不是那样工作的。你必须从统一的角度来思考。试试这个:

currentWeekday(Wday) :- currentDate(Today), day_of_the_week(Today, Wday).

请务必注意调用 day_of_the_week(currentDate(_Today), Wday) 的实际含义。它正在调用一个谓词 day_of_the_week/2,第一个参数是 currentDate(_Today)。这个参数只是一个结构——它不以任何方式求值。这就是为什么当您调用 day_of_the_week(date(2016,12,1),D) 时它起作用了——您将作为第一个参数传入结构 date(2016,12,1) 并且谓词能够针对该值进行统一。

注意:没有 "date object" - 它只是一个看起来像 date(2016,12,1) 的结构。您可以在 Prolog 中创建一个看起来像 foo(bar(42),wee(Zip)) 的结构 - 该结构实际​​上是一棵树。