arrays - Prolog:将树转换为顺序列表并检查列表是否已排序
问题描述
现在我想检查一棵树是否是搜索树,以便按顺序遍历是一个升序数组。(所以如果树被排序) - 它几乎可以工作。但是我现在找不到我的错误,所以不幸的是我有一个思考障碍。首先创建树的列表,然后将其传递给 isSorted 方法,然后返回错误。
% List Methode
append([], Ys, Ys).
append([X|Xs], Ys, [X|Zs]) :- append(Xs, Ys, Zs).
% inorder Traversel - work coorect
inorder(nil, []).
inorder(tree(X, Left, Right), R) :-
inorder(Left,R1),
inorder(Right,R2),
append(R1,[X|R2],R).
% contains - work coorect
contains(tree(_,L,_), X) :- contains(L,X).
contains(tree(X,_,_), X).
contains(tree(_,_,R), X) :- contains(R,X).
% isSorted
% TODO:
% Convert tree to list
% Check list whether list is correct.
% Der Fehler liegt irgendwo hier.
isSorted([]).
isSorted([_]).
isSorted(tree(X,Left,Right)) :- inorder(tree(X,Left,Right),X), isSorted(X).
isSorted([X,Y|T]) :- X=< Y, isSorted([Y|T]).
% ?-inorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X). -> work
% isSorted(inorder(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil)),X)). -> doesn't work
解决方案
试试这个 isSorted 谓词:
isSorted([]).
isSorted([_]).
isSorted([X|[Y|_]]) :-
X=< Y,
isSorted([Y|_]).
isSorted(tree(X,Left,Right)) :-
inorder(tree(X,Left,Right),Z),
isSorted(Z).
但您的查询必须是:
?- isSorted(tree(5,tree(4,tree(1,nil,tree(3,tree(2,nil,nil),nil)),nil),tree(6,nil,nil))).
请记住,Prolog 不是函数式编程。你不能指望 p(q(X,Z)) 作为一个函数组合,如果你想要这样的东西,你需要做:
r(X):-
q(X,Z),
p(Z).
还有一件事:你不能覆盖变量的值。所以,当你写
“ inorder(tree(X,Left,Right),X)” 您没有覆盖 X 的值。您要求具有根节点 X 的树使得该树的中序为 X。
推荐阅读
- performance - 高写入,偶尔读取(两者都必须很快),任何食谱?
- java - 递归获取具有索引的双端队列的值
- javascript - 如果在谷歌地图的地方没有提供地址组件,如何获取国家、邮政编码、地区和子地区?
- javascript - node.js中管道和流之间的区别
- node.js - 如何在构建 Maven 项目时设置目标路径?
- c# - 无法加载 V8 接口程序集。v8-ia32.dll 的加载失败信息
- vue.js - 了解如何在 VueJS 中避免 vue/require-prop-type-constructor 警告
- javascript - 改进灯箱
- mips - MIPS 加载字指令的偏移量大小
- java - 如何在java中根据x对此进行排序