Хороший способ объявить деревья в прологе? - PullRequest
2 голосов
/ 13 апреля 2011

Я работаю с деревьями (общие деревья, не ограничиваясь бинарными) в прологе.Из небольшого фрагмента кода, который я видел, хотя легко определить обходы и т. Д. Для дерева, нелегко определить экземпляр дерева.Что было бы хорошим способом сделать это?Кроме того, как я должен попытаться включить значения одного атрибута с каждым узлом?

Ответы [ 2 ]

4 голосов
/ 14 апреля 2011

По поводу вашего комментария «Но проблема в том, что все дерево должно идти в одну строку»: это не тот случай.Вы также можете использовать несколько строк для построения дерева, например:

tree(Tree) :-
    Tree = tree(Root, [Child,Leaf3]).
    Child = tree(Node1, [Leaf1,Leaf2]),
    Leaf1 = tree(Node2, []),
    Leaf2 = tree(Node3, []),
    Leaf3 = tree(Node4, []).
4 голосов
/ 13 апреля 2011

Это домашняя работа?

Простой способ представить произвольную древовидную структуру, IMHO, состоял бы в том, чтобы представить каждый узел как что-то вроде:

tree(Data,[ChildNode_1,...,ChildNode_n]).

Листовые узлы будут выглядеть так:

tree(Data,[]).

Бинарное дерево, будучи слегка специализированным, может выглядеть как

tree(Data,LeftChild,RightChild).

с атомом nil, представляющим несуществующий дочерний узел, поэтому его конечные узлы будут выглядеть как

tree(Data,nil,nil).

И узел только с левым потомком, такой как

tree(Data,LeftChild,nil).

Данные узла могут быть любой произвольной структуры. Возможно, вы хотите, чтобы это была пара ключ / значение:

tree(kvp(Key,Value),ChildNodes).
...