List 在Prolog中检查一个元素列表

List 在Prolog中检查一个元素列表,list,prolog,List,Prolog,我对Prolog(来自C++)非常陌生,在理解使用列表作为参数时遇到困难。特别是,我想知道如何解释列表只有一个元素(尾部为“空”)的情况。为什么不能将[L]本身作为参数?为什么必须明确包含尾部 /** Trying to print out the head of the list */ writeList([L|_]) :- write(L). /** Works fine */ writeList([L]) :- write(L). /** Doesn't work.

我对Prolog(来自C++)非常陌生,在理解使用列表作为参数时遇到困难。特别是,我想知道如何解释列表只有一个元素(尾部为“空”)的情况。为什么不能将[L]本身作为参数?为什么必须明确包含尾部

/** Trying to print out the head of the list */
writeList([L|_]) :- write(L).      /** Works fine */
writeList([L]) :- write(L).        /** Doesn't work. Will return false, but why? */
writeList([L]) :- write([L]).      /** I thought I'd try this to see if it was a 
                                   problem with write(), but this returns false as well. */
我提出的唯一解决方案(不在“:-”)之后创建测试)是:

但必须指定尾部为[]似乎有点混乱。有没有更干净的方法


对不起,如果这个问题很傻的话——我试图找到这个(相当基本的)问题的答案,但我怀疑在我的基本理解中有问题。

符号
[X | Y]
指的是一个列表,它的第一个元素是
X
,尾部是
Y

下划线
是一个匿名变量,表示任何术语。这不是你想要的

一个元素列表有一个空的尾部,因此
Y
被绑定到一个空列表
[]
,那么符号是:
[X |[]]

类似地,对于双元素列表:
[X,Y |[]]


查看有关此主题的更多信息。

谓词
writeList([L]):-write(L)。
对我来说效果很好。我的目标是
?-writeList([alice])。
。请记住,prolog目标要么成功,要么失败,它们不会返回真或假。我想我说的是错的(我回过头来,一直在做writeList(alice)),每次都不知怎么地忘记了括号)。看起来我的困惑只是因为一个愚蠢的错误——谢谢你的回答,这让我意识到。回答得好!只是一个小小的补充:只需为一个元素列表编写
[X]
,为两个元素列表编写
[X,Y]
。@mat这更干净了!。我真的习惯了这件事。谢谢
writeList([L|[]]) :- write(L).