【问题标题】:Rewrite recursive sicstus prolog function重写递归 sicstus prolog 函数
【发布时间】:2016-04-20 20:11:48
【问题描述】:

我的目标是有这样的输入:

L = [a,b,c], build_tree(L,T).

有了这个输出:

L = [1,30,kth,5],
T = b(l(a),b(l(b),b(l(c)))) ? 

yes

使用这段代码,计算一棵树的叶子数:

leaves(l(X), [X]).
leaves(b(L1,L2),V):-
    leaves(L1,V1),
    leaves(L2,V2),
    append(V1,V2,V).

我可以通过简单地给函数一个列表而不是树作为输入来获得所需的输出,例如:

L = [a,b,c], leaves(T,L).

这里唯一的问题是它以错误的顺序获取参数(即 build_tree(T,L) 而不是 build_tree(L,T))。

那么,我怎样才能产生相同的结果,而只是交换输入参数? 我已经尝试了每一个“明显”的解决方案(交换变量),但我猜它可能不像看起来那么容易,因为它是一种递归方法。

【问题讨论】:

    标签: prolog dcg


    【解决方案1】:

    另外,考虑使用 DCG:

    leaves(l(X))     --> [X].
    leaves(b(T1,T2)) --> leaves(T1), leaves(T2).
    

    【讨论】:

    • 我不确定这与问题是否相关,但感谢您提及 DCG。它们似乎是一个可行的选择。
    • @keyser:在这里使用 DCG 将使翻译成本线性化,而 append/3 可以很容易地成为二次方!
    【解决方案2】:

    如果你有一个谓词并且想要重新排序参数,最简单的方法(imo)是编写一个包装谓词:

    my_foo(X,Y,Z):-
        foo(Y,Z,X).
    
    foo(X,Y,Z):- ....
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-09-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-08
      • 2012-08-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多