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
修改它