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

标签 prolog

我正在尝试确定 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 系统使用第一个参数索引(对于现代系统是正确的),这避免了在使用实例化参数调用 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/

相关文章:

Prolog 参数未充分实例化,R 为 [H|R1]

prolog - Prolog 中\+ 的替代品?

ssl - 在 SWI-Prolog 中打开并检查 Pem 文件

prolog - 我想用Prolog证明一些定理,但是它总是返回 "Out of global stack"

prolog - 覆盖 Prolog 中预定义的谓词

functional-programming - 逻辑编程的最佳用途是什么?

mysql - 如何在prolog中获取最后一个插入id

list - 将数字拆分为 Prolog 中的数字列表

Prolog:程序中的统一或回溯错误

prolog - 了解具体化- “What relationships hold between x and y?"