【发布时间】:2015-12-10 22:40:08
【问题描述】:
我正在编写一个程序来检查列表是否包含唯一长度的子列表:
例如diffLengthLists([[2],[3,4]]) 应该返回 true,而 diffLengthLists([[3],[4]]) 应该返回 false。
这是我的代码:
diffLengthLists(A):- is_list(A),
diffLength(A,[_]).
diffLength([A|B], [C|D]):- length(A, C),
diffLength(B, D),
unique([C|D]).
unique([A|B]):- \+member(A, B), unique(B).
unique([]).
所以我基本上是将每个子列表的长度添加到另一个列表[C|D],然后检查[C|D] 中的元素是否唯一。
但是,我的程序没有按预期工作。我在这里做错了什么?有没有更好(更清晰)的方式来编写这个程序?
提前感谢您的帮助!
编辑:我测试了辅助谓词,问题似乎是由diffLength 引起的,但是,我不明白为什么它不起作用。
我在代码中添加了unique([]).,现在谓词可以正常工作了。
【问题讨论】:
-
您是否尝试评估您的辅助谓词(
diffLength、unique)以查看它们的实现是否符合您的期望? -
我完全忘记了,谢谢你提到它。我更新了问题。
-
听起来您发现了一个缺失的基本案例。一个好主意是始终确保退化案例适用于所有谓词定义。一旦您对那里感到满意,您可能会考虑在脑海中浏览一些示例案例,以了解为什么它们没有按预期出现? (此外,您从未提及为什么您认为它们不起作用。您是否确定了谓词没有给出正确答案的值?)
-
感谢您的帮助。我弄清楚了问题所在:) 我会在几个小时内发布答案。 (基本上我只需要为 diffLength 添加另一个基本案例,以及其他一些小的编辑)
标签: prolog