Обратимое отношение длины дерева

Я пытаюсь написать обратимые отношения в "чистом" Прологе (нетis, вырезать или аналогичные вещи. Да, это домашнее задание), и я должен признать, что понятия не имею, как. Я не вижу никакого процесса, чтобы создать такую вещь.

Нам даны «нечистые», но обратимые арифметические отношения (сложение, многовариантность, равенство, меньше, ...), которые мы должны использовать для создания этих отношений.

Прямо сейчас я пытаюсь понять, как создать обратимые функции путем создания отношенияtree(List,Tree) что верно, еслиList список листьев бинарного дереваTree.

Чтобы добиться такого, я пытаюсь создатьtree_size(Tree,N) отношение, которое верно, когдаTree имеетN уходит. Вот мое наивное, необратимое отношение:

tree_len(n(_,leaf,leaf),1).
tree_len(n(op,G,D),N) :-
    tree_len(G,TG),
    tree_len(D,TD),
    add(TG,TD,N).

Я могу сделать запросtree_len(some tree, N)но не, скажем,tree_len(X,3), так что это не обратимо. Пока что я попробовал несколько вещей, но я должен признать, что я чувствую себя обескураженным, потому что я не знаю, где и что искать. Есть ли на самом деле способ сделать это?

Ответы на вопрос(2)

Ваш ответ на вопрос