【问题标题】:recursive Prolog predicate?递归Prolog谓词?
【发布时间】:2015-09-02 17:15:44
【问题描述】:

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

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

【问题讨论】:

  • 根据问题陈述,您需要在某处添加一些数字,但您的解决方案不会添加任何数字。它只是追加。

标签: prolog predicate


【解决方案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.

【讨论】:

    【解决方案2】:

    这是一个基于的实现。

    :- use_module(library(clpfd)).
    

    由于谓词break_downFD/2是非递归的,代码既可读又简单:

    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
    

    使用 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.
    

    【讨论】:

      猜你喜欢
      • 2018-10-09
      • 1970-01-01
      • 2011-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多