展平列表

2024-03-31

尝试解决练习 07http://www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/ http://www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/

我从一个迭代开始,如下所示

my_flatten1([], []).
my_flatten1([[A|T]|U], [A|V]) :-
   append(T, U1, V),
   my_flatten1(U, U1).
my_flatten1([A|T], [A|U]) :-
   not(is_list(A)),
   my_flatten1(T, U).

is_flat(A) :-
   my_flatten1(A, A).

它似乎适用于以下一组查询

my_flatten1([a, [b, [c, d], e]], X).
my_flatten1(X, [a, b, c]).
my_flatten1(X, [a|T]).
my_flatten1(X, [a, b, A]).
my_flatten1([a, X], M).
my_flatten1([a|X], M).

is_flat([a|X]).
is_flat([a,[c]|X]).
is_flat([F,[c]|X]).

my_flatten1(A, B).
my_flatten1([A], B).
my_flatten1([[A]], B).
my_flatten1([[a|A]], B).
my_flatten1([a|A], B).
my_flatten1([X|B], [1,2,3,4]).
my_flatten1([[a,c|D]|X], [a|B]).

但是我没有成功构建my_flatten基于my_flatten1。总会有一些查询失败或最终陷入无限循环,或者只产生一个最明显的结果。

编辑以澄清我的目的,例如我可以打电话my_flatten1使用变量作为第一个参数来分配括号:

?- my_flatten1(X, [a, b]).
X = [[a], [b]] ;
X = [[a], b] ;
X = [[a, b]] ;
X = [a, [b]] ;
X = [a, b].

不知道你是否知道,当你点击问题标题时,99个Prolog问题都包含解决方案?

无论如何,my_flatten例如,看起来如下:

my_flatten(X,[X]) :- \+ is_list(X).
my_flatten([],[]).
my_flatten([H|T],R) :-
    my_flatten(H,HFlat),
    my_flatten(T,TFlat),
    append(HFlat,TFlat,R).

一些查询:

?- my_flatten([[]],R).
   R = [].

?- my_flatten([[1],[2]],R).
   R = [1, 2].

?- my_flatten([[1],[[3]]],R).
   R = [1, 3].

EDIT

正如 @lambda.xy.y 所正确观察到的,上述版本不会终止查询:

?- my_flatten(X,[X]).

所以我看了一下 SWI 内置的行为flatten/2并观察到:

?- flatten([],[]).
   true.

?- flatten([],X).
   X = [].

?- flatten(X,[]).
   false.

?- flatten(X,Y).
   Y = [X].

?- flatten(X,[X]).
   true.

执行:

my_flatten(L,R) :-
    my_flatten(L,[],Flat),
    !,
    R=Flat.

my_flatten(X,R,[X|R])  :- \+ is_list(X), !.
my_flatten([],R,R)     :- !.
my_flatten([H|T],A1,R) :- !,
    my_flatten(H,A2,R),
    my_flatten(T,A1,A2).
my_flatten(NonList,T,[NonList|T]).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

展平列表 的相关文章

  • 如何通过反射访问Generic.List的索引?

    好的 我有一个类 我将一个对象作为属性传递 我传递的对象是List
  • 这个版本的trace有什么问题?

    我有这个跟踪元解释器 它是为 swi prolog 编写的 trace Goal trace Goal 0 trace true Depth true trace fail Depth fail trace A gt B Depth A g
  • 如何在给定位置的情况下获取列表中的某个元素?

    所以我有一个清单 list myList myList push back Object myObject 我不确定 但我确信这将是数组中的 第 0 个元素 我可以使用任何函数来返回 myObject 吗 Object copy myLis
  • “sizeof”对不完整类型列表结构 C 的无效应用

    我正在尝试实现一种处理页面错误的替换算法 因此 我尝试使用 malloc 创建一个循环链表 但出现以下错误 无效的应用程序sizeof to incomplete typepageInMemory 以下是代码 typedef struct
  • 当列表中不存在 X 时,从列表中查找大于 X 的值

    我试图从列表中查找大于特定值 在我的情况下已知 的值 Example Given list 1 2 5 10 15 list is sorted 查找大于的值X 7在这种情况下 期望的结果 返回一个包含值的列表 10 15 我尝试使用jav
  • 打印出每一行(从文件中)并带有行号python [重复]

    这个问题在这里已经有答案了 我有一个 txt包含一些单词的文档 每个单词都在不同的行上 例如 hello too me 我试图弄清楚如何打印每一行以及每个单词所在的行号 但从 1 开始 而不是 0 所需的输出 1 hello 2 too 3
  • 如何将嵌套的数字列表转换为字符串列表?

    我有下面的列表 p 1 2 3 4 2 3 4 1 如何将子列表放入字符串中 例如 期望的结果是 p 1234 2341 可以通过将每个整数转换为字符串并连接字符串来完成 p join map str sub list for sub li
  • 序言中的“如果”?

    有没有办法在序言中执行 if 操作 例如如果变量为 0 则执行一些操作 将文本写入终端 甚至不需要 else 但我找不到 if 的任何文档 是的 ISO Prolog 中有这样一个控制结构 称为 gt 你像这样使用它 condition g
  • 识别子列表中的唯一元素并更改

    我在 R 中有以下 列表 1 1 17336 5246 8597 5246 17878 19701 2 1 19701 37748 18155 5246 8597 3 1 12297 19701 17878 5246 17336 8597
  • 对自身内部列表的递归引用[重复]

    这个问题在这里已经有答案了 所以我在 python 中遇到了一些非常奇怪的东西 我尝试添加对列表本身的引用 该代码可能有助于比我能表达的更好地展示我所说的内容 我正在使用 IDLE 编辑器 交互模式 gt gt gt l 1 2 3 gt
  • Prolog真的基于封闭世界假设吗?

    在下面封闭世界假设 https en wikipedia org wiki Closed world assumption 目前未知的事实是错误的 Prolog 的语义通常被认为遵循封闭世界假设 例如 here https cstheory
  • 将由空格分隔的整数字符串更改为 int 列表[重复]

    这个问题在这里已经有答案了 我该如何做类似的东西 x 1 2 3 45 87 65 6 8 gt gt gt foo x 1 2 3 45 87 65 6 8 我完全陷入困境 如果我按索引执行此操作 那么超过 1 位数字的数字将被分解 请帮
  • 在 R 中垂直绘制表 kable::extra 和 kable 的列表?

    我需要绘制表格列表一个在另一个之下 显示垂直 有任何想法吗 问题从这里开始 https stackoverflow com questions 73867229 plot a list of tables in a single table
  • 在Python中将字符串转换为字典或列表?

    在Python中将此字符串转换为列表或字典 u f i r s t n a m e u j o h n u l a s t n a m e u s m i t h u a g e 2 0 u m o b
  • 如何使用流从两个列表或数组乘法中查找元素对

    我有两个数字列表 我想找到所有可能的数字对 例如 给定列表 1 2 3 and 3 4 结果应该是 1 3 1 4 2 3 2 4 3 3 3 4 我知道我可以使用for loop但有没有更简洁的方法来使用Java 8 流 我尝试了以下操作
  • C++ std::list:迭代时擦除/删除元素[重复]

    这个问题在这里已经有答案了 可能的重复 您可以在迭代 std list 时从其中删除元素吗 https stackoverflow com questions 596162 can you remove elements from a st
  • Python列表内存存储[重复]

    这个问题在这里已经有答案了 据我了解 Python 列表本质上是 C 数组 它们分配特定的顺序内存块 但是 这些内存块实际上存储列表中的数据还是它们只是指向内存中存储实际数据的另一个位置 它可能取决于列表中存储的对象的大小吗 因为您可以轻松
  • 计算例如具有多列 data.frames 的列表中的平均值

    我有几个 data frames 的列表 每个 data frame 有几列 通过使用mean mylist first dataframe a我可以得到这个 data frame 中 a 的平均值 但是我不知道如何计算列表中存储的所有 d
  • 寻找嵌套列表中的最低值?

    我正在尝试编写一个函数 它接受一个列表并可以打印该列表中的最小整数 现在我试图弄清楚在嵌套列表中该怎么做 如果最低数字位于这些嵌套列表之一中 那么总的来说它将打印该数字 我的代码在这里 def listMin list2 3 4 2 99
  • 将嵌套列表转换为嵌套列表

    我知道可以将项目列表从一种类型转换为另一种类型 但是如何将嵌套列表转换为嵌套 List 已经尝试过的解决方案 List

随机推荐

  • 不调用bind()的情况下监听()

    我尝试了以下方法 int sockfd socket listen sockfd 10 accept sockfd 没有一个调用失败 并且程序开始阻塞 就像我调用了bind 一样 在这种情况下会发生什么 由于没有本地地址或端口 是否永远无法
  • Spring @Autowire 两个未在 ApplicationContext 中定义的同一类的 bean

    我正在开发 Spring MVC 应用程序并遇到问题 我是Spring的新手 所以如果我的工作有点笨拙 请原谅我 基本上我有一个java类ContractList 在我的应用程序中 我需要此类的两个不同对象 它们都必须是单例 public
  • 主干+rails TypeError:List.Header不是构造函数

    我正在尝试按照从该网站购买的教程进行操作 http www backbonerails com http www backbonerails com 我正在关注该系列的第五集 起床运行 第 1 部分 在视频的 46 52 左右 他有 lis
  • go run:无法运行非主包

    这是简单的 go 应用程序 如果我运行以下代码 我会收到 go run 无法运行非主包 错误 package zsdfsdf import fmt func Main fmt Println sddddddd 要修复它 我只需要将包命名为m
  • 如何在 Terraform 中定义一个根据变量可能为空的列表?

    我需要在 Terraform v0 10 8 中定义一个资源 该资源具有一个列表属性 该属性可能为空也可能不为空 具体取决于变量 请参阅volume ids在下面的定义中 resource digitalocean droplet work
  • Apache Hive - 复杂数据类型映射 不起作用

    蜂巢版本2 1 1 问题描述 集合项终止值作为映射键插入 蜂巢表 CREATE TABLE profiles id int name struct
  • Azure 文本转语音:如何更改输出的语言和语音?

    我需要以下 JavaScript 的帮助 希望有人能帮助我 文本以英语语音朗读 如何在以下工作代码中更改语言和语音 由于我的java技术较差 我在网上进行了大量搜索 但找不到合适的解决方案 所以 不幸的是我的编程技能不够好 所以我需要一些具
  • 使用WiX安装后是否可以提示重启机器?

    使用WiX安装后是否可以提示重启机器
  • 检查 Kusto 语言的表是否存在?

    有没有办法使用 kusto 语言以编程方式检查日志分析中是否存在表 例如 假设我想检查工作区是否包含 VMConnection 表 如下所示 IF OBJECT ID objectName U IS NOT NULL OR IF EXIST
  • 如何访问 Import-Csv 数组中的特定行?

    我需要将大文件上传拆分为多个并行进程 并希望使用单个 CSV 文件作为输入 是否可以从一个访问行块Import Csv对象 像这样 SODAData Import Csv CSVPath Delimiter Where Rownum 20
  • 如何在 MVC 的 C# 中创建自己的值为“00”和“”的 SelectList?

    我的操作中有以下代码 ViewBag AccountId new SelectList reference Get 01 AsEnumerable OrderBy o gt o Order RowKey Value 00 在我看来 Html
  • 使用 XCB 检测窗口焦点变化

    我正在使用 XCB 编写一个程序 需要检测窗口何时获得或失去焦点 到目前为止我已经有了这个 但它只是挂在xcb wait for event调用 永远不会进入循环 我在这里缺少什么来获取根事件 或者我的做法完全错误 有比听根音更好的方法吗
  • 我应该避免使用“async void”事件处理程序吗?

    我知道使用 即发即弃 通常被认为是一个坏主意async void方法来启动任务 因为没有对挂起任务的跟踪 并且处理可能在此类方法中抛出的异常很棘手 我通常应该避免async void事件处理程序也是如此 例如 private async v
  • 如何使用Python的GAE开发服务器测试床模拟文件上传到blobstore

    我想编写一些单元测试 其中包括读取 blobstore 文件 https developers google com appengine docs python blobstore blobreaderclass hl pl 如何编写单元测
  • 动态 Javascript 树结构

    我想动态构建层次结构 每个节点创建为层次结构中的层 级别 具有自己的节点数组 这应该形成一个树结构 应该有一个根节点 以及未定义数量的节点和级别来构成层次结构的大小 除了根节点之外 不应修复任何内容 我不需要阅读或搜索层次结构 我需要构建它
  • 如何将录制的视频数据从 javascript 传递到 python

    我正在尝试将录制的视频数据块从某些 javascript 代码传递到我的路线 以便我可以保存它 我是新手 JavaScript 使用用户网络摄像头录制视频并将其保存为 RecordedBlob 我正在尝试将记录的 Blob 数据传递到我的
  • AngularJS + html5Mode + 自定义后备

    我有一个申请html5模式 真 但在 IE 上我不需要回退到 url 我需要的是保留 URL 并重新加载完整的页面 如果我找不到任何方法 我将需要编辑 AngularJS 文件 而这正是我不想要的 建议 Thanks 编辑 作为临时解决方案
  • 管理多个用户的 Firebase Cloud Messaging 令牌

    查看 Firebase 文档 它建议为每个客户端实例生成一个 FCM 令牌 然后必须手动存储该令牌 如果我将每个令牌链接到 Firestore 数据库中的用户文档 那么在用户注销时我是否需要手动删除设备特定的令牌 例如 用户 A 启动应用程
  • pelican:如何在 Markdown 中嵌入 html 和 javascript

    我想在博客文章中嵌入一些 html 元素和 javascript 这是我的 Markdown 文件 Title Foo Tags Bar Some Content here div div 但是 pelican 将 html 标签包装在pr
  • 展平列表

    尝试解决练习 07http www ic unicamp br meidanis courses mc336 2009s2 prolog problemas http www ic unicamp br meidanis courses m