Пролог: чтение предиката пропускает некоторые скобки в пользовательском вводе - PullRequest
0 голосов
/ 05 февраля 2019

Я новичок в Прологе.Я пытаюсь решить головоломку с числовыми ссылками с изменяющимся размером платы и начальными конечными положениями точек для соединенияПоскольку детали конфигурации платы меняются, я получаю все эти детали от пользователя.Чтобы получить пользовательский ввод, я использую предикат read / 1 в прологе.Но когда я снова пытаюсь записать пользовательский ввод, я вижу, что отсутствуют некоторые круглые скобки, которые для меня важны для дальнейшей обработки.Ниже приведен пример кода, с которым я работал, а также ввод и вывод.

number_link_puzzle(Input):-
read(Input),
write(Input).

Здесь входное значение: 7, 5, (1: (5,2), (4,3)), (2: (3,2), (4,3)).
Обратите внимание на круглые скобки, окружающие (4,3) координаты.Но вывод, который я получаю, когда записываю пользовательский ввод обратно, равен X = (7,5, (1: (5,2), 4,3), 2: (3,2), 4,3).

Где 4,3 не заключены в круглые скобки.Поскольку круглые скобки во входных данных важны для моей дальнейшей обработки в моей программе, я хотел бы знать, почему эти круглые скобки пропущены, или есть ли другая альтернатива, которую я мог бы использовать для достижения этой цели?

Заранее спасибо:)

1 Ответ

0 голосов
/ 07 февраля 2019

Предложение 1: вынудите пользователя написать действительный термин Пролог и запустить программу как запрос с верхнего уровня.Это может выглядеть так:

?- number_link_puzzle(puzzle(7, 5, x(1, 5-2, 4-3), x(2, 3-2, 4-3))).

Я понятия не имею, что это за головоломка (потому что вы не сказали), поэтому я не знаю, является ли это лучшим способом ее написать.Но, по крайней мере, теперь вы можете использовать сопоставление с образцом в голове, чтобы «извлечь» (или, скорее, просто получить доступ) все значения.Заголовок вашего предиката будет выглядеть так:

number_link_puzzle(puzzle(A, B, x(C, D-E, F-G), x(H, I-J, K-L)))

Просто, чтобы поместить здесь некоторый рабочий код, давайте распечатаем все переменные там:

number_link_puzzle(puzzle(A, B, x(C, D-E, F-G), x(H, I-J, K-L))) :-
    format("~w", [[A,B,C,D,E,F,G,H,I,J,K,L]]).

И сзапрос выше, вы получите:

?- number_link_puzzle(puzzle(7, 5, x(1, 5-2, 4-3), x(2, 3-2, 4-3))).
[7,5,1,5,2,4,3,2,3,2,4,3]
true.

Это простой способ решения таких проблем: просто избегайте проблемы.Предложения 2 и 3 связаны с ненужной работой, и я не буду писать полностью рабочий код.

Предложение 2: Вы можете использовать read/1, но измените свое представление так, чтобы оно было действительным термином Prolog.Нет необходимости, потому что это просто обходной способ реализации предложения 1.

Предложение 3: Используйте что-то вроде read_line_to_codes, чтобы прочитать все входные данные в список кодов (или список символов), а затем используйте DCG для его анализа.Это означает, что вы можете придумать любое представление, которое хотите, но вы должны затем проанализировать его, чтобы извлечь из него данные.

Что-то вроде:

puzzle(p(A, B, C, D)) -->
    number(A), ", ",
    number(B), ", ",
    x(C), ", ",
    x(D).

x(x(A, B-C, D-E)) -->
    "(", number(A), ": ",
    pair(B, C), ", ",
    pair(D, E), ")".

pair(A, B) --> "(", number(A), ",", number(B), ")".

Это на самом деле будет работатьесли у вас был SWI-Prolog и вы добавили

:- use_module(library(dcg/basics)).

поверх него.

?- phrase(puzzle(P), `7, 5, (1: (5,2), (4,3)), (2: (3,2), (4,3))`).
P = p(7, 5, x(1, 5-2, 4-3), x(2, 3-2, 4-3)).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...