Prolog中的尾递归

问题描述 投票:1回答:1

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

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

对象列表:费用(表格,1000)。费用(椅子,100)。成本(灯,80)。成本(烤箱,800)。

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

我应该定义什么规则?

recursion prolog tail-recursion
1个回答
2
投票

您可以先定义已经知道的内容:

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.

Boom!或等效地,

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应该是什么?

© www.soinside.com 2019 - 2024. All rights reserved.