【发布时间】:2018-10-14 11:34:50
【问题描述】:
我有一个包含列表的列表。 我想创建一个排列列表。
例子:
generate_perm([[3],[1,2,3,4],[1,2]], P).
P = [[3,1,1], [3,2,1], [3,3,1], [3,4,1], [3,1,2], [3,2,2], [3,3,2], [3,4,2]];
no
所以输出列表:第 n 个元素是输入列表中第 n 个列表的元素。 我已经尝试过:使用成员和 findall,但我被卡住了。由于我是 prolog 的新手,所以我总是以命令式的方式思考。
到目前为止,我提供了 1 个解决方案的代码:
generate_perm([],_).
generate_perm([H|Tl], Perm):- member(M, H), append(Perm, [M], Perm2),
generate_perm(Tl, Perm2).
调试:
| ?- generate_perm([[3],[1,2,3,4],[1,2]], P).
# 1 1 Call: member(_4961,[3]) ?
# 1 1 Exit: member(3,[3]) ?
# 2 1 Call: generate_perm([[1,2,3,4],[1,2]],[3]) ?
# 3 2 Call: member(_56173,[1,2,3,4]) ?
?# 3 2 Exit: member(1,[1,2,3,4]) ?
# 4 2 Call: generate_perm([[1,2]],[3,1]) ?
# 5 3 Call: member(_138349,[1,2]) ?
?# 5 3 Exit: member(1,[1,2]) ?
# 6 3 Call: generate_perm([],[3,1,1]) ?
# 6 3 Exit: generate_perm([],[3,1,1]) ?
?# 4 2 Exit: generate_perm([[1,2]],[3,1]) ?
?# 2 1 Exit: generate_perm([[1,2,3,4],[1,2]],[3]) ?
P = [] ?
所以答案就在那里(调用:generate_perm([],[3,1,1]),这里的答案是 [3,1,1]),但它给了我一个空列表,我可以'不知道为什么。 我需要帮助的另一个步骤是我不知道如何在一个列表中获得所有解决方案。
【问题讨论】:
-
想想
generate_perm将是一个空列表、一个包含一个子列表的列表以及一个包含多个子列表的列表。 -
对不起,你能说得更具体一点吗?我不明白你的想法。
-
卡在哪里?请编辑问题并添加您的代码、您尝试运行的示例查询以及 Prolog 的响应。
-
对不起,我删除了我的第一次尝试,但现在我再次尝试并上传了我的代码。
-
@Goba: 如果你在 reverse 中使用
append/3会怎样?
标签: prolog