【问题标题】:Prolog Cryptarithmetic programProlog 密码算术程序
【发布时间】:2014-12-06 23:32:17
【问题描述】:

我正在上一门编程课程,由于时间不够,教授只是略略浏览了 Prolog。不管怎样,他建议我们自己研究一下。我遇到了一个应该计算的密码算术程序?上午 + 下午 = 天。我不知道应该在 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.

请记住,我们在 Prolog 上只有两个课程,所以我几乎一无所知!

斯科特

【问题讨论】:

  • 试试solve(X),它会在长度为5的列表中为您提供AMPDY的可能结果。
  • 好的....所以这给了我这个 X = [2, 5, 9, 1, 0]。那么这到底是什么意思呢?这如何解决 AM + PM = DAY?序言很奇怪!哈哈
  • 试试solve([A, M,P,D,Y]).希望有帮助。如果你说你不明白的事情会更容易。 Prolog 为您提供了一种解决方案,如果您按 space 您将得到其他解决方案。
  • 感谢帕特里克的回复。我想我不明白程序是如何工作的。我想你按照 AM+PM 的方式输入一些东西,它会输出 DAY。我只是不确定程序期望输入什么以及期望的输出是什么?这有意义吗?
  • 嘿,我试着在下面给你一个答案。

标签: prolog cryptarithmetic-puzzle


【解决方案1】:

好的,这个程序会给公式赋值

DAY = AM + PM 

如果每个字符都是从09 的数字,则数字可以使用两次,并且APD 不能是0(不允许使用前导零)。

对于试图理解 prolog 程序的初学者来说,提出以下问题可能更可行:“它(程序)如何正确”,而不是“什么输入产生什么输出”。 Prolog 很乐意为您提供所需的变量设置,为您提供true。 (它还会跟踪它本可以走另一条路的路,所以可以再问一次)。

该程序使用模式匹配,但基本上需要一个包含五个元素的列表,这些元素代表变量 AMPDY(按此顺序)。

select 的参数是:

  1. 东西(你可以列个清单)
  2. 包含第一个参数的列表
  3. 没有第一个参数的列表。

not 尝试解决给出的问题,如果成功则失败。

, 是一个简短的电路,就像许多类似 C 语言中的&&

最后四行是简单的算术运算,而上面的行只是确保您没有选择双精度数和前导 0s。

所以在你加载你的程序之后,你可以查询答案:

?- solve([A, M,P,D,Y]).
A = 2,
M = 5,
P = 9,
D = 1,
Y = 0 

如果您想要其他解决方案,您可以点击 space;。想知道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

【讨论】:

  • 回答了我的问题,帕特里克!感谢您的耐心和解释!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-09
  • 1970-01-01
  • 1970-01-01
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多