【发布时间】:2018-12-19 17:43:13
【问题描述】:
我正在尝试使用 Prolog 来实现这一点,以在二叉树中查找元素。
elem1(tree(Element,void,void),Element).
elem1(tree(_Element,Left,Right),N) :-
elem1(Left,N),
elem1(Right,N).
因为我认为 elem1 会检查我的树的根是否是我搜索的元素,并且这适用于此输出。
?- trace,elem1(tree(c,void,void),c).
Call: (9) elem1(tree(c, void, void), c) ? creep
Exit: (9) elem1(tree(c, void, void), c) ? creep
true
但是以这样的递归方式:
?- trace,elem1(tree(4,tree(1,void,void),tree(2,void,void)),1).
Call: (9) elem1(tree(4, tree(1, void, void), tree(2, void, void)), 1)
creep
Call: (10) elem1(tree(1, void, void), 1) ? creep
Exit: (10) elem1(tree(1, void, void), 1) ? creep
Call: (10) elem1(tree(2, void, void), 1) ? creep
Call: (11) elem1(void, 1) ? creep
Fail: (11) elem1(void, 1) ? creep
Fail: (10) elem1(tree(2, void, void), 1) ? creep
Redo: (10) elem1(tree(1, void, void), 1) ? creep
Call: (11) elem1(void, 1) ? creep
Fail: (11) elem1(void, 1) ? creep
Fail: (10) elem1(tree(1, void, void), 1) ? creep
Fail: (9) elem1(tree(4, tree(1, void, void), tree(2, void, void)), 1) ?
creep
false.
似乎以正确的方式调用 (10) 并正确检查谓词,但在尝试扩展更多并给我失败之后。
我不知道为什么会这样,但是基本情况运行良好,所以我认为当找到一个元素时,退出并给我 true,因为基本谓词是有效的。
【问题讨论】:
-
相关问题:Trees in Prolog