【问题标题】:Prolog Higher-order reduce predicateProlog 高阶归约谓词
【发布时间】:2016-01-24 21:15:49
【问题描述】:

我们可以定义一个高阶的map谓词:

map([], [], F).
map([A|As], [B|Bs], F) :-
   call(F, A, B),
   map(As, Bs, F).

同样,我们可以将fold(左)定义为:

fold([], Acc, Acc, _F).
fold([A|As], B, Acc1, F) :-
   call(F, Acc1, A, Acc2),
   fold(As, B, Acc2, F).

reduce(左)的正确定义是什么?我们可以这样定义吗?

reduce([A|As], Bs, F) :-   
   fold(As, Bs, A, F).

reduceback(右)如下?

reduceback([], Ident, F) :-
   identity(F, Ident).
reduceback([A|As], B, F) :-
   reduceback(As, C, F),
   call(F, C, A, B).

这些是正确的吗?

【问题讨论】:

    标签: prolog higher-order-functions meta-predicate


    【解决方案1】:

    fold/4 和 reduce/3 执行正确,而没有 identity/1 reduceback/3 是不完整的。但是控制流似乎是正确的,虽然

    1 ?- fold([1,2,3],S,0,[X,Y,Z]>>(Z is X+Y)).
    S = 6.
    
    2 ?- reduce([1,2,3],S,[X,Y,Z]>>(Z is X+Y)).
    S = 6.
    

    我已经添加了声明

    :- meta_predicate 折叠(+,?,+,3)。 :- meta_predicate reduce(+,?,3)。

    将参数限定为闭包,并将库 (yall) 用于 lambda...

    在 Prolog 中,一个常见的约定是将输出参数放在最后,所以你的定义对我来说是相当难以理解的......

    编辑

    为了与 reduce/3 对称,identity/1 似乎没用,可以使用最后一个元素:所以它可以是

    :- meta_predicate reduceback(+,?,3).
    
    reduceback([Last],Last,_F).
    reduceback([A|As],B,F):-
      reduceback(As,C,F),
      call(F,C,A,B).
    

    测试:

    ?- reduceback([1,2,3],S,[X,Y,Z]>>(Z is X+Y)).
    S = 6 ;
    false.
    
    ?- reduceback([1,2,3],S,[X,Y,Z]>>(Z is X-Y)).
    S = 0 ;
    false.
    

    【讨论】:

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