Prolog-写出事实并阅读用户输入

时间:2018-11-15 13:24:21

标签: prolog

我对Prolog并不陌生,在理解它时遇到了一些麻烦。 我有一些名为“ 问题”的事实,我希望首先将这些事实打印出给用户,然后要求他们输入一个值,然后读取并使用该值。

从目前为止的理解来看,最好是使用forall打印出这些事实,然后使用read来读取输入的值,但是在实现这一点时遇到了一些问题。这是我到目前为止的内容,不胜感激

我的问题:如何从用户中读取有关该问题的输入,并将其应用于变量以供以后使用?

tellMeYourProblem:-
forall(problem(P), 
writeln(P)),
answer = read(X),


problem('1').
problem('2').
problem('3').
problem('4').
problem('5').
problem('6').
problem('7').
problem('8').
problem('9').
problem('10').

2 个答案:

答案 0 :(得分:3)

注意:此答案使用SWI-Prolog。

  

我如何阅读用户关于该问题的输入?

您已经使用read(X)进行了此操作,但是read/1会读取术语(术语以句点结尾),您可能想读取字符。如果您使用的是SWI-Prolog,请查看Primitive character I/O来读取字符,Predicates that operate on strings来读取字符串。

  

如何将其应用于变量以供以后使用?

在文本级别上与用户进行基本I / O时,REPL是很好的入门方法。添加REPL有点复杂,所以我会给你代码。

tellMeYourProblem :-
    output_problems,
    read_input.

output_problems :-
    forall(problem(P),
    writeln(P)).

read_input :-
    repeat,
    read_string(user_input, "\n", "\r\t ", _, Line),
    process_input(Line).

process_input(Line) :-
    string(Line),
    atom_number(Line, N),
    integer(N),
    do_something_with(Line),
    fail.
process_input("quit") :-
    write('Finished'), nl,
    !, true.

do_something_with(X) :-
    writeln(X).

problem('1').
problem('2').
problem('3').
problem('4').
problem('5').
problem('6').
problem('7').
problem('8').
problem('9').
problem('10').

在Prolog中,样式也是使用snake casing,因此tellMeYourProblem应该是tell_me_your_problem

通常在Prolog中,REPL是用->/2,(Read Input till quit statement Prolog)完成的,但是我将其更改为添加更多的guard语句,以便退出条件有效,例如

string(Line),
atom_number(Line, N),
integer(N)

或将警卫人员放在头部,例如

process_input("quit")

在对屏幕和键盘进行I / O时,想法是使用stdInstdOut,但对于SWI-Prolog键盘,则使用user_input。参见:Input and output

在查找REPL的所有样板代码之后,您要寻找的下一部分就是要对输入值进行处理,在这种情况下,只需将其打印出来即可。

do_something_with(X) :-
    writeln(X).

答案 1 :(得分:-1)

最容易写出问题1的事实, 是使用内置列表/ [0,1]。这个内置 接受所谓的谓词指示符。您可以 通过以下方式写出事实:

{
  "status": "Succeeded",
  "succeeded": true,
  "failed": false,
  "finished": true,
  "recognitionResult": {
    "lines": [{
      "boundingBox": [140, 289, 818, 294, 816, 342, 138, 340],
      "text": "General information Com",
      "words": [{
        "boundingBox": [106, 290, 363, 291, 363, 343, 106, 343],
        "text": "General"
      }, {
        "boundingBox": [323, 291, 659, 291, 659, 344, 323, 343],
        "text": "lawyer"
      }, {
        "boundingBox": [665, 291, 790, 291, 790, 344, 665, 344],
        "text": "Com"
      }]
    }]
  }
}

许多Prolog系统都支持该谓词 例如GNU Prolog等。有关如何读取输入的信息,请参见 例如Guy Coder的帖子。