List Prolog检查列表是否包含偶数个元素
我必须检查列表是否包含偶数个没有内置元素的元素 例如:List Prolog检查列表是否包含偶数个元素,list,recursion,prolog,tail,head,List,Recursion,Prolog,Tail,Head,我必须检查列表是否包含偶数个没有内置元素的元素 例如: containsEvenNumber([a,b,c,a,a], a). 返回false containsEvenNumber([a,b,c,a], a). 返回true containsEvenNumber([a,b,c,a], a). 当前状态: not(A) :- A, !, fail. not(_). equal([E|_], E). containsEvenNumber([], _). containsEven
containsEvenNumber([a,b,c,a,a], a).
返回false
containsEvenNumber([a,b,c,a], a).
返回true
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
如何使其工作/修复?在状态之间切换实际上是解决此问题的一个好方法。逻辑应遵循以下简单规则:
Xs
中有奇数个X
元素,则[X | Xs]
中有偶数个X
元素
X
和Y
不同,则X
元素在[Y | Xs]
中为偶数,而X
元素在Xs
中为偶数
Xs
中有偶数个X
元素,则[X | Xs]
中有奇数个X
元素
X
和Y
不同,则X
元素在[Y | Xs]
中为奇数,而X
元素在Xs
中为奇数
[]
中的任何元素都是偶数
[X]
中有奇数个X
您只需要将这些规则编写为Prolog。但是,您的实现存在一些问题
在少数情况下,您编写的列表是[Head,Tail]
,而不是[Head | Tail]
<代码>[Head,Tail]是正好包含两个元素的列表。另外,您对不均匀计数/2
的基本情况(我假设您指的是奇数计数)是不正确的。如果您有一个始终失败的基本情况,那么您的谓词将始终失败。除了少数例外,您应该编写谓词子句以使其成功,而不是失败。当无法取得成功时,失败将自动发生
让我们试着写出上面的规则。ISO序言已经有了\+
,因此您不需要定义not/1
。另外,写相等([E | |,E])
也是不必要的。您可以简单地直接在代码中执行此操作
evenCount(_, []). % base case for even
evenCount(X, [X|Xs]) :- % rule #1
oddCount(X, Xs).
evenCount(X, [Y|Xs]) :- % rule #2
dif(X, Y),
evenCount(X, Xs).
oddCount(X, [X]). % base case for odd
oddCount(X, [X|Xs]) :- % rule #3
evenCount(X, Xs).
oddCount(X, [Y|Xs]) :- % rule #4
dif(X, Y),
oddCount(X, Xs).
SWI Prolog定义了dif/2
。您也可以使用\=
,但它并不是像dif/2
那样纯粹定义的(因此行为也不那么普遍),“在状态之间切换”实际上是解决这个问题的好方法。逻辑应遵循以下简单规则:
Xs
中有奇数个X
元素,则[X | Xs]
中有偶数个X
元素
X
和Y
不同,则X
元素在[Y | Xs]
中为偶数,而X
元素在Xs
中为偶数
Xs
中有偶数个X
元素,则[X | Xs]
中有奇数个X
元素
X
和Y
不同,则X
元素在[Y | Xs]
中为奇数,而X
元素在Xs
中为奇数
[]
中的任何元素都是偶数
[X]
中有奇数个X
您只需要将这些规则编写为Prolog。但是,您的实现存在一些问题
在少数情况下,您编写的列表是[Head,Tail]
,而不是[Head | Tail]
<代码>[Head,Tail]是正好包含两个元素的列表。另外,您对不均匀计数/2
的基本情况(我假设您指的是奇数计数)是不正确的。如果您有一个始终失败的基本情况,那么您的谓词将始终失败。除了少数例外,您应该编写谓词子句以使其成功,而不是失败。当无法取得成功时,失败将自动发生
让我们试着写出上面的规则。ISO序言已经有了\+
,因此您不需要定义not/1
。另外,写相等([E | |,E])
也是不必要的。您可以简单地直接在代码中执行此操作
evenCount(_, []). % base case for even
evenCount(X, [X|Xs]) :- % rule #1
oddCount(X, Xs).
evenCount(X, [Y|Xs]) :- % rule #2
dif(X, Y),
evenCount(X, Xs).
oddCount(X, [X]). % base case for odd
oddCount(X, [X|Xs]) :- % rule #3
evenCount(X, Xs).
oddCount(X, [Y|Xs]) :- % rule #4
dif(X, Y),
oddCount(X, Xs).
SWI Prolog定义了
dif/2
。您也可以使用\=
,但它不是像dif/2
那样纯粹定义的(因此行为也不像一般情况那样),是的,它在Prolog中是可能的。没有内置的?因为Prolog的所有基本功能都是“内置的”,所以我认为不是。到目前为止你试过什么?你有更具体的问题吗?您看过Prolog文档并检查了它的一组运算符了吗?是的,我应该编写以下谓词:containsevennumberofelement(L,E)。
没有任何内置项。我是一张单子,那也是可能的。你需要展示你的尝试并提出一个具体的问题。我现在编辑了这个问题,希望你能帮助我:)在状态之间切换实际上是解决这个问题的好方法,但你有几个问题:(1)你不需要定义而不是/1
。它已经在SWI Prolog中定义,ISO Prolog有\+
(这不是一个bug,只是一个注释);(2) [Head,Tail]
应该是[Head | Tail]
而[E,Tail]
应该是[E | Tail]
;(3) 您的oddCount/2
(我想您的真正意思是oddCount
?)的基本情况不正确。它应该是unloccount([X],X)。
使用failing子句作为基本大小写将导致谓词失败。是的,在Prolog中是可能的。没有内置的?因为Prolog的所有基本c语言