Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/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
String Prolog-Prolog新手,很难理解代码段_String_Recursion_Prolog_Increment - Fatal编程技术网

String Prolog-Prolog新手,很难理解代码段

String Prolog-Prolog新手,很难理解代码段,string,recursion,prolog,increment,String,Recursion,Prolog,Increment,我刚刚开始学习Prolog,发现了一些我很难理解的代码: stringCounter([],0,0). stringCounter([H|[]],1,1) :- char_type(H, alpha),!. stringCounter([H1,H2|T],CCount,WCount):- char_type(H1, alpha), \+char_type(H2,alpha), !, stringCounter(T,L0,A0),

我刚刚开始学习Prolog,发现了一些我很难理解的代码:

stringCounter([],0,0).
stringCounter([H|[]],1,1) :- char_type(H, alpha),!.
stringCounter([H1,H2|T],CCount,WCount):-
        char_type(H1, alpha),
        \+char_type(H2,alpha),
        !,
        stringCounter(T,L0,A0),
        CCount is L0+1, WCount is A0+1.

stringCounter([H|T],CCount,WCount):-
        char_type(H, alpha),
        !,
        stringCounter(T,L1,A1),
        CCount is L1+1, WCount is A1+0.

stringCounter([_|T],CCount,WCount):- !, stringCounter(T,CCount,WCount).
函数任务是计算字符串中有多少个字符和有多少个单词(据我所知)

我理解这里的大部分代码,除了3件小事:

  • CCount是L0+1,WCount是A0+1
    etc是一种有效的语法吗
    L0
    A0
    完全未定义。Prolog如何知道例如
    A0+1
    是什么?是否应该是
    A0是WCount+1

  • 我不太明白
    stringCounter([H |[]),1,1):-char_类型(H,alpha)
    stringCounter([|T],Account,WCount):-!,stringCounter(T、CCount、WCount)。
    is

  • 如果我移动
    stringCounter([|T],CCount,WCount):-!,为什么函数的结果会改变!,stringCounter(T、CCount、WCount)。
    远离底部(向上)?我试过了,在我移动了那条线之后,我得到了一个完全不同的结果

  • 很抱歉提出了一些非常基本/愚蠢的问题,但我很难理解Prolog和逻辑编程

    函数任务是计算字符串中有多少个字符和有多少个单词(据我所知)

    No
    CCount
    (第二个参数)与
    alpha
    字符的数量相一致,
    WCount
    alpha
    字符的序列数量相一致。Soo
    “foo8bar\u qux”
    CCount=9
    WCount=3
    相统一

    CCount是L0+1
    WCount是A0+1
    等,这是一种有效的语法吗
    L0
    A0
    完全未定义。(……)

    是吗?在该线上方一行,我们看到:

    stringCounter(T,L0,A0),
    
    因此,将
    stringCounter
    接地
    L0
    A0
    。如果在调用
    stringCounter/3
    后,
    L0
    A0
    接地是一个不变量,那么它将正常工作。Prolog不能用
    is/2
    谓词处理未接地变量,这是正确的

    我不太明白
    stringCounter([H |[]),1,1):-char_类型(H,alpha)
    stringCounter([|T],Account,WCount):-!,stringCounter(T、CCount、WCount)。
    is

    [H |[]]
    [H]
    的详细形式:一个包含一个元素的列表
    [H]
    。因此,这里我们检查
    H
    是否为字母字符。如果是,那么我们将其计算为一(对于
    CCount
    WCount
    )。请注意,它以一个切口(
    )结束。这意味着忽略其他条款

    语句
    stringCounter([|T],CCount,WCount):-!,stringCounter(T、CCount、WCount)。
    是最后一个。由于其他子句使用剪切,这意味着仅当列表包含至少一个元素且该元素不是
    alpha
    元素时才会触发此子句。在这种情况下,我们对尾部进行递归调用,不计算字符数(对于bouth
    CCount
    WCount

    如果我将
    stringCounter([|T],CCount,WCount):-!,stringCounter(T,CCount,WCount)。
    从底部(向上)移开,为什么函数的结果会改变?我试过了,移动那一行后得到了完全不同的结果

    因为如前所述,
    stringCounter([|T]、CCount、WCount)
    头与每个非空列表匹配。这只是因为上面的子句中的削减,它被隐式保护为只接受非alpha字符,等等

    因此,如果您将其移动到顶部,则可能会导致所有字符串都具有
    CCount=0
    WCount=0
    ,因为它将递归枚举字符串,直到到达末尾,在这种情况下,它将与basecase
    stringCounter([],0,0)统一
    .Cut可以提高程序的效率,但由于一个子句的规范对该子句下面的子句有影响,因此它们使程序不容易理解