Prolog二叉搜索树测试-不需要的父节点的父节点比较

2024-02-20

我是 Prolog 菜鸟,请记住这一点。 我尝试编写一个谓词来确定某个给定术语是否是二叉搜索树。我想出了这段代码:

is_btree(nil).
is_btree(node(N,L,R)) :-
   number(N),
   is_btree(L), 
   is_btree(R), 
   small(N, R),
   big(N, L).

small(N, nil).
small(N, node(M,L,R)) :-
   N < M,
   small(N, L),
   small(N, R).

big(N, nil).
big(N, node(M,L,R)) :-
   N > M,
   big(N, L),
   big(N, R).

它工作得很好,直到我测试右侧有一个节点的图,该节点通过“高于父节点”的条件,但它高于或等于父节点的父节点。在这种情况下,Prolog 报告失败。

以下是意外失败的示例查询:

?- is_btree(node(9,node( 3,node( 2,nil,nil),
                           node(10,nil,nil)),
                   node(12,node( 8,nil,nil),
                           node(15,nil,nil)))).
false.

当左侧的某个节点高于父节点的父节点时,会出现非常类似的问题,如下图所示:

如何仅使用其直接父节点的值而不是父节点的父节点的值来检查节点值?


这是对您要解决的问题的稍微不同的看法。

  1. dcg /questions/tagged/dcg用于收集元素:按顺序树遍历 /questions/tagged/tree-traversal

    
    
    in_order(nil) --> [].
    in_order(node(X,L,R)) --> in_order(L), [X], in_order(R).
      
  2. clpfd /questions/tagged/clpfd用于关联相邻的list /questions/tagged/list元素(都是有限域变量)

    
    
    chain(Zs, #<)
      

让我们把它们放在一起并定义is_bintreeFD/1像这样:



:- use_module http://www.swi-prolog.org/pldoc/doc_for?object=use_module/1(library(clpfd) http://www.swi-prolog.org/man/clpfd.html).

is_bintreeFD(T) :-
   phrase http://www.swi-prolog.org/pldoc/doc_for?object=phrase/2(in_order(T), Zs),
   chain http://www.swi-prolog.org/pldoc/doc_for?object=chain/2(Zs, #<).
  

示例查询:



?- is_bintreeFD(node(9,node( 3,node(2,nil,nil),node(10,nil,nil)),
                       node(12,node(8,nil,nil),node(15,nil,nil)))).
false.

?- is_bintreeFD(node(9,node( 3,node( 2,nil,nil),node( 8,nil,nil)),
                       node(12,node(10,nil,nil),node(15,nil,nil)))).
true.
  
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Prolog二叉搜索树测试-不需要的父节点的父节点比较 的相关文章

  • Prolog 程序从列表中删除每个第 n 个元素

    您能帮我解决以下问题吗 编写三元谓词delete nth从列表中删除每个第 n 个元素 样本运行 delete nth a b c d e f 2 L L a c e false delete nth a b c d e f 1 L L f
  • AllegroGraph 检查现有三元组

    我正在使用 AllegroGraph 4 我有一个三元组存储 并且只有在新的三元组尚不存在时我才会尝试添加它们 这是我的 Prolog 查询 select news alfas news a news tst has annotation
  • 二叉树的列表实现是否可扩展?

    我正在写一个简单的编解码器 该树将被预先计算 一旦构建就不会发生任何变化 它只会被搜索 平衡二叉树的所有叶节点都是信号值 内部节点是近似压缩表示 如果我有很大的叶节点值 使用 stl 矢量的列表实现是否可扩展 目前我不知道有多大 列出实现
  • 克隆二叉树的时间复杂度

    我想知道克隆二叉树的代码的时间复杂度是否为 O n 如果是 O n 你能解释一下为什么吗 如果没有 你能建议一种时间复杂度为 O n 的方法吗 public TreeNode cloneTree TreeNode root if root
  • current_prolog_flag double_quotes DCG(代码或字符)?

    在使用 SWI Prolog DCG 时 我注意到有些人注意到 set prolog flag double quotes codes Jan http www swi prolog org pldoc man section string
  • 在 C 中将二叉树转换为数组(并随后保存)

    所以 我正在做这个客户应用程序 您可以在其中创建 修改 搜索 列出客户 后来 这扩展到通过订单等方式将客户与产品联系起来 但我现在的重点只是客户 我已经创建了一个二叉树 所有这些功能都可以工作 但是我需要一种方法来存储创建的客户以供下次使用
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • 在 Prolog 中表达“交换性”的替代方案?

    作为一个Prolog的初学者 我发现Prolog中的交换表达式非常不直观 例如 如果我想表达 X 和 Y 属于一个家庭 例如 family X Y married X Y relative X Y father son X Y 我还应该在定
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 2 个二叉树的交集会引发堆栈溢出错误

    我试图将两个二叉树相交 并使用相同的节点创建一个新的二叉树 但以下内容会产生 stackOverflow 错误 谁能帮我 private OrderedSet
  • C 程序将一棵二叉搜索树复制到另一棵

    所以 在这里我想出了二叉搜索树程序 其中我创建了 2 个二叉树 tmp 和 tmp2 我试图将整个 tmp2 复制到 tmp 该节点作为用户的输入 但我遇到了一些分段错误 而且我也不太确定逻辑是否正确 这是整个程序 请让我知道 t cpy
  • Rust 中的基本树和指针

    我拥有一些 C 语言背景 尝试 学习 Rust 让我对自己的能力产生了质疑 我正在尝试找出如何更改拥有的指针 并且正在努力做到这一点 除了从额外的库中复制之外 我无法弄清楚二叉树上所需的递归 特别是 我不知道如何交换指针分支 虽然使用链表我
  • Prolog 中的迷你数独求解器中途停止

    我正在学习 七周七种语言 我只是想从书中找到一个例子 它解决迷你数独网格 4x4 作者使用的是 gprolog 但我使用的是 swi prolog 无论出于何种原因 我都无法让 gprolog 在我的虚拟机上工作 但 swi prolog
  • SWI-Prolog 中的约束编程

    我想要一个包含三个元素 A B 和 C 的列表 L 并具有以下约束 use module library clpfd L A B C L ins 1 3 A B C 但是 它给出了一个错误 Syntax error Operator exp
  • Prolog 匹配 vs miniKanren 统一

    在 Prolog 人工智能编程中 Bratko 在第 58 页说了以下内容 Prolog 中的匹配对应于逻辑中所谓的统一 但是 我们避免使用 统一 这个词 因为出于效率原因 在大多数 Prolog 系统中 匹配的实现方式并不完全对应于统一
  • Prolog 实现 and/2、or/2、nand/2、nor/2、xor/2 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在序言中实现以下谓词并将它们用于真值表 and 2 or 2 nand 2 nor 2 xor 2 也许有人可以告诉我如何实现和
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西
  • SWI Prolog 使用的检查优化会发生什么情况?

    去引用SICStus Prolog 手册 https sicstus sics se sicstus docs 3 12 9 html sicstus Occur html 逻辑编程背后的通常数学理论禁止 创建循环项 规定发生检查应该是 每
  • 生成所有可能的树

    给定以下数据类型定义 data FormTree Empty Node FormTree FormTree deriving Show 我想编写一个函数 它生成一个无限列表 其中包含按长度排序的所有可能的树 例如节点数量 下面的代码几乎满足
  • 计算序言中列表的排列

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3

随机推荐

  • 转移可变借用的所有权

    我的理解是 可变借款人可以将所有权转移给另一个可变借款人 但这个移动似乎与移动非指针变量有点不同 让我们看一个例子 以下p1被转移到p2 when compute 被称为第一次 但所有权似乎又回到了p1 after compute 返回 f
  • 覆盖目标 Android Makefile 的命令

    我正在尝试使用 g 编译我的 Android ndk 项目中的模块之一 尽管源代码都是 C 语言 make 系统警告刺激了我的眼睛 C NVPACK android ndk r8d build core build binary mk 34
  • Flexbox 列自身与底部对齐

    我正在尝试使用 Flexbox http css tricks com almanac properties a align content http css tricks com almanac properties a align co
  • 替换许多字符串的更好方法 - C# 中的混淆

    我试图混淆大量数据 我创建了一个要替换的单词 标记 列表 并且使用 StringBuilder 类逐个替换单词 如下所示 var sb new StringBuilder one MB string foreach var token in
  • 如果我们将内存标记为WC(Write Combined),那么我们是否自动具有一致性?

    众所周知 在 x86 架构上自动提供获取 释放一致性 即所有操作自动排序 没有任何围栏 不包括第一个存储和下一个加载操作 正如 Herb Sutter 在第 34 页所说 如果我们把MFENCE LFENCE SFENCE 在它们之间 则存
  • Unity3d:如何检测区域内的点击

    在 Unity3d 应用程序中 我尝试检测当前相机的某个方形区域中的单击 有什么办法可以做到这一点吗 谢谢 这不是您要找的吗 http unity3d com support documentation ScriptReference In
  • 参数 1 具有意外类型“Ui_mainWindow”

    我正在尝试为我在这里的一些人的帮助下编写的一个小程序制作一个 GUI 无论如何 我在 PyQt 中制作了 GUI 它看起来不错 我添加了一个名为 dirButton 的按钮 上面写着 选择目录 self dirButton QtGui QP
  • 在同一个 DOM 元素上使用 ng-show 和 ng-hide 是否正确?

    我想知道在同一个 DOM 元素上使用 ng show 和 ng hide 是否是一个好习惯 这似乎是一个更好的主意 而不是在一个 ng show 中使用多个条件 其中一些条件是否定的 让我知道 谢谢 PS 这里有一个例子 div Mary
  • jQuery 验证器所需的最少字数

    我正在寻找一种使用 jQuery 验证某些输入文本区域的方法 不幸的是 尽管 jQuery 验证器插件很棒 但它缺乏验证 据我所知 最少所需单词 我没有携带代码 我将在早上编辑 但我编写了一个函数来计算输入中的单词数 但这并不像插件提供的那
  • Django 1.9.2 AssertionError:数据库连接未设置为 UTC

    我现在已经使用 PostgreSQL 设置了 3 个服务器 但到目前为止还没有看到这个问题 我现在正在设置第一台不在丹麦服务器上运行的服务器 并且在从网络访问数据库时开始出现错误 我可以毫无问题地使用 createsuperuser 并且它
  • 如何为数组分配排名号

    我有一个数字数组 例如 myarray 45 3 56 7 21 我需要做的是将这些值排列到另一个数组中 因此对于上述内容 我最终会得到 myarray2 4 1 5 2 3 非常感谢 Adam 好了 完整的解决方案
  • 如何将 Delphi XE 包和设置移至其他用户?

    我们已经建立了一个新的 模板 开发机器 其中包括 Delphi XE 其中包括大量第三方和内部软件包 并打算为我们团队中的开发人员制作该计算机的多个克隆 请注意 我们并不是试图绕过许可 我们在克隆后 重新 激活 注册 Windows Off
  • Mac OS下安装pygresql时出现clang错误

    我试图在 Mac OS X 10 11 3 下安装 PyGreSQL 但从 pip 和源安装时会出现相同的 clang 错误 python3 setup py install running install running bdist eg
  • 如何将所有以前的提交合并到一个提交中?

    Context 在 GitHub 上启动项目并一直在尝试 git 命令 该项目的历史是混乱的 问题 如何删除所有历史记录并将所有提交消息替换为 已上传项目源的初始版本 之类的内容 此选项将允许您保留项目的所有配置文件 git reset s
  • DataTable Linq 连接许多列

    我在使用 Linq Join 时遇到问题 我想连接 2 个表 它们具有相同的 n 列结构 我的问题是我不知道这些列的名称 那么我如何在 select new 中重写这些列 表 1 这里我有一些 ID Name 和 LastName 参数 注
  • MySql 错误:1364 字段“display_name”没有默认值

    我刚刚从 MAMP 安装切换到本机 Apache MySql 和 PHP 安装 我已经一切正常 但我已经开始在新环境中使用我的网络应用程序 突然任何 INSERT 命令都会导致以下错误 SQLSTATE HY000 一般错误 1364 字段
  • 为什么 nasm 找不到 cmake 中的 include 语句

    我正在使用一个模块化引导加载程序 我觉得设置它使用 Gas 比将 nasm 移植到 cmake 更痛苦 似乎并非如此 NAsm 无法找到包含文件 我缺少什么 完整的代码可以在这个 Github 存储库 https github com Co
  • 为什么 Google 智能锁对话框只有“从不”和“保存”两个选项,而没有“否”?

    Smart Lock 弹出对话框只有两个按钮 一个是 从不 另一个是 保存密码 如果用户不小心点击了 从不 SmartLock就会被禁用 直到他使用chrome应用程序删除 从未保存过的密码 项 这对于 懒惰用户 来说步骤太多了 而且很有可
  • 不同播放器(AVAudio Player 和 MPMusicPlayer)同时播放时是否可以使用不同的音量?

    我需要使用音频和音乐播放器为不同的播放器设置不同的音量级别 我正在播放这两个播放器 但我不知道如何设置不同的不同音量级别 谢谢你 马丹 莫汉 假设您的 avaudioplayer 名为 theAudio 要控制音量 请说 theAudio
  • Prolog二叉搜索树测试-不需要的父节点的父节点比较

    我是 Prolog 菜鸟 请记住这一点 我尝试编写一个谓词来确定某个给定术语是否是二叉搜索树 我想出了这段代码 is btree nil is btree node N L R number N is btree L is btree R