Пролог Криптарифметическая программа
Я учусь на курсе по программированию, и профессор просто слегка скользит по Прологу из-за нехватки времени. В любом случае, он предложил нам исследовать это самостоятельно. Я сталкивался с Криптарифметической программой, которая должна рассчитывать? AM + PM = ДЕНЬ. Я не знаю, что должно быть добавлено в качестве входных данных в интерпретаторе SWI и что должно быть получено в качестве правильного вывода... Если это имеет смысл?
Я старался...
solve([AM],[PM],[DAY]).
Это ничего не делает. Любая помощь по поводу того, какой будет правильный ввод для AM+PM = DAY или чего-то подобного, была бы отличной! Вот программа, с которой я играл...
solve([A,M,P,D,Y]):-
select(A,[0,1,2,3,4,5,6,7,8,9],WA), % W means Without
not(A=0),
select(M,WA,WMA),
select(P,WMA,WMAP),
not(P=0),
select(D,WMAP,WMAPD),
not(D=0),
select(Y,WMAPD,WMAPDY),
DAY is 100*D+10*A+Y,
AM is 10*A+M,
PM is 10*P+M,
DAY is AM+PM.
Пожалуйста, имейте в виду, что у нас было только два занятия по Прологу, поэтому я почти ничего не знаю!
Скотт
1 ответ
Хорошо, эта программа даст переменное назначение для формулы
DAY = AM + PM
Где каждый из символов является цифрой от 0
в 9
нет, цифра может использоваться дважды и A
,P
а также D
не должно быть 0
(ведущие нули не допускаются).
Для начинающих, пытающихся понять программы на прологе, было бы более целесообразно задать вопрос: "Как это (программа) верна", а не "какой вход генерирует какой выход". Prolog с радостью предоставит вам необходимые переменные настройки, чтобы дать вам true
, (Он также отслеживает путь, по которому он мог пойти другим путем, поэтому можете спросить снова).
Программа использует сопоставление с образцом, но в основном хочет список из пяти элементов, которые представляют переменные A
, M
,P
,D
а также Y
(в этой последовательности).
select
Аргументы:
- что-то (вы можете поместить в список)
- список, который содержит первый аргумент
- список без первого аргумента.
not
пытается решить, что ему дается и терпит неудачу, если это удается.
,
является коротким обводом и, как &&
во многих C-подобных языках.
Последние четыре строки являются простой арифметикой, а строки выше просто гарантируют, что вы не выбираете двойные и ведущие 0
s.
поэтому после загрузки программы вы можете запросить ответы:
?- solve([A, M,P,D,Y]).
A = 2,
M = 5,
P = 9,
D = 1,
Y = 0
Если вы хотите другое решение, вы можете нажать пробел или ;, Если вы хотите знать, есть ли решение с A = 5
, вы можете запросить так:
?- A = 5, solve([A, M,P,D,Y]).
A = 5,
M = 6,
P = 9,
D = 1,
Y = 2
Если вы хотите "собрать" его, эта строка может помочь:
?- solve([A, M,P,D,Y]), format('~w~w~w= ~w~w + ~w~w~n', [D,A,Y,A,M,P,M]).
format
это что-то вроде printf
на многих других языках.