我是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.
答案 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))
的结构 - 该结构实际上是一棵树。