Почему это выражение не унифицировано?

Я определил следующую базу знаний:

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) термины.

Теперь в Прологе два термина можно определить, если:

  1. это один и тот же атом; или же
  2. это термин с тем же функтором и арностью, а аргументы элементарно не различимы.

Так как функтор leaf/1 не равно функтору tree/1, это означает, что leaf(X) а также tree(X) не может быть равным.

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

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