Пролог - объединение символов (или терминов?) - PullRequest
0 голосов
/ 27 июля 2011

(Простите, если моя терминология неверна ... Я новичок в Прологе.)

Предположим, у вас есть ряд символов, встречающихся в неизвестном количестве предикатов.

f1(a, b, c, d).
f2(b, b, c).
...
fn(b, d, e).

Позже - во время выполнения - вы понимаете, что термины a и b совпадают, и вы хотите объединить их или заменить один из них другим. Другими словами, я бы хотел:

  • Марка a = b
  • Заменить все экземпляры a на b
  • Заменить a и b новым символом (сделанным через gensym / 2)
  • ... или что-то еще, что выполняет это

... где я не знаю, какие предикаты используют эти термины.

1 Ответ

3 голосов
/ 27 июля 2011

Атомы, которые начинаются с заглавных букв, являются переменными. Первый шаг - использовать A и B. Если в какой-то момент вы решите, что две переменные на самом деле равны, просто скажите это A = B. Процесс логического утверждения, что одно = другое - это «объединение».

например.

veryDifferentOrTheSame(A,B) :- veryDifferent(A,B).
veryDifferentOrTheSame(A,B) :- A = B.

Конечно, объединение не всегда будет работать. a(X) = b(X) потерпит неудачу.

Все это означает, что когда код был написан, вы знали, что не уверены, что A = B.

Вы также можете динамически утверждать предложения во время выполнения. Объявление предложения как динамического и использование ассемблера или ассертца.

Но если вы укажете:

iOwn(goldfish).
iOwnFish :- iOwn(fish).

и затем захотите выполнить эту работу, сказав: «в моей вселенной рыба = золотая рыбка», тогда вы попадаете на странную территорию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...