gpt4 book ai didi

prolog - 递归 Prolog 谓词?

转载 作者:行者123 更新时间:2023-12-01 12:36:27 25 4
gpt4 key购买 nike

我目前正在做一个项目,我想在 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com