【问题标题】:Recursively checking if all elements in a list are a certain value in Prolog递归检查列表中的所有元素是否是Prolog中的某个值
【发布时间】:2018-05-11 20:38:46
【问题描述】:

我在Prolog中定义如下:

listOfa([H|T]):- H = 'a', listOfa(T).
listOfa([]).

它做我想做的事。它检查列表中的所有项目是否都是某个元素,在本例中为字符 a,并相应地返回 true 或 false。但是,如果列表为空,它会返回 true,我不希望它这样做。除了,我不确定除了空列表之外还可以使用什么作为递归的基本情况。对于空列表,如何在不返回 true 的情况下保持递归?

【问题讨论】:

  • 您的基本情况可能是listOfa([a]) 而不是listOfa([])
  • 另外,把H改成a,下一步就去掉统一,这比你需要做的还多。

标签: list recursion prolog


【解决方案1】:

从空列表和非空列表的两个子句开始是很自然的,实际上您可以保持这种模式!您可以使用 separate 谓词轻松解决这个问题,如果它的参数是一个包含至少一个元素的列表,则该谓词为真。

例如:

not_empty([_|_]).

然后,贴出这个谓词的连词和你已经成功实现的那个。

如果需要,您还可以将其组合成仅由该连词组成的第三个谓词。

另外,看看这个:

?- maplist(=(a), Ls).

结合这些目标后,您可以通过纯粹的代数共振找到更短的解决方案!

【讨论】:

  • listOfA([a|T]) :- maplist(=(a), T). :)
  • @DanielLyons 你能解释一下为什么listOfA([a|T]) :- maplist(=(a), T). 在调试时返回true.,但listOfa([a|T]):- a = 'a', listOfa(T). listOfa([a]). 返回true(没有句号)?程序在这两种情况下有何不同?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-22
  • 2011-04-20
  • 2011-07-13
  • 2018-11-17
  • 2021-03-10
相关资源
最近更新 更多