SWI-Пролог 7.6.4:
?- dif (X, f(Y)), X=f(a).
X = f(a),
dif (f(f(a), Y), f(f(Y), a)).
Обратите внимание, что я использую f/1 в запросе, но ограничение на f/2. Это не неправильно, но кажется довольно окольным путем. Почему Пролог не возвращается
?- dif (X, f(Y)), X=f(a).
X = f(a),
dif (Y, a).
Этот f в печатном ограничении не имеет ничего общего с вашим f. Это просто заполнитель для хранения подтерминов вместе:
?- dif (X, incal(Y)), X=incal(a).
X = incal(a),
dif (f(incal(a), Y), f(incal(Y), a)). <--- residual constraints, not yet resolved
Вышеупомянутое означает именно это:
incal(a)
должен отличаться от incal(Y)
; иY
должен отличаться от a
Да, вы могли бы упростить это, но... когда можно знать, будет ли оптимизация стоить меньше, чем выиграете?
Я понимаю. Хотя все равно странно. Он мог бы указать оба ограничения (или только последнее), не изобретая f/2.
@MaxB Я полагаю, что это просто способ избежать лишнего кода или где-то увеличить скорость.
Кажется ошибкой ... извините, у меня нет конструктивного ответа, скорее всего, вам следует опубликовать дискурс SWI-Prolog. Ян В. всегда обеспечивает быстрый и точный анализ и исправления