prolog - 计算一组不同的奇数(如果存在的话),使得它们的总和等于给定的数字

标签 prolog constraints clpfd

:- use_module(library(clpfd)). % load constraint library

% [constraint] Compute a list of distinct odd numbers (if one exists), such that their sum is equal to a given number.

odd(Num) :- Num mod 2 #= 1.

sumOfList([],N,N) :- !.
sumOfList([H|T],Counter,N) :-
  NewN #= H + Counter,
  sumOfList(T,NewN,N).

buildOddList(N,InputList,L) :-
  %return list when sum of list is N
  V in 1..N,
  odd(V),
  append(InputList,[V],TempL),
  sumOfList(TempL,0,N)->
    L = TempL;
    buildOddList(N,TempL,L).

computeOddList(N) :-
  buildOddList(N,[],L),
  label(L).

这是我的代码,我似乎无法获得正确的输出,任何代码评论家? :)

最佳答案

这是我对这个问题的看法,通过谓词 nonNegInt_oddPosSummands/2 和辅助谓词 list_n_sum/3 实现:

:- use_module(library(clpfd)).

list_n_sum([],_,0).
list_n_sum([Z|Zs],N,Sum) :-
    Z #>= 1,
    Z #=< N,
    Z mod 2 #= 1,
    Sum  #=  Z + Sum0,
    Sum0 #>= 0,
    list_n_sum(Zs,N,Sum0).

nonNegInt_oddPosSummands(N,List) :-
    length(_,N),
    list_n_sum(List,N,N),
    chain(List,#<),
    labeling([],List).

现在开始一些问题!

首先,“19可以分解成哪些列表?”:

?- nonNegInt_oddPosSummands(19,Zs).
Zs = [19] ;
Zs = [1, 3, 15] ;
Zs = [1, 5, 13] ;
Zs = [1, 7, 11] ;
Zs = [3, 5, 11] ;
Zs = [3, 7, 9] ;
false.

接下来,一个更通用的查询不会终止,因为解决方案集是无限的。 “如果 Zs 的长度为 2,哪些正整数 N 可以分解为 Zs?”

?- Zs=[_,_], nonNegInt_oddPosSummands(N,Zs).
N = 4,  Zs = [1,3] ;
N = 6,  Zs = [1,5] ;
N = 8,  Zs = [1,7] ;
N = 8,  Zs = [3,5] ;
N = 10, Zs = [1,9] ...

最后是最一般的查询。与上面的一样,它不会终止,因为解决方案集是无限的。但是,它公平地枚举所有分解和相应的正整数。

?- nonNegInt_oddPosSummands(N,Zs).
N = 0,  Zs = []      ;
N = 1,  Zs = [1]     ;
N = 3,  Zs = [3]     ;
N = 4,  Zs = [1,3]   ;
N = 5,  Zs = [5]     ;
N = 6,  Zs = [1,5]   ;
N = 7,  Zs = [7]     ;
N = 8,  Zs = [1,7]   ;
N = 8,  Zs = [3,5]   ;
N = 9,  Zs = [9]     ;
N = 9,  Zs = [1,3,5] ;
N = 10, Zs = [1,9] ...

关于prolog - 计算一组不同的奇数(如果存在的话),使得它们的总和等于给定的数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1786365/

相关文章:

compilation - 如何运行序言代码?

recursion - 如何使用递归对 x 和 y 之间的数字求和/相加?

ios - Swift UICollectionView 单元格宽度

prolog - 使用逻辑编程使用共享资源调度任务

arrays - 序幕,骑士攻击

prolog - Prolog 中的逻辑难题 - 使用列表

MySQL 更新唯一约束

json - 是否可以更改 ASP.NET MVC 3 路由约束,使其返回 400 Bad Request 和 JSON 正文?

prolog - 必须在 Prolog 中使用约束

prolog - 限制整数在集合中