控制 Prolog 变量值选择

2024-05-05

灵感来自之前的一个问题 https://stackoverflow.com/questions/41595786/using-operator-to-save-variables-in-a-list我尝试实现一些可以枚举布尔表达式可能性的东西。但是,我在变量选择方面遇到了麻烦。这是我的预期结果:

?- eval(X^Y, R).
R = 0^0;
R = 0^1;
R = 1^0;
R = 1^1;
no.

这是我的代码:

:- op(200, yfx, ^).

split(V, R) :- var(V), R = 0.
split(V, R) :- var(V), R = 1.
split(X ^ Y, XP ^ YP) :- split(X, XP), split(Y, YP).

即使对于这个简单的情况,这也没有达到我想要的效果:

?- split(Y, R).
R = 0 ;
R = 1 ;
Y = _G269^_G270,
R = 0^0 ;
Y = _G269^_G270,
R = 0^1 ;
Y = _G269^ (_G275^_G276),
R = 0^ (0^0) ;
Y = _G269^ (_G275^_G276),
R = 0^ (0^1) ;
Y = _G269^ (_G275^ (_G281^_G282)),
R = 0^ (0^ (0^0)) .

所以,我可以看出问题出在哪里,那就是在通过的过程中split(Y, YP)Prolog 已经穷尽了前两个子句,所以它最终出现在split(X^Y, ...)再次统一我的Y with X'^Y', 本质上。我只是不确定我需要做什么来关闭这条路径,除了一开始我就有结构^/2.

我还希望它能够与嵌套结构一起使用,所以我不能仅仅消除分支的递归处理。

Edit: 没有运算符

If the op/3困扰你,考虑这个公式:

eval(and(X,Y), R).
R = and(0,0);
R = and(0,1);
R = and(1,0);
R = and(1,1);
no.

在这种情况下,代码如下:

split(V, R) :- var(V), R = 0.
split(V, R) :- var(V), R = 1.
split(and(X,Y), and(XP,YP)) :- split(X, XP), split(Y, YP).

请记住,我仍然希望它能够与递归公式一起使用,例如and(and(X,Y),and(Y,Z)) etc.


主要问题:默认表示

这个案例的核心问题是违约代表您用来表示布尔表达式。

我所说的“默认”是指您无法通过以下方式清楚地区分这些情况模式匹配:在你的情况下,一个变量V可以表示either

  • 命题常数之一0 and 1, or
  • 形式的复合表达式A^B.

由于这个缺点,您无法清楚地表达“变量”形式的约束X仅代表程序中的两个命题常数之一。


出路:干净的代表

声明式的解决方法是使用干净的表现 instead.

例如,假设我们任意使用v/1为了区分仅表示命题常数的变量,我们有:

  • v(X)表示命题变量X
  • A^B来表示一个复合表达.

显然,由于主函子和元数是不同的(v/1 vs. (^)/2),我们可以仅通过模式匹配来区分情况。

有了这个new代表,你的片段变成:



split(v(V), V) :- V = 0.
split(v(V), V) :- V = 1.
split(X^Y, XP ^ YP) :-
        split(X, XP),
        split(Y, YP).
  

查询示例:



?- split(v(X)^v(Y), R).
X = Y, Y = 0,
R = 0^0 ;
X = 0,
Y = 1,
R = 0^1 ;
X = 1,
Y = 0,
R = 1^0 ;
X = Y, Y = 1,
R = 1^1.
  

请注意,这still工作于八方,也在最一般的情况:



?- split(Expr, R).
Expr = v(0),
R = 0 ;
Expr = v(1),
R = 1 ;
Expr = v(0)^v(0),
R = 0^0 ;
Expr = v(0)^v(1),
R = 0^1 ;
etc.
  

根据经验,一旦你必须使用像这样的额外逻辑谓词var/1在您的代码中,几乎没有希望保持其逻辑纯度和单调性。力求干净的表示来保留这些属性。

有时,不可避免地要使用默认表示,例如,因为您想让用户更轻松地进行输入。在这种情况下,目标是在开始实际推理之前将它们快速转换为干净的。

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

控制 Prolog 变量值选择 的相关文章

  • 数据中的是什么?

    我使用OCaml版本4 02 3 我定义了一个类型self type self Self of self type self Self of self 及其实例s let rec s Self s val s self Self
  • Prolog:消除查询中的重复

    我一直在尝试编写一个简单的代码 其行为方式如下 hasCoppiesOf X a b a b a b a b X a b X a b a b X a b a b a b a b And hasCoppiesOf a b a b a b a
  • 编写 Prolog 谓词的最佳实践是什么,以便它以指定参数的不同方式工作

    我正在尝试实现一些简单的谓词 例如 my length 或 my append 如果我们事先知道我们想要找到列表的长度 或者我们想要附加两个列表 这对我来说很容易 即我知道什么是输入 什么是输出 在 Prolog 中 可以用其他方式做事 如
  • 二叉树的 Herbrand 宇宙、Herbrand 基础和 Herbrand 模型(序言)

    什么是二叉树的 Herbrand 宇宙 Herbrand Base 和 Herbrand Model binary tree empty binary tree tree Left Element Right binary tree Lef
  • 针对数字板难题的优化 CLP(FD) 求解器

    考虑问题从https puzzling stackexchange com questions 20238 explore the square with 100 hops https puzzling stackexchange com
  • 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
  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • 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
  • 井字游戏的极小极大

    我正在尝试用简单的极小极大算法来解决井字游戏 简单 但应该涵盖很多语言 到目前为止我所拥有的 该板表示为 9 个 未绑定 变量的数组 这些变量可以设置为x or o 获胜条件基本上是 win Player X1 X2 X3 X1 Playe
  • 非成员规则在 Prolog 中无法按预期工作

    我正在尝试在 Prolog 中创建一个迷宫程序 其目的是找到一条从迷宫起点到迷宫中心点 m 的路线 迷宫由使用四种颜色之一连接的正方形组成 蓝色 绿色 紫色或橙色 从起点到中心的路线遵循四种颜色的重复图案 我创建了以下代码 link2 A
  • 在 Prolog、尾递归中计算斐波那契数列

    我想在 Prolog 中以递归尾部模式计算斐波那契数列 fibonacci 0 0 fibonacci 1 1 fibonacci N Result fibonacci N 1 0 fibonacci N Result Count Coun
  • 如何在 Prolog 中计算数字序列的和

    任务是计算从0到M的自然数之和 我使用SWI Prolog编写了以下代码 my sum From To From gt To my sum From To S From 0 Next is 1 S is 1 my sum Next To S
  • Prolog 过滤自定义目标失败的所有元素的列表

    我正在尝试写一个谓词filter List PredName Result 过滤一个List目标的所有要素PredName失败并随后返回Result列表 谓词PredName 1应该在调用过程时定义filter 3例如可以是 test N
  • Prolog内存问题

    我想找到一种方法来分析我在序言中编写的谓词 一个巨大的谓词 的内存使用情况 我目前正在运行它swi http www swi prolog org and yap http www dcc fc up pt vsc Yap document
  • 斜线(/)在序言中做什么?

    我有这个代码 set value X Value X T X Value T set value X Value Y V T Y V NewT X Y set value X Value T NewT set value X Value X
  • Prolog 展平列表

    flatten A B R islist A gt flatten A R1 R R1 write A append A R1 R flatten B R1 flatten X X islist 这是我写的代码 但我有奇怪的问题 I get
  • 谓词对于列表中的所有元素都必须为 true

    我有一组事实 likes john mary likes mary robert likes robert kate likes alan george likes alan mary likes george mary likes har

随机推荐

  • 在运行时选择模板参数时如何避免代码呈指数级增长

    考虑一堆基本类型 Foo 所有这些都具有通用方法的独特实现 Bar 我可以结合Foo1 Foo2 Foo5像这样 CombinedFoo
  • 通过提供邮政编码获取城市名称的网络服务[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我需要一个可靠的网络服务 它通过传递邮政编码给出相应的城市名称 该网络服务应该随时可用 该网络服务也将在生产中使用 我发现了几种使用基于
  • 更改 EF Power Tools Beta 3 中生成的文件名

    我已经搜索过但无法找到这个问题的答案 目前我们的数据库用户表的前缀 例如tblUsers 我已更新 EF 模板以从生成的类名称中删除 tbl 但是我仍然不知道如何更改输出文件名以匹配 有可能吗 还是我在向月亮祈求 我正在 VS 2012 中
  • 为什么 T-SQL 块即使不应该执行也会给出错误?

    我正在编写一个 看似 直接的 SQL 片段 它在确保列存在后删除该列 问题 如果该列不存在 则代码insideIF 子句抱怨它找不到该列 出色地 doh 这就是为什么它位于 IF 子句内 所以我的问题是 为什么一段不应该执行的代码会出错 这
  • 如何不自动取消引用 Google App Engine 中的 db.ReferenceProperty?

    假设我有 class Foo db Model bar db ReferenceProperty Bar foo Foo all get 有没有办法让我在不向数据存储区进行查询的情况下执行 foo bar 操作 文档说foo bar将是一个
  • 如何将 Font Awesome 4.3.0 与 JSF 集成?

    我已经尝试过这个方法 如何将 webjars org 中的 Font Awesome 与 JSF 结合使用 https stackoverflow com questions 18891768 how to use font awesome
  • Spark:如何从spark shell运行spark文件

    我正在使用CDH 5 2 我能够使用火花外壳运行命令 如何运行包含 Spark 命令的文件 file spark 有没有办法在没有 sbt 的情况下在 CDH 5 2 中运行 编译 scala 程序 在命令行中 您可以使用 spark sh
  • 如何覆盖 attr_protected?

    我的 STI 实施如下 class Automobile lt ActiveRecord Base end class Car lt Automobile end class Truck lt Automobile end class Us
  • 如何将不同层的核心动画一个接一个地链接起来?

    我有一个启用分页的scrollView和N个页面 它们是作为scrollView的子视图的UIView 我正在尝试执行以下操作 用户滚动到第 n 页 此时 之前添加到第 n 页的 7 个 CALayers 即 到页面 scrollView
  • C# 中加密的数据太长,无法在 Java 中解密

    我有一个用 Java 编写的服务器 它在将其发送到客户端之前将其 RSA 密钥转换为 NET 使用的 XML 格式 public String getPublicKeyXML try KeyFactory factory KeyFactor
  • MERGE 命令导致序列号出现间隙

    我试图利用 MERGE 命令来填充 Snowflake 中的维度 为了实现代理键 我创建了一个默认为序列号的列 每当插入新行时该序列号就会自动递增 我在其他数据仓库平台上尝试了类似的方法 但从未引起任何问题 但是 我注意到 每当我在 Sno
  • 是否可以使用 LINQ 检查列表中的所有数字是否单调递增?

    我感兴趣的是 在 LINQ 中是否有一种方法可以检查列表中的所有数字是否单调递增 Example List
  • 如何在 Vaadin 中禁用浏览器缓存

    我的问题很短 希望很容易解决 我怎样才能完全禁用我的浏览器缓存用vaadin实现的webservice 我想完全禁用缓存 因为当我尝试进行一些 PDF 流式传输并在浏览器中显示它们时遇到问题 我已经阅读了有关我的问题的解决方案 例如这里 使
  • Android 密钥库停止工作

    就在最近 我在密钥存储方面遇到了问题 我知道已经有很多关于这个问题的问题了 我已经阅读了所有这些内容并疯狂地用谷歌搜索 Error keytool error java io IOException Keystore was tampere
  • 将外部 jar 放在 JAVA_HOME/lib/ext 目录中是一件坏事吗?

    我们有一个在 JRE 环境中运行的应用程序 该应用程序使用了一些外部 jar 我们已将它们放在 JAVA HOME lib ext 文件夹中 这对我们来说已经工作了很多年 但最近一位新程序员加入了我们的团队 他似乎强调这是一件多么糟糕的事情
  • `knitr` 可以抑制 sql 块中的执行或输出吗?

    下面的文档运行 sql 并显示结果 我不希望显示任何输出 要么不运行该块 要么隐藏输出 有没有办法做到这一点 output html document Hide SQL Output First set up a temporary dat
  • 如何在 elisp 中将列表作为宏的参数?

    我想实现这样的目标 setq my global keybindings C x C d dired C x C b ibuffer C x b ivy switch buffer apply bind keys my global key
  • 在 IE9 中,如何使用 watir-webdriver 绕过无效证书屏幕?

    这是显示 该网站的安全证书有问题 的屏幕 标头 这是我尝试单击的链接的代码 tr td nbsp td td align left valign middle h4 img src red shield png border 0 alt N
  • Oracle 中的 TO_Char 数字格式模型

    我不完全理解如何使用 to char 函数将数字转换为具有适当格式模型的字符串 实际数字具有以下格式 使用逗号作为小数点分隔符 始终为 5 个小数 整数最多可达 6 可能是无限的 但目前绝不会超过 6 数字可以是正数或负数 数字可以以 0
  • 控制 Prolog 变量值选择

    灵感来自之前的一个问题 https stackoverflow com questions 41595786 using operator to save variables in a list我尝试实现一些可以枚举布尔表达式可能性的东西