【问题标题】:Tail-Recursion in PrologProlog中的尾递归
【发布时间】:2020-06-30 20:40:32
【问题描述】:

我是 Prolog 的新手,但在尾递归的练习题上遇到了问题。

问题:

定义一个关系,其中第一个参数是一个对象列表,第二个是一个数字,第三个是列表中对象的总价格加上第二个参数;并确保对递归的调用是规则的最后一个子句。

对象列表:

cost( table, 1000).  
cost( chair, 100).  
cost( lamp, 80).  
cost( oven, 800).

例如totalTail( [chair,table], 100, X) ==> X = 1200.

我应该定义什么规则?

【问题讨论】:

  • 一分钱你的想法?

标签: recursion prolog tail-recursion


【解决方案1】:

你可以从定义你已经知道它应该是什么开始:

totalTail( [chair, table], 100, X) :- X = 1200.

或者,等价的,

totalTail( [Chair, Table], 100, X) :- 
    Chair = chair, cost( Chair, 100),
    Table = table, cost( Table, 1000),
    X is 100 + 100 + 1000.

或者,等价的,

totalTail( [Chair, Table], InitialCost, X) :- InitialCost = 100,
    Chair = chair, cost( Chair, ChairCost), ChairCost = 100,
    Table = table, cost( Table, TableCost), TableCost = 1000,
    X is InitialCost + ChairCost + TableCost.

或者,等价的,

totalTail( [Chair, Table], InitialCost, X) :- 
                   cost( Chair, ChairCost),
                   cost( Table, TableCost),
    X is InitialCost + ChairCost + TableCost.

轰隆隆!或者,等效地,

totalTail( [A, B], InitialCost, X) :- 
                   cost( A, ACost),
                   cost( B, BCost),
    X is InitialCost + ACost + BCost.

甚至

totalTail( [A, B, C], Z, X) :- 
                   cost( A, ACost),
                   cost( B, BCost),
                   cost( C, CCost),
    X is Z + ACost + BCost + CCost.

其中

相同
totalTail( [A, B, C], Z, X) :- 
                   cost( A, ACost),
                   totalTail( [B, C], Z, X2)
    X is Z + ACost + X2.

对吗?错误的!你能发现错误吗?我们数了两次吗?

所以修复它,我们得到

totalTail( [A, B, C], Z, X) :- 
                   cost( A, ACost),
                   Z2 is .... + .... ,
                   totalTail( [B, C], Z2, X).

没错。但不就是一样

totalTail( [A | BC], Z, X) :- BC = [B, C],
                   cost( A, ACost),
                   Z2 is .... + .... ,
                   totalTail( BC, Z2, X).

但是,为什么要限制自己使用这个非常具体的选项,BC = [B, C]?我们真的必须指定它吗?

如果第一个参数与[A | BC] 列表完全不匹配怎么办?那会是一个什么样的清单?在这种情况下,X 应该是什么?

【讨论】:

  • 你确实需要写“The little Prologer”
  • 谢谢,我会考虑的。 :) 小心,这条路导致世界上所有(网络)程序员被机器取代,因为它应该在几十年前完成。我的意思是,如果规范已经写好了,为什么人类要把他们的灵魂倾注到本应是平凡的机械推导中? (IOW 训练他们唯一的 Gd-given 神经网络来完成这些技巧,就好像我们是受过训练的狗或其他东西(不尊重狗))。无论如何,这就是理论,或者更确切地说是白日梦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多