【发布时间】:2015-12-05 21:12:06
【问题描述】:
我正在尝试确定 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的额外结果?
【问题讨论】:
-
每个子句在 Prolog 中创建所谓的“选择点”。如果堆栈上有一个选择点,Prolog 将为您提供要求另一个答案的选项。由于您的谓词在逻辑上是正确的,因此这个选择点是无害的。删除这些被称为使您的谓词确定性,并且可以成为学习切割(
!)或once/1的一个很好的练习。
标签: prolog