你可以从定义你已经知道它应该是什么开始:
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 应该是什么?