У меня есть следующий код, который сглаживает дерево в списокКак отождествлять списки в прологе?
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, чтобы он мог работать?
Вы говорите о '' 'treeMatch'', проверяя, имеют ли списки те же элементы. Но используя '' 'is/2''', вы проверяете,' '' 'Ah''' арифметически оценивается' '' Th'''. Поэтому '' 'treeMatch ([2], [1 + 1])' '' будет успешным, но также не будет '' 'treeMatch (X, foo)' '' и '' 'treeMatch (2, X)' '' (первое, потому что foo не является арифметическим выражением, а второе, потому что оценка может быть выполнена только на земных условиях). Это ожидаемое поведение? Мое подозрение в том, что вы действительно хотите проверить '' 'L1 = L2'''. –