首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在SWI-Prolog中,如何将集合列表[ 1,( 2,3)]转换为[ 1,2,3 ]?

在SWI-Prolog中,如何将集合列表[ 1,( 2,3)]转换为[ 1,2,3 ]?
EN

Stack Overflow用户
提问于 2015-05-25 18:55:13
回答 2查看 198关注 0票数 0

我有一个用read/1子句执行用户输入的程序。然后创建一个包含输入信息的列表,如下所示:

代码语言:javascript
复制
write('Input' )
read(Folks),

consult('database.pl.pl'), 
Predic =.. [Inform, [ Name, Bussi, Folks ] ],
assert(Predic),

在磁盘中写入:

代码语言:javascript
复制
Inform(['Juc', 'Rockstar', 'Desprogra', 1899, 1999, ( 'Bill', 'Steven', 'Demi' ) ]).

因此,我不能将()放在列表的末尾:

代码语言:javascript
复制
..., ( 'Bill', 'Steven', 'Demi' ) ]

我知道这是因为,必须读取read(Folks),的:'Bill', 'Steven', 'Demi'

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-05-26 06:49:02

Prolog没有元组,因为我们可以将它们实现为逗号运算符的递归应用程序。有关一般处理,请阅读有关分析术语的部分。特别是,(=.。)/2经常用于执行结构的参数处理,但这里需要的可能是

代码语言:javascript
复制
conj_list((A,B), [A|Bs]) :- conj_list(B, Bs), !.
conj_list(T, [T]).

(切割位置很重要,请进行实验,看看它能起到什么作用)。现在,完成任务的更简单的代码应该是

代码语言:javascript
复制
?- maplist(conj_list, [1,(2,3)],L), flatten(L, F).
L = [[1], [2, 3]],
F = [1, 2, 3].
票数 1
EN

Stack Overflow用户

发布于 2015-05-26 19:12:02

让:

代码语言:javascript
复制
superflatten([],A,A).

superflatten([[]|Q],A,R) :- !,
   superflatten(Q,A,R).

superflatten([H|Q],A,R) :-
  H =.. [K|L],
  ( L = [] -> append(A,[K],T1); superflatten(L,A,T1) ),
  superflatten(Q,T1,R).

superflatten(X,R) :- superflatten(X,[],R).

一些查询和回答的例子:

代码语言:javascript
复制
debug]  ?- superflatten([],R).
R = [].

[debug]  ?- superflatten([a,b],R).
R = [a, b].

[debug]  ?- superflatten([a,[b,c]],R).
R = [a, b, c].

[debug]  ?- superflatten([a,[],[b,c]],R).
R = [a, b, c].

[debug]  ?- superflatten([a,(b,c)],R).
R = [a, b, c].

[debug]  ?- superflatten([a,t(b,c)],R).
R = [a, b, c].
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30444443

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档