如何在prolog中等同列表?

时间:2016-12-05 18:23:16

标签: list recursion prolog

我有以下代码,它将树展平为列表

tree_list(leaf(Leaf)) --> [Leaf].
tree_list(node1(Leaf, Node)) -->
        [Leaf],
        tree_list(Node).
tree_list(node2(Leaf, Node1, Node2)) -->
        tree_list(Node1),
        [Leaf],
        tree_list(Node2).
tree_list(node3(_, Node1, Node2, Node3)) -->
        tree_list(Node1),
        tree_list(Node2),
        tree_list(Node3).

示例查询和回答:

?- phrase(tree_list(node3(1,
                     node1(2, leaf(1)),
                     node2(3, leaf(1), leaf(1)),
                     node1(4, leaf(1)))), Ls).
Ls = [2, 1, 1, 3, 1, 4, 1].

我写了一段匹配的代码,看两个列表是否有相同的元素列表。

treeMatch([], []).
treeMatch([Th| Tt], [Ah| At]) :- Th is Ah, treeMatch(Tt, At).

上面只是通过一个列表,检查两个列表中的每个索引是否具有相同的元素,直到它们到达空列表。

尝试使用treeMatch([2, 1, 1, 3, 1, 4, 1], [2, 1, 1, 3, 1, 4, 1])的代码返回true。

但是,如果我尝试

treeMatch([2, 1, 1, 3, 1, 4, 1], phrase(tree_list(node3(1,
                     node1(2, leaf(1)),
                     node2(3, leaf(1), leaf(1)),
                     node1(4, leaf(1)))), Ls)).

我弄错了。有没有办法检索Ls的值并将其直接插入到treeMatch以允许它工作?

1 个答案:

答案 0 :(得分:1)

您以错误的方式致电threeMatch/2

如果你打电话

treeMatch([2, 1, 1, 3, 1, 4, 1], phrase(tree_list(node3(1,
                     node1(2, leaf(1)),
                     node2(3, leaf(1), leaf(1)),
                     node1(4, leaf(1)))), Ls))

您询问列表[2, 1, 1, 3, 1, 4, 1]是否等于结构phrase(tree_list(node3...,而不是它是否等于Ls

您应该分两次通话分组,如下所示

phrase(tree_list(node3(1,
                       node1(2, leaf(1)),
                       node2(3, leaf(1), leaf(1)),
                       node1(4, leaf(1)))), Ls),
treeMatch([2, 1, 1, 3, 1, 4, 1], Ls)

所以第一个电话(phrase/2)与Ls统一[2, 1, 1, 3, 1, 4, 1]treeMatch/2验证[2, 1, 1, 3, 1, 4, 1]Ls匹配。

- 编辑 -

OP写

  

我用你的方法尝试了吗? - treeMatch([2,3,4],E)。错误:user:// 3:74:是/ 2:参数没有充分实例化。

建议:致电treeMatch(E, [2, 3, 4])或(我认为更好)修改treeMatch/2,如下所示

treeMatch([H | Tt], [H | At]) :- treeMatch(Tt, At).

如果您使用is/2Th is Ah),则在您的子句中强加一个方向:第一个参数可以与第二个参数的值统一,但第二个参数可以与第二个参数统一第一个的价值。