Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Prolog中二叉搜索树上的范围查询 我知道如何用程序的方式(如C++、java等)来执行BST的范围查询,但是我发现很难转换为Prolog语言。< /P>_Prolog_Binary Search Tree - Fatal编程技术网

Prolog中二叉搜索树上的范围查询 我知道如何用程序的方式(如C++、java等)来执行BST的范围查询,但是我发现很难转换为Prolog语言。< /P>

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”这样不纯的谓词,因为它们是不可逆的。相反,我们使

程序方式应如下所示:

有没有关于如何将其转换为Prolog范例的提示


非常感谢大家

您引用的站点的声明性描述可以直接翻译成序言:

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));