这行得通
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 允许用户按预期输入数据。输入将被读取并存储为字符串。如果要转换数据,则存在对strings 进行操作的谓词