2017-06-01 8 views
1

私は正直なとこれを宿題と言ってこれを序文しますが、私は必然的に助けが必要です。Prolog:2つのオブジェクト間の相違の関係

私はPrologを初めて使用しています.C++とJavascriptを使用していますが、試してみても問題はありません。

私がしなければならないことは、2つの日付の違いを見つけることができることです(うるう年でないと仮定します)。

は、基本的に私は次のようにレイアウト情報を有する知識ベースを有する:A月表し

object(A, B). 
    object(A, B). 
    ... 

およびBは、月の総日数を表します。 (。。例えば、オブジェクト(1、31))

Iを入力するために使用することになってい表現はこれです: 差(オブジェクト(A、B)、オブジェクト(A、B)、N)。 (N =オブジェクト間の差異)。

私はいくつかの異なるものを試してみました(と私は、これは正しい軌道に乗っていないことを知っている)し、さらに取得することができていない:

difference(object(A,B), object(A,B),N):- 
    days(M,D), days(M,D), 
    Y = 365-D, 
    N is Y. 

私が作る方法を理解していません2つのオブジェクトは私が操作することができる個々のものとして登録し、したがって問題を継続します。

誰かが正しい方向に向いていますか?

ありがとう

宿題(AS REQUESTED)。 閏年以外の各暦月に何日いるかを示す日関係が存在するとします。

days(1,31). 
days(2,28). 

(など)。

構造体dateObject(M、D)は日付を表します。たとえば、dateObject(6,5)は6月5日を表します。 リレーションの差(From、To、N)を書き込みます。ここで、Nは開始までの日数です。 開始日と終了日To。開始日はカウントに含まれません。 例えば:

?- difference(dateobject(2,1),dateobject(2,2),N). 
N = 1. 

日付で日または月の値は、例えばDateオブジェクト(4,31)(無効な場合、Dateオブジェクト(13,1)、その後Nの 値は-1でなければなりませんが返されます。日付から、ここでは本当に悪いソリューションです後で、その後により-1エラー値もN.

+0

"オブジェクト間の違い"とは何ですか? – Enigmativity

+0

私はあなたが「2つのオブジェクトを私が操作できる個々のものとして登録する」という意味を理解していませんか? – Enigmativity

+0

@Enigmativity基本的にオブジェクトは1ヶ月の日数を表します。 日(1,31)。 差異(dateobject(4,30)、dateobject(5,15)、N)です。 – TheLeftRight

答えて

1

のために返されるべきである - 私は私がより良い何かを考え出すだろうよりも、誰かが賢く確信している

?- difference(dateobject(1,28),dateobject(6,1),N),write(N),nl. 

days(1,31). 
days(2,28). 
days(3,31). 
days(4,30). 
days(5,31). 
days(6,30). 
days(7,31). 
days(8,31). 
days(9,30). 
days(10,31). 
days(11,30). 
days(12,31). 

daysbetween(M,FD,M,TD,N) :- !, N is TD - FD. 
daysbetween(FM,FD,TM,TD,N) :- 
    days(FM,D), 
    FM2 is FM + 1, 
    daysbetween(FM2,FD,TM,TD,N2), 
    N is D + N2. 

difference(dateobject(FM,FD),dateobject(TM,TD),N) :- 
    TM >= FM, 
    FD >= 1, 
    days(FM,FDM), 
    FD =< FDM, 
    TD >= 1, 
    days(TM,TDM), 
    TD =< TDM, 
    daysbetween(FM,FD,TM,TD,N), 
    N > 0, 
    !. 
difference(_,_,-1). 
+0

私はすぐにそれをテストし、あなたに戻ってきます。それは悪いとは言わないでください、それは私が思い付いたものより良い方法です、あなたは私がここに私に与えてくれたすべての助けにどれほどの感謝をしているのか分かりません。一度私のコンピュータに戻ってテストします – TheLeftRight

+0

サー、あなたは文字通りの伝説です。 – TheLeftRight

関連する問題