我有以下代码,它将树展平为列表
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以允许它工作?
答案 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/2
(Th is Ah
),则在您的子句中强加一个方向:第一个参数可以与第二个参数的值统一,但第二个参数可以与第二个参数统一第一个的价值。