Prolog中的条件

时间:2016-01-05 21:53:07

标签: prolog swi-prolog

如果下面没有提供月份和年份,我的谓词monthyear会返回当前月份。

monthyear(M,Y) :-
    get_time(Stamp),
    stamp_date_time(Stamp, DateTime, local),
    date_time_value(month, DateTime, M),
    date_time_value(year, DateTime, Y).

如果提供月份和年份,则返回提供的月份和年份。 为实现这一点,我在下面编写了以下代码。

cal(X,Y,Z1,Z2):-
    Z1 is X,
    Z2 is Y.

cal(X,Y,Z1,Z2):-
    X == null,
    Y == null,
    monthyear(Z1,Z2).

但是我确信这段代码可以改进,我也遇到了错误

ERROR: is/2: Arguments are not sufficiently instantiated

我怎样才能做到这一点?。

X=1,Y=2,cal(X,Y,Z1,Z2).
returns
Z1 = X
Z2 = Y

cal(X,Y,Z1,Z2).
returns
Z1 = 1,
Z2 = 2016

1 个答案:

答案 0 :(得分:1)

您可以使用两个版本的cal

cal(X,Y,Z1,Z2):-
    Z1 is X,
    Z2 is Y.

cal(Z1,Z2):-
    monthyear(Z1,Z2).

如果您致电cal(2, 2015, Z1, Z2),您将获得

Z1 = 2,
Z2 = 2015.

如果您致电cal(Z1, Z2),您将获得(今天)

Z1 = 1,
Z2 = 2016.