【问题标题】:How to get user console input into a Prolog list如何将用户控制台输入到 Prolog 列表中
【发布时间】:2019-07-07 16:47:57
【问题描述】:

我正在尝试将用户输入写入列表,但遇到了两个问题。使用此代码

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

我能够从用户那里得到症状,但输出显示第一个用户输入作为头部,其他作为尾部。如何使头部“症状”并且仅将用户输入广告到尾部?其次,当我将“停止”更改为“完成”时,程序不再停止?

所以有人告诉我“完成”不起作用,因为它是大写的。如果我想使用大写单词,我该怎么做?

【问题讨论】:

  • Done 是一个变量,因为它以大写字母开头,而stop 不是,因为它不以大写字母开头。
  • @GuyCoder 好的,谢谢。那么当输入“完成”而不是“完成”时,我将如何使用 dif 停止?
  • 如果您的症状与您的EOF 同名,“停止”或“完成”或其他什么,真的会发生什么?用户将永远无法输入该症状。
  • @repeat 已更正。谢谢。

标签: list input prolog


【解决方案1】:

这行得通

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 进行操作的谓词

【讨论】:

  • 这很有帮助。谢谢!
【解决方案2】:

试试这样的:

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 ).

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-08
    • 1970-01-01
    • 2016-05-10
    • 1970-01-01
    • 2018-04-17
    相关资源
    最近更新 更多