【问题标题】:Prolog - How to find the maximum set of elements that their sum is equal to NProlog - 如何找到它们的总和等于 N 的最大元素集
【发布时间】:2015-01-06 16:50:59
【问题描述】:

我的游戏是关于从给定列表中选择最大的元素集合,它们的总和为 N

示例:L=[1,1,2,2,3,2,4,5,6]N = 6,子列表将等于 [1,1,2,2]

我需要使用约束逻辑编程的提示。

【问题讨论】:

  • L 是否总是升序排列?
  • 解必须是原列表的子列表? (您在问题中同时使用了“一组元素”和“子列表”)
  • 其实……这很重要。即使列表始终按升序排列,这也很重要。想想L=[1, 1, 3, 4, 5]N=7
  • 请注意:substringsubsequence。不幸的是,这些概念在英语中有点混乱
  • 我的错...“连续子序列”不是引用子字符串的最佳方式。

标签: prolog clpfd constraint-programming


【解决方案1】:

SWI-Prolog 中有一个用于约束逻辑编程的库。它叫做clpfd

:-use_module(library(clpfd)).

假设您将有一个用于子序列长度的变量。它的域从零(对应于空子序列)到列表的长度。为了首先获得最长的序列,应该从最高的开始尝试值。

...
    length(List, M),
    L in 0..M,
    labeling([max(L)],[L]),
...

接下来,L 可用于构建L 变量列表,这些变量将对应于来自List 的元素索引。由于这些索引必须按升序排列,chain/2 可用于在任意两个连续索引之间创建#</2 约束。

...
    length(Indices, L),
    Indices ins 1..M,
    chain(Indices, #<),
...

使用这些索引,可以构造一个包含来自List 的元素的列表。 nth1/3 在这里很有用,但有一个小技巧。

...
nth1a(List, N, E):-
    nth1(N, List, E).
...
    maplist(nth1a(List), Indices, SubSequence),
...

并且该列表的总和必须是N

...
    sum(SubSequence, #=, N)
...

由于只需要最长的序列,once/1 可用于在找到第一个解决方案后停止。

一些示例查询:

?- longest_subsequence([1,1,4,4,6], 9, S).
S = [1, 4, 4].

?- longest_subsequence([1,1,4,4,6], 11, S).
S = [1, 4, 6].

?- longest_subsequence([1,1,4,4,6], 21, S).
false.

由于我不确定这是否是作业,所以我不会在这里发布完整的代码。

【讨论】:

  • 感谢您的努力,您对我的帮助很大,我会尝试找出漏洞代码 ;)
【解决方案2】:

在这个答案中,我们使用 和一点

:- use_module([library(clpfd),
               library(lambda)]).

基于 maplist/4 和我们定义的约束(ins)/2sum/3

zs_selection_len_sum(Zs, Bs, L, S) :-
   same_length(Zs, Bs),
   Bs ins 0..1,
   maplist(\Z^B^X^(X #= Z*B), Zs, Bs, Xs),
   sum(Bs, #=, L),
   sum(Xs, #=, S).

使用labeling/2 和选项max/1 的示例查询:

?- zs_selection_len_sum([1,1,4,4,6],Bs,L,8), labeling([max(L)],Bs)。 Bs = [1,1,0,0,1], L = 3 ; Bs = [0,0,1,1,0],L = 2 ;错误的。 ?- zs_selection_len_sum([1,1,3,4,5],Bs,L,7), labeling([max(L)],Bs)。 Bs = [1,1,0,0,1], L = 3 ; Bs = [0,0,1,1,0],L = 2 ;错误的。 ?- zs_selection_len_sum([1,1,2,2,3,2,4,5,6],Bs,L,6),标签([max(L)],Bs)。 Bs = [1,1,0,1,0,1,0,0,0], L = 4 ; Bs = [1,1,1,0,0,1,0,0,0], L = 4 ; Bs = [1,1,1,1,0,0,0,0,0], L = 4 ; Bs = [0,0,1,1,0,1,0,0,0],L = 3 ; Bs = [0,1,0,0,1,1,0,0,0],L = 3 ; Bs = [0,1,0,1,1,0,0,0,0],L = 3 ; Bs = [0,1,1,0,1,0,0,0,0],L = 3 ; Bs = [1,0,0,0,1,1,0,0,0],L = 3 ; Bs = [1,0,0,1,1,0,0,0,0],L = 3 ; Bs = [1,0,1,0,1,0,0,0,0],L = 3 ; Bs = [1,1,0,0,0,0,1,0,0],L = 3 ; Bs = [0,0,0,0,0,1,1,0,0],L = 2 ; Bs = [0,0,0,1,0,0,1,0,0],L = 2 ; Bs = [0,0,1,0,0,0,1,0,0],L = 2 ; Bs = [0,1,0,0,0,0,0,1,0],L = 2 ; Bs = [1,0,0,0,0,0,0,1,0],L = 2 ; Bs = [0,0,0,0,0,0,0,0,1],L = 1 ;错误的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-23
    • 2018-08-10
    • 1970-01-01
    • 2020-08-26
    • 2022-10-12
    • 1970-01-01
    • 2019-09-11
    • 1970-01-01
    相关资源
    最近更新 更多