微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我想在序言中创建KMP并开始这样工作。不幸的是,我无法创建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,N),!;
    write('Else'),string_chars(0,P = Element,S is StartPos+1.

loop(CharatStartPos,TextLength,PrefixList):-
    StartPos<TextLength,write('Start position is: '),write(StartPos),nl,compare(CharatStartPos,P),loop(CharatStartPos,!;
    StartPos=TextLength,write("Loop end"),write(PrefixList).

createPrefixTable(Text,PrefixList):-
    getTextAsList(Text,ListText),getTextLength(Text,TextLength),StartPos=1,NextPos=0,nth0(0,ListText,CharatStartPos),nth0(1,CharatNextPos),write(NextPos),write(CharatStartPos),write(CharatNextPos),PrefixList),write(PrefixList),write("Finish").

解决方法

您使用;来实现析取不是习惯性的,并且是不正确的。即使;存在,您也应该几乎总是使用单独的子句。这样可以更清楚地找出问题所在:

loop(CharAtStartPos,CharAtNextPos,StartPos,NextPos,TextLength,PrefixList):-
    StartPos<TextLength,write('Start position is: '),write(StartPos),nl,compare(CharAtStartPos,PrefixList,S,N,P),loop(CharAtStartPos,P).
loop(CharAtStartPos,PrefixList):-
    StartPos=TextLength,write("Loop end"),write(PrefixList).

第二个子句不以任何方式绑定PrefixList。呼叫者将永远无法从该谓词中获取信息!

我认为您可能想添加一个“累加器”参数,该参数在递归调用上“构建”前缀列表。当递归停止时,最终结果应为累加器值。这样的东西(未经任何测试):

loop(CharAtStartPos,PrefixList0,PrefixList) :-
    StartPos < TextLength,PrefixList1),PrefixList1,PrefixList).
loop(CharAtStartPos,PrefixList):-
    StartPos = TextLength,write(PrefixList).

“外部”的初始调用需要传递合适的初始累加器值,例如:

loop(CharAtStartPos,[],PrefixList)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。