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

我有详细的代码为:

oddSize([]) :-
    false.
oddSize([_]).
oddSize([_,_|T]) :-
    oddSize(T).

尝试测试此代码时收到的输出是:
1 ?- oddSize([]).
false.

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

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

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

似乎正在检测哪个列表中的元素数量为奇数,但是为什么我得到false的额外结果呢?

最佳答案

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

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

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

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

一些示例查询:
?- odd_size([1,2,3]).
true.

?- odd_size([1]).
true.

?- odd_size([1,2]).
false.

关于prolog - 如何在Prolog中判断列表长度是奇数还是偶数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34110959/

10-12 22:12