Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List Prolog检查列表是否包含偶数个元素_List_Recursion_Prolog_Tail_Head - Fatal编程技术网

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语言