PROLOG:如何在PROLOG中创建KMP算法?
我想在prolog中创建KMP,并开始这样工作。很遗憾,我无法创建Prolog所需的前缀表?考虑到prolog是一种逻辑语言,我做得对吗PROLOG:如何在PROLOG中创建KMP算法?,prolog,knuth-morris-pratt,Prolog,Knuth Morris Pratt,我想在prolog中创建KMP,并开始这样工作。很遗憾,我无法创建Prolog所需的前缀表?考虑到prolog是一种逻辑语言,我做得对吗 compare(CharAtStartPos,CharAtNextPos,StartPos,NextPos,PrefixList,S,N,P):- CharAtStartPos=CharAtNextPos,write('Equal'), N is NextPos+1, string_chars(N,Element), write
compare(CharAtStartPos,CharAtNextPos,StartPos,NextPos,PrefixList,S,N,P):-
CharAtStartPos=CharAtNextPos,write('Equal'),
N is NextPos+1,
string_chars(N,Element),
write("Element is"), write(Element),
S is StartPos+1,!;
CharAtStartPos\=CharAtNextPos,NextPos\=0,write('Not equal'),
value is NextPos-1,
nth0(value,PrefixList, N),!;
write('Else'),
string_chars(0,Element),
P = Element,write("Element is"),
write(Element),
S is StartPos+1.
loop(CharAtStartPos,CharAtNextPos,StartPos,NextPos,TextLength,PrefixList):-
StartPos<TextLength,
write('Start position is: '),write(StartPos),nl,
compare(CharAtStartPos,CharAtNextPos, StartPos,NextPos,PrefixList,S,N,P),
loop(CharAtStartPos,CharAtNextPos,S,N,TextLength,P),!;
StartPos=TextLength,
write("Loop end"),
write(PrefixList).
createPrefixTable(Text,TextLength, PrefixList):-
getTextAsList(Text,ListText),
getTextLength(Text,TextLength),
StartPos=1,NextPos=0,
nth0(0,ListText,CharAtStartPos), nth0(1,ListText,CharAtNextPos),
write(StartPos),write(NextPos),nl,
write(CharAtStartPos),write(CharAtNextPos),nl,
loop(CharAtStartPos,CharAtNextPos,StartPos, NextPos,TextLength, PrefixList),
write(PrefixList),
write("Finish").
比较(CharAtStartPos、CharAtNextPos、StartPos、NextPos、PrefixList、S、N、P):-
CharAtStartPos=CharAtNextPos,write('Equal'),
N是NextPos+1,
字符串字符(N,元素),
写入(“元素是”),写入(元素),
S是StartPos+1,!;
CharAtStartPos\=CharAtNextPos,NextPos\=0,write('Not equal'),
值为NextPos-1,
nT0(值,前缀列表,N),!;
写('Else'),
字符串字符(0,元素),
P=元素,写入(“元素为”),
写入(元素),
S是StartPos+1。
循环(CharAtStartPos、CharAtNextPos、StartPos、NextPos、TextLength、PrefixList):-
开始使用您的代码>实现析取不是惯用的方法,也是不正确的。即使
exists您几乎应该始终使用单独的子句。这将更清楚地说明问题所在:
loop(CharAtStartPos,CharAtNextPos,StartPos,NextPos,TextLength,PrefixList):-
StartPos<TextLength,
write('Start position is: '),write(StartPos),nl,
compare(CharAtStartPos,CharAtNextPos, StartPos,NextPos,PrefixList,S,N,P),
loop(CharAtStartPos,CharAtNextPos,S,N,TextLength,P).
loop(CharAtStartPos,CharAtNextPos,StartPos,NextPos,TextLength,PrefixList):-
StartPos=TextLength,
write("Loop end"),
write(PrefixList).
来自“外部”的初始调用需要传递一个合适的初始累加器值,例如:
loop(CharAtStartPos, CharAtNextPos, StartPos, NextPos, TextLength, [], PrefixList)
loop(CharAtStartPos, CharAtNextPos, StartPos, NextPos, TextLength, [], PrefixList)