【问题标题】:Prolog predicate without using listsProlog 谓词不使用列表
【发布时间】:2021-04-24 05:06:41
【问题描述】:

我需要编写一个 prolog 谓词 count(X,Y,D,N) 而不使用应该计算两个整数 XY 之间的元素数量的列表。但是,它应该只计算那些可以被D 整除的值。

例如,count(3,6,2,N) 应该返回 N = 2,因为 4 和 6 可以被 2 整除,但 3 和 5 不能。

【问题讨论】:

    标签: recursion prolog


    【解决方案1】:

    递归是你的朋友(就像大多数 Prolog 的情况一样)。

    这里有一个辅助谓词,它带有一个作为累加器的附加参数:

    你应该这样做:

    count( X, Y, D, N ) :- count( X, Y, D, 0, N ) .
    
    count( X , Y , D , T , N ) :- X =< Y,     % If X <= Y ...
      ( X rem D =:= 0                         % - and X is divisible by D
        -> T1 is T+1                          %   - then increment T
        ;  T1 = T                             %   - otherwise don't
      ),                                      % and
      X1 is X+1,                              % - increment X
      count( X1, Y, D, T1, N ).               % - recurse down
    count( X , Y , _ , N , N ) :- X > Y.      % IF X > Y, we're done: unify the accumulator with the result.
    

    以上是尾递归,并且针对所有意图和目的优化为迭代。更经典的递归解决方案是这样的:

    count( X, Y, _, 0 ) :- X >  Y .
    count( X, Y, D, N ) :- X =< Y ,
        X1 is X+1,
        count( X1, Y, D, T ),
        ( 0 =:= X rem D ->  N is T+1 ; N = T )
        .
    

    【讨论】:

    • 我强烈怀疑有一个封闭形式的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-29
    • 1970-01-01
    • 2017-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多