Пролог Криптарифметическая программа

Я учусь на курсе по программированию, и профессор просто слегка скользит по Прологу из-за нехватки времени. В любом случае, он предложил нам исследовать это самостоятельно. Я сталкивался с Криптарифметической программой, которая должна рассчитывать? 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Аргументы:

  1. что-то (вы можете поместить в список)
  2. список, который содержит первый аргумент
  3. список без первого аргумента.

not пытается решить, что ему дается и терпит неудачу, если это удается.

, является коротким обводом и, как && во многих C-подобных языках.

Последние четыре строки являются простой арифметикой, а строки выше просто гарантируют, что вы не выбираете двойные и ведущие 0s.

поэтому после загрузки программы вы можете запросить ответы:

?- 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 на многих других языках.

Другие вопросы по тегам