我想在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] 删除。
我来说两句