如何在Prolog中判断列表长度是奇数还是偶数

Arc*_*ald 2 prolog

我试图确定 Prolog 列表的元素数量是奇数还是偶数。我意识到可能有更好的解决方案使用length/2,我愿意将比这个更好的解决方案标记为正确答案,我只想知道我在这个例子中做错了什么。

我有详细的代码:

oddSize([]) :-
    false.
oddSize([_]).
oddSize([_,_|T]) :-
    oddSize(T).
Run Code Online (Sandbox Code Playgroud)

当我尝试测试此代码时收到的输出是:

1 ?- oddSize([]).
false.

2 ?- oddSize([1]).
true ;
false.

3 ?- oddSize([1,2]).
false.

4 ?- oddSize([1,2,3]).
true ;
false.
Run Code Online (Sandbox Code Playgroud)

它似乎在检测哪些列表具有奇数个元素,但为什么我会得到额外的结果false

Pau*_*ura 6

请注意,您可以定义一个odd_size/1最多成功一次的谓词,即不留下任何选择点 (*):

odd_size([_| Tail]) :-
    even_size(Tail).

even_size([]).
even_size([_| Tail]) :-
    odd_size(Tail).
Run Code Online (Sandbox Code Playgroud)

(*) 假设您的 Prolog 系统使用第一参数索引(现代系统为真),这避免了在调用even_size/1带有实例化参数的谓词时创建选择点。

一些示例查询:

?- odd_size([1,2,3]).
true.

?- odd_size([1]).
true.

?- odd_size([1,2]).
false.
Run Code Online (Sandbox Code Playgroud)