PROLOG-子序列在数字中的出现次数

PROLOG-子序列在数字中的出现次数,prolog,Prolog,使用Prolog语言,我需要找出一个子序列在一个数字中出现的次数 我试图在一个大的文本文件中计算一个单词的出现次数,但也没有成功。虽然我有它的代码 word_freq(W, Freq) :- word_count(W, 0, Total, 0, Match), Total > 0 -> Freq is Match / Total. word_count(W, TotSoFar, Tot, MatchSoFar, Match) :- ( read_word(

使用Prolog语言,我需要找出一个子序列在一个数字中出现的次数

我试图在一个大的文本文件中计算一个单词的出现次数,但也没有成功。虽然我有它的代码

word_freq(W, Freq) :-
    word_count(W, 0, Total, 0, Match),
    Total > 0 -> Freq is Match / Total.

word_count(W, TotSoFar, Tot, MatchSoFar, Match) :-
    (  read_word(SoFar,W),
    N \= end_of_file
    -> T1 is TotSoFar + 1,
    (  N == W
    -> M1 is MatchSoFar+1
    ;  M1 is MatchSoFar
    ),
    word_count(W, T1, Tot, M1, Match)
    ; TotSoFar = Tot,
    MatchSoFar = Match
    ).

read_word(SoFar, W) :-
    get_code(C),
    (   C == -1
    ->  ( SoFar == [] -> W = end_of_file ; reverse(SoFar, W) )
    ;   code_type(C, alnum)
    ->  read_word([C|SoFar], W)
    ;   reverse(SoFar, W)
    ).

我认为发生率/频率计数对于这两种情况都应该是相同的,或者是类似的。我不知道从哪里开始,也不知道如何继续,非常感谢您的帮助。

请告诉我您对该解决方案的看法。我假设子序列也必须是一个数字,因为我们正在寻找它在数字中的出现

想法如下:

给定一个数字和另一个数字(子序列),从该数字中减去子序列,然后查看最低有效数字是否为零(最低有效数字的数量由子序列的大小决定)。如果它们是零,那么我们就有子序列,否则就没有子序列。继续对使用NumberNew=number div 10获得的其余数字执行此操作,直到出现数字小于子序列的情况。如果你在理解代码方面有任何困难,我会编辑这篇文章并用注释更新它

subsequence_size(Subsequence,1) :- Subsequence < 10,!.
subsequence_size(Subsequence,Size) :- SubNew is Subsequence div 10,subsequence_size(SubNew,N),Size is N+1. 


is_subsequence(_,0).
is_subsequence(Number,SubSize) :-  Rem is Number mod 10,
                                   Rem=0,
                                   NumberNew is Number div 10,
                                   SubSizeNew is SubSize - 1,
                                   is_subsequence(NumberNew,SubSizeNew).

occurence_of_subsequence_in_number(Subsequence,Number,Occurences) :- subsequence_size(Subsequence,SubSize),
                                                                     count(Subsequence,SubSize,Number,0,Occurences).

count(0,_,0,Occurences,1) :- Occurences=0,!.
count(0,_,0,Occurences,Occurences) :- not(Occurences=0),!.
count(Subsequence,_,Number,Occurences,Occurences) :- Subsequence > Number,!.
count(Subsequence,SubSize,Number,Occurences,FinalOccurences) :- NumberToTest is Number-Subsequence,
                                                                (is_subsequence(NumberToTest,SubSize)),
                                                                OccurencesNew is Occurences+1,
                                                                NumberNew is Number div 10,
                                                                count(Subsequence,SubSize,NumberNew,OccurencesNew,FinalOccurences),!.

count(Subsequence,SubSize,Number,Occurences,FinalOccurences) :- NumberToTest is Number-Subsequence,
                                                                not(is_subsequence(NumberToTest,SubSize)),
                                                                NumberNew is Number div 10,
                                                                count(Subsequence,SubSize,NumberNew,Occurences,FinalOccurences),!.
subsequence\u大小(subsequence,1):-subsequence<10,!。
子序列大小(子序列,大小):-子网是子序列div 10,子序列大小(子序列,N),大小是N+1。
是_子序列(0)。
is_子序列(编号,子序列):-Rem是编号mod 10,
Rem=0,
NumberNew是第10分区的编号,
SUFFISZENEW是SUFFISZE-1,
是_子序列(编号新,子编号新)。
子序列的出现次数(子序列,编号,出现次数):-子序列大小(子序列,子序列),
计数(子序列、子序列、数字、0、出现次数)。
计数(0,0,发生次数,1):-发生次数=0,!。
计数(0,0,发生次数,发生次数):-不是(发生次数=0),!。
计数(子序列、数量、发生、发生):-子序列>数量,!。
计数(子序列、子序列、数字、事件、最终结果):-NumberToTest是数字子序列,
(is_子序列(NumberToTest,SubSize)),
事件new是事件+1,
NumberNew是第10分区的编号,
计数(子序列、子序列、新编号、新事件、最终结果),!。
计数(子序列、子序列、数字、事件、最终结果):-NumberToTest是数字子序列,
不是(是_子序列(NumberToTest,SubSize)),
NumberNew是第10分区的编号,
计数(子序列、子序列、新编号、事件、最终结果),!。

请告诉我您对该解决方案的看法。我假设子序列也必须是一个数字,因为我们正在寻找它在数字中的出现

想法如下:

给定一个数字和另一个数字(子序列),从该数字中减去子序列,然后查看最低有效数字是否为零(最低有效数字的数量由子序列的大小决定)。如果它们是零,那么我们就有子序列,否则就没有子序列。继续对使用NumberNew=number div 10获得的其余数字执行此操作,直到出现数字小于子序列的情况。如果你在理解代码方面有任何困难,我会编辑这篇文章并用注释更新它

subsequence_size(Subsequence,1) :- Subsequence < 10,!.
subsequence_size(Subsequence,Size) :- SubNew is Subsequence div 10,subsequence_size(SubNew,N),Size is N+1. 


is_subsequence(_,0).
is_subsequence(Number,SubSize) :-  Rem is Number mod 10,
                                   Rem=0,
                                   NumberNew is Number div 10,
                                   SubSizeNew is SubSize - 1,
                                   is_subsequence(NumberNew,SubSizeNew).

occurence_of_subsequence_in_number(Subsequence,Number,Occurences) :- subsequence_size(Subsequence,SubSize),
                                                                     count(Subsequence,SubSize,Number,0,Occurences).

count(0,_,0,Occurences,1) :- Occurences=0,!.
count(0,_,0,Occurences,Occurences) :- not(Occurences=0),!.
count(Subsequence,_,Number,Occurences,Occurences) :- Subsequence > Number,!.
count(Subsequence,SubSize,Number,Occurences,FinalOccurences) :- NumberToTest is Number-Subsequence,
                                                                (is_subsequence(NumberToTest,SubSize)),
                                                                OccurencesNew is Occurences+1,
                                                                NumberNew is Number div 10,
                                                                count(Subsequence,SubSize,NumberNew,OccurencesNew,FinalOccurences),!.

count(Subsequence,SubSize,Number,Occurences,FinalOccurences) :- NumberToTest is Number-Subsequence,
                                                                not(is_subsequence(NumberToTest,SubSize)),
                                                                NumberNew is Number div 10,
                                                                count(Subsequence,SubSize,NumberNew,Occurences,FinalOccurences),!.
subsequence\u大小(subsequence,1):-subsequence<10,!。
子序列大小(子序列,大小):-子网是子序列div 10,子序列大小(子序列,N),大小是N+1。
是_子序列(0)。
is_子序列(编号,子序列):-Rem是编号mod 10,
Rem=0,
NumberNew是第10分区的编号,
SUFFISZENEW是SUFFISZE-1,
是_子序列(编号新,子编号新)。
子序列的出现次数(子序列,编号,出现次数):-子序列大小(子序列,子序列),
计数(子序列、子序列、数字、0、出现次数)。
计数(0,0,发生次数,1):-发生次数=0,!。
计数(0,0,发生次数,发生次数):-不是(发生次数=0),!。
计数(子序列、数量、发生、发生):-子序列>数量,!。
计数(子序列、子序列、数字、事件、最终结果):-NumberToTest是数字子序列,
(is_子序列(NumberToTest,SubSize)),
事件new是事件+1,
NumberNew是第10分区的编号,
计数(子序列、子序列、新编号、新事件、最终结果),!。
计数(子序列、子序列、数字、事件、最终结果):-NumberToTest是数字子序列,
不是(是_子序列(NumberToTest,SubSize)),
NumberNew是第10分区的编号,
计数(子序列、子序列、新编号、事件、最终结果),!。