Prolog 中的匹配元组

2024-04-24

为什么Prolog匹配(X, Xs)包含更多元素的元组?一个例子:

test2((X, Xs)) :- write(X), nl, test2(Xs).                                    
test2((X)) :- write(X), nl.                                                   
                                                                              
test :-                                                                       
        read(W),                                                               
        test2(W). 

?- test.
|: a, b(c), d(e(f)), g.
a
b(c)
d(e(f))
g
yes

实际上这就是我想要实现的目标,但似乎很可疑。还有其他方法可以将术语连词视为 Prolog 中的列表吗?


Tuple term建设与,/2PROLOG 中的运算符通常是右结合的(通常称为sequence),所以你的输入a, b(c), d(e(f)), g实际上很可能是这个词(a, (b(c), (d(e(f)), g)))。您的谓词这一事实证明了这一点test2/1打印您的问题中显示的内容,在第一次调用第一个子句时test2/1, X匹配的a and Xs匹配的(b(c), (d(e(f)), g)),然后在第二次调用时X匹配的b(c) and Xs匹配的(d(e(f)), g), 等等。

如果你真的想处理一个list对于解释为连词的术语,您可以使用以下内容:

test2([X|Xs]) :- write(X), nl, test2(Xs).                                    
test2([]).

...输入时[a, b(c), d(e(f)), g]。这里的列表结构通常与使用构造的元组解释略有不同,/2(至少在 SWI-PROLOG 中,这样的结构是处理由./2与构造序列或元组项的方式大致相同,/2)。这样,如果您可以允许列表术语,您将获得列表术语支持的好处解释为连词在你的代码中。另一种选择是声明并使用您的own(可能是中缀运算符)用于连接,例如&/2,您可以将其声明为:

:- op(500, yfx, &). % conjunction constructor

然后你可以将你的连接构造为a & b(c) & d(e(f)) & g并从那里适当地处理它,确切地知道你的意思&/2- 连词。

请参阅手册页op/3 http://www.swi-prolog.org/pldoc/man?predicate=op/3在 SWI-PROLOG 中了解更多详细信息 - 如果您不使用 SWI,我认为您使用的任何 PROLOG 实现中都应该有一个类似的谓词 - 如果它值得的话那就是盐:-)

EDIT:转换使用构造的元组术语,/2对于列表,您可以使用类似以下内容:

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

Prolog 中的匹配元组 的相关文章

  • 如何在 Prolog 中为变量(如字符串)分配多个值?

    今天早些时候 我寻求帮助以在序言中构建数据库以及如何通过参数搜索 有人提出了这个 您还可以向每个处理器添加术语列表 例如 processor pentium g4400 brand intel family pentium series g
  • Prolog - 从列表中删除具有相同第一个值的对

    我有这样的对象列表 list obj x y obj x z obj a b obj b c 我想删除那些共享相同第一个值的元素 这样我就可以使用修改后的列表 在这种情况下 最终列表将如下所示 list obj a b obj b c 有人
  • .net 中 Tuple(T1)/Singleton 的用途是什么?

    net 4 中的元组类型之一是单元素元组 http msdn microsoft com en us library dd384265 aspx 我只是想知道这个结构的目的是什么 我看到的唯一用途是在使用时8 Tuple http msdn
  • Java 中 & 和 && 有什么区别?

    我一直以为 Java中的运算符用于验证其两个布尔操作数是否为true 以及 运算符用于对两个整数类型进行按位运算 最近我才知道 运算符也可用于验证其布尔操作数是否为true 唯一的区别是即使 LHS 操作数为 false 它也会检查 RHS
  • 错误:没有运算符 << 与这些操作数匹配?

    我正在练习一些 C 试图离开 Java 我偶然发现了这个恼人的错误 错误 没有操作符 这个错误在我的 cpp 文件中 还有其他错误 但我现在不关心它们 void NamedStorm displayOutput NamedStorm sto
  • 寻找最大最小值集合

    我正在尝试编写一个 天真的或半天真的 程序 给定一组元素和许多玩家将其划分为这个数量的玩家 并且对于每个这样的划分取最小值 按总和 子集 然后 我想计算所有这些最小除法的最大值 这被称为https en wikipedia org wiki
  • std::valarray 的运算符* 有什么问题?

    考虑以下 MCVE 其中我有两个值数组 其中w是两次v 在这里尝试一下 https godbolt org z JkXPNN include
  • 正则表达式 - 线上任何地方的负向后看

    仅当同一行中前面没有特定字符时 如何匹配模式 我有以下正则表达式代码 pattern lt s lt replacement span 1 span code Regex Replace code pattern replacement 我
  • Prolog 管线任务

    我有一项任务是在序言中制作一张简化的地铁地图 其中一部分要求制定一项规则来检查两个车站是否在同一条线上 我有一条规则 但它似乎不起作用 这就是我到目前为止所拥有的 adjacent nh lg central 4 adjacent lg o
  • 为什么不使用强制转换语法调用“operator void”?

    玩的时候这个答案 https stackoverflow com questions 4030959 will a variablename c statement be a no op at all times 4030983 40309
  • 如何从python字典中的给定名称获取键

    我有一个变量叫做 anime dict which contains a dictionary of lists of objects as shown below JI2212 Inu Yasha year 1992 rating 3 E
  • 在 Prolog 中动态拆分列表

    我从序言开始几周 但我看到了更深入的操作列表的递归谓词的构造 我的问题是 是否可以构建一个谓词 将给定列表拆分为给定数量的其他列表 比如我想象的 split H T NumberLists Lists 递归实现 split 1 2 3 4
  • 如何在 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
  • Scala:具有可重用条件的模式匹配

    考虑这种模式匹配的情况 foo match case x if expensiveCalculation x nonEmpty gt do something with expensiveCalculation x 是否可以 标记 或重复使
  • 我在 Python 中查找重复循环的正则表达式模式有什么问题?

    我想匹配任何具有重复循环的字符串 就像这个数据一样 3333333333333333333333333333333333333333 1 digit cycle 3 1666666666666666666666666666666666666
  • 如何在Python中检查元组是否包含元素?

    我试图找到可用的方法 但找不到 没有contains 我应该使用index 我只想知道该项目是否存在 不需要它的索引 You use in if element in thetuple whatever you want to do
  • 根据两个元素对元组列表进行排序[重复]

    这个问题在这里已经有答案了 我有一个元组列表 如下所示 a 4 2 a 4 3 a 7 2 a 7 3 b 4 2 b 4 3 b 7 2 b 7 3 我知道 例如要按第二个元素对它们进行排序 我可以使用 sorted unsorted k
  • 实现用户定义的算术函数

    如何添加函数 例如汉明权重 并在右侧出现的表达式中使用它是一些 is 2 goal 像 goal expansion 或 term expansion 这样的东西可以帮助这里吗 我承认这不是一个大功能 但它可以提高我的一些 Prolog 程
  • R 中从右到左的运算符结合性可能吗?

    我是 R 新手 我刚刚发现我患有支架恐惧症 https mathematica stackexchange com a 17315 2266 请参阅链接中的评论 我喜欢这种方式magrittr符号 gt 有效 因为它在某些情况下避免了嵌套括
  • SWI Prolog 使用的检查优化会发生什么情况?

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

随机推荐

  • WAMP服务器将MySQL切换为MariaDB

    如何在WAMP 3 1 0中将数据库从MySQL切换到MariaDB 我正在寻找它 但我找不到它 从您显示的图像来看 MySQL 和 MariaDB 似乎都已经在运行 注意 这有点占用内存 简单测试看看 MySQL 和 MariaDB 是否
  • python服务器中进程之间共享列表

    我有简单的UDP服务器 它适用于多重处理 我想创建一个列表 其中包含有关所有客户的信息 I use Manager 但我不明白 如何在列表中附加信息 我需要传输 Manager 的对象来处理 但是如何 我使用新属性的方法不起作用 impor
  • 将图像插入 JTable

    我在将图像插入 JTable 时遇到问题 我搜索了一下 发现有两种方法 您可以覆盖表模型的 getcolumnclass 或创建自定义 tablecellrender 我选择使用以下代码制作自己的单元格渲染器 public class My
  • 从 Helm stable/cert-manager 升级到 jetstack/cert-manager

    我们有一个生产 AKS 集群 其中包含stable cert manager安装 helm 图表以允许使用 Let s Encrypt 证书 当前安装的版本是cert manager v0 6 0 in the kube system命名空
  • Laravel:BadMethodCallException 方法 [find] 不存在

    当尝试使用模型对象 User 从数据库中提取一些值时 出现以下错误 BadMethodCallException Method find does not exist 这是我的文件 模范用户
  • 错误 NU5049 不支持 SDK 样式项目的 pack 命令

    我的解决方案包含 Framework 4 8 项目 Net Standard 2 1 项目和 net6 项目 它已经运行了几周 没有出现任何问题 今天构建管道开始失败并出现错误 错误 nuget 命令失败 退出代码 1 和错误 错误 NU5
  • 解析iOS SDK:从Xcode调用云函数

    Scenario我想在我的应用程序中使用这两个云函数 他们检查用户的在线状态 我想为每个用户设置一个布尔键 isOnline 如果用户在线 则设置为 是 如果用户不在线 则设置为 否 var moment require moment Pa
  • 使用 jQuery 获取类中不同类型的输入

    假设我在 JavaScript 中有一个 jquery 函数 并且到目前为止我有这段代码 效果很好 jQuery div class someClass input type text each function some code 在上面
  • 如何在 C# 中使用随机数?

    我正在用 C 和 XNA 开发 Pong 我想使用一个随机数 在一定范围内 来确定诸如球是否直线反弹或以一定角度反弹以及球击中球拍时移动的速度之类的事情 我想知道如何实施 Use the Random http msdn microsoft
  • 为什么我收到 PayPal Android Native Checkout SDK - 无效的 client_id 或 redirect_uri

    我正在使用新的 Android Native Checkout SDK 和 Kotlin 并且我一直遵循文档中的每一步 但这种情况不断发生 我不知道为什么 我也在尝试PayPal Android Native Checkout SDK 无效
  • 为什么调用指定命名空间的函数会更慢?

    我认为指定我给出的命名空间R要做的工作更少 但我可能是错的 library microbenchmark gt microbenchmark unique default c 1 1 10 base unique default c 1 1
  • 忽略 git log -p 中的文件

    我正在尝试总结我在一个项目上的工作 问题是我不想在输出中包含测试文件git log patch 这些文件位于一个名为mtest 但是 该文件夹还包含我确实想展示的测试套件代码 我想排除的测试文件具有扩展名mscx or xml 所以我希望过
  • 关闭文件夹/命名空间约定

    我看到人们在谈论烦恼Visual Studio 自动创建与项目文件夹相对应的命名空间 https stackoverflow com questions 1289425 should i stop fighting visual studi
  • 如何使用 conda 卸载 r-essentials?

    最近 我安装了r essentials using conda命令 conda install c r r essentials正如这个网址中所描述的 https anaconda org r r essentials https anac
  • Angular2 条件路由

    这可能是一个基本问题 但是在 Angular2 中是否有任何方法可以进行条件路由 或者 有人会在路由器之外这样做吗 我知道 ui router 有一定的能力做到这一点 但我在 Angular2s 路由器中没有看到类似的东西 如上所述 角路线
  • 通过值获取 std::queue 中元素的索引

    有没有一种简单的方法来获取元素在 a 中的位置std queue通过它在 C 中的值 例如 std queue
  • 重新声明第 3 方库中不正确的打字稿类型

    我正在使用带有 types winston 类型的winston 3 0 这些类型尚未完全兼容 并且我遇到了类型中的错误 我不知道如何纠正 这是我的代码 记录器 ts export function middleware express H
  • Show 的新实例声明

    我正在尝试在 Haskell 中为我创建但未成功创建的新数据类型添加实例声明 到目前为止我已经尝试过 data Prediction Prediction Int Int Int showPrediction Prediction gt S
  • 使用 Heroku 拒绝关系 django_migrations 的权限

    在尝试在 Heroku 上使用 django 迁移数据库更改时 我得到 psycopg2 ProgrammingError permission denied for relation django migrations 其他人已经能够通过
  • Prolog 中的匹配元组

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test