Prolog - 需要帮助找到满足我目标的各种选项中的列表

时间:2017-05-10 17:09:46

标签: prolog

假设我在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).

1 个答案:

答案 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_relationelement_relation非常一般,不会描述您的特定问题。你应该恰当地命名。