【发布时间】:2016-03-07 05:43:09
【问题描述】:
我正在尝试编写一个 Prolog 谓词,它可以使用 DCG 将给定的非负整数分解为每个可能的总和。
例如:
?- s(3, L, []).
L = [3] ? ;
L = [2,1] ? ;
L = [1,2] ? ;
L = [1,1,1] ? ;
false.
我首先编写了一个谓词,它接受一个数字 N 并返回 L = [1,2,3,...,N]:
mkList(N, L) :-
m(0, N, L).
m(X, X, []).
m(Y, L, [H|T]) :-
H is Y+1,
m(H, L, T).
但是,我不确定如何继续。
s(Input) -->
{ mkList(Input, InputList) },
{ member(X, InputList) },
[X].
这就是我要使用的,它开始我逐个遍历列表。但是,我不确定我应该在哪里添加一条规则来找出X 和Input 之间的区别。
【问题讨论】:
-
您展示的内容不是使用 DCG。您是否阅读过 DCG 文档?此外,您所说的标准是“非负整数”,这意味着
s(3, L, [])的有效解决方案应包括[0,3]、[0,0,3]等。我假设您的意思是正整数? -
总和应该由正整数组成,是的,这不是我所说的非负数。我没有阅读文档,我只是从在线书籍'Learn Prolog Now'中学习
-
考虑以下两个非常相关的答案:stackoverflow.com/a/29289431/4609915 和 stackoverflow.com/a/29305045/4609915。一种使用clpfd,另一种使用普通的Prolog。 HTH!
-
@lurker。 IMO 问题stackoverflow.com/q/29270479/4609915 基本相同,然而它的名字很烂:难怪为什么这个 user127992 没有找到它。这里的正确行为是什么?重命名旧问题?让新问题指向旧问题?将新问题标记为重复(OP 永远不会找到的问题)? 困惑你有什么建议?