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

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

Пожалуйста, имейте в виду, что у нас было только два класса по Прологу, так что я почти ничего не знаю!

Скотт


person NoobCoderChick    schedule 06.12.2014    source источник
comment
попробуйте solve(X), это даст вам возможные результаты для A, M, P, D и Y в списке длиной 5.   -  person Patrick J. S.    schedule 07.12.2014
comment
Хорошо... так что это дало мне это X = [2, 5, 9, 1, 0]. Так что же это значит? Как это решает AM + PM = DAY? Пролог странный! ха-ха   -  person NoobCoderChick    schedule 07.12.2014
comment
попробуйте solve([A, M,P,D,Y]). надеюсь, что это поможет. Было бы проще, если бы вы сказали то, чего не понимаете. Prolog дает вам одно решение проблемы, если вы нажмете ‹kbd›пробел‹/kbd›, вы получите другие.   -  person Patrick J. S.    schedule 07.12.2014
comment
Спасибо за ответ Патрик. Кажется, я не понимаю, как работает программа. Я полагал, что вы вводите что-то вроде AM + PM, и это выводит DAY. Я просто не уверен, что программа ожидает на входе и каким будет желаемый результат? Имеет ли это смысл?   -  person NoobCoderChick    schedule 07.12.2014
comment
Эй, я попытался дать вам ответ ниже.   -  person Patrick J. S.    schedule 07.12.2014


Ответы (1)


Хорошо, эта программа даст присваивание переменной формуле

DAY = AM + PM 

Если каждый из символов является цифрой от 0 до 9 no, цифра может использоваться дважды, а A, P и D не должны быть 0 (начальные нули не допускаются).

Для начинающих, пытающихся понять программы на прологе, может быть более целесообразно задать вопрос: «Как это (программа) истинна», а не «какой ввод генерирует какой вывод». Prolog с радостью предоставит вам настройки переменных, необходимые для создания true. (Он также отслеживает в пути, где он мог пойти другим путем, так что можете переспросить).

Программа использует сопоставление с образцом, но в основном ей нужен список из пяти элементов, представляющих переменные A, M, P, D и Y (именно в таком порядке).

Аргументы select:

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

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

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

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

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

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

person Patrick J. S.    schedule 07.12.2014
comment
Вот и ответил на мои вопросы Патрик! Спасибо за терпение и объяснение!! - person NoobCoderChick; 07.12.2014