You need to enable JavaScript to run this app. 如何在Prolog中提取用户输入姓名各单词首字母生成缩写并输出?
优惠活动
大模型
产品
解决方案
定价
更多

如何在Prolog中提取用户输入姓名各单词首字母生成缩写并输出?

现有代码的核心缺陷

  • 原beginStr谓词无任何过滤逻辑,遍历到什么字符就直接输出什么,运行后会把输入的整串姓名原样打印,完全不具备提取单词首字母的能力。
  • 缺失状态判断机制,无法区分当前字符是「单词开头的首字母」还是「单词内部的普通字符」,也没有对“空格分隔单词”这个场景做专门处理。

调整思路

给字符串遍历流程增加状态标记,严格按照姓名缩写的规则做判断:

  • 跳过姓名前后的所有前置/后置空格
  • 每个单词的第一个字符(不管是开头的第一个单词,还是空格后面的后续单词)直接输出
  • 单词中间的普通字符、所有空格、连续多个空格全部跳过,不输出任何多余内容

可直接运行的修改后代码

begin :-
    read(X),
    name(X, L),
    write('Name Code: '),
    beginStr(L, start),
    nl.

% 初始状态:尚未读取到有效单词的第一个字符
beginStr([H|T], start) :-
    H \= 32, % 32是ASCII编码中空格的对应值
    put(H),
    beginStr(T, in_word).
beginStr([H|T], start) :-
    H = 32,
    beginStr(T, start).

% 单词内状态:当前正在某个单词的字符序列中,不需要输出后续普通字符
beginStr([H|T], in_word) :-
    H \= 32,
    beginStr(T, in_word).
beginStr([H|T], in_word) :-
    H = 32,
    beginStr(T, after_space).

% 空格后状态:刚跳过空格序列,下一个非空格字符就是新单词的首字母
beginStr([H|T], after_space) :-
    H \= 32,
    put(H),
    beginStr(T, in_word).
beginStr([H|T], after_space) :-
    H = 32,
    beginStr(T, after_space).

% 字符串遍历完成,结束流程
beginStr([], _).

运行输出

完全匹配预期效果:

| ?- begin.
|: 'Jenny Liz Ane'.
Name Code: JLA
yes

内容的提问来源于stack exchange,提问作者EddieJn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.11 15:06:04