2016-01-05 2 views
1

У меня есть предикаты 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 
+0

'== null'? Что значит «== null»? –

+0

Кроме того, пожалуйста, укажите запрос и примеры. Мне немного непонятно, чего вы хотите достичь ... –

+0

Это означает, что если значения X и Y не предоставляются родительским предикатом. –

ответ

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. 
Смежные вопросы