2016-12-05 2 views
1

У меня есть следующий код, который сглаживает дерево в списокКак отождествлять списки в прологе?

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

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

ответ

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.

Вы должны разделить вызов в 2 вызова следующим

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.

- EDIT -

ОП записи

I tried it with your method and got ?- treeMatch([2, 3, 4], E). ERROR: user://3:74: is/2: Arguments are not sufficiently instantiated .

Предложение: вызов treeMatch(E, [2, 3, 4]) или (лучше, я полагаю) изменить treeMatch/2 следующим

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

Если вы используете is/2 (Th is Ah) вы накладываете одно направление в своей статье: первый аргумент c унифицирован со значением второго, а второй не может быть унифицирован со значением первого.

+0

Я попробовал это с вашим методом и получил '?- treeMatch ([2, 3, 4], E). ОШИБКА: пользователь: // 3: 74: is/2: Аргументы не созданы в достаточной степени '. Означает ли это, что E не был унифицирован [2, 3, 4]? –

+0

@AndrewRaleigh - улучшил мой ответ; надеюсь это поможет. – max66

+0

Спасибо за исправление, все работает сейчас, спасибо :) –

 Смежные вопросы

  • Нет связанных вопросов^_^