Это работает в моем SWI-прологе:
leaf_rule(leaf) --> "*".
tree_rule(X) --> leaf_rule(X), !.
tree_rule(node(X,Y)) --> "(", tree_rule(X), tree_rule(Y), ")".
Чтобы разобрать строку, вам необходимо вызвать предикат phrase
, например:
phrase(tree_rule(X), "((**)*)", Rest).
Пролог объединитX с абстрактным представлением дерева из строки.