如何将列表的列表转换为prolog中的元组列表?

  • 本文关键字:列表 元组 prolog 转换 prolog
  • 更新时间 :
  • 英文 :


ex[[a,b],[b,c]]to[(a,b),(b,c)]

% Define a predicate that takes a list of lists and returns a list of tuples
convert_list_to_tuple(ListOfLists, ListOfTuples) :-
% Base case: if the input list is empty, return an empty list
ListOfLists = [],
ListOfTuples = [].
convert_list_to_tuple(ListOfLists, ListOfTuples) :-
[Head|Tail] = ListOfLists,
Head =.. Tuple,
convert_list_to_tuple(Tail, TailTuples),
ListOfTuples = [Tuple|TailTuples].

如何将列表的列表转换为prolog中的元组列表?前[[a, b], [c.d]]——比;[(a, b), (c, d)]

可以直接使用mapplist:

conv([A,B], (A,B)).
?- maplist(conv, [[a,b],[b,c]], L).
L = [(a, b), (b, c)].

这样的元组("逗号列表")是一个糟糕的(即令人困惑的)选择。最好使用命名原子:

conv_term(Lst, Term) :-
Term =.. [v|Lst].
?- maplist(conv_term, [[a,b],[c,d,e]], L).
L = [v(a, b), v(c, d, e)].

为什么要使用(a,b)这样的东西?它可以很好地工作,但添加更多的元素-(a,b,c,d,e)-它变得丑陋:

','( a , ','( b , ','( c , ','( d , e ) ) ) )

Prolog的列表是在术语./2之上的简单语法糖,原子[]表示空列表。因此,列表[a,b]实际上是术语.(a,.(b,[]))。恭喜你!-你刚刚用一种笨拙的方式重新发明了Prolog的列表。

用术语代替

将列表转换为这样的元组很简单—只需在列表前加上想要用于元组的函子(name),并使用内置的=../2在列表和元组之间进行映射:

list_tuple( L , T ) :- T =.. [ tuple | L ] .

一旦你有了这个,把一个列表的列表变成一个元组的列表也很简单:

lists_tuples( []     , []     ) .
lists_tuples( [L|Ls] , [T|Ts] ) :- list_tuple(L,T), lists_tuples(Ls,Ts) .

评估
?- lists_tuples( [ [] , [a] , [a,b] , [a,b,c] , [a,b,c,d], [a,b,c,d,e] ] , Ts ) .

产生预期的

Ts = [
tuple,
tuple(a),
tuple(a,b),
tuple(a,b,c),
tuple(a,b,c,d),
tuple(a,b,c,d,e)
]

评估
?- lists_tuples( L, [tuple,tuple(a),tuple(a,b),tuple(a,b,c),tuple(a,b,c,d),tuple(a,b,c,d,e)] ).

同样产生预期的

L = [[], [a], [a,b], [a,b,c], [a,b,c,d], [a,b,c,d,e]]

您可以在https://swish.swi-prolog.org/p/JDhVptgN.pl

修改它

最新更新