You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 10:30:53