无法从函数中提取日期(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))
的结构 - 该结构实际上是一棵树。
我是 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))
的结构 - 该结构实际上是一棵树。