有没有办法检查一个字符串是否是Prolog中另一个字符串的子字符串?我尝试将字符串转换为字符列表,然后检查第一个字符集是否是第二个字符集的子集,而该子集似乎不够严格。这是我当前的代码:

isSubstring(X,Y):-
        stringToLower(X,XLower),
        stringToLower(Y,YLower),
        isSubset(XLower,YLower).

isSubset([],_).
isSubset([H|T],Y):-
        member(H,Y),
        select(H,Y,Z),
        isSubset(T,Z).

stringToLower([],[]).
stringToLower([Char1|Rest1],[Char2|Rest2]):-
        char_type(Char2,to_lower(Char1)),
        stringToLower(Rest1,Rest2).


如果我用


isSubstring(“ test”,“ tesZting”)。


它返回是,但应返回否。

最佳答案

Prolog字符串是列表,列表的每个元素都是代表所讨论字符的代码点的整数值。字符串"abc"与列表[97,98,99]完全等效(假设您的序言实现使用的是Unicode或ASCII,否则值可能会有所不同)。这导致了这个解决方案(从Big-O角度来看可能不是最佳的),它基本上说X是S的子字符串,如果


S的后缀T使得
X是T的前缀


这是代码:

substring(X,S) :-
  append(_,T,S) ,
  append(X,_,T) ,
  X \= []
  .


我们将X限制为空列表(也就是nil字符串"")以外的其他内容,因为从概念上讲,任何字符串中都可以找到很多零长度的子字符串:长度为n的字符串具有2+(n-1 )nil个子字符串,在字符串的每个字符之间一个,在第一个字符之前,在最后一个字符之后。

关于prolog - 检查字符串是否为Prolog中的子字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20250462/

10-12 17:46
查看更多