递归检查列表中的所有元素是否都是Prolog

时间:2018-05-11 20:38:47

标签: list recursion prolog

我在Prolog中将其定义如下:

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

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

1 个答案:

答案 0 :(得分:3)

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

例如:

not_empty([_|_]).

然后,发布此谓词的连接以及您已成功实施的谓词。

如果需要,您还可以将其组合成仅包含此连接的第三个谓词。

另外,请检查一下:

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

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