Prolog实现两字符串子串判断:代码续写求助
实现输入两个字符串并判断子串关系的完整方案
你当前的代码只有输入提示,缺少读取输入和判断逻辑,下面是完整的实现步骤和代码:
1. 补充输入读取逻辑
首先需要在提示后读取用户输入的两个字符串。SWI-Prolog里用read_string/3可以读取包含空格的完整字符串,比read/1更通用:
write('Enter the first string:'), nl, read_string(current_input, _, Str1), % 读取第一个字符串 write('Enter the second string:'), nl, read_string(current_input, _, Str2), % 读取第二个字符串
2. 编写子串判断逻辑
我们需要实现两种判断:要么第一个字符串是第二个的子串,要么反过来。这里提供两种实现方式:
方式一:用内置谓词(简单高效)
SWI-Prolog自带sub_string/4谓词,能直接判断一个字符串是否是另一个的子串:
% 判断A是否是B的子串 is_substring(A, B) :- sub_string(B, _, _, _, A). % 只要其中一个是另一个的子串就返回true check_either_substring(A, B) :- is_substring(A, B); % 逻辑或,满足其一即可 is_substring(B, A).
方式二:手动实现(适合理解底层逻辑)
如果想自己实现子串判断的原理,可以把字符串转成字符列表,通过子列表匹配来实现:
% 把字符串转成字符列表 string_to_chars(Str, Chars) :- string_chars(Str, Chars). % 判断列表X是否是列表Y的子列表 is_sublist([], _). % 空列表是任何列表的子列表 is_sublist([H|T], [H|Rest]) :- prefix(T, Rest); % 当前开头匹配,检查剩余部分是否是前缀 is_sublist([H|T], Rest). % 不匹配当前开头,继续向后找 % 判断列表X是否是列表Y的前缀 prefix([], _). prefix([H|T], [H|Rest]) :- prefix(T, Rest). % 主判断谓词:转成字符列表后检查两种子列表情况 check_either_substring(A, B) :- string_to_chars(A, CharsA), string_to_chars(B, CharsB), (is_sublist(CharsA, CharsB); is_sublist(CharsB, CharsA)).
3. 整合代码并输出结果
把输入、判断和结果提示整合到一个谓词里,完整代码如下:
完整代码(内置谓词版)
substring_checker :- write('Enter the first string:'), nl, read_string(current_input, _, Str1), write('Enter the second string:'), nl, read_string(current_input, _, Str2), (check_either_substring(Str1, Str2) -> write('One of the strings is a substring of the other.'), nl ; write('Neither string is a substring of the other.'), nl ). is_substring(A, B) :- sub_string(B, _, _, _, A). check_either_substring(A, B) :- is_substring(A, B); is_substring(B, A).
完整代码(手动实现版)
substring_checker :- write('Enter the first string:'), nl, read_string(current_input, _, Str1), write('Enter the second string:'), nl, read_string(current_input, _, Str2), (check_either_substring(Str1, Str2) -> write('One of the strings is a substring of the other.'), nl ; write('Neither string is a substring of the other.'), nl ). string_to_chars(Str, Chars) :- string_chars(Str, Chars). is_sublist([], _). is_sublist([H|T], [H|Rest]) :- prefix(T, Rest); is_sublist([H|T], Rest). prefix([], _). prefix([H|T], [H|Rest]) :- prefix(T, Rest). check_either_substring(A, B) :- string_to_chars(A, CharsA), string_to_chars(B, CharsB), (is_sublist(CharsA, CharsB); is_sublist(CharsB, CharsA)).
运行方法
在SWI-Prolog控制台加载代码后,输入substring_checker.并回车,就能按照提示输入字符串,程序会输出判断结果:
?- substring_checker. Enter the first string: hello Enter the second string: hello world One of the strings is a substring of the other. true.
内容的提问来源于stack exchange,提问作者Vaibav Reddy
相关产品推荐
相关产品推荐

