prolog 中对称关系的传递闭包

2023-12-02

我是序言初学者,我想创建“兄弟”关系。

该关系应该是对称的,就像兄弟(阿林、亚历克斯)是真的,兄弟(亚历克斯、阿林)应该也是如此。

它也应该是传递的,就像兄弟(阿林、亚历克斯) and 兄弟(亚历克斯、克劳迪乌)是真的,兄弟(阿林、克劳迪乌)应该也是如此。

结合 到 属性,如果兄弟(亚历克斯、阿林) and 兄弟(亚历克斯、克劳迪乌)是真的,兄弟(阿林、克劳迪乌)也应该如此。

这是我的代码:

r_brother(alin, alex).
r_brother(alin, ciprian).
r_brother(alex, claudiu).

s_brother(X, Y) :- r_brother(X, Y).
s_brother(X, Y) :- r_brother(Y, X).

brother(L1, L2) :-
    t_brother(L1, L2, []).

t_brother(L1, L2, _) :-
    s_brother(L1, L2).

t_brother(L1, L2, IntermediateNodes) :-
    s_brother(L1, L3),
    \+ member(L3, IntermediateNodes),
    t_brother(L3, L2, [L3 | IntermediateNodes]).

r_兄弟- 是基本关系

兄弟- 是对称兄弟关系(这很好用)

兄弟- 这应该是传递和对称关系,我保留中间节点,这样我就不会出现循环

问题是答案:

?- brother(X, alin).

is:

X = alex ;
X = ciprian ;
X = alin ;
X = alin ;
X = alin ;
X = alin ;
X = alex ;
X = alex ;
X = alex ;
X = alex ;
X = ciprian ;
X = ciprian ;
X = claudiu ;
X = claudiu ;
false.

我查看了跟踪,我明白问题是什么,但我不知道如何解决。

alin不应该是一个可能的答案,其他答案应该出现一次。


我认为基本问题是您没有检查 t_brother/3 的第一个子句中是否已经找到了 L2。初始的 L1 应该添加到 Brother/2 的列表中:

brother(L1, L2) :-
  t_brother(L1, L2, [L1]).                   % <-- [L1] instead of []

t_brother(L1, L2, IntermediateNodes) :-
  s_brother(L1, L2),
  \+ member(L2, IntermediateNodes).          % <-- added this check

t_brother(L1, L2, IntermediateNodes) :-      % <-- this clause is unchanged
  s_brother(L1, L3),
  \+ member(L3, IntermediateNodes),
  t_brother(L3, L2, [L3 | IntermediateNodes]).

您仍然可以通过使用析取来缩短解决方案:

t_brother(L1, L2, IntermediateNodes) :-
  s_brother(L1, L3),
  \+ member(L3, IntermediateNodes),
  ( L2=L3
  ; t_brother(L3, L2, [L3 | IntermediateNodes])).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

prolog 中对称关系的传递闭包 的相关文章

  • 如何在 SWI-Prolog 中创建事实?

    我只想创建类似的东西 like x y 我已经尝试了很长时间了 真的很沮丧 谁能告诉我该怎么做 我假设您正在交互地使用 swi 并尝试输入事实会给您一个如下错误 1 like x y ERROR toplevel Undefined pro
  • AllegroGraph 检查现有三元组

    我正在使用 AllegroGraph 4 我有一个三元组存储 并且只有在新的三元组尚不存在时我才会尝试添加它们 这是我的 Prolog 查询 select news alfas news a news tst has annotation
  • 二叉树的 Herbrand 宇宙、Herbrand 基础和 Herbrand 模型(序言)

    什么是二叉树的 Herbrand 宇宙 Herbrand Base 和 Herbrand Model binary tree empty binary tree tree Left Element Right binary tree Lef
  • Prolog 变量查询中的“\+”问题

    我正在读 七周七种语言 atm 我对一些 Prolog 查询感到困惑 我不明白对 否 的回答 The friends pl文件看起来像这样 likes wallace cheese likes grommit cheese likes we
  • Prolog 中的聊天机器人

    我一直在尝试在序言中创建一个聊天机器人 作为作业 到目前为止 我已经在 pl 文件中创建了一个数据库 并且列出了很多可能的对话 我知道序言是这样工作的 例如如果我们有 Chatbot good 然后我们输入 Chatbot good 它会回
  • 如何在 swi-prolog 的 prolog 文件中运行 prolog 查询?

    如果我有一个定义规则的 prolog 文件 并在 Windows 中的 prolog 终端中打开它 它会加载事实 然而 然后它显示 提示我手动输入一些内容 如何将代码添加到文件中 以便它实际上会评估这些特定的语句 就像我输入它们一样 像这样
  • YAP Prolog 中的正向链接?

    我需要在某些 Prolog 问题中使用前向链接器 我想避免使用普通元解释器从头开始实现它 但如果没有其他选项可用 这就是我必须要做的 因为使用元解释器执行此操作会很慢 而且我我确信应该有一些好的实现 有人知道 YAP 或 SWI Prolo
  • 执行树元解释

    我有根据我之前的问题制作的跟踪元解释器here https stackoverflow com questions 27235148 implementing cut in tracing meta interpreter prolog 我
  • 如何实现 not_all_equal/1 谓词

    如何实施not all equal 1谓词 如果给定列表包含至少 2 个不同的元素 则该谓词成功 否则失败 这是我的尝试 不是很纯粹的尝试 not all equal L member H1 L member H2 L H1 H2 gt t
  • Prolog 实现 and/2、or/2、nand/2、nor/2、xor/2 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在序言中实现以下谓词并将它们用于真值表 and 2 or 2 nand 2 nor 2 xor 2 也许有人可以告诉我如何实现和
  • 转换句子会产生无限循环 - 但如何转换呢?

    我不明白这是哪里出了问题 请注意 我对 Prolog 很陌生 我确信我错过了一些东西 只是不知道那可能是什么 有人可以帮我吗 谢谢 这是我的代码 printSentence printSentence W write W write nl
  • 在 prolog 中读取用户输入的字符串

    我是 Prolog 初学者 我正在使用 swi prolog 刚刚开始使用它 我需要将用户输入字符串拆分到列表中 我尝试了以下代码 但出现错误 指出 在子句正文中完全停止 无法重新定义 2 write Enter the String nl
  • 在 SWI Prolog 中使用 process_create/3 使用命令提示符或 shell 时出错

    在 Windows 7 上 当我在 SWI Prolog 中使用 process create 3 打开 Notepad exe 等应用程序时 记事本将打开 但是 它不适用于使用命令提示符的应用程序 例如 当我尝试打开命令提示符窗口时 使用
  • Prolog家谱

    我做到了 但没有显示答案 当我询问兄弟姐妹 叔叔 阿姨时 这是我写的 有什么问题吗 uncle X Y male X sibling X Z parent Z Y uncle X Y male X spouse X W sibling W
  • 将 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 变体 它缺少findall 还有一个关于实现我们自己的问题findall here 获取 Prolog 中的解决方案列表 https stackoverflow com questions 419103
  • 变量的多个值介于 0 和数字序言之间

    所以我一直在尝试自学序言 我认为我进展顺利 然而 我有点坚持我正在尝试的这一种方法 toN N A A 等于 0 到 N 1 之间的整数值 按升序生成 所以 toN 5 A 将是 A 0 A 1 A 2 A 3 A 4 我对序言还很陌生 所
  • 判断第一个字母是否是元音序言

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

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

随机推荐

  • 如何在 Vuejs 渲染函数中复制插槽?

    我有一个通过插槽传递内容的组件 我正在使用渲染函数来输出内容 我使用渲染函数的原因是因为我想多次复制内容 当我使用这段代码时 一切正常 render createElement return createElement div this s
  • 旋转后图像不在正确的位置(图形)

    我试图以不同的速率显示两个直径为 512untis 的旋转轮 但我无法删除以前绘制的图像图形并将旋转的图形设置在正确的位置 现在我正在以任意角度进行旋转 我尝试了 affineTransform 并获得了旋转 但很奇怪 就像所有像素都散开一
  • 如何让表单延迟显示

    编辑 Application DoEvents 这做到了 在这里找到 强制从 UI 线程更新 GUI c winforms 我想以 1 为步长增加数字 并将这些增量显示在列表视图中 以便用户看到数字递增 例如从 10 到 15 我有另一个按
  • 图像 url 未显示在网格中

    我已经为图像网址设置了网格视图 我无法在网格中看到图像 仅显示背景 然后单击网格将在下一个屏幕中播放 我做错了什么 如何实施 预先非常感谢 my code public class act extends Activity static S
  • 如何在 Matplotlib 图中的单行中获得不同的颜色?

    我正在使用 matplotlib 来创建绘图 我必须在图表中画一条线 必须根据每个点的函数定义其颜色 例如 我需要一条线 其中 2000 以下的点涂成红色 2000 以上的点涂成蓝色 我怎样才能得到这个 您知道类似的解决方案或解决方法来实现
  • 如何处理球体功能匹配?

    我正在从事徽标检测应用程序OpenCV on Android 我进行了大量搜索 发现为此目的大多数时候都使用特征检测 所以我搜索并尝试了不同的检测器和匹配器 最后我编写了一个可以很好地工作的代码ORB特征检测器 and 暴力匹配器 priv
  • Tensorflow安装错误:此平台上不支持轮子

    当我尝试通过从 Git 克隆来安装 TensorFlow 时 遇到错误 没有名为 copyreg 的模块 因此我尝试使用虚拟环境 但是 我随后遇到了这个错误 pip install https storage googleapis com
  • Sqlite 打开错误“无法打开数据库”

    在我的应用程序中 我使用日历控件来按日期存储信息 日历控件的链接 http blog webscale co in p 244 例如 当前选择的月份是 2010 年 10 月 现在 如果我切换回 2010 年 4 月并尝试返回到 2010
  • 使用java servlet将excel文件发送到客户端

    我在用阿帕奇兴趣点用于生成Excel文件输入Java Servlet getExcel 函数返回HSSFWorkbook 我想发送给客户 HSSFWorkbook wb getExcel 这是我到目前为止所尝试过的 block1 ByteA
  • 不应使用 keyup 事件的“charCode”属性。值没有意义

    HTML 代码
  • 如何获取存储在数组中的字符串长度(C)

    我如何获得下面字符串的长度以及数组大小 char str str 0 He str 1 llo str 2 Wor str 3 ld 我如何将它们存储在多维数组中 所以这个数组看起来像这样 char strstr str 的大小 str 的
  • 读取带有隐藏或不可见字符^M的csv文件

    我尝试读取包含隐藏或不可见字符的 csv 文件 但失败 文件内容如下所示 my data2 lt read table text Common name Scientific name Stuff1 Stuff2 Greylag Goose
  • SQLite onUpgrade 有 4 个数据库版本

    当我们有 4 个数据库版本并且我们在每个版本的用户表中添加了一个新字段时 执行 SQLiteOpenHelper 的 onUpgrade 方法的正确方法是什么 变体 A 每个 case 后都没有 中断 case 2 和 3 是否继续运行 p
  • 相对定位顶部百分比不适用于行内元素

    在下面 如果我对 Top 使用百分比值 则不会重新定位 em 如果我使用 px 的话效果很好 为什么 我在 w3 中对此进行了研究 但找不到任何使用百分比值的资格 定位上下文是 p 因为它的相对定位 应该具有从行框派生的高度 编辑 为了清楚
  • 在 jQuery 中使用 $ 和变量有什​​么具体原因吗

    我知道这是一个愚蠢的问题 但我对此有点困惑 例如 如果我有一个带有 ID 的输入 rad1 下面几行代码有什么区别吗 var a rad1 or var a rad1 不 没有真正的区别 这只是一个惯例 可以帮助您记住这一点a不是 DOM
  • 如何将 numpy 数组中的多个字符串连接为单个字符串?

    我有以下字符串数组作为 numpy 数组 filepaths np array Padma Meghna Jamuna 我想连接起来 这样我应该得到以下内容 Padma Meghna Jamuna 我正在执行以下操作 但没有达到预期效果 n
  • Azure AD B2C OpenID Connect 使用 WS-Federation 和 SAML 声明提供程序进行单点注销

    使用 WS Federation 和 SAML 将 AD FS 配置为自定义策略 作为 Azure AD B2C 上的声明提供程序 Azure AD B2C 上的依赖方正在使用 OpenID Connect 是否可以通过 OpenID Co
  • Android MediaPlayer 准备时间太长

    嘿 我正在使用 MediaPlayer 播放常规 ShoutCast 流 该代码非常简单 只需使用prepareAsync 和一个处理程序即可开始播放 虽然它可以与 DI FM 或 ETN FM http u10 di fm 80 di p
  • MS Access 失败后如何恢复 ODBC 连接

    有一个 MS Access 应用程序 其中包含通过 ODBC 链接的 MS SQL Server 上的表 当连接丢失时 我收到 ODBC 错误 3146 连接物理恢复后 我仍然收到 ODBC 3146 错误 我必须做一些类似重新连接到服务器
  • prolog 中对称关系的传递闭包

    我是序言初学者 我想创建 兄弟 关系 该关系应该是对称的 就像兄弟 阿林 亚历克斯 是真的 兄弟 亚历克斯 阿林 应该也是如此 它也应该是传递的 就像兄弟 阿林 亚历克斯 and 兄弟 亚历克斯 克劳迪乌 是真的 兄弟 阿林 克劳迪乌 应该