假设我在prolog [[1,2],[3,4,2],[5,6,1]]
中列出了这样的列表。
我需要能够获得我可以从该常规列表中获得的每个单一列表的列表。这意味着在第一个列表中可以存在1或2。在第二个列表中,可以存在3,4或2等。但是每个数字只能在单一列表的最终列表中重复一次。
我的意思是:
我们找到第一个包含多个元素的列表并选择一个随机
[[1],[3,4,2],[5,6]]
我们传播更改并从最后一个列表中删除1,因为我们现在无法在那里选择它。我知道怎么做。
现在我们选择第二个列表,因为它不是单一的,例如选择第一个项[[1], [3], [5,6]]
。
我们这样做,直到获得单一列表[[1], [3], [5]]
列表。
但还有其他选项,例如我们在第一个列表中选择了2 [[2], [3,4], [5,6,1]]
- > [[2], [3], [5]]
。
等等。我如何在Prolog中尝试每一个选项,直到找到一个尊重我的目标?
我现在所拥有的是(谓词is_solution检查输入是否满足我的目标):
solve(List, Solution) :-
is_solution(List),
Solution = List.
solve(List, Solution) :-
does_something_here
我不知道该怎么做。我有一个想法,我需要做一些DFS(我猜?)横向选择每个选项,直到我发现一个适合但我还没有完全掌握Prolog的思维方式。任何人都可以帮忙解决这个问题吗?
编辑:获取单一列表列表(三[如[[[1,2],[3,4]],[[6,7],[3,4]]]的嵌套列表我)建立这个似乎现在工作,因为我修复它
list_relation(List1, List2) :-
maplist(sublist_relation, List1, List2).
sublist_relation(SubList1, SubList2) :-
maplist(element_relation, SubList1, SubList2).
element_relation(Element1, Element2) :-
member(X, Element1),
length(Element2, 1),
member(X, Element2).
答案 0 :(得分:1)
你没有太多事情要做,所以我会提供一些提示。
首先,这是Prolog中的一个常见模式,您希望在其中描述两个列表之间的关系,并在相应元素之间建立一对一的关系。这样的模式看起来像这样:
list_relation([], []). % The empty list is related to the empty list
list_relation([H1|T1], [H2|T2]) :-
% Code here that describes the relation between H1 and H2
list_relation(T1, T2). % Recursively check the relation on the tails
这是如此常见,事实上,有一个maplist
谓词可以为你处理映射:
list_relation(List1, List2) :-
maplist(element_relation, List1, List2).
element_relation(Element1, Element2) :-
% Code here that describes the relation between Element1 and Element2
在您的特定情况下,您的元素是列表,并且您想要挑选元素。可以使用member/2
谓词来描述第一列表中的元素与第二列表的对应元素之间的“关系”。 member(X, List)
成功,X
是列表List
的元素。
我给你留下了那些线索。
<小时/> 作为附录,您更新的问题会过度使用
maplist
,并且表达一个元素列表的方式过于复杂。你的尝试做了一个子列表关系,我没有说是必要的,也不是。
因此,如果您按照我上面所写的内容进行操作,您的element_relation
将表示为:
element_relation(List, [E]) :-
member(E, List).
就这么简单。所以完整的解决方案如下:
list_relation(List1, List2) :-
maplist(element_relation, List1, List2).
element_relation(List, [E]) :-
member(E, List).
请注意List
中的element_list
对应于第一个列表中的元素。该元素本身就是一个列表。 element_list
的第二个参数给出了从List
中选择的元素的单元素列表。使用member(E, List)
进行此选择。
最后,请为您的谓词使用合理的名称。我选择通用名称来解释原理。 list_relation
和element_relation
非常一般,不会描述您的特定问题。你应该恰当地命名。