有没有办法检查一个字符串是否是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/