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

时间:2016-12-01 03:37:02

标签: prolog swi-prolog

我是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)时,它只返回false.

1 个答案:

答案 0 :(得分:2)

你的问题在于这个谓词:

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

您预计Prolog会像命令式语言一样工作,就像currentDate(_Today)返回一个值一样,并且您将该值传递给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(2016,12,1)的结构。您可以在Prolog中创建一个看起来像foo(bar(42),wee(Zip))的结构 - 该结构实际​​上是一棵树。