2016-12-01 3 views
0

私はProlog(SWI-Prolog、具体的には)の極限な初心者ですが、現在の平日の取得には苦労しています。現在の年、月、日の数字をうまく取得できました。私はちょうどコンソールでcurrentDate(Today)を実行すると関数から日付(Y、M、D)を取り出すことができません

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). 

、私はだから私は私の知る限りdate()オブジェクト(または何でもあなたはそれを呼び出す)を取得しています

Today = date(2016, 11, 30). 

を取得します。

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

あなたはcurrentDate(_Today)が値を返すかのようにプロローグが命令型言語と同じように動作することを予想している:私は、コンソールでcurrentWeekday(W)を実行しようとする。しかし、それだけでfalse.

+0

あなたは 'currentWeekday(w)'または 'currentWeekday(W)'を実行しようとしていますか? – Enigmativity

+0

currentWeekday(W)< - 大文字。それをキャッチするためにありがとう。私は説明を編集しました。 – UnworthyToast

+0

コードはうまく動作します。 '? - currentDate(W).'は' W = date(2016、12、1) 'を返します。 – Enigmativity

答えて

2

あなたの問題は、この述語であるを返しますその値をday_of_the_weekに渡していることを確認してください。プロローグはそのようには機能しません。あなたは統一に関して考える必要があります。試してみてください:

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

day_of_the_week(currentDate(_Today), Wday)の呼び出しが実際に意味することに注意することが重要です。最初のパラメータがcurrentDate(_Today)である述語day_of_the_week/2を呼び出しています。このパラメータは単なる構造体です。これは決して評価されません。そのため、day_of_the_week(date(2016,12,1),D)を呼び出すと、最初のパラメータとして構造体date(2016,12,1)が渡され、述語がその値に対して統一できます。

NB:「日付オブジェクト」はありません。それはdate(2016,12,1)のような構造に過ぎません。 foo(bar(42),wee(Zip))のようなPrologの構造を作ることができます。その構造は効果的にはツリーです。

+0

ありがとう、ありがとう!私の次のステップは、あなたが言ったようなものを試してみることでしたが、私の人生では、それをどうやって行うのか分かりませんでした。今私は、統一する方法をちょっと考えていたことを知っています。 – UnworthyToast

+0

最後に追加の説明もありがとうございます。 – UnworthyToast

関連する問題