问题标签 [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 - Prolog bagof、setof、findall 谓词
如何在 Prolog 中使用bagof
,查询具有 3 个或更多属性setof
的数据库事实 一个例子我定义了一个数据库students(name, grade,sport,gender)
。我想找到参加特定运动的学生名单,比如板球。我当前的查询
list - Prolog - 列表成员的总和
我一直试图在 Prolog 中找到一个国家的周长。
我有完成的谓词
和
它给出了集合中满足条件的所有项目的列表。
为了得到周长,我尝试这样做:
...但我得到的输出只是边界谓词中两国之间的长度。
我的测试:
规则:
为什么不C
成为这些数字的总和?
list - setof 创建多个列表而不是一个列表序言
我有一个使用 prolog 创建的函数,由于某种原因,它总是为每个元素创建多个列表而不是一个列表,有人可以帮我吗?
这是我写的:(问题是最后一个函数创建了许多列表)
数据示例:
但是当我跑步时
我得到:
代替:
prolog - 如何在 Swi-Prolog 中订购元组列表
我在 swi-prolog 中有一个列表,如下所示:
我需要由每个“元组”的第二个元素组织列表,删除任何重复的元素,所以这个列表看起来像这样:
使用谓词 sort/2,它可以完成我想要的一切,除了它根据每个元组的第一个元素进行组织,这是我不想要的。
我该怎么做?
prolog - 无需按“;”的 Prolog 调度 每次
我有以下带有谓词参加的文件,这表示每个学生都参加了某门课程(第一个参数:Student_ID,第二个参数:Course_ID)。
我想创建一个谓词函数,如下所示:
其中 W1 (Week1) 将是一个包含 3 门课程的列表(例如 W1= [c216,c205,c902]),E 将是学生将参加考试的课程数量。
问题是每个学生都会有回溯,所以我必须按“;”。因此,对于每个学生来说,都有一个不同的 E。相反,我想要的是将所有这些 E 值放在一个列表中,而无需按“;” 然后看看有多少个 E 值大于 2 (>2)。
prolog - Prolog 查询重复
我已经看到了一些关于这个主题的问题,但是他们都没有真正正确地回答我的问题。我会写一个小例子,这里有一些事实:
我想创建一个规则,说明pete
喜欢任何踢足球或网球的人。
但很明显,当我在 Prolog 中查询它时,john
会出现两次john
同时踢足球和网球。我希望它只出现john
一次。我怎样才能修改我的代码来做到这一点?
在此先感谢 - 丹
prolog - 从 prolog 谓词中获得多个答案
假设我有一个谓词,有时会给我多个输出。像这样 -
我如何才能获得在另一个谓词中给出的所有值Out
,foo
记住它有时会给出一个,有时会给出多个(例如在列表中)?
编辑-不太确定我得到的答案回答了我的问题,所以我会更具体。采用上述谓词,我可以运行查询foo(5, Out).
这满足两个规则,所以如果我在 SWI-prolog 中运行它,我会得到这个 -
然后我可以输入一个分号让序言回溯并寻找其他解决方案 -
因此,如果我在另一个谓词中执行此谓词,在给定 Number = 5 的情况下,如何获得 Out 的所有有效值?
prolog - bagof/3 是不可预测的
我对以下结果感到困惑。我正在使用 SWI-Prolog。
注意[a,_]
和[_,b]
不统一产生答案A = [a,b], X=[[a,b],[a,b]]
。
现在,让我们尝试使用算术约束:
奇怪的是,这一次算术约束被放在一起,但没有答案A in 1..5, X=[A]
和A in 3..8, X=[A]
。
现在让我们以另一种方式尝试:
算术约束像以前一样组合在一起,但我们有两个答案而不是一个。
如何解释这一切?
编辑:一些更奇怪的结果。比较一下:
有了这个:
prolog - Prolog 中的无损通用量化
一种好的逻辑编程语言应该允许程序员使用与数学家使用的语言接近的语言。因此,我一直认为 Prolog 中缺少适当的全称量词是一个重要缺点。
今天我想到了如何定义比forall
和更好的东西foreach
。
forany(Var, {Context}, Condition, Body)
这个谓词试图证明Body
所有实例Var
在回溯时都连续获得Condition
。Condition
和中的所有变量都被视为局部变量,除非在orBody
中列出。不允许以任何方式修改 中列出的变量,否则将无法正常工作。Var
Context
Condition
Context
forany
这是实现(基于 yall):
我的第一个问题是关于forany
. 我想消除它。
现在举一些例子
构造前 8 个方格的列表:
反转列表:
子集:
一种有趣的方式来生成列表的所有排列而不重复:
一种对不同整数列表进行排序的有趣方法。请注意,约束用于使列表排序,因此不会生成大多数排列:
问题
forany
当不使用约束时,这似乎非常有效。此外,它可以用于生成约束,但至少在 SWI-Prolog 上,当已经生成约束时会出现问题。原因是forany
使用bagof
并根据 SWI-Prolog 的手册:
术语复制操作(
assertz/1
、retract/1
、findall/3
、copy_term/2
等)通常也复制约束。效果从好的,巨大的约束网络的无声复制到违反约束网络的内部一致性。根据经验,必须不推荐复制包含属性的术语。如果您需要推理约束中涉及的术语,请使用copy_term/3
以获取约束作为 Prolog 目标,并使用这些目标进行进一步处理。
bagof
以下是使用约束创建的问题的演示:
如您所见,创建了三个不必要的约束。
我的第二个问题是这是否只是 SWI-Prolog 的问题。
第三个问题:有没有办法在 SWI-Prolog 中解决这个问题。手册中的上述引用表明copy_term/3
应该使用。不幸的是,我不理解这个建议,也不知道它是否对forany
.
prolog - 使用不同的仍然导致重复
我是序言的新手,据我了解,“不同”的目的是清除重复项。但是,此代码块:
产生以下结果:
我不确定我错过了什么,但如果有人能指出我正确的方向,我将不胜感激。