【发布时间】:2018-11-17 20:20:06
【问题描述】:
我必须检查一个列表是否包含偶数个没有内置的元素。
例子:
containsEvenNumber([a,b,c,a,a], a).
返回假
containsEvenNumber([a,b,c,a], a).
返回真
当前状态:
not(A) :-
A, !,
fail.
not(_).
equal([E|_], E).
containsEvenNumber([], _).
containsEvenNumber([E|Tail], E) :-
unevenCount(Tail, E).
containsEvenNumber([Head|Tail], E) :-
not(equal([Head|Tail], E)),
evenCount(Tail, E).
evenCount([], _).
evenCount([E|Tail], E) :-
unevenCount(Tail, E).
evenCount([Head, Tail], E) :-
not(equal([Head|Tail], E)),
unevenCount(Tail, E).
unevenCount([], _) :-
fail.
unevenCount([E, Tail], E) :-
evenCount(Tail, E).
unevenCount([Head, Tail], E) :-
not(equal([Head|Tail], E)),
unevenCount(Tail, E).
我尝试在元素出现时在状态之间切换。 它不起作用,因为我从不进入头部不是元素的状态,或者更确切地说,我也进入状态并在头部是元素时返回 false。
我怎样才能让它工作/修复它?
【问题讨论】:
-
是的,在 Prolog 中是可能的。没有内置插件?由于 Prolog 的所有基本功能都是“内置的”,我会说不是。你都尝试了些什么?你有更具体的问题吗?您是否查看过 Prolog 文档并检查过它的运算符集?
-
是的,我应该编写以下谓词:
containsEvenNumberOfTheElement(L,E).,没有任何内置函数。 L 是一个列表。 -
那个也是可能的。您需要展示您的尝试并提出具体问题。
-
我现在编辑了这个,希望你能帮助我:)
-
“状态之间的切换”其实是解决这个问题的好办法,但是你有几个问题:(1)你不需要定义
not/1。它已经在 SWI Prolog 中定义,ISO prolog 有\+(这不是错误,只是注释); (2)[Head, Tail]应该是[Head | Tail]和[E, Tail]应该是[E|Tail]; (3) 您对unevenCount/2的基本情况(我假设您的意思是oddCount?)不正确。应该是unevenCount([X], X).使用失败子句作为基本情况会导致谓词失败。
标签: list recursion prolog tail head