PROLOG:如何在PROLOG中创建KMP算法?

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

我想在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("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)