Это работает
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 позволяет пользователю вводить данные так, как они ожидают.Ввод будет прочитан и сохранен как строка.Если данные должны быть преобразованы, существуют предикаты, которые работают с строками