Prolog,使用大写字母

时间:2014-04-24 09:22:22

标签: variables prolog

我正在研究SWI-Prolog中的数据库项目。问题是我想使用我从输入中读取的运动员的名字。我需要用大写字母保存他们的名字,但prolog将这些作为变量解释。任何想法如何解决这个问题?

4 个答案:

答案 0 :(得分:2)

我会使用code_type/2来确保输入的任何名称都以大写字母开头。

由于您希望允许用户输入带有小写或大写字母的名称,我会使用read_line_to_codes/2读取的代码列表进行大小写转换。

由于您要将名称存储在数据库中,我使用dynamic/1声明我将添加一些sportsname/1条目,并使用assert/1添加特定名称数据库。

以下是代码:

:- dynamic(sportsname/1).

:- initialization(input).

input:-
  repeat,
  format(user_output, 'Please enter a name (or type `quit`):\n', []),
  read_line_to_codes(user_input, Codes1),
  (
    atom_codes(quit, Codes1)
  ->
    !, true
  ;
    capitalize(Codes1, Codes2)
  ->
    atom_codes(Name, Codes2),
    assert(sportsname(Name)),
    format(current_output, 'Sportsname ~a writen to database.\n', [Name]),
    fail
  ;
    fail
  ).

capitalize([], []).
capitalize([H1|T], [H2|T]):-
  code_type(H2, to_upper(H1)).

使用示例:

$ swipl sport_names.pl
Please enter a name (or type `quit`):
|: john
Sportsname John writen to database.
Please enter a name (or type `quit`):
|: James
Sportsname James writen to database.
Please enter a name (or type `quit`):
|: suzan
Sportsname Suzan writen to database.
Please enter a name (or type `quit`):
|: quit

?- sportsname(X).
X = 'John' ;
X = 'James' ;
X = 'Suzan'.

希望这有帮助!

答案 1 :(得分:1)

我不知道这段代码与实现无关,但这对我来说在SWI-Prolog中有用:

read_string(String) :-
    current_input(Input),
    read_line_to_codes(Input, Codes),
    string_codes(String, Codes).

示例输入和输出:

?- read_string(X).
|: Test!
X = "Test!".

答案 2 :(得分:0)

使用引用的原子......

?- atom('X').
true.

?- 'X' = 'Y'.
false.

...或字符串:

?- X = "Foo!".
X = [70, 111, 111, 33].

(字符串表示为代码点列表,在本例中为ASCII码)。引用的原子更容易使用。

答案 3 :(得分:0)

只需引用Prolog需要读取的任何字符串,无论您在数据库中找到哪种情况......谨防转义:例如

?- write('O\'Neal').
O'Neal

?- read(X).
|: 'O\'Neal'.
X = 'O\'Neal'.