2016-04-21 7 views
1

Ich habe versucht, 2 Daten in Prolog zu vergleichen.Prolog Erhalten Sie die Unterschiede in Tagen zwischen zwei Daten

Die Termine Format ist Datum (YYYY, MM, DD)

ex: (2016,04,21).

Ich möchte zwei Daten vergleichen und wissen, ob die Differenz (in Tagen) zwischen diesen Daten größer als 15 Tage (2 Wochen) ist.

%dateDifference(number_of_day, date_no1, date_no2). 
dateDifference(35, date(2003,8,16), date(2003,9,20)). 
+2

Sie sagen: "Ich habe es versucht". Sie sollten zeigen, was Sie versucht haben und erklären, warum es nicht funktioniert hat und wo Sie stecken bleiben. –

+2

Check [** Bibliothek (julianisch) **] (https://github.com/mandrix/julian) von Michael Hendricks für eine sehr elegante und allgemeine Art, über Daten in Prolog nachzudenken. – mat

+0

@mat, wenn ich versuche, dieses Paket (PDT-SWI) zu installieren Ich habe diesen Fehler: 'Fehler: [Thread pdt_console_client_0_Default Process] make_directory/1: Keine Berechtigung zum Erstellen von Verzeichnis c:/Programmdateien/swipl/pack '' (Berechtigung verweigert) 'auch ist es nicht Arbeit in sisctus –

Antwort

2

die Differenz in Tagen zwischen zwei Daten-Computing kann einfache oder schwierige je nach Kalender und auf den abgedeckten Perioden sein. Unter der Annahme des Gregorianischen Kalenders besteht die übliche Lösung darin, die Daten in Julianische Tage zu konvertieren.Wie @mat in seinem Kommentar für SWI-Prolog erwähnt, betrachten Sie die library(julian);

https://github.com/mndrix/julian

Für eine tragbare Lösung, die mit den meisten Prolog-Systemen (einschließlich SWI-Prolog) verwendet werden kann, umfasst Logtalk eine Drittanbieter-ISO 8601-Bibliothek, die für diese Berechnungen verwendet werden kann:

http://logtalk.org/library/iso8601_0.html

0

zunächst einmal, sollten Sie die Notiz von @Boris Konto setzen, zweite, , um das Problem, Ihr Prädikat in drei Teile geteilt zu vereinfachen:

Teil 1:

  • wissen, ob das Jahr ist Sprung oder gemeinsame,
  • beeinflussen die Anzahl der Tage für jeden Monat,
  • Schließlich folgt dieser Teil der folgenden Schuldenregel;

Code:

calcule_days([Y,M,D],Res):- 
    Res is (((Y*1461)/4)+((M*153)/5)+D). 

Teil 2:

  • berechnet die Differenz zwischen den beiden Daten so
  • die formula (Part1) gelten mit date1 und date2,
  • berechnen die Unterschiede zwischen den beiden Ergebnissen difference_date1_date2,
  • das negative Vorzeichen zu vermeiden abs(difference_date1_date2)
  • hinzufügen round (result_abs_pred)

Demo-Code ein Wertansatz zu erhalten:

dateDifference(NumberOfDays,date(YEAR1,MONTH1,DAY1),date(YEAR2,MONTH2,DAY2)):- 
      ... 

Teil3:

  • Prüfung, ob das Ergebnis >= 15, Ergebnis muss True/false
  • sein

Demo-Code:

bigger_2weeks(date(YEAR1,MONTH1,DAY1),date(YEAR2,MONTH2,DAY2)):- 
... 
+0

Der direkte Weg, dies zu tun wäre, die beiden' date (Jahr, Monat, Tag) 'in Sekunden zu konvertieren, seit einem bestimmten Zeitpunkt mit einer richtigen Bibliothek, wie üblich, dann mach den Unterschied und verwandle das in Tage oder Wochen oder was auch immer. –

+0

@Boris, Ich versuche, Bibliothek (Julian) hinzuzufügen, aber ich kann nicht mit beiden SP SP und Swi-PDT –

+0

Sie brauchen keine Bibliothek (Julian), zumindest für SWI-Prolog: Es gibt eine [Bibliothek, die behandelt mit Daten] (http://eu.swi-prolog.org/pldoc/man?section=timedate). –