如何传递参数

时间:2014-01-30 18:11:36

标签: prolog parameter-passing

我是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”附近的任何地方使用“功能”一词。

1 个答案:

答案 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).