Унификация терминов в прологе - PullRequest
1 голос
/ 01 ноября 2019

У меня есть следующие термины:

T1 = f(f(3,Z,2),f(I,Z,G),Z)

T2 = f(F,f(R,f(5,2),D),f(3,2,F))

Я должен объединить эти термины.

Моя идея такова:

G=(3,Z,2)

I=(5,2)

I=(3,2,F)

Я знаю, как объединиться впростые примеры. Кто-нибудь, кто может пролить свет на это для меня? Спасибо

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

Развитие интуиции для объединения действительно ценно как в мире Прологов, так и за его пределами. Поэтому я считаю очень полезным потратить время на изучение того, как найти объединяющие термины вручную! Замечательная вещь об объединении состоит в том, что вы можете рассуждать через объединение простых терминов, используя свою геометрическую интуицию!

Рассмотрите эту прекрасную иллюстрацию из статьи Википедии об объединении для вдохновения:

enter image description here

Учитывая две частичные структуры, 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 для вас, как показано в ответе Дэниела Лайонса!

Желаю вам много веселья в ваших будущих объединениях:)

0 голосов
/ 01 ноября 2019

Я немного удивлен, что вы не просто попросили Пролога сделать это для вас:

?- T1 = f(f(3,R,2),f(A,R,I),A), T2 = f(N,f(E,f(5,2),S),f(3,2,N)), T1=T2.                                                             
T1 = T2, T2 = f(f(3, f(5, 2), 2), f(f(3, 2, f(3, f(5, 2), 2)), f(5, 2), S), f(3, 2, f(3, f(5, 2), 2))),
R = f(5, 2),
A = E, E = f(3, 2, f(3, f(5, 2), 2)),
I = S,
N = f(3, f(5, 2), 2).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...