Recursion Prolog中的尾部递归

Recursion Prolog中的尾部递归,recursion,prolog,tail-recursion,Recursion,Prolog,Tail Recursion,我是Prolog新手,在练习尾部递归时遇到了问题 问题: 定义一个关系,其中第一个参数是对象列表,第二个参数是数字,第三个参数是列表中对象的总价加上第二个参数;还要确保对递归的调用是规则的最后一个子句 对象列表: 成本(表1000)。 费用(椅子,100)。 成本(灯,80)。 成本(烤箱,800)。 e、 g.totalTail([椅子,桌子],100,X)==>X=1200 我应该定义什么规则?您可以从定义您已经知道的规则开始: totalTail( [chair, table], 100

我是Prolog新手,在练习尾部递归时遇到了问题

问题:

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

对象列表:

成本(表1000)。
费用(椅子,100)。
成本(灯,80)。
成本(烤箱,800)。
e、 g.
totalTail([椅子,桌子],100,X)
==>
X=1200


我应该定义什么规则?

您可以从定义您已经知道的规则开始:

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( [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( [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( [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, 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 | BC], Z, X) :- BC = [B, C],
                   cost( A, ACost),
                   Z2 is .... + .... ,
                   totalTail( BC, Z2, X).
对吧??错了!你能发现错误吗?我们数了两次了吗

所以修好它,我们就可以

totalTail( [A, B, C], Z, X) :- 
                   cost( A, ACost),
                   Z2 is .... + .... ,
                   totalTail( [B, C], Z2, X).
对。但这不是和

totalTail( [A, B, C], Z, X) :- 
                   cost( A, ACost),
                   totalTail( [B, C], Z, X2)
    X is Z + ACost + X2.
totalTail( [A | BC], Z, X) :- BC = [B, C],
                   cost( A, ACost),
                   Z2 is .... + .... ,
                   totalTail( BC, Z2, X).
但是,同样地,为什么要把自己限制在非常具体的选项上,
BC=[B,C]
?我们真的要具体说明吗


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

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

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( [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( [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( [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, 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 | BC], Z, X) :- BC = [B, C],
                   cost( A, ACost),
                   Z2 is .... + .... ,
                   totalTail( BC, Z2, X).
对吧??错了!你能发现错误吗?我们数了两次了吗

所以修好它,我们就可以

totalTail( [A, B, C], Z, X) :- 
                   cost( A, ACost),
                   Z2 is .... + .... ,
                   totalTail( [B, C], Z2, X).
对。但这不是和

totalTail( [A, B, C], Z, X) :- 
                   cost( A, ACost),
                   totalTail( [B, C], Z, X2)
    X is Z + ACost + X2.
totalTail( [A | BC], Z, X) :- BC = [B, C],
                   cost( A, ACost),
                   Z2 is .... + .... ,
                   totalTail( BC, Z2, X).
但是,同样地,为什么要把自己限制在非常具体的选项上,
BC=[B,C]
?我们真的要具体说明吗


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

你确实需要写“小序言”谢谢,我会考虑的。:)但要小心,这条路会让世界上所有的(网络)程序员都被一台机器所取代,几十年前就应该如此。我的意思是,如果说明书已经写好了,为什么一个人要把他们的灵魂倾注到一个应该是平凡的机械推导中呢?(我们训练他们唯一的神经网络来做这些把戏,就好像我们是训练过的狗或其他东西一样(没有对狗的不尊重)。这就是理论,或者说是白日梦。你确实需要写“小序言”谢谢,我会考虑的。:)但要小心,这条路会让世界上所有的(网络)程序员都被一台机器所取代,几十年前就应该如此。我的意思是,如果说明书已经写好了,为什么一个人要把他们的灵魂倾注到一个应该是平凡的机械推导中呢?(我们训练他们唯一的神经网络来做这些把戏,就好像我们是训练过的狗或其他东西一样(没有对狗的不尊重)。这就是理论,或者说是白日梦。一分钱给你的思想?一分钱给你的思想?