prolog - Prolog将n写为连续数字的总和
问题描述
我正在研究序言,我想确定所有 n 的分解(n 给定,正数),作为连续自然数的总和,但我不知道如何解决这个问题。
有任何想法吗 ?
解决方案
这里的关键是between/3
,它涉及数字和范围。Prolog 不会凭空想出数字,你必须给它一些线索。在这种情况下,您可以假设一个介于 1 和 n 之间的数字范围:
decomp2(N, X, Y) :-
between(1, N, X),
between(1, N, Y),
N =:= X + Y.
这将为您提供产生 N 的两个数字的总和:
?- decomp2(5, X, Y).
X = 1,
Y = 4 ;
X = 2,
Y = 3 ;
X = 3,
Y = 2 ;
X = 4,
Y = 1 ;
一旦你可以得到两个,你可以通过删除一个值decomp2/2
并通过归纳得到其余的值来得到一个更长的列表。您只需要提出一个基本案例,例如 N 的单例列表:
decomp(N, [N]).
decomp(N, [X|L]) :- decomp2(N, X, Y), decomp(Y, L).
请注意,这将产生大量重复!
?- decomp(5, L).
L = [5] ;
L = [1, 4] ;
L = [1, 1, 3] ;
L = [1, 1, 1, 2] ;
L = [1, 1, 1, 1, 1] ;
L = [1, 1, 2, 1] ;
L = [1, 2, 2] ;
L = [1, 2, 1, 1] ;
L = [1, 3, 1] ;
L = [2, 3] ;
L = [2, 1, 2] ;
L = [2, 1, 1, 1] ;
L = [2, 2, 1] ;
L = [3, 2] ;
L = [3, 1, 1] ;
L = [4, 1] ;
您可能可以通过引入排序要求来限制重复,例如 X 大于 Y。
推荐阅读
- elasticsearch - 将 Paketbeat 日志限制在我的服务器 IP 上,而不是其他子网的
- domain-driven-design - 如果认证涉及到一些业务逻辑,不应该去Domain Service吗?
- swiftui - 如何更改特定区域的工作表 DragGesture?
- typescript - 是否可以在同一个文件中多次使用“require”?
- angular - 尝试将 razorpay 与 angular9 集成时无法读取 null 的属性 postMessage
- c# - 有没有办法通过隐式转换在类实例中设置参数,就像 c# 中的运算符一样?
- pyqt - 如何在 python、PyQt 中读取文件/读取?
- angular - 如何刷新 MatTable 中的数据源?
- memory-management - 远程 Peer 如何处理 RDMA 写操作发送的数据
- c# - ASP .NET Core DI:向 HTTP 客户端提供异步 BaseAddress