Как записать ввод пользователя в список Пролог - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь записать пользовательский ввод в список, но сталкиваюсь с двумя проблемами.Используя этот код

getInput([Symptom|List]):-
    writeln('Enter Element:'),
    read(Symptom),
    dif(Symptom,stop),
    getInput(List).
getInput([]).

Я могу получить симптомы от пользователя, но результат показывает первый пользовательский ввод в качестве головы, а остальные - в качестве хвоста.Как сделать заголовок «Симптомы» и только добавить пользовательский ввод в хвост?Во-вторых, когда я меняю «стоп» на «Готово», программа больше не останавливается?

Поэтому мне сказали, что «Готово» не работает, потому что оно написано с заглавной буквы.Если я хочу использовать заглавное слово, как бы я это сделал?

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

Это работает

get_symptoms(Symptoms) :-
    write('Enter Symptom: ' ),
    read_string(user, "\n", "\r", _, Response),
    (
        Response == "Stop"
    ->
        Symptoms = []
    ;
        get_symptoms(Symptoms0),
        Symptoms = [Response|Symptoms0]
    ).

Использует
1. == / 2 вместо dif / 2 .
2. read_string / 5 вместо read / 1 , чтобы можно было вводить строки.
3. write / 1 вместо writeln / 1 такэтот ввод находится в той же строке, что и приглашение.
4. -> / 2 вместо отдельных предложений.

Вы можете изменить значение выходного слова на что-то отличное от «Стоп».", вы даже можете использовать отдельные символы, такие как". "если хотите.

Обратите внимание, что для этого не требуется вырезать (!).

Пример запускается:

?- get_symptoms(List).
Enter Symptom: Stop
List = [].

?- get_symptoms(List).
Enter Symptom: A
Enter Symptom: Stop
List = ["A"].

?- get_symptoms(List).
Enter Symptom: a
Enter Symptom: A
Enter Symptom: A line with some spaces
Enter Symptom: Notice that a period is not needed at the end
Enter Symptom: Stop
List = ["a", "A", "A line with some spaces", "Notice that a period is not needed at the end"].

Как сделать «Симптомы» для главы и добавить только ввод пользователя в хвост?

Вы хотите, чтобы пользователь вводил голову и имел следующие записи в качестве хвоста.Хитрость в этом примере состоит в том, чтобы поместить конструктор списка |/2 после рекурсивного вызова, например,

    get_symptoms(Symptoms0),           % Recursive call
    Symptoms = [Response|Symptoms0]    % List constructor

Во-вторых, когда я изменяю «стоп» на «Готово», программа больше не останавливается?

Поскольку Done начинается с заглавной буквы, это переменная Prolog, которая вызывает проблему.stop начинается с буквы нижнего регистра и является атомом, поэтому он работает, как и ожидалось, при сравнении.

Если я хочу использовать заглавное слово, как бы я это сделал?

Вы можете использовать read / 1 , который требует от пользователявведите "" при вводе значения, например,

?- read(X).
|: "Hello".

X = "Hello".

, но read / 1 читает термин, поэтому требует, чтобы пользователь не только добавил двойные кавычки, но и завершил их точкой.Использование read_string / 5 позволяет пользователю вводить данные так, как они ожидают.Ввод будет прочитан и сохранен как строка.Если данные должны быть преобразованы, существуют предикаты, которые работают с строками

0 голосов
/ 13 февраля 2019

Попробуйте что-то вроде этого:

get_input( Rs ) :-
  get_input( [], Rs )
  .

get_input( Ss , Rs ) :-
  writeln('Enter Element:'),
  read( S ),
  dif( S , stop ),
  !,
  get_input( [S|Ss] , Rs )
  .
get_input( Rs, Rs ).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...