这是我的代码的详细信息
name:-read(X),write('Name : '),write(X),nameCode(X).
nameCode(X):-nl, write('Name Code : ').
我想从每个单词中取出前 3 个字母并显示出来。应该在我的代码中添加什么? 此外,我得到的结果只允许我输入用户的一个名字。当我尝试在查询中输入多个名字(peter jane mary)时,它显示如下语法消息
| ?- name.
|: peter jane mary.
* Syntax Error
下面是我要打印的结果
Name : peter jane mary
Name Code : PJM
答案 0 :(得分:2)
1- 首先,用户输入他/她的名字/中间名/姓氏。
2- 已读取。
3- string_chars 将字符串分解成字符:peter 将变成 p,e,t,e,r
4- getFirstLetter 谓词从列表中提取第一个元素:从彼得我们得到 p。
5- upcase_atom 将小写字母转换为大写:p 将变为 P。
6- 使用 write 显示答案。
k:-
write('Enter First name: '),nl,
read(FName),nl,
string_chars(FName,N1),
getFirstLetter(N1,L1),
upcase_atom(L1,Str1),
write('Enter Middle name: '),nl,
read(MName),nl,
string_chars(MName,N2),
getFirstLetter(N2,L2),
upcase_atom(L2,Str2),
write('Enter Last name: '),nl,
read(LName),nl,
string_chars(LName,N3),
getFirstLetter(N3,L3),
upcase_atom(L3,Str3),
write(Str1),write(' '),write(Str2),write(' '),write(Str3).
getFirstLetter([H|_],H).
示例:
?-k.
Enter First name:
peter
Enter Middle name:
jane
Enter Last name:
mary
P J M
一项更具挑战性的任务:从名称中删除第一个字母。
1- 首先,用户输入他/她的名字/中间名/姓氏。
2- 已读取。
3- string_chars 将字符串分解成字符:peter 将变成 p,e,t,e,r
4- removeFirstLetter 谓词删除第一个字母:p,e,t,e,r 将变成 e,t,e,r
5- charstring 谓词将 e,t,e,r 转换为 "e","t","e","r",我们使用 term_string强>(这对下一个很重要 步骤)
6- atomic_list_concat 将所有单独的字符连接在一起:"e","t","e","r" 将 成为永恒
k:-
write('Enter first name: '),nl,
read(FName),nl,
string_chars(FName,N1),
removeFirstLetter(N1,L1),
charstring(L1,String1),
atomic_list_concat( String1 , Cs1),
write('Enter Middle name: '),nl,
read(MidName),nl,
string_chars(MidName,N2),
removeFirstLetter(N2,L2),
charstring(L2,String2),
atomic_list_concat( String2 , Cs2),
write('Enter Last name: '),nl,
read(LName),nl,
string_chars(LName,N3),
removeFirstLetter(N3,L3),
charstring(L3,String3),
atomic_list_concat( String3 , Cs3),
write(Cs1),write(" "),write(Cs2), write(" "),write(Cs3).
charstring([],[]).
charstring([H|T],[H2|L]):-
term_string(H,H2),
charstring(T,L).
removeFirstLetter([_|T],T).
示例:
?-k.
Enter first name:
peter
Enter Middle name:
jane
Enter Last name:
mary
eter ane ary
1true
答案 1 :(得分:1)
内置谓词 read/1 读入序言词,以句号终止。 “peter jane mary” 不是序言术语,因此会出现语法错误。特别是,prolog 不知道如何处理您姓名之间的空格。
如果你更喜欢用逗号来分隔名字,你可以这样:
?- read(X), X = ','(A, ','(B,C)).
|: peter,mary,paul.
X = (peter,mary,paul),
A = peter,
B = mary,
C = paul.
逗号被解释为函子(在标准序言中)。 我回答你的问题了吗?