Развитие интуиции для объединения действительно ценно как в мире Прологов, так и за его пределами. Поэтому я считаю очень полезным потратить время на изучение того, как найти объединяющие термины вручную! Замечательная вещь об объединении состоит в том, что вы можете рассуждать через объединение простых терминов, используя свою геометрическую интуицию!
Рассмотрите эту прекрасную иллюстрацию из статьи Википедии об объединении для вдохновения:
Учитывая две частичные структуры, t1
и t2
, мы можем найти объединитель, сравнивая части структур, чтобы сопоставить отсутствующие биты в одном с существующимбиты в другом. В Прологе пропущенными битами в структуре являются переменные .
Возвращаясь к вашему вопросу, давайте сделаем немного ascii искусства, чтобы сделать структуру ваших двух терминов более наглядной.
T1 = f( f(3, R, 2), f(A, R ,I), A )
% | | | | | | |
T2 = f( N , f(E, f(5, 2),S), f(3, 2, N) )
Здесь представлены те же составные термины, только они разнесены, и я добавил каналы, совпадающие с частями терминов, которые должны координироваться, чтобы выяснить объединение. Обратите внимание, что каналы также соединяют термины, которые не являются переменными. Это важно, потому что, если бы в структуре были какие-то несоответствующие базовые термины, тогда наше объединение просто провалилось бы.
Считывание слева направо, первая переменная, с которой мы сталкиваемся, это N
. Следуя трубе, мы видим, что N
должно быть объединено с составным термином f(3, R, 3)
, иначе структуры не смогут совпадать, и объединение не будет выполнено. Итак, мы знаем, что N = f(3, R, 3)
.
Следующие переменные: A
и E
. Действительно, они скоординированы, поэтому мы знаем, что A = E
, но у нас пока недостаточно информации, чтобы сказать больше.
Следующая переменная, которую мы видим, - R
. Это согласуется с составным термином f(5, 2)
, поэтому мы должны иметь R = f(5, 2)
. Это дает нам первое объединение переменной с основным термином! Так как мы знаем основной термин, который должен объединиться с R
, мы также можем заполнить пропущенное отверстие из нашего предыдущего объединения для N
: N = f(3, R, 4) = f(3, f(5, 2) 3)
.
Продолжайте в пути, и вы 'в итоге вы получите тот же результат, что и Prolog для вас, как показано в ответе Дэниела Лайонса!
Желаю вам много веселья в ваших будущих объединениях:)