如何在Prolog中对列表中的所有元素进行配对?

如何在Prolog中对列表中的所有元素进行配对?,prolog,Prolog,目标是从短列表中创建成对/三元组/四元组,因为这些列表出现在我展开的列表列表中。因为我希望这些元素保持连接,所以我需要一种方法来平展列表,而不会丢失这些特定列表中项目之间的连接 简而言之,[a,b,c]需要转换为a-b-c。理论上,长名单也需要处理,但实际上只有短名单才相关 到目前为止,我所尝试的,我知道是非常错误的: create_pair([], Pair). create_pair([H, H1|T], Pair):- NPair = H-H1, create_pair

目标是从短列表中创建成对/三元组/四元组,因为这些列表出现在我展开的列表列表中。因为我希望这些元素保持连接,所以我需要一种方法来平展列表,而不会丢失这些特定列表中项目之间的连接

简而言之,[a,b,c]需要转换为a-b-c。理论上,长名单也需要处理,但实际上只有短名单才相关

到目前为止,我所尝试的,我知道是非常错误的:

create_pair([], Pair).

create_pair([H, H1|T], Pair):-
    NPair = H-H1, 
    create_pair(T, NPair).

这仅适用于列表有2个元素的情况

你可以打造你的双人/三人组/四人组/。。。通过连接列表的前两项并用连接项替换它,直到处理完整个列表:

create_ntets([H], H).
create_ntets([H,H1|T], NTet):-
  create_ntets([H-H1|T], NTet).
本程序假设没有0-tet。 样本运行

?- create_ntets([a,b,c], Triplet).
Triplet = a-b-c

?- create_ntets([a,b,c,d], Quartet).
Quartet = a-b-c-d

如果要将短列表转换为的数据结构并不重要,则可以使用=../2将列表转换为术语。比如:

list_term(L,T) :- T =.. [ listlet | L ].
所以求值列表_到_项[a,b,c],T将T绑定为listleta,b,c,求值列表_到_项L,listleta,b,c,d将L绑定为[a,b,c,d]

请看一个可运行的操场