我是Prolog的新手。我想实现一个计算列表列表大小的函数。例如,我有[[1,2,3],[a,b,c],[12,ab]]
,返回的值应为8
。所以我有这个代码:
size([], _).
size([_|T], X):- X1 is X + 1, size(T, X1).
total_size([], X):- write('size = '), write(X).
total_size([H|T], X):- size(H, X), total_size(T, X).
但是我的函数一直返回0
。我的计划是将X
传递给size
函数,并在每次调用X
时增加size
的值。查询是:
?- total_size([[1,2,3],[a,b,c],[12,ab]], 0).
我做错了什么?
提前谢谢你,
科尔内留
PS:我知道我不应该在“prolog”附近的任何地方使用“功能”一词。
答案 0 :(得分:0)
考虑尺寸/ 2可以“返回”一个值。值只能'返回'绑定参数(我们称之为参数)。然后第一步应该是纠正第一个子句(我们称之为'代码')。
size([], 0).
这是一种关系,说空列表的大小为0。
现在也可以纠正递归步骤:它将使用递归调用的值,然后
编辑纠正我的错误
size([_|T], X):- size(T, X1), X is X1 + 1.
你可以看到,值从计算出的步骤中“回流”。
total_size / 2它是不同的,因为计算值必须在递归结束时显示(好吧,这些是循环,真的)。计算值'向下流'调用。只是,你忘了添加size / 2返回的值。
total_size([], X):- write('size = '), write(X).
total_size([H|T], SoFar):- size(H, X), Sum is SoFar + X, total_size(T, Sum).