write reglas recursividad programacion predicados listas funciones prolog predicate

reglas - predicado Prolog recursivo?



reglas en prolog (2)

Aquí hay una implementación basada en clpfd .

:- use_module(library(clpfd)).

Como el predicado break_downFD/2 no es recursivo, el código es legible y simple:

break_downFD(N,Zs) :- length(Max,N), % multiple choices append(_,Zs,Max), Zs ins 1..N, sum(Zs,#=,N), chain(Zs,#=<), % enforce sequence is non-descending labeling([],Zs). % multiple choices, possibly

Consulta de muestra con SWI-Prolog:

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

Actualmente estoy trabajando en un proyecto y quiero implementar un predicado auxiliar en Prolog

break_down(N, L)

que funciona de la siguiente manera

?- 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.

y así sucesivamente para cualquier número entero positivo N.

He intentado e implementado un código que genera solo el primer resultado y no puedo obtener el resto de los resultados, y este es mi código

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

que genera solo el primer resultado de salida:

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

alguna sugerencia de cómo editar mi código para obtener el resto?


Aquí hay una implementación recursiva simple usando aritmética de enteros simples y retroceso:

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

Consulta de muestra:

?- 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.