Prolog中二叉搜索树上的范围查询 我知道如何用程序的方式(如C++、java等)来执行BST的范围查询,但是我发现很难转换为Prolog语言。< /P>
程序方式应如下所示: 有没有关于如何将其转换为Prolog范例的提示Prolog中二叉搜索树上的范围查询 我知道如何用程序的方式(如C++、java等)来执行BST的范围查询,但是我发现很难转换为Prolog语言。< /P>,prolog,binary-search-tree,Prolog,Binary Search Tree,程序方式应如下所示: 有没有关于如何将其转换为Prolog范例的提示 非常感谢大家您引用的站点的声明性描述可以直接翻译成序言: 1) 若键大于k1,那个么递归地调用左子树 序言翻译: bst(tree(Key, Left, Right), K1, K2, Value) :- Key > K1, bst(Left, K1, K2, Value). 2) 如果钥匙在范围内,则打印钥匙 我们不使用像“print”这样不纯的谓词,因为它们是不可逆的。相反,我们使
非常感谢大家您引用的站点的声明性描述可以直接翻译成序言: 1) 若键大于k1,那个么递归地调用左子树 序言翻译:
bst(tree(Key, Left, Right), K1, K2, Value) :-
Key > K1,
bst(Left, K1, K2, Value).
2) 如果钥匙在范围内,则打印钥匙
我们不使用像“print”这样不纯的谓词,因为它们是不可逆的。相反,我们使用Prolog在顶层报告绑定:
bst(tree(Key, _, _), K1, K2, Key) :- between(K1, K2, Key).
3) 若键小于k2,那个么递归地调用右子树
我把这当作练习
询问
?-bst(树,K1,K2,值)。
对于给定范围内的值
,将产生回溯绑定
如果使用约束,可以在所有方向上使用这个谓词,也可以生成包含值的树。
< P>与C++或java中的相同。 假设C++中有最小的代码,那么你得到正确结果的几率就非常高。这通常用于递归定义:类似// pseudocode - Elem must implement operator<
struct BST<Elem> {
bool find(const Elem e) { return find(root, e) }
private:
bool find(Node n, Elem e) {
if (!n) return false;
if (n.payload() == e) return true;
return n.payload() < e ? find(n.left) : find(n.right);
}
}
<> C++注释:我在Github(AT)上上传了一个声明性的、非侵入式C++接口在一个原始指针模型(AgRAPHYT**和FROUTS)上的例子。有了这个接口,实现起来非常简单,因为我们有了C++中的lambda:
// live code here
void lqXDotScene::dump(QString m) const {
qDebug() << m;
cg->depth_first([&](Gp t) { qDebug() << "graph" << gvname(t) << CVP(find_graph(t)); });
qDebug() << "nodes";
cg->for_nodes([&](Np n) {
qDebug() << "node" << gvname(n) << CVP(find_node(n));
cg->for_edges_out(n, [&](Ep e) {
qDebug() << "edge" << gvname(e) << CVP(find_edge(e)) << "to" << gvname(e->node) << CVP(find_node(e->node));
});
});
}
//这里是实时代码
void lqxdotsecene::dump(QString m)常量{
qDebug()depth_first([&](Gp t){qDebug()非常有效..但是如果我想在输出列表中的一个步骤中获得所有答案呢?此解决方案逐个检索结果。在Prolog中收集所有解决方案很容易:使用像setof/3
这样的all solutions谓词。
% note: untested
bst(t(Payload,_,_), Payload). % found
bst(t(Payload,L,R), Sought) :- Sought @< Payload -> bst(L, Sought) ; bst(R, Sought).
// live code here
void lqXDotScene::dump(QString m) const {
qDebug() << m;
cg->depth_first([&](Gp t) { qDebug() << "graph" << gvname(t) << CVP(find_graph(t)); });
qDebug() << "nodes";
cg->for_nodes([&](Np n) {
qDebug() << "node" << gvname(n) << CVP(find_node(n));
cg->for_edges_out(n, [&](Ep e) {
qDebug() << "edge" << gvname(e) << CVP(find_edge(e)) << "to" << gvname(e->node) << CVP(find_node(e->node));
});
});
}
cg->depth_first([&](Gp t) { qDebug() << "graph" << gvname(t) << CVP(find_graph(t));