执行树元解释

2024-04-15

我有根据我之前的问题制作的跟踪元解释器here https://stackoverflow.com/questions/27235148/implementing-cut-in-tracing-meta-interpreter-prolog/我想做类似的元解释器,但这次是为了制作执行树。 我使用类似于在网上找到的相同代码和我之前问题中的技术做了如下类似的事情。

clause_tree(true,_,true) :- !, true. 
clause_tree((G,R),Trail,(TG,TR)) :-
   !, 
   clause_tree(G,Trail,TG),
   clause_tree(R,Trail,TR). 
clause_tree(G,_,prolog(G)) :- 
   (predicate_property(G,built_in) ;  
     predicate_property(G,compiled) ), 
    call(G).
clause_tree(G,Trail,tree(G,T)) :- 
   clause(G,Body),
   clause_tree(Body,[G|Trail],T).

why(G) :-
    call_with_depth_limit( 
        catch(
            clause_tree(G,[],T),
            cut,
            fail),
        30,
        _Message),
    nl,
    draw_tree(T,0).

draw_tree(tree(Root,Branches),Tab) :- !,
   tab(Tab),
   write(Tab),
   write(': '),
   write(Root),
   nl,
   Tab1 is Tab + 1,
   draw_tree(Branches,Tab1).
draw_tree((B,Bs),Tab) :- !,
   draw_tree(B,Tab),
   draw_tree(Bs,Tab).
draw_tree(Node,Tab) :-
   tab(Tab),
   write(Tab),
   write(': '),
   write(Node),
   nl.

%example program for testing
%?-p(X).
p(X) :- a(X). 
p(X) :- b(X),c(X), d(X),e(X). 
p(X) :- f(X).

b(Y) :- g(Y), h(Y).
b(1). 
b(2). 

a(1).

c(1). 
c(2).

d(1). 
d(2). 

e(2). 

f(3). 

g(2).
g(1).

h(2).

我如何改变这个解释器,让它显示失败的分支,并且该树只是一个包含所有解决方案的树?考虑到树仅针对类似的程序(例如用代码编写的示例程序)来完成,如果这很重要的话。

我正在使用 swi-prolog。

编辑:我正在努力实现类似的目标this https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/f3_1_1.gif但以文本形式。


None

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

执行树元解释 的相关文章

  • Prolog 时间重叠问题

    假设我有这个知识库 free ann slot time 8 0 time 9 0 free ann slot time 10 0 time 11 0 free bob slot time 7 0 time 8 30 free bob sl
  • 如何提高词法分析效率?

    在解析一个 3 GB 的大文件时DCG https www metalevel at prolog dcg 效率很重要 我的词法分析器的当前版本主要使用 or 谓词 2 http www swi prolog org pldoc doc f
  • phpmyadmin的PHP不执行但其他php脚本可以运行

    调用 phpmyadmin 网站时 会出现 保存文件 对话框application x httpd php 所以我的服务器不执行 phpmyadmin php 脚本 而是将代码传输到我的浏览器 其他 php 如 roundcube 或 is
  • 为什么错误回溯显示编辑后的脚本而不是实际运行的脚本?

    背景 考虑以下最小示例 当我保存以下脚本并从终端运行它时 import time time sleep 5 raise Exception 该代码将在休眠五秒后引发错误 并留下以下回溯 回溯 最近一次调用最后一次 文件 test minim
  • 如何在 SWI-Prolog 中创建事实?

    我只想创建类似的东西 like x y 我已经尝试了很长时间了 真的很沮丧 谁能告诉我该怎么做 我假设您正在交互地使用 swi 并尝试输入事实会给您一个如下错误 1 like x y ERROR toplevel Undefined pro
  • 了解相继执行的 setTimeout() 函数

    我需要以固定的时间间隔依次执行多个函数 因此使用了setTimeout 我想确保我理解它是如何执行的 我有以下逻辑 setTimeout function Execute first function 200 setTimeout func
  • 获取 Prolog 中的解决方案列表

    我正在学习 Prolog 并且正在阅读一本名为 人工智能 Prolog 编程 的书 作为练习 我想学习如何扩展本书中的示例之一 有人可以帮忙吗 假设您有以下事实 parent pam bob pam is a parent of bob p
  • 二叉树的 Herbrand 宇宙、Herbrand 基础和 Herbrand 模型(序言)

    什么是二叉树的 Herbrand 宇宙 Herbrand Base 和 Herbrand Model binary tree empty binary tree tree Left Element Right binary tree Lef
  • Prolog 中的聊天机器人

    我一直在尝试在序言中创建一个聊天机器人 作为作业 到目前为止 我已经在 pl 文件中创建了一个数据库 并且列出了很多可能的对话 我知道序言是这样工作的 例如如果我们有 Chatbot good 然后我们输入 Chatbot good 它会回
  • 从 .NET 应用程序执行 shell 命令

    我需要从我的 NET 应用程序执行 shell 命令 这与os execute http lua users org wiki OsLibraryTutorial 该页面下方一点 Lua http en wikipedia org wiki
  • 在Java中,是否可以执行一个方法一段时间,并在达到时间限制后停止?

    我有下载网页的代码 HttpURLConnection connection private String downloadContent InputStream content Source parser try content conn
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 Given L1 1 2 3 4 and L2 2 3 4 调用名为remove list L1 L2 L 的函数将从L1中删除L2 所以L将是 1 但是 如果第二个列表的元素与 L1 中的元素顺序不同 或者更准确
  • Prolog 管线任务

    我有一项任务是在序言中制作一张简化的地铁地图 其中一部分要求制定一项规则来检查两个车站是否在同一条线上 我有一条规则 但它似乎不起作用 这就是我到目前为止所拥有的 adjacent nh lg central 4 adjacent lg o
  • Prolog 同构图

    这里尝试解决同构图问题 作业信息 判断2个无向图是否同构 没有孤立的顶点 顶点数小于30 图的边作为谓词给出 即 e 1 2 f 1 2 我正在尝试使用以下方法 对于每对边 即图 1 和图 2 中的每条边 Try to bind the v
  • 值的 Ocaml 表示 - 原子

    我查看了一些 OCaml 值的内部表示 空数组的表示是atom 0 即一个块tag 0 and size 0 空浮点数数组由atom 0 too 是否存在由原子表示的任何 OCaml 值tag gt 0 如果不是 OCaml 字节码集包含以
  • 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
  • 在列表列表中查找形状

    节目说明 该计划的目的 我的程序旨在计算 20X15 大小的平面中形状的位置 我有一个形状列表 其中包含形状类型 其 ID 半径或高度以及其在平面上的预期 X Y 位置 我有一个不同的二元运算列表 仅包含形状类型 其 id 及其与另一个形状
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • Prolog 罗马数字(属性语法)

    我正在做一项作业prolog questions tagged prolog扫描数字列表并应返回该列表是否是有效的罗马数字以及数字的十进制值 前任 1 roman N I N 1 true 2 当我运行我认为应该工作的程序时 十进制值总是正
  • 适合从记录中提取 OneToMany 关系的约束编程

    也许有人可以帮助我解决 Prolog 或任何约束编程语言的问题 想象一个项目表 学生与母亲一起做某事的学校项目 每个项目都有一名或多名儿童参与 对于每个孩子 我们存储其姓名及其母亲的姓名 但对于每个项目 只有一个包含所有母亲的单元和一个包含

随机推荐

  • app.dock.hide(); 的等效项是什么?

    我目前正在开发电子托盘应用程序 对于 Mac Electron 框架具有将应用程序隐藏在 Dock 中的功能 app dock hide 我尝试在 Windows 计算机上运行此程序并收到错误 TypeError Cannot read p
  • “内部联系”是什么意思?

    标准中写道 当名称具有内部链接时 它所表示的实体可以是 由同一翻译单元中其他范围的名称引用 and 具有命名空间范围 3 3 6 的名称具有内部链接 如果它是 变量 函数或函数模板的名称 显式声明为静态 所以考虑下面的代码 include
  • s3 存储桶中的 utf-8 文件名

    是否可以使用 utf 8 编码名称 如 jpg 向 s3 添加密钥 使用 boto 上传时出现以下错误
  • Python 请求:requests.exceptions.TooManyRedirects:超过 30 个重定向

    我试图使用 python requests 库抓取此页面 import requests from lxml import etree html url http www amazon in b ref sa menu mobile ele
  • 使用 MongoDB 有效确定层次结构中记录的所有者

    我正在努力实现以下目标 选择我拥有的所有记录 其中所有权是我创建的对象或我管理的用户创建的对象 其中用户管理可以在管理用户的用户层次结构中 所有权显然很简单 可以通过与所有者相对应的简单 ID 来处理 用户管理的层次结构让我有点难以执行 而
  • 当 Net Framework 引用 Net 标准库时,无法加载文件或程序集

    我对 netstandard 非常陌生 当我想运行引用 netstandard 库的 Net Framework 控制台 调试模式时 我刚刚遇到异常 所以我后来发现 如果我将 nuget 中的 System IO Ports 安装到 Net
  • 如何在某一点切断一条线,但在最近的空间处分割

    我希望每行在 20 个字符过去后分开 但我希望它在最近的空格处分开 这样句子就只有整个单词 这是我的代码 System out println Please input a word Scanner stringScanner new Sc
  • 如何获取PAC的访问日志(代理自动配置)

    我正在使用 Chrome 我想为自己监控浏览器访问日志 我怀疑某些扩展程序在后台发送 url 等 我尝试使用 Privoxy 但它无法记录 HTTPS url 我认为 PAC 是记录原始 url 的唯一方法 我使用 PAC 几年了 但我仍然
  • 如何使用 django-pytest 跟踪 Django 重定向?

    在设置一个档案索引视图 https docs djangoproject com en 2 0 ref class based views generic date based django views generic dates Arch
  • 文件包含\u00c2\u00a0,转换为字符

    我有一个 JSON 文件 其中包含这样的文本 wax and voila u00c2 u00a0At the moment you can t use our 我的简单问题是如何将这些 u 代码转换 而不是删除 为空格 撇号等 Input
  • ANTLR 语法也可以识别数字键和整数

    我正在尝试创建一个 ANTLR 语法来解析可选地具有重复计数的键序列 例如 a b c r5 表示 重复键 a b 和 c 五次 我有语法工作KEYS a z A Z 但是当我尝试添加数字键时KEYS a z A Z 0 9 输入表达式如
  • URL 中的 HTML5 不明确的 & 符号

    The W3C 验证器 http validator w3 org 在我的一些 URL 中引发了有关 符号的错误 例如 根据HTML5 规范 http www whatwg org specs web apps current work m
  • 如何计算给定日期Android的周数

    我正在尝试从给定日期获取当前周数 即 如果我输入日期为 01 03 2013 那么我应该得到周数 9 请帮助我找到解决方案 Thanks 阿布舍克 您可以为该日期创建一个 Calendar 对象并通过以下方式获取星期 calendar ge
  • if 语句在循环内部还是外部?

    如果我这样做会更好吗 foreach my item array if bool code else code or if bool foreach my item array else foreach my item array 我会离开
  • 有关 URLEncoder 和 URLDecoder 的一些问题?

    我已经浏览了 URLEncoder 和 URLDecoder 的 javadocs 然后就更加好奇了 将服务器视为 tomcat 在任何 Web 应用程序中 每当我们提交时 表单 服务器将表单字段转换为 urlencoded 字段 当我们执
  • 邮件与发送邮件

    我正在 Codeigniter 中使用 Email 类 并且在manual http codeigniter com user guide libraries email html我看到有 3 个协议可以使用 mail sendmail 和
  • 如何获取调用方法的类?

    The get calling class函数必须通过返回调用该函数的方法的类来通过以下测试A f method class A def f self return get calling class class B A def g sel
  • 序列化数组列表

    现在我想知道你们是否可以帮助我将 ArrayList 序列化到文件中 现在我正在做一份学校的总结 但是我没有遇到真正的编码问题 我正在制作的是一个 GUI 地址簿 当用户添加地址时 它会存储到数组列表中并添加到组合框中 这就是我正在做的事情
  • 在 Spring 中处理 POST 请求的 REST 方法到底是如何工作的?

    我正在学习 Spring Core 认证 我对 Spring MVC 中 RESTful webapp 的练习有一些疑问 因此 在示例中 我使用以下方法创建一个新的Account object Creates a new Account s
  • 执行树元解释

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我