Почему это выражение не унифицировано?
Я определил следующую базу знаний:
leaf(_).
tree(X) :- leaf(X).
и ожидал запрос:
leaf(X) = tree(X).
возвращать true .
потому что любой лист должен по определению быть деревом.
К сожалению, активация трассировки не дает никаких полезных результатов. Вот ссылка на этот минимальный пример, если вы хотите поиграть с ним.
1 ответ
Короткий ответ: вы здесь проверить, если термин leaf(X)
может быть объединен с tree(X)
, Поскольку эти термины состоят из разных функторов, это не удастся.
tree/1
а также leaf/1
в вашем заявлении leaf(X) = tree(X)
не являются предикатами. То, что вы в основном здесь написали:
=(leaf(X), tree(X))
Итак, вы называете (=)/2
предикат, с leaf(X)
а также tree(X)
термины.
Теперь в Прологе два термина можно определить, если:
- это один и тот же атом; или же
- это термин с тем же функтором и арностью, а аргументы элементарно не различимы.
Так как функтор leaf/1
не равно функтору tree/1
, это означает, что leaf(X)
а также tree(X)
не может быть равным.
Даже если бы мы определили предикат с целью проверки, являются ли два предиката семантически одинаковыми, это не получится. Здесь вы в основном стремитесь решить проблему эквивалентности, которая неразрешима. Это означает, что в общем случае нельзя создать алгоритм, который проверяет, принимают ли две машины Тьюринга один и тот же язык. Пролог - это полный язык Тьюринга, мы можем перевести любой предикат на машине Тьюринга и наоборот. Это означает, что мы не можем рассчитать, если два предиката принимают один и тот же вход.