String Prolog-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),
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)。
远离底部(向上)?我试过了,在我移动了那条线之后,我得到了一个完全不同的结果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
元素时才会触发此子句。在这种情况下,我们对尾部进行递归调用,不计算字符数(对于bouthCCount
和WCount
)
如果我将stringCounter([|T],CCount,WCount):-!,stringCounter(T,CCount,WCount)。
从底部(向上)移开,为什么函数的结果会改变?我试过了,移动那一行后得到了完全不同的结果
因为如前所述,stringCounter([|T]、CCount、WCount)
头与每个非空列表匹配。这只是因为上面的子句中的削减,它被隐式保护为只接受非alpha字符,等等
因此,如果您将其移动到顶部,则可能会导致所有字符串都具有CCount=0
和WCount=0
,因为它将递归枚举字符串,直到到达末尾,在这种情况下,它将与basecasestringCounter([],0,0)统一
.Cut可以提高程序的效率,但由于一个子句的规范对该子句下面的子句有影响,因此它们使程序不容易理解