这是来自立即学习Prolog 的练习3.5。他们在解释列表之前把它放在一边,所以我需要一个不涉及列表的程序。
任务是交换嵌套二叉树的叶子。如果查询是
swap(tree(tree(leaf(1), leaf(2)), leaf(4)), T).
答案应该是
T = (tree(leaf(4), tree(leaf(2), leaf(1))).
用
swap((X, Y), (Y, X)).
swap(tree(X, Y), T) :-
swap((X, Y), (Y, X)),
T = (Y, X).
我得到了
T = (leaf(4), tree(leaf(1), leaf(2))).
如您所见,leaf(1)
和leaf(2)
未被交换。我想要一些提示甚至你的程序,它应该适用于任何深度的节点。谢谢。
答案 0 :(得分:6)
你有一个基础案例交换叶子,一般情况交换树! 对于一片叶子,无事可做:
swap(leaf(X), leaf(X)).
当您交换树时,您也必须交换树叶,所以
swap(tree(X,Y), tree(Y1,X1)) :-
swap(X,X1),
swap(Y,Y1).