PROLOG 中的递归?

2023-12-12

鉴于以下 Prolog 事实:

f(a, [b]).
f(b, [c]).
f(c, [d]).
f(d, [e]).
f(e, []).

我需要创建一个查询xyz(a,Y)这样我得到Y = [e,d,c,b],因为 a 依赖于 b,b 又依赖于 c,等等。 我当前的查询是:

xyz(X,Y):-
  f(X,P),
  member(Y,[P]).

然而,这个查询xyz(a,Y)只给我Y = [b],而不是 b 的家属等。

我想也许我可以将这两行添加到上面查询的末尾,但这并不像我希望的那样工作。由于之前的免费查询成功检索了 a 的依赖 b,因此我希望接下来的两行可以对 b 及其以上执行相同的操作。但是,我认为这也许不是解决这个问题的好方法。也许递归是一个更好的主意。

f(P,S),
member(Y,[P]).

我很确定我应该在最后添加一个递归,但我不知道如何处理。有人能帮助我吗?

(3/4) 编辑:

我能够使用下面的 @CapelliC 方法成功解决单元素列表的问题。然而,我想扩展这个问题,以便它适用于多元素列表,其中 Prolog 事实现在看起来像:

f(a, [b, d]).
f(b, [c]).
f(c, []).
f(d, [e]).
f(e, [f]).
f(f, [g).
f(g, []).

在这种情况下,查询xyz(a,X)应该给我:X = [b,c,d,e,f,g],元素顺序不一定重要,我可以在之后对其进行排序。

这是之前适用于单列表的代码:

xyz(Z, [X|Y]):-
    f(Z,[X]),
    !,
    xyz(X,Y).
    xyz(_,[]).

根据@lurker的说法,我需要合并成员函数,但我遇到了麻烦。这是我当前的方法,但它不起作用,只是给我一个空列表作为所有内容的输出:

xyz(Z, [X|Y]):-
    f(Z,X),
    member(Y,X), // I'm not sure if this should be a 'Y'
    !,
    xyz(X,Y).
    xyz(_,[]).

有任何想法吗?


这个片段以相反的顺序获取列表,wrt您的请求......

xyz(K, [D|Ds]) :- f(K, [D]), !, xyz(D, Ds).
xyz(_, []).

edit扩展到多个依赖元素(但没有循环!)可以像

xyz(K, Ds) :- f(K, DKs) -> findall([T|P], (member(T, DKs), xyz(T, P)), L), flatten(L, F), sort(F, Ds) ; Ds = [].
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

PROLOG 中的递归? 的相关文章

  • 寻找最大最小值集合

    我正在尝试编写一个 天真的或半天真的 程序 给定一组元素和许多玩家将其划分为这个数量的玩家 并且对于每个这样的划分取最小值 按总和 子集 然后 我想计算所有这些最小除法的最大值 这被称为https en wikipedia org wiki
  • 如何从序言中的列表中删除列表?

    我想在序言中实现以下问题 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
  • Prolog 中的匹配元组

    为什么Prolog匹配 X Xs 包含更多元素的元组 一个例子 test2 X Xs write X nl test2 Xs test2 X write X nl test
  • 适合从记录中提取 OneToMany 关系的约束编程

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

    我正在尝试构建一个 DCG 它可以识别与此形式匹配的所有列表 a n b 2m c 2m d n 我写下了以下规则 s gt s gt ad ad gt a ad d ad gt bc bc gt b b bc c c bc gt a gt
  • SWI Prolog 使用的检查优化会发生什么情况?

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

    在 序言艺术 第二版中有一个问题 您应该定义一个谓词 Even permutation Xs Ys 和类似的奇数排列 当您查询时 例如 Even permutation 1 2 3 2 3 1 和 odd permutation 1 2 3
  • 如何在 Prolog 中解决这个算术表达式难题?

    我有一个编程问题 https blog svpino com 2015 05 08 solution to problem 5 and some other thoughts about this type of questions htt
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • Prolog内存问题

    我想找到一种方法来分析我在序言中编写的谓词 一个巨大的谓词 的内存使用情况 我目前正在运行它swi http www swi prolog org and yap http www dcc fc up pt vsc Yap document
  • 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
  • 使用 prolog 添加另外两次出现

    我有一个清单 a b a a a c c 我需要为每个元素添加两次以上的出现 最终结果应该是这样的 a a a b b b a a a a a c c c c 如果列表中有一个与下一个项目相同的项目 那么它会继续下去 直到出现一个新项目 当
  • 如何让 Prolog 解释你的结果超出真实的陈述

    我有以下事实和规则 flight sea msp flight msp jfk route A B flight A B route B A flight A B route A C flight A B flight B C 当查询rou
  • 判断第一个字母是否是元音序言

    我习惯了过程式编程语言 而且我在 prolog 上遇到了一些困难 缺乏在线资源也是一个遗憾 获取给定变量的第一个字符并检查它是否是元音的最 序言 方式是什么 我想 这样的东西就是我所追求的 这都是伪代码 但这是你解决问题的方法吗 isVow
  • 将行读取到序言中的原子列表

    我需要将任何行 来自 user input 读入原子列表 例如 Example line which contains any ASCII chars into Example line which contains any ASCII c
  • findall 的异常行为

    以下看起来很不寻常 findall X member X 1 2 3 X X 1 2 3 痕迹更是如此 trace findall X member X 1 2 3 X Call 11 findall 100058 member 10005
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng
  • 下面代码中的修剪选择点如何使其更加高效(Prolog)?

    在下面给出的代码中 有 cut 修剪选择点以提高效率 我非常确定reverse谓词和agent do moves谓词是必不可少的 solve task Task Cost agent current position oscar P sol

随机推荐

  • 具有共享网络的 Html 图像 src 路径在 Firefox 中不起作用

    在我的网页中 我使用图像标签 src 属性指向共享网络位置 即 server images image1 png 确切的脚本是 img src
  • 在 C# 中将树排序为列表

    我有一个 C 实体列表 我的实体定义如下 public class Item the id of an item public Guid ID get set if this is a child item the ParentID is
  • 如何在 phpmyadmin 中多次运行查询?

    我想要一种能够对查询进行 1 000 000 次基准测试的方法 做到这一点最简单的方法是什么 目前 我已经多次搜索发出查询的方法 但没有弹出任何内容 我还遇到过可以在 mysql 命令行中运行的 benchmark 命令 但它似乎有一些限制
  • CodeIgniter + jQuery UI 自动完成 = 由于 CSRF 设置为 TRUE,导致 500 内部服务器错误(带代码)

    这是查看代码
  • 由于线程未挂起,评估失败

    用户 我的 Microsoft VS Code 有问题 当我用方法运行我的代码时 System in read 我遇到问题 评估失败 因为线程未挂起 附 当我使用 javac 和 java 运行文件时 这段代码可以工作 我也有 VS Cod
  • C# 中使用和 .Dispose() 调用之间的区别[重复]

    这个问题在这里已经有答案了 我最近一直在使用Using 但我想知道它与显式调用 Dispose 有什么不同 例如 以下之间有什么区别 using DisposableTest obj new DisposableTest Some code
  • 获取数组中特定值之前和之后的键(在 PHP 中)

    我想获得价值before and afterPHP 中数组的特定值 例如我有 array 441 212 314 406 And my specific value is 441 在这个例子中我应该得到之前的 406 之后 212 如果我的
  • 添加平台 cordova 后没有平台

    自上周以来 我一直在尝试让科尔多瓦工作 但还没有成功 从这个文档一步一步 http cordova apache org docs en 3 2 0 guide cli index md html 在 cordova 平台添加 androi
  • libpqxx v12 - 将向量值动态绑定到准备好的语句(替代调用)

    我想使用准备好的语句一次将数千行插入到我的 postgres 数据库中 要插入的数据存储在结构向量中 通过阅读以下问题的答案如何在 Postgresql for C 中准备语句和绑定参数我想我找到了方法 不幸的是 我使用的当前版本的 lib
  • Mysql 用 SELECT CASE 的结果存储变量

    我正在学习如何使用 SELECT CASE 但我不太明白 这里是代码 SET vgls 1 SET lgls 1 SET st SELECT CASE WHEN vgls lgls THEN emp WHEN vgls gt lgls TH
  • 为什么 hashcode() 返回一个整数而不是 long? [复制]

    这个问题在这里已经有答案了 在java中 hashcode 方法返回整数而不是长整型 有什么具体原因吗 嗯 一个很好的理由是hashCode基于数据结构 HashSet HashMap 使用数组来存储 bin 数组仅限于int指数 你将一无
  • 当活动重新启动时,活动的片段如何恢复?

    我正在测试系统由于 RAM 不足而终止应用程序进程后用户进入我的应用程序的情况 我看到意想不到的行为并希望得到一些帮助 在我的应用程序中 我有一个活动 我们称之为ActivityA 立即创建一个片段 Fragment A 并进行片段替换 F
  • android WebView停止Flash插件onPause

    我有一个 WebView 其中包含一个 html 文件 其中包含一个 Flash 插件 一个视频 当用户按下 Flash 插件上的播放按钮时 视频可以正常播放 然而 当用户关闭应用程序或移动到新的 Activity 时 Flash 仍在后台
  • 调度周期性任务和时钟漂移

    我想安排一个每隔 X 小时执行一次的定期任务 我有一个用 Java 编写的服务 我正在考虑创建一个长时间运行的后台线程 只要服务启动 它就永远运行 我如何确保我们每 X 小时执行一次任务 我的主机上的时钟漂移是我应该担心的问题吗 我知道如果
  • 在同一端口上运行多个 Tomcat 实例

    我需要在同一端口上的不同目录名下运行多个 tomcat6 实例 我将为两个不同的项目安装两次tomcat6 但是如何将两个实例配置为在同一端口上运行 您可以使用 apache Web 服务器来实现这一点 该服务器使用 mod jk 或 mo
  • xsl:fo 检索标记不是有效的子项

    我需要进行 xsl fo 转换
  • 如何将每个句子的第一个字母大写?

    我知道如何将每个单词的第一个字母大写 但我想知道如何在 C 中将每个句子的第一个字母大写 这不一定是一个小问题 句子可以以许多不同的标点符号结尾 而这些相同的标点符号并不总是表示句子的结尾 像 Dr 这样的缩写可能会带来特殊问题 因为可能有
  • C++ 模板 std::tuple 到 void* 并返回

    我正在尝试使用 C 11 和可变参数模板创建资源管理器 问题是如何将 std tuple 存储到集合中并将其取回 在此示例中 我尝试将其存储到 void 此处尝试不使用 boost any 每次我转换回 std tuple 时 我都会发现转
  • 使用列计数时避免将元素拆分为两列

    我正在尝试使用多列创建一组 但它将一个 Link4 分成两列 只需将鼠标悬停在 Link4 上即可 它的一些部分被分成第二列 有没有什么可能的方法来避免这种情况 div Nav height 100 important div Nav a
  • PROLOG 中的递归?

    鉴于以下 Prolog 事实 f a b f b c f c d f d e f e 我需要创建一个查询xyz a Y 这样我得到Y e d c b 因为 a 依赖于 b b 又依赖于 c 等等 我当前的查询是 xyz X Y f X P