序言将列表中的所有元素相乘

路易斯·费尔南多·皮内达

我想在Prolog中定义一个谓词prod_list / 2,它将一个列表的每个元素相乘。我有一个空列表的问题,希望乘积应为零,但我得到的是假。我的代码是

prod_list([H], H).
prod_list([H|T], Product) :- prod_list(T, Rest), 
                            Product is H * Rest.

我得到的结果是prod_list([4,3],Product)。->产品= 12,但当我执行prod_list([],产品)时。我得到的不是产品= 0,而是错误的。

请帮忙。

伦佐

您的问题是没有子句与空列表匹配。实际上,您有一个递归子句:

prod_list([H|T], Product) :- prod_list(T, Rest), 
                        Product is H * Rest.

但是当列表中只有一个元素时,它的递归终止:

prod_list([H], H).

因此,在任何情况下,空列表都[]不会与子句匹配,因此,答案是false(无匹配项)。

要解决您的问题,您需要为空列表包括一个显式子句:

prod_list([],0).
prod_list([H],H).
prod_list([H|T], Product) :- prod_list(T, Rest), Product is H * Rest.

考虑到应该以这种方式(正确)定义空列表的乘积,可以找到一个不同的解决方案:

product_of_list([], 1).
product_of_list([H|T], Product) :- product_of_list(T, Rest), Product is H * Rest

那么您可以添加的“特殊”定义prod_list

prod_list([],0).
prod_list(List, Product) :- product_of_list(List, Product).

编辑

最后的解决方案不工作的Prolog的一些交互版本(例如沙沙上线),而它确实工作SWI-Prolog的(多线程,64位版本7.3.11)。适用于每个版本的解决方案如下:

prod_list([],0).
prod_list([H|T], Product) :- product_of_list([H|T], Product).

感谢user474491发现了这一点。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章