删除列表中的重复项(Prolog)

2023-12-05

我对 Prolog 完全陌生,正在尝试一些练习。其中之一是:

编写谓词集(InList,OutList) 它以任意输入作为输入 列表,并返回一个列表,其中每个 仅出现输入列表的元素 一次。

这是我的解决方案:

member(X,[X|_]).
member(X,[_|T]) :- member(X,T).

set([],[]).
set([H|T],[H|Out]) :-
    not(member(H,T)),
    set(T,Out).
set([H|T],Out) :-
    member(H,T),
    set(T,Out).

我不允许使用任何内置谓词(甚至不使用会更好not/1)。问题是,set/2给出多个same解决方案。输入列表中的重复次数越多,产生的解决方案就越多。我究竟做错了什么?提前致谢。


由于 Prolog 的回溯,您会得到多个解决方案。从技术上讲,提供的每个解决方案都是正确的,这就是生成它的原因。如果您只想生成一个解决方案,则必须在某个时刻停止回溯。这就是序言cut是用来。您可能会发现阅读该内容将帮助您解决这个问题。

更新:对。你的member()谓词评估为true如果第一个变量在第二个变量中处于多个位置,则可以采用几种不同的方式。

我用过这个名字mymember()对于这个谓词,以免与内置的 GNU Prolog 冲突member()谓词。我的知识库现在看起来像这样:

mymember(X,[X|_]).
mymember(X,[_|T]) :- mymember(X,T).

not(A) :- \+ call(A).

set([],[]).
set([H|T],[H|Out]) :-
    not(mymember(H,T)),
    set(T,Out).
set([H|T],Out) :-
    mymember(H,T),
    set(T,Out).

So, mymember(1, [1, 1, 1]).评估为true以三种不同的方式:

| ?- mymember(1, [1, 1, 1]).

true ? a

true

true

no

如果你只想得到一个答案,你就必须使用剪切。改变第一个定义mymember()对此:

mymember(X,[X|_]) :- !.

解决你的问题。

此外,您还可以避免not()如果你愿意的话,可以通过定义一个notamember()自己做谓语。这是你的选择。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

删除列表中的重复项(Prolog) 的相关文章

  • 得到“致命错误:索引超出范围”:在 swiftui 的列表项中显示索引

    更新 错误 类型 没有成员 1 如果在list foreach中放置一个if闭包 if self showMarkedOnly name marked 为什么 代码版本4 struct Name Identifiable Hashable
  • 按元素名称组合/合并列表

    我有两个列表 其元素的名称部分重叠 我需要将其逐个元素合并 组合成一个列表 gt lst1 lt list integers c 1 7 letters letters 1 5 words c two strings gt lst2 lt
  • 当列表中不存在 X 时,从列表中查找大于 X 的值

    我试图从列表中查找大于特定值 在我的情况下已知 的值 Example Given list 1 2 5 10 15 list is sorted 查找大于的值X 7在这种情况下 期望的结果 返回一个包含值的列表 10 15 我尝试使用jav
  • 查找列表中的最大值 - Prolog

    我刚刚接触 Prolog 并尝试编写一个谓词来查找整数列表的最大值 我需要写一个从头开始比较的内容 另一个从最后开始比较的内容 到目前为止 我有 max2 R max2 X Xs R X gt R max2 Xs X max2 X Xs R
  • 计算列表的累积和,直到出现零

    我有一个 长 列表 其中随机出现零和一 list a 1 1 1 0 1 1 0 1 0 1 1 1 我想获取 list b 列表中出现 0 之前的总和 出现0的地方 在列表中保留0 list b 1 2 3 0 1 2 0 1 0 1 2
  • 从字符串数组中删除项目

    我有一个包含如下数据的数据库字段 76 60 12 例如 如果我想删除60 我该怎么办 要删除的号码可以是任何地方 如果需要的话 我还需要删除逗号 我正在使用 NET 2 0 我会用逗号分割字符串 删除元素 然后再次连接字符串 希望这一切都
  • JSON 列表中元素的顺序是否保留?

    我注意到 JSON 对象中元素的顺序不是原始顺序 JSON 列表的元素怎么样 他们的秩序是否得到维持 是的 JSON 数组中元素的顺序会被保留 从RFC 7159 JavaScript 对象表示法 JSON 数据交换格式 https www
  • python 中的扁平化列表

    我看过很多关于如何在 Python 中展平列表的帖子 但我一直无法理解这是如何运作的 reduce lambda x y x y myList 有人可以解释一下这是如何工作的吗 gt gt gt myList 1 2 3 4 5 6 7 8
  • Python 两个列表之间的多重条件

    我正在使用 python 3 我需要检查不同列表中的 3 个变量 我想打印数据 如果username age lang与其他列表不同 这是我的代码 list1 list2 list1 append username alice age 25
  • C#动态创建Type数组

    在 C 中 我需要能够在运行时基于以字符串形式传递给函数的逗号分隔数据类型列表创建 Type 对象数组 基本上 这就是我想要实现的目标 create array of types Type paramTypes typeof uint ty
  • 将“mod”运算符与“or”一起使用时是否强制具体化?

    我使用 CLP FD 和 SWI Prolog 编写了一个 CSP 程序 我认为当我使用时我需要改进我的约束写作mod操作员 和 一起 在我的谓词中 一个简短的例子 use module library clpfd constr X Y Z
  • 在列表列表中查找共同元素

    我有一个名为 wordlist 的单词列表列表 如下所示 dog cat sheep rabbit kiss time cow pig bomb cat sheep cake boy new 我想找到所有子列表中的共同元素 因此 我期望的上
  • 对自身内部列表的递归引用[重复]

    这个问题在这里已经有答案了 所以我在 python 中遇到了一些非常奇怪的东西 我尝试添加对列表本身的引用 该代码可能有助于比我能表达的更好地展示我所说的内容 我正在使用 IDLE 编辑器 交互模式 gt gt gt l 1 2 3 gt
  • 将 for 循环转换为列表理解

    我有一个for循环 将字符串列表中每个元素的子字符串与另一个字符串列表中的元素进行比较 mylist for x in list1 mat False for y in list2 if x 14 in y mat True if not
  • 在 R 中垂直绘制表 kable::extra 和 kable 的列表?

    我需要绘制表格列表一个在另一个之下 显示垂直 有任何想法吗 问题从这里开始 https stackoverflow com questions 73867229 plot a list of tables in a single table
  • 在 Python 中合并/添加列表

    我很确定应该有一种更 Pythonic 的方法来做到这一点 但我想不出一种方法 如何将二维列表合并到一维列表中 有点像 zip map 但有两个以上的迭代器 示例 我有以下列表 array 1 2 3 4 5 6 7 8 9 我希望有 re
  • 循环列表的值[重复]

    这个问题在这里已经有答案了 我是编码新手 正在尝试编写一个简单的代码 该代码将采用一个列表 例如 1 2 3 并循环元素 n 次 所以如果n 1 我应该得到A 3 1 2 如果n 2 我应该得到A 2 3 1 我写的代码是 n 1 j 0
  • java交叉连接两个列表

    我有一个 ABC 类 其中包含两个整数字段 public class ABC private Integer x private Integer y getters and setters 我有两个列表 xValues 和 yValues
  • 列表 到数据视图

    如何在 Net 中将列表转换为数据视图 我的建议是将列表转换为 DataTable 然后使用表的默认视图来构建 DataView 首先 您必须构建数据表
  • 用于列出文件夹但排除特定文件夹的批处理脚本

    我希望此脚本列出文件夹名称中包含 deleted 的所有文件夹 但如果它们位于名为 done 的文件夹中则不列出 例如 列出文件夹 如果位于 C temp如果它在C temp random folder name但如果它在C temp do

随机推荐

  • 选择不包含某些特定类的 :first-child 或 :last-child

    假设我们有一个包含 5 个项目的列表 并且我们想要应用一些具体款式到第一个或最后一个孩子 但是这个列表的功能需要通过 jQuery 应用一个类 我们称之为 hide 这将设置一个display none 关于目标项目 The 具体款式我一开
  • 从使用 dlopen 加载的共享库引用全局符号

    我有一个共享库 我想从主程序访问符号 例如 main c include
  • 如何删除

    标签顶部的空间/将包含的文本与容器顶部对齐?

    这无疑是一个愚蠢的问题 但我今天过得很糟糕 这让我很困惑 如果您查看http jsfiddle net E6kGP 1 然后您可以看到两个相邻的简单 div 每个 div 都包含一个 p 标签 每个标签具有不同的字体大小和匹配的行高 p 容
  • org.apache.hadoop.mapreduce.counters.LimitExceededException:计数器太多:121 max=120

    我正在运行一个 hadoop 作业 来自 oozie 它有很少的计数器和多输出 我收到如下错误 org apache hadoop mapreduce counters LimitExceededException 计数器太多 121 ma
  • 网络服务器的实现[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我想用纯 Java 实现我自己的网络服务器 Web 服务器应该仅支持静态资源 即 html js css 图片 电影等 您能推荐一个关于如何实现这样
  • 无法在字段值中使用 1(int 类型)作为 *int 类型

    为什么会产生错误 一样的int除了 with 指针 type Gim struct Active int yesVar Gim Active 1 error Cannot use 1 type int as type int in fiel
  • 如何在c中实现定时器?

    我们想在Linux平台下的C程序中添加一个定时器 我们正在尝试发送数据包 并且希望了解 1 分钟内发送了多少数据包 我们希望计时器与while正在执行发送数据包的循环 例如 while 1 send packets 该循环将继续发送数据包
  • Angular2 中使用 Angular-CLI 的环境特定服务端点

    我正在为我的 Angular2 项目使用 Angular CLI 我通过 angular2 服务调用后端 ajax 服务 我对于不同的任务有不同的服务端点 URL 我想让这些服务环境变得有意义 假设我有两个服务 客户服务 https loc
  • Boost Spirit 可选解析器和回溯

    为什么这个解析器离开 b 在属性中 即使选项不匹配 using namespace boost spirit qi std string str abc auto a char a auto b char b qi rule
  • 拥有值的一般方法(不指定“Rc”或“Box”)

    一般来说 当您不想指定时 是否有一个针对拥有值的枚举 特征how确切地说 该值是拥有的 无论共享与否 但您只想拥有它 我需要将对闭包的引用存储在结构中 这意味着它们必须与结构一样存在 当然 我无法复制它们 因此它们需要作为参考 但我不想做出
  • 如何访问向量中的最后一个值?

    假设我有一个嵌套在具有一层或两层的数据框中的向量 有没有一种快速而肮脏的方法来访问最后一个值 而不使用length 功能 类似 PERL 的东西 特殊变量 所以我想要这样的东西 dat vec1 vec2 代替 dat vec1 vec2
  • 找出两个日期之间的小时差?

    例如 我可以通过查看这两个日期来计算它们的差异 但在程序中计算时我不知道 日期 A 是2014 02 12 y m d 13 26 33且 B 是2014 02 14 y m d 11 35 06那么小时差是 46 我假设你将时间存储为字符
  • 为什么 g++ 找不到 iostream.h?

    我试图了解如何在 Ubuntu 上使用 g 和 最终 Clang 从命令行编译 C 程序 我找到了一个解释 MakeFiles 的网页 我正在遵循他们的指示 http mrbook org tutorials make 我将四个示例文件下载
  • for 循环事件驱动代码?

    在 Redis 数据存储中 我有一个键列表 我想迭代该键列表并从 Redis 获取这些值 问题是我正在使用事件驱动语言 即通过 node js 的 javascript 如果 javascript 是程序化的我可以这样做 function
  • Karate 0.9.6 到 1.0.1 升级问题与数组参数

    在空手道中发送空数组参数时 不会发送该参数 Example Given url homeUrl And path types And param filterTypes When method GET Then status 200 And
  • Firebase函数无法从源加载函数定义错误解决方案

    错误 无法从源加载函数定义 无法从 函数源生成清单 错误 ERR PACKAGE PATH NOT EXPORTED 包子路径 lib firestore 未由 Users macbook Desktop ein itin 中的 expor
  • 多值字典?

    任何人都知道一个好的实施MultiValueDictionary 基本上 我想要一个允许每个键有多个值的东西 我希望能够做类似的事情 dict Add key val 如果该键尚不存在 它将添加它 如果存在 它只会向该键添加另一个值 我只是
  • 如何使 django-registration 使用我自定义的 UserCreationForm 和 UserChangeForm?

    我正在使用 Django 1 4 开发一个网站django registration 我希望允许用户使用任意 Unicode 字符创建用户名 目前 如果有人尝试使用非拉丁字符注册 他将看到一条错误消息 负责拒绝这种非 ASCII 用户名的代
  • 使用 mvc3 下拉列表的 jquery 自动完成

    我正在使用 ASP NET MVC3 和 EF Code First 我以前没有使用过 jQuery 我想将自动完成功能添加到绑定到我的模型的下拉列表中 下拉列表存储 ID 并显示值 那么 如何连接 jQuery UI 自动完成小部件以在用
  • 删除列表中的重复项(Prolog)

    我对 Prolog 完全陌生 正在尝试一些练习 其中之一是 编写谓词集 InList OutList 它以任意输入作为输入 列表 并返回一个列表 其中每个 仅出现输入列表的元素 一次 这是我的解决方案 member X X member X