Предложение 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)).