问题标签 [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.

0 投票
1 回答
56 浏览

prolog - setof/3 里面的 setof/3 不工作,但为什么呢?

灵感来自

在 swi-prolog 中查找不同事实中的相互元素

我想尝试一下“Prolog中的RDBMS操作”(实际上,这或多或少是Datalog)

问题陈述

给定一个“主演电影演员”的数据库:

并给定一组电影,找到在该组所有电影中出演的演员。

我首先有一个丑陋的解决方案,但后来......

很好的解决方案

澄清问题:

集合由没有重复的列表表示,可能是有序的。

  1. 给定一组电影 MovIn
  2. ... 找到演员集 ActOut
  3. ... ...这样:每个演员ActOut出现在(至少)所有电影中MovIn
  4. ... ... 重新制定:任何演员的电影 集都是.MovAxAxActOutMovIn

setof/3似乎是正确的顶级谓词。第 1 点和第 2 点的Ansatz是:

如果MovAx是出现的电影集Ax我们可以使用

让我们使用subset/2.

第 4 点似乎让我们写道:

开发......

这似乎已经是它了!

有 λ 表达式但在键盘或语法中没有 λ 时的感觉。

完毕!

总结为谓词:

不幸的是,上述方法不起作用。

正在进行回溯,显然我需要将所有内容包装到另一个setof/3中,但是为什么呢?

完成了,拿两个

以下确实有效:

测试

测试只是运行几个目标。

请注意,对于空电影集,我们获取所有演员。这可以说是正确的:每个演员都出演了空场的所有电影。

问题

我错过了什么

0 投票
1 回答
153 浏览

prolog - Prolog 理解 setof/3 与 ^ 标记

有人可以向我解释这是在做什么吗?

我已阅读 setof 的文档;我的理解是第三个论点与事实统一起来。

但是,我无法理解上面的代码片段。

完整的片段是:

0 投票
1 回答
41 浏览

prolog - Setof:有没有办法提前停止?

我想找到很多时间表的最小错误数。我制定了一个时间表,记录了错误,将所有错误存储在一个列表中并获取第一个元素(MinError)。MinError >=0,所以我想知道当随机计划得到 Errors=0 并返回 MinError 时是否可以停止此过程。

setof(Errors,A^B^C^(schedule(A,B,C),schedule_errors(A,B,C,Errors)),[MinError|_]).

0 投票
1 回答
48 浏览

prolog - Prolog规则可以条件是在日期之前,但不能在日期之后,为什么?

我有以下规则在具有特定日期的数据库中查找事实:

preceding工作得很好:

after不起作用:

请注意,这两个规则之间的唯一区别@<是vs.@>运算符。我试过改变操作数的顺序,改变规则中语句的顺序,但它不起作用。

我也尝试过颠倒逻辑:

这也不起作用。

我什至写了一个单独的规则来检查我是否可以让操作员工作:

这行得通。但是用D @> Afterisafter(D,After)after规则替换是行不通的。

为什么制作“之前”条件有效,但“之后”条件无效?你能让我的after规则起作用吗?:)

(我实际上想编写一个between同时使用“之前”和“之后”条件的函数,但我意识到我的between函数的确切问题是@>。)

0 投票
1 回答
71 浏览

prolog - 如何将知识库中的事实放入列表中?

假设我有这些事实:

我想得到一个像这样的列表:

但我的查询findall/3没有给出预期的结果:

与以下类似bagof/3

我不明白为什么findall/3并且bagof/3表现得像这样。

0 投票
1 回答
53 浏览

prolog - 带有多个谓词的 Prolog setOf

在我的序言数据库中,我有以下事实:

我想将所有名称唯一地打印为一个列表。

下面是我使用 setof 的查询和输出:

但是,输出不是我想要的。我希望它以列表的形式唯一地打印出名称。

0 投票
1 回答
107 浏览

prolog - Prolog:存在量化

我试图了解存在量化的用法。我现在知道的是这种技术与setof, findall,一起使用bagof。此外,我找到了一个教程。但是,我不确定何时以及如何Vars^Goal在 Prolog 中进行(存在量化)。

这是示例,我的目标是找到两个彼此认识但在不同公司工作的员工,将结果与L显示绑定Name1-Name2

我的第一直觉是使用查询

查询找到了答案,但没有将其呈现为正确的格式。正确的是:

我怎么能理解(C1,C2)^(employee(N1,C1),employee(N2,C2),C1\=C2,knows(N1,N2))?它的概念是什么?谢谢。

0 投票
1 回答
58 浏览

prolog - 如何将 PROLOG 程序中的规则和事实合并到一个列表中?

我试图找到所有英特尔处理器的所有发布日期列表。它应该看起来像这样

[1993、1976、1974、1971]

目前我只能像这样创建一个包含 1 个条目的列表

setof(Y,released(pentium,Y),S1)这给了我[1993]。