Prolog — 对称谓词

2024-06-24

我必须在序言中模拟家谱。 我有对称谓词的问题。Facts:

parent(x,y).
male(x).
female(y).
age(x, number).

Rules:

blood_relation让我头疼。这就是我所做的:

blood_relation(X,Y) :- ancestor(X,Y).
blood_relation(X,Y) :- uncle(X,Y)
                    ; brother(X,Y)
                    ; sister(X,Y)
                    ; (mother(Z,Y),sister(X,Z))
                    ; (father(Z,Y),sister(X,Z))
                    ; (father(Z,Y),brother(X,Z)).
blood_relation(X,Y) :- uncle(X,Z)
                    , blood_relation(Z,Y).

我得到了我认为满意的结果(我有双打印 - 我可以解决这个问题),问题是我希望这种关系是对称的。现在不是。

blood_relation(johns_father, john):yes 
blood_relation(john,johns_father): no

那么..有没有办法解决这个问题。 我需要查询:所有不在 Blood_relation 中的对..

Update:

第一个语句应该满足什么类型的关系? 血液关系(X,Y):-血液关系(X,Y)。

抱歉..这是一个错误的复制/粘贴..它

blood_relation(X,Y):-ancestor(X,Y).

现在固定在上面。

以下是其他规则:

father(X,Y) :-
  parent(X,Y),male(X).  
mother(X,Y) :-
  parent(X,Y),female(X).  
brother(X,Y) :-
  parent(Z,X),parent(Z,Y),
  male(X).  
sister(X,Y) :-
  parent(Z,X),parent(Z,Y),
  female(X).  
grandFather(X,Y) :-
  parent(Z,Y),parent(X,Z),
  male(X).  
grandMother(X,Y) :-
  parent(Z,Y),
  parent(X,Z),female(X).  
uncle(X,Y) :-
  mother(Z,Y),brother(X,Z).  
ancestor(X,Y) :-
  ancestor(X,Y).  
ancestor(X,Y) :-
  parent(X,Z),ancestor(Z,Y).

母亲的兄弟是叔叔的定义。这有点奇怪。我有需要实施的规则,但除此之外我不知道如何实施规则。我只是很困惑。

知道如何制作blood_relation对称?和not_blood_relation是一个新规则。我需要查询。这个实在是让我很头疼。也许是因为关系写得像垃圾。

没有更多的事实了。就这样。所有规则,所有事实。

query.. not(blood_relation(X,Y))不起作用,我真的不知道为什么。 例如查询:

age(X,Y), Y>18,  
not(parent(X,Z)),write(X),nl,fail.

工作得很好


使特定谓词对称的简单解决方案与一个不错的解决方案相差不远。为了一般性起见,让我们看一下友谊关系,这样人们就不会被叔叔之类的人绊倒。

以下是一些详细说明友谊关系的事实(例如,数字是用户 ID,参数的特定顺序来自发起友谊的人)。

friends(1,2).
friends(5,2).
friends(7,4).

你最初会认为这样的规则“friends(A,B) :- friends(B,A).” 会解决问题,但这会导致无限递归,因为它告诉序言,如果它只是再交换一次参数,它可能会起作用。有一个谓词称为“@</2”,告诉您一个术语(甚至是一个变量)是否按照“术语的标准顺序”出现在另一个术语之前。技术含义在这里并不那么重要,但我们关心的是,对于两个不同的术语来说,它只是正确的对于它们的一个排序。我们可以用它来打破无限递归!

这条规则将负责制作“friend/2“对称。

friends(A,B) :- A @< B, friends(B,A).

尽管这很简洁,但有一种方法可以让您should用于大型项目。回想一下,我的事实列表中参数的顺序具有一些实际意义(谁发起了友谊)。添加最终规则破坏了将来对该信息的访问,并且对于阅读代码的其他人来说,将对称属性隐藏在一行代码中,这在面对硬编码数据块时很容易被忽略。

考虑工业级解决方案:

friended(1,2).
friended(5,2).
friended(7,4).

friends(A,B) :- friended(A,B).
friends(A,B) :- friended(B,A).

它体积较大,但它可以清晰地读取,无需使用晦涩的谓词,并保留原始信息(有一天您可能会在实际应用程序中再次需要这些信息)。

--

至于寻找对don't具有特定属性,请确保当您使用否定来查找实际个体时,始终包含一些谓词以在规则中提供上下文。

potential_enemies(A,B) :- user(A), user(B), \+ friends(A,B).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系: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
  • Prolog 过滤自定义目标失败的所有元素的列表

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

    我知道这可能听起来很奇怪 但我想知道 Microsoft Visual F 正在进入的这个新世界中的一件事 这种语言有很多应用 我要学习 关于解析 函数式编程 结构化编程 但是人工智能呢 模糊逻辑有什么应用吗 F 是一种适合模糊逻辑应用程序
  • 如何找到排列的索引

    index List Idx Predicate will get List with permutation and I want to know index of permutation For example index 4 1 3
  • 斜线(/)在序言中做什么?

    我有这个代码 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家谱

    我做到了 但没有显示答案 当我询问兄弟姐妹 叔叔 阿姨时 这是我写的 有什么问题吗 uncle X Y male X sibling X Z parent Z Y uncle X Y male X spouse X W sibling W
  • Java 使用函子连接集合

    给定 2 个具有相同数量元素的集合 例如List
  • 将 X 插入到排序列表中的正确位置

    在序言中 如何将 X 插入到排序列表中的正确位置 我的尝试 insert X Y Rest X Y Rest X lt Y insert X Rest BiggerRest 您的方向是正确的 但您需要解决这三个问题 insert X X i
  • 将行读取到序言中的原子列表

    我需要将任何行 来自 user input 读入原子列表 例如 Example line which contains any ASCII chars into Example line which contains any ASCII c
  • Prolog:从哪里开始解决类似扫雷的难题?

    我需要在序言中写一些类似扫雷的东西 我能够用 正常 语言做到这一点 但是当我尝试用序言开始编码时 我完全不知道如何开始 我需要一些提示 输入规格 板尺寸 m n m n 1 16 三元组列表 i j k 在哪里i 1 m j 1 n k 1
  • WAM 中的扁平化形式

    WAM 教程重构指出查询 p Z h Z W f W 需要使用以下原则进行扁平化 话虽这么说 查询扁平化形式是 X3 h X2 X5 X4 f X5 X1 p X2 X3 X4 我对外部变量的定义感到困惑 请考虑以下内容 p Z h Y a
  • prolog跟踪如何使用

    跟踪prolog程序时如何进行第二步 例如 我想跟踪以下简单程序 length1 0 length1 X Xs N length1 Xs N1 N is N1 1 我跟踪程序 trace length 1 2 3 N Call 7 leng
  • 冒号 (:) 在 Swi-Prolog 中到底代表什么?

    我无法明确找到 代表什么prolog http www swi prolog org pldoc doc for object op 3 在交互模式下您可以看到以下证据 display a b a b true display a b c
  • TypeScript 中的类型安全谓词函数

    我的目标是编写谓词函数 isNull and isUndefined例如 在 TypeScript 中满足以下条件 可以独立使用 array filter isNull 可以逻辑组合 array filter and not isNull
  • Prolog 否定和逻辑否定

    假设我们有以下程序 a tom v pat 和查询 返回 false a X v X 当追踪时 我可以看到X被实例化为tom 谓词a tom 成功 因此 a tom fails 我在一些教程中读到 不 在Prolog中只是一个测试 不会导致
  • Prolog中统计一个列表中出现次数的方法

    我必须编写一种方法 可以计算一个列表在给定的另一个列表中出现的次数 例如 reps a b c a b c a b c 0 R R 2 no 我试图编码它 incr X X1 X1 is X 1 reps C D incr C D reps
  • 为什么在我添加冗余约束之前此 clpfd 查询不会终止?

    我编写了一些谓词 它们采用列表的长度并附加一些约束 这是要使用的正确词汇吗 clp length 0 clp length Head Rest Length Length gt 0 Length Length1 1 clp length R
  • Prolog - DCG 解析器,带有来自文件的输入

    作为项目的一部分 我需要编写一个解析器 它可以读取文件并解析为我可以在程序中使用的事实 文件结构如下所示 property el1 el2 我最终想要的是 property el1 property el2 我这样读我的文件 main op
  • 如何根据prolog中的数量来概括程序?

    我使用 swi prolog 我有一个这样的事实库 由数量为 4 的事实组成 attribute a1 a2 a3 a4 data yes no no no data yes no yes no data yes yes yes no da
  • 使用 DCG 解析变量

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

随机推荐

  • 加载 requireJS 和 Backbone 的多个实例

    我正在创建一个 google chrome 扩展 当在选项卡上激活时 它会将一些自定义代码和一些新视图加载到该窗口的文档中 我想使用 requireJS 加载扩展调用的这些新代码模块 但是 我担心如果调用此扩展的应用程序 网站已经在运行 r
  • 简单的awk命令问题(FS、OFS相关)

    我尝试重新组织包含以下内容的文件的格式 gt Humanl chr16 86430087 86430726 element 1 positive gt Humanl chr16 85620095 85621736 element 2 neg
  • 使用 AngularFireObject 和 switchMap

    我真的不知道如何解决这个问题 我该如何修复这个错误 in user service ts import Injectable from angular core import AngularFireDatabase AngularFireL
  • Android和Unity 3D游戏开发

    我开始探索使用 Unity 3d for android 进行游戏开发 我已经下载了unity 3 3的试用版 我浏览了一些教程 我有一个问题没有得到解答 在我们使用eclipse开发的普通应用程序中 我们可以通过复制apk文件来部署到手机
  • HDFS:使用 HDFS API 附加到 SequenceFile

    我一直在尝试使用 Java API 在 HDFS 上创建和维护序列文件 而不运行 MapReduce 作业作为设置用于未来的 MapReduce 工作 我想将 MapReduce 作业的所有输入数据存储在单个序列文件中 但数据会随着时间的推
  • JS 在类中隐藏损坏的图像

    我了解如何隐藏图像 如果它们如下所示 img src 然而 我遇到了问题 因为我对 JS 一无所知 如何隐藏损坏的图像 如果它们是这样的 div class lx g3 f div class lx gallery alt alt text
  • 如何在 Linux Bash 中通过 SFTP 将数据传输到远程文件而不将数据存储在本地文件中?

    我需要能够通过 SFTP 将数据从内存传输到远程文件 我最初是通过 SSH 进行此操作的 在工作时发现我没有对远程位置的 SSH 访问权限 只有 SFTP 访问权限 下面是我的原始 SSH 代码的示例 echo secret data ss
  • 如何在 Angular CLI 中重命名组件?

    除了手动编辑所有组件文件 例如文件夹名称 css ts spec ts 和 app module ts 之外 是否有任何快捷方式可以使用 Angular CLI 重命名组件 No 没有任何命令可以更改使用组件创建命令生成的所有文件的名称 于
  • 如何在自定义 Presto 聚合函数中强制执行排序 (ORDER BY)

    我正在编写一个自定义 Presto 聚合函数 当 且仅当 值按我聚合的值按升序排序时 它会生成正确的结果 IE 以下将起作用 SELECT key MY AGG FUNC value ORDER BY value ASC FROM my t
  • 将子进程的输出重定向到父进程 - Powershell

    我有 powershell 进程 并且我正在调用 Start Process 或 System Diagnostic Process 以作为不同用户启动子进程 以获取其他用户环境变量 我尝试使用重定向输出 但它不起作用 下面是代码 proc
  • ReactJS - 监视访问令牌过期

    在我的应用程序中 我有一个访问令牌 Spotify 的 该令牌必须始终有效 当此访问令牌过期时 应用程序必须每 60 分钟访问刷新令牌端点并获取另一个访问令牌 授权功能 出于安全原因 这两个电话 get token and refresh
  • Twilio:通过 API 更新语音(或消息)URL?

    我已经使用 Twilio 一段时间了 认为它是一项出色的服务 并且希望使用 Twilio 为我的家庭自动化服务器 一台旧的 mac mini 提供文本 语音功能 问题是 如果我的家庭 IP 地址发生变化 那么我的 Twilio 号码的 SM
  • 根据 Woocommerce 中的用户输入自定义购物车商品价格

    在我们的 Woocommerce 商店中 我们对任何产品都有一些最低价格 每个产品内页都有两个字段 客户可以在其中输入产品的宽度 高度 然后他们可以将该产品添加到购物车 然后价格根据给定的宽度和高度进行更改 例如 如果产品的最低价格是50
  • Scala / PowerMockito - Java 最终类在使用 Powermockito 的 Scala 测试中导致构建错误

    我有最后一堂课 public final class AClass private final AConfig aClassConfig public final static BeanName aClass 我试图在测试中模拟它 RunW
  • 如何从 .ps1 文件运行 powershell 脚本?

    我正在尝试自动执行一个简单的 PS 脚本 以删除某个 txt 文件 显然 我是 powershell 新手 当我在 shell 中运行代码时 它工作完美 但是当我将代码保存为 ps1 并双击它 或远程执行它 时 它只是弹出一个窗口 什么也不
  • Azure 表中查询结果大小的限制是多少?

    我想知道Azure表存储中查询结果的大小是否有限制 例如如果我查询一个分区并且它包含很多记录 有什么问题吗 1000 个实体是单个查询事务中返回的最大值 之后服务将返回一个继续令牌 请参阅文档查询实体 https msdn microsof
  • Django 表单在表单字段后添加

    以下是我的表单代码 class FMessage forms Form From forms CharField To forms CharField Subject forms CharField Message forms CharFi
  • 错误:java:无法运行程序CreateProcess error=2,系统找不到指定的文件

    Error java Cannot run program C Program Files Java jdk1 7 0 45 bin java in directory C Users navya chamidisetty IntelliJ
  • 删除打印为 PDF 的选项

    当单击 Crystal 报告的打印按钮时 我看到以下内容 我不想先导出为 PDF 我只想在按下 打印 按钮时立即打印 我该如何配置此行为 听起来你想使用PrintToPrinter方法 根据 MSDN 将报表的指定页面打印到使用 Print
  • Prolog — 对称谓词

    我必须在序言中模拟家谱 我有对称谓词的问题 Facts parent x y male x female y age x number Rules blood relation让我头疼 这就是我所做的 blood relation X Y