Prolog在树中查找元素的顺序位置(不使用列表)

Prolog在树中查找元素的顺序位置(不使用列表),prolog,Prolog,我试图用一种有序的方法遍历一棵二叉树 我的目标是在树中查找特定键的出现 例如 我有下面的树: t(t(t(nil,"d",t(nil,"g",nil)),"b",t(nil,"e",nil)),"a",t(t(nil,"f",t(nil,"h",nil)),"c",nil)) 当我使用iOrder_finder时,我将获得以下信息: 对于“c”,我将得到8 对于“d”,我将得到1 对于“w”,我将得到-1 我得到了以下代码: inorder_finder(nil,_,_,0). inorde

我试图用一种有序的方法遍历一棵二叉树 我的目标是在树中查找特定键的出现 例如 我有下面的树:

t(t(t(nil,"d",t(nil,"g",nil)),"b",t(nil,"e",nil)),"a",t(t(nil,"f",t(nil,"h",nil)),"c",nil))
当我使用iOrder_finder时,我将获得以下信息: 对于“c”,我将得到8 对于“d”,我将得到1 对于“w”,我将得到-1

我得到了以下代码:

inorder_finder(nil,_,_,0).

inorder_place(t(_,X,_),X,Count,Place) :-
    Place is Count+1.

inorder_place(t(L,_,R),Wanted,Count,Place) :-
        inorder_place(L,Wanted,Count+1,Place),
        Place<1, 
        inorder_place(R,Wanted,Count+1,Place),
        Place<1,
        Count = Count+1.
但目前它不起作用。(总是返回false) 有什么想法吗


更新:我已经根据我得到的注释更新了代码-它仍然返回false,并且不能像我希望的那样工作

注释中提到了最明显的错误,仍然存在的是:


  • 放置“c”我会得到8个为什么??您的树根本没有
    “c”
    ?这有点令人困惑。位置是从1开始还是从0开始?无效位置设置为-1,但如果位置<1,代码将继续搜索,这意味着0被视为无效位置指示符。你说现在不行是什么意思?它以什么方式不起作用?最后,如果您在order\u finder中显示
    时调用谓词(…
    您将得到一个错误,因为在Prolog中,函子和左括号之间不能有空格。Place=Count+1应该是Place is Count+1A检查时有两个错误…如果正确的第一个指示符是1,如您所说,那么我建议使用
    顺序查找器(nil,\uu,\u0)。
    而不是
    顺序查找器(无,地点):-Place=-1.
    。谓词的原因取决于count的增量,因此对于-1基本情况,它会在某一点上由于增量而导致无效的0计数。另外,请注意,
    计数是count+1
    将始终失败,因为
    计数
    永远不能与中的
    计数+1
    具有相同的值订单查找器(t(L,R),通缉,计数,地点)
    将始终失败,因为它没有完整的成功路径。您尚未解决前面提到的所有问题。请仔细阅读它们。
    inorder_finder inorder_place(t(t(t(nil,"d",t(nil,"g",nil)),"b",t(nil,"e",nil)),"a",t(t(nil,"f",t(nil,"h",nil)),"c",nil)),"c",1,Place)
    
    inorder_finder(nil,_,Count,Count,-1).
    
    inorder_finder(t(L,X,_),X,Count,Count2,Place):-
                    inorder_finder(L,X,Count,Count3,_),
                    Place is Count3+1,Count2 is Place.
    
    inorder_finder(t(L,X,R),Wanted,Count,Count2,Place):-
                    dif(X,Wanted),
                    inorder_finder(L,Wanted,Count,Count3,Place1),
                    Count4 is Count3+1,
                    inorder_finder(R,Wanted,Count4,Count2,Place2),
                    Place is max(Place1,Place2).
    
    ?- inorder_finder(t(t(t(nil,"d",t(nil,"g",nil)),"b",t(nil,"e",nil)),"a",t(t(nil,"f",t(nil,"h",nil)),"c",nil)),"c",0,_,P).
    P = 8 ;
    false.
    
    ?- inorder_finder(t(t(t(nil,"d",t(nil,"g",nil)),"b",t(nil,"e",nil)),"a",t(t(nil,"f",t(nil,"h",nil)),"c",nil)),"W",0,_,P).
    P = -1.
    
    ?- inorder_finder(t(t(t(nil,"d",t(nil,"g",nil)),"b",t(nil,"e",nil)),"a",t(t(nil,"f",t(nil,"h",nil)),"c",nil)),"d",0,_,P).
    P = 1 ;
    false.