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.