如何获取用户输入的每个单词的第一个字母

时间:2020-12-19 04:23:40

标签: prolog

这是我的代码的详细信息

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

2 个答案:

答案 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

___enter image description here


一项更具挑战性的任务:从名称中删除第一个字母。

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.

逗号被解释为函子(在标准序言中)。 我回答你的问题了吗?