Пролог - выписывайте факты и читайте отзывы пользователей - PullRequest
0 голосов
/ 15 ноября 2018

Я довольно новичок в Прологе, и у меня возникли проблемы с его пониманием. У меня есть некоторые факты с именем ' problem '. Я хочу сначала распечатать эти факты для пользователя, а затем попросить их ввести значение, затем это значение будет прочитано и использовано позже.

Из моего понимания до сих пор было бы лучше использовать 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 голосов
/ 15 ноября 2018

Самый простой способ записать факты проблемы / 1 - использовать встроенный листинг / [0,1].Эта встроенная функция принимает так называемый предикатный индикатор.Вы можете записать факты с помощью:

?- listing(problem/1).

Предикат поддерживается многими системами Prolog, такими как GNU Prolog и т. Д. Чтобы узнать, как читать вводные данные, см., Например, пост Гая Кодера.

0 голосов
/ 15 ноября 2018

Примечание: в этом ответе используется SWI-Prolog.

Как мне прочитать входные данные пользователя относительно проблемы?

Вы делаете это уже сread(X), однако read / 1 читает термины (термины заканчиваются точками), и вы, вероятно, захотите прочитать символы.Если вы используете SWI-Prolog, обратите внимание на Примитивный ввод / вывод символов для чтения символов и Предикаты, которые работают со строками для чтения строк.

Как применить это в переменной для последующего использования?

При выполнении базовых операций ввода-вывода с пользователем на текстовом уровне 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 стиль использует кожух змеи , поэтому tellMeYourProblem должно быть tell_me_your_problem.

Обычно в Прологе REPL выполняется с помощью -> / 2 , ( Чтение ввода до оператора выхода Prolog ), но я изменил это, чтобы добавить больше охранник заявления, чтобы сработало условие выхода, например,

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

или установка охранника в голову, например,

process_input("quit")

При выполнении ввода / вывода дляНа экране и на клавиатуре предполагается использовать stdIn и stdOut, но для клавиатуры SWI-Prolog вместо этого использует user_input.См .: Вход и выход

После того, как весь код пластины котла для REPL - это следующая часть, которую вы ищете, это что-то сделать с входным значением, в этом случае просто распечатайте его.

do_something_with(X) :-
    writeln(X).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...