我对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').
答案 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时,想法是使用stdIn
和stdOut
,但对于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的帖子。