Пролог: Можно ли заставить предикат вести себя по-разному в зависимости от того, является ли значение основательным или нет?

У меня есть несколько сложный предикат с четырьмя аргументами, которые должны работать, когда первый и последний аргументы являются заземлением / не заземлением, а не заземлением / заземлением или заземлением / заземлением, а второй и третий аргументы - заземлением.

то есть предикат (A,B,C,D).

Я не могу предоставить свой фактический код, так как он является частью назначения.

У меня это в основном работает, но я получаю ошибки инстанцирования, когда A не заземлен, но D есть. Тем не менее, я выделил строку кода, которая вызывает проблемы. Когда я изменяю порядок цели предиката, он работает, когда D - заземление, а A - нет, но при этом он больше не работает, когда A - заземление, а D - нет. Я не уверен, что есть способ обойти это.

Есть ли способ использовать обе строки кода, так что если A, например, заземлен, он будет использовать первую строку, но если A не заземлен, он будет использовать вторую и игнорировать первую? И наоборот.

1 ответ

Вы можете сделать это, но почти всегда вы нарушите декларативную семантику ваших программ, если вы это сделаете.

Рассмотрим простой пример, чтобы увидеть, как такой немонотонный и экстралогический предикат уже нарушает основные предположения и типичные декларативные свойства известных предикатов, такие как коммутативность соединения:

? - земля (X), X = a.
ложный.

Но, если мы просто поменяемся целями по коммутативности соединения, мы получим другой ответ:

? - X = a, земля (X).
Х = а.

По этой причине таких мета-логических предикатов лучше избегать, особенно если вы только начинаете изучать язык.

Вместо этого лучше остаться в чистом и монотонном подмножестве Пролога. Используйте ограничения как dif/2 и CLP(FD), чтобы сделать ваши программы пригодными для использования во всех направлениях, повышая универсальность и простоту понимания.

Посмотрите логическую чистоту, prolog- dif и clpfd для получения дополнительной информации.

Другие вопросы по тегам