prolog - 递归 Prolog 谓词?

标签 prolog predicate

我目前正在做一个项目,我想在 Prolog 中实现辅助谓词

break_down(N, L)

它的工作原理如下

?- break_down(1,L).
L = [1] ;
false.
?- break_down(4,L).
L = [1, 1, 1, 1] ;
L = [1, 1, 2] ;
L = [1, 3] ;
L = [2, 2] ;
L = [4] ;
false.

对于任何正整数 N 依此类推。

我已经尝试并实现了一个只生成第一个结果的代码,我无法获得其余的结果,这是我的代码

break_down(1,[1]).
break_down(N,L):-
   N>0,
   N1 is N-1,
   break_down(N1,L1),
   append(L1,[1],L).

只生成第一个输出结果:

 L = [1, 1, 1, 1] ;

关于如何编辑我的代码以获得其余部分的任何建议?

最佳答案

这是一个使用普通整数运算和回溯的直接递归实现:

break_down(N,L) :-
    break_ref_down(N,1,L).       % reference item is initially 1

break_ref_down(0,_,[]).
break_ref_down(N,Z0,[Z|Zs]) :-
    between(Z0,N,Z),             % multiple choices
    N0 is N-Z,
    break_ref_down(N0,Z,Zs).     % pass on current item as reference

示例查询:

?- break_down(8,Zs).
  Zs = [1,1,1,1,1,1,1,1]
; Zs = [1,1,1,1,1,1,2]
; Zs = [1,1,1,1,1,3]
; Zs = [1,1,1,1,2,2]
; Zs = [1,1,1,1,4]
; Zs = [1,1,1,2,3]
; Zs = [1,1,1,5]
; Zs = [1,1,2,2,2]
; Zs = [1,1,2,4]
; Zs = [1,1,3,3]
; Zs = [1,1,6]
; Zs = [1,2,2,3]
; Zs = [1,2,5]
; Zs = [1,3,4]
; Zs = [1,7]
; Zs = [2,2,2,2]
; Zs = [2,2,4]
; Zs = [2,3,3]
; Zs = [2,6]
; Zs = [3,5]
; Zs = [4,4]
; Zs = [8]
; false.

关于prolog - 递归 Prolog 谓词?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29270479/

相关文章:

C++ 逻辑真一元函数

algorithm - 计算一个列表是另一个列表的子列表的次数

prolog - 列表内部或外部的序言对有什么用

prolog - gprolog 最长子集

loops - PROLOG/带循环的有向图中的所有路径

java - 保存条件逻辑的枚举 - 可能吗?

prolog - 为什么我会出现无限循环 (Prolog)

c++ - 无法推断模板参数 'T'

iphone - 使用谓词对核心数据进行排序以消除重复