问题标签 [prolog-setof]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - setof/3 里面的 setof/3 不工作,但为什么呢?
灵感来自
我想尝试一下“Prolog中的RDBMS操作”(实际上,这或多或少是Datalog)
问题陈述
给定一个“主演电影演员”的数据库:
并给定一组电影,找到在该组所有电影中出演的演员。
我首先有一个丑陋的解决方案,但后来......
很好的解决方案
澄清问题:
集合由没有重复的列表表示,可能是有序的。
- 给定一组电影
MovIn
- ... 找到演员集
ActOut
- ... ...这样:每个演员都
ActOut
出现在(至少)所有电影中MovIn
- ... ... 重新制定:任何演员的电影 集都是.
MovAx
Ax
ActOut
MovIn
setof/3似乎是正确的顶级谓词。第 1 点和第 2 点的Ansatz是:
如果MovAx
是出现的电影集,Ax
我们可以使用
- 库的 子集/2 (列表)或
- ord_subset/2 of library(ordset) ...如果我们可以确保 evertyhing 是一个 ordset。
让我们使用subset/2
.
第 4 点似乎让我们写道:
开发...
...
这似乎已经是它了!
有 λ 表达式但在键盘或语法中没有 λ 时的感觉。
完毕!
总结为谓词:
不幸的是,上述方法不起作用。
正在进行回溯,显然我需要将所有内容包装到另一个setof/3
中,但是为什么呢?
完成了,拿两个
以下确实有效:
测试
测试只是运行几个目标。
请注意,对于空电影集,我们获取所有演员。这可以说是正确的:每个演员都出演了空场的所有电影。
问题
我错过了什么
prolog - Prolog 理解 setof/3 与 ^ 标记
有人可以向我解释这是在做什么吗?
我已阅读 setof 的文档;我的理解是第三个论点与事实统一起来。
但是,我无法理解上面的代码片段。
完整的片段是:
prolog - Setof:有没有办法提前停止?
我想找到很多时间表的最小错误数。我制定了一个时间表,记录了错误,将所有错误存储在一个列表中并获取第一个元素(MinError)。MinError >=0,所以我想知道当随机计划得到 Errors=0 并返回 MinError 时是否可以停止此过程。
setof(Errors,A^B^C^(schedule(A,B,C),schedule_errors(A,B,C,Errors)),[MinError|_]).
prolog - Prolog规则可以条件是在日期之前,但不能在日期之后,为什么?
我有以下规则在具有特定日期的数据库中查找事实:
preceding
工作得很好:
但after
不起作用:
请注意,这两个规则之间的唯一区别@<
是vs.@>
运算符。我试过改变操作数的顺序,改变规则中语句的顺序,但它不起作用。
我也尝试过颠倒逻辑:
这也不起作用。
我什至写了一个单独的规则来检查我是否可以让操作员工作:
这行得通。但是用D @> After
我isafter(D,After)
的after
规则替换是行不通的。
为什么制作“之前”条件有效,但“之后”条件无效?你能让我的after
规则起作用吗?:)
(我实际上想编写一个between
同时使用“之前”和“之后”条件的函数,但我意识到我的between
函数的确切问题是@>
。)
prolog - 如何将知识库中的事实放入列表中?
假设我有这些事实:
我想得到一个像这样的列表:
但我的查询findall/3
没有给出预期的结果:
与以下类似bagof/3
:
我不明白为什么findall/3
并且bagof/3
表现得像这样。
prolog - 带有多个谓词的 Prolog setOf
在我的序言数据库中,我有以下事实:
我想将所有名称唯一地打印为一个列表。
下面是我使用 setof 的查询和输出:
但是,输出不是我想要的。我希望它以列表的形式唯一地打印出名称。
prolog - Prolog:存在量化
我试图了解存在量化的用法。我现在知道的是这种技术与setof
, findall
,一起使用bagof
。此外,我找到了一个教程。但是,我不确定何时以及如何Vars^Goal
在 Prolog 中进行(存在量化)。
这是示例,我的目标是找到两个彼此认识但在不同公司工作的员工,将结果与L
显示绑定Name1-Name2
:
我的第一直觉是使用查询
查询找到了答案,但没有将其呈现为正确的格式。正确的是:
我怎么能理解(C1,C2)^(employee(N1,C1),employee(N2,C2),C1\=C2,knows(N1,N2))
?它的概念是什么?谢谢。
prolog - 如何将 PROLOG 程序中的规则和事实合并到一个列表中?
我试图找到所有英特尔处理器的所有发布日期列表。它应该看起来像这样
[1993、1976、1974、1971]
目前我只能像这样创建一个包含 1 个条目的列表
setof(Y,released(pentium,Y),S1)
这给了我[1993]。