Prolog:消除间接关系中的循环

2023-11-30

我有一个用户事实列表,定义为:

user(@michael).
user(@ana).
user(@bob).
user(@george).
user(@john).

等等。此外,我还有一组事实:

follows(@michael,@ana).
follows(@ana,@bob).
follows(@bob,@michael).

我正在尝试编写一个间接关系(user1,user1),它会告诉我 user1 是否间接跟随 user2。 然而,我无法消除循环关系。

就像给定的例子一样,michael -> ana -> bob -> michael 将导致一个循环。

从间接(user1,user2)结果中消除这些循环的最佳方法是什么?


您可以制定一条规则,传递迄今为止您“见过”的额外用户列表,并忽略来自这些用户的以下内容:follows(A, B, Seen).

为此,请定义一个包装实际规则的“遵循传递”规则,如下所示:

follows_tx(A, B) :- follows(A, B, []).

现在您可以定义follows/3这样规则:

follows(A, B, Seen) :-
    not_member(B, Seen),
    follows(A, B).
follows(A, B, Seen) :-
    follows(A, X),
    not_member(X, Seen),
    follows(X, B, [A|Seen]).

基本条款说,如果有一个事实关于A下列的B,只要我们还没有看到谓词,我们就认为谓词已被证明B before.

否则,我们会找到跟随的人A,通过检查来检查我们是否还没有看到该用户not_member/2,最后看看该用户是否关注B,直接或间接。

最后,这是您可以定义的方法not_member:

not_member(_, []).
not_member(X, [H|T]) :- dif(X, H), not_member(X, T).

Demo.

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

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
  • 斜线(/)在序言中做什么?

    我有这个代码 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 和一般情况下避免尾递归吗?

    我正在阅读 立即学习 Prolog 在线书籍 以获取乐趣 我正在尝试编写一个谓词 该谓词遍历列表的每个成员并向其添加一个 使用累加器 我已经在没有尾递归的情况下轻松完成了 addone addone X Xs Y Ys Y is X 1 a
  • Same_length/2 更好的纯版本

    鉴于频繁的纯定义same length 2 as same length same length As Bs same length As Bs same length L L loops 是否有一个纯粹的定义不会在这种情况下循环 类似于纯
  • 从终端查询不会打印任何内容

    当在命令行中运行时 这 swipl g write 42 t halt 打印 42 到STDOUT正如预期的那样 然而 这 swipl g X 42 t halt 不打印任何内容 它只是返回 我如何让它打印在 REPL 中打印的内容 即X
  • Prolog 中的隔离列表

    我很难理解如何让我的代码显示由偶数和奇数组成的隔离列表 我什至不确定我的理解缺乏什么 显然我对这门语言很陌生 必须在学校使用它 我的命令式和功能性思维不会让我知道这到底是怎么回事 哈哈 现在 不 我不是要求你做我的作业 我只是请你帮我看看我
  • Prolog - 如何从输入文件的给定列表中创建变量列表?

    我有一个输入谓词将文件作为列表读取 输入 文件名 列表 该列表的格式将是 9 字面意思就是下划线字符 在这里 不是一个通配符 问题是我如何编写谓词 pred List List2 然后转换所有 进入变量但保留9还在同一个位置吗 所以如果我输
  • Prolog中计算数字是否为素数

    我正在尝试计算输入是否是素数 但出了问题 这是我的代码 primeNumber X prime prime A 1 prime prime A B R is A mod B R 1 R A prime prime X B B lt A Ne
  • 将 SWI Prolog 代码编译为 Windows 可执行文件 - 解析器 Grails3 项目

    我正在尝试构建解析器 Grails3 项目https github com RichardMoot Grail https github com RichardMoot Grail谁的教程是http www labri fr perso m
  • 如何让 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 练习实现求解谓词?

    我正在使用 Ivan Bratko 的书 人工智能编程 学习 Prolog 我发现实施拟议练习的最后部分有些困难 该练习是一个使用图形来决定如何移动块并按顺序排列它们的程序 这是与程序必须执行的操作相关的图像 正如您在上图中看到的 可以使用
  • Prolog - 通过演绎减少知识库

    我需要创建一个规则来搜索与 my rule 匹配的事实 这些事实将用于改变知识库 my rule Conclusion Premise 我有这个知识库可以开始 dynamic is 2 is m1 house is m1 thing is
  • Prolog:如何在不重复的情况下创建所有可能的组合

    我正在尝试创建一个谓词来查找所有可能的组合而不重复相同的数字 我尝试使用排列谓词 但它发现了重复的列表 例如 permutation 0 1 1 L L 0 1 1 L 0 1 1 L 1 0 1 L 1 1 0 L 1 0 1 L 1 1
  • 判断第一个字母是否是元音序言

    我习惯了过程式编程语言 而且我在 prolog 上遇到了一些困难 缺乏在线资源也是一个遗憾 获取给定变量的第一个字符并检查它是否是元音的最 序言 方式是什么 我想 这样的东西就是我所追求的 这都是伪代码 但这是你解决问题的方法吗 isVow
  • Prolog 在技术上是如何工作的?引擎盖下是什么?

    我想更多地了解 Prolog 的内部结构并了解它是如何工作的 我知道如何使用它 但不是它内部如何运作 Prolog 中使用的算法和概念的名称是什么 它可能会构建某种树结构或有向对象图 然后在查询时使用复杂的算法遍历该图 也许是深度优先搜索
  • Prolog:给定两个索引,创建子列表

    基本上 我需要创建 sublist S M N L 形式的谓词 其中 S 是由索引 M 和索引 N 之间 含 之间的 L 元素形成的新列表 这是我得到的 sublist sublist M N M gt N sublist S M N L
  • 使用 DCG 解析变量

    我在使用 Prolog 的 DCG 表示法将以大写字母开头的序列解析为变量时遇到问题 例如 如果我有字符串 f a X y Z X 以及解析该字符串的 DCG 是否有任何方法可以将每个大写字母解析为唯一的 Prolog 变量 例如 解析Y到

随机推荐

  • 当上游有事件时,为什么有一个可用的“事件”变量而没有定义?

    我今天偶然发现了一个奇怪的行为 基本上 我有一个绑定到 knockout js 单击事件的函数 该函数利用了淘汰事件 但没有明确将其作为参数 this myClickHandler function console log event ev
  • 从子字符串中包含特定字符的字符串中提取单词

    在 MS Excel 中 我想使用公式从文本中包含特定字符 的单元格中仅提取单词 A2 多莉给我做了一个自制的蛋糕和一些松饼 A3 晚餐我们吃了奶酪 蛋糕 A4 每个人都喜欢面包店制作的美味 蛋糕 A5 约翰尼昨晚自己做了晚餐 然后打扫了厨
  • xlink 的 jQuery 选择器

    a xlink href coastline attr class grey a xlink href onshore attr class blue light 这就是我目前必须选择具有 xlink 的每个项目 coastline然后把它
  • 有没有办法很好地去除标签?

    有没有办法隐藏这个标签栏 附 不确定这个问题是否属于 stackoverflow 好的 我自己通过编写 VS 扩展来完成此操作 还将标题栏和菜单栏切换为自动隐藏 现在我的 VS 终于有了一个简约的视图 GitHub VS画廊
  • 如何在字典中打印换行符?

    我正在尝试通过字典创建一个查询 如下所示 Name name ID id Date of Birth dob 第二name是用户通过 raw input 输入的预设值 同样对于id和dob 这是我当前的代码 students id nNam
  • 是否可以预先评估 bash 的 PS1 中的值?

    我正在尝试构建一个 Bash 提示符 其中包含我的 git 分支信息 使用 git 的 bash completion 中的 git ps1 和一个小彩色笑脸来指示最近运行的命令是否成功 笑脸是使用这种技术创建的 我在这里找到了这样的技术
  • 如何使用 jquery mobile 创建 100% 高度的 div?

    如何创建 id test 高度为 100 的 div div div h1 Title h1 div div div div div div
  • OptaPlanner,Score计算速度会太低

    运行我的 optaplanner 项目并得到以下输出 看来有两个问题 这些输出是什么意思 第一个是 Score calculation speed will be too low because move thread s destroy
  • 如何在PHP中使mysql查询不断刷新?

    我正在制作一个基本的聊天室 我的代码 conn 127 0 0 1 root mymessages stmt SELECT FROM posts ORDER BY timestamp LIMIT 100 result mysqli quer
  • 将 jQuery 加载到 Django 中

    我有一个非常基本的问题 我正在尝试将一些 AJAX 功能构建到 Django 项目中 我打算使用 jQuery 现在 我只是通过 Linux 在本地运行代码 我一直在测试一些代码here所以我相当确定它是有效的 但我无法确定将 jQuery
  • com.android.support:appcompat-v7 和设计版本 23.2.0 崩溃包裹错误

    我在我的应用程序中使用了几个来自 android 支持的库 并在它们可用时更新它们 在版本 23 2 0 的测试期间 当我更改 Android 6 上的应用程序权限时 我遇到了崩溃 如您所知 当用户禁用权限时 会重新创建应用程序 与设备旋转
  • Android:图像绕中心旋转

    我正在尝试围绕中心旋转图像 这通常使用 RotateAnimation 工作 但我想让它更快一点 我现在使用带有单独绘图线程的 SurfaceView 模式 这是正确绘制位图的代码 取决于外部 标题 航向 角度 以度为单位 位图 位图 w
  • cmake 检测哪个库 libc++ 或 libstdc++ 配置为针对 g++ 或 clang++ 使用

    我写了一个CMakeLists txt构建一个项目g or clang 为了捕获尽可能多的错误 我同时使用了两者libc with D LIBCPP DEBUG2 2 for clang and libstdc with D GLIBCXX
  • 将 pandas multiindex 系列转换为 Json python

    嗨 我有两个类似于下面的熊猫系列 PnL Product Name Price Company A Orange 3000 Company B Apple 2000 Grapes 1000 Tax Product Name Price Co
  • 在 React Native 中更改 TouchableOpacity 的颜色

    谁能帮我 这是我的源代码 https snack expo io rJFgyPDpH 想法是 如果我点击 1 Button 它应该是 红色 如果我点击 2个按钮 也应该将其颜色更改为 红色 但是 1 个按钮 应将其更改为默认颜色黑色 然而
  • 快速获取 2 个日期之间的月份总数

    如何获得两个日期之间的总月份 这是约会的正常方式 1 开始日期 2020 2 22 10 25 00 2 结束日期 2020 3 3 12 34 00 let diffInDate Int Calendar current dateComp
  • 如何解析Controller中的Service Provider?

    我试图更好地理解服务容器在 Laravel 中的工作原理 所以我知道服务是用来拥有 Laravel 设置的你想要使用的东西 对吗 我正在尝试使用 LDAP php 内置函数制作一个简单的示例 我的里面有这个AppServiceProvide
  • 调用 Scanner.close() 会抛出 nosuchelementException

    我有一个简单的方法 可以将命令打印到屏幕上 扫描用户的输入 并将其作为字符串返回 如果用户的输入无效 它会通知用户并再次询问 此方法运行良好 但我的导师提到我们应该始终关闭资源 因此我返回并添加了 close 方法 现在每次调用该方法时 无
  • PostgreSQLgenerate_series()以SQL函数作为参数

    我有一个名为的 SQL 函数get forecast history integer integer 这需要两个参数 一个月和一年 该函数返回使用以下命令创建的自定义类型 CREATE TYPE fcholder AS y integer
  • Prolog:消除间接关系中的循环

    我有一个用户事实列表 定义为 user michael user ana user bob user george user john 等等 此外 我还有一组事实 follows michael ana follows ana bob fo