如何在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
相关产品推荐
相关产品推荐

