Prolog在顺序遍历中的应用

Prolog在顺序遍历中的应用,prolog,dcg,Prolog,Dcg,节点的示例如下所示: node(3, nil, 14). node(14, nil, 15). node(15, nil, 92). 我在这里看到过类似的问题,但是我的问题不同,因为我的节点在参数中有三个而不是两个值 它应该如何运行的示例: ?- inOrder(3, X). X = [3, 14, 15, 35, 65, 89, 92] . 我目前的代码是: % the in-order traversal of a leaf is the leaf inOrder(X, [X]) :

节点的示例如下所示:

node(3, nil, 14).
node(14, nil, 15).
node(15, nil, 92).
我在这里看到过类似的问题,但是我的问题不同,因为我的节点在参数中有三个而不是两个值

它应该如何运行的示例:

?- inOrder(3, X).
X = [3, 14, 15, 35, 65, 89, 92] .
我目前的代码是:

 % the in-order traversal of a leaf is the leaf
 inOrder(X, [X]) :-
    node(X, nil, nil).

 % if the node only has a left child, we traverse that
 inOrder(x, [X|T]) :-
    node(X, L, [X|T]),
    inOrder(L, T).
 % if the node only has a right child we traverse that
 inOrder(x, [X|T]) :-
    node(X, nil, R),
    inOrder(R, T).
 % if the node has both, we traverse them both.
inOrder(x, [X|T]) :-
    node(L, X, R),
    L \= nil, R \= nil,
    inOrder(L, T1),
    inOrder(R, T2),
    append(T1, T, T2).

它返回false而不是实际值,感谢高级中的任何帮助

您在递归情况下使用小写的
x
,用于
顺序
;这应该是一个变量。但这可能不是唯一的问题。

在你的表达中有一些曲折。一般来说,树状结构在数据库中不是扁平化的,这里使用的是
节点/3
,而是在单个术语中维护的

此外,坚持每个节点都有自己的事实似乎是一个好主意。在你的例子中,92需要一个事实

因此,考虑到所有这些预防措施,我们可以使用DCG编写:

node(3, nil, 14).
node(14, nil, 15).
node(15, nil, 92).
node(92, nil, nil).    % added!

inorder(I, Xs) :-
   phrase(inorder(I), Xs).

inorder(nil) -->
   [].
inorder(I) -->
   {dif(I, nil)},
   {node(I, L, R)},
   inorder(L),
   [I],
   inorder(R).

| ?- inorder(3,L).
L = [3,14,15,92] ? ;
no
检查数据库中的孤立节点:

orphan(Nr) :-
   node(_, L, R),
   ( Nr = L ; Nr = R ),
   dif(Nr, nil),
   \+ node(Nr, _, _).

因此,孤立(N)应该会在数据库上失败

您的示例
节点
的参数有原子,但您的代码似乎假定第三个可以是列表。