我试图确定 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?
请注意,您可以定义一个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)