1

我正在上一门编程课程,由于时间不够,教授只是略略浏览了 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 上只有两节课,所以我几乎一无所知!

斯科特

4

1 回答 1

2

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

DAY = AM + PM 

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

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

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

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

于 2014-12-07T03:46:34.920 回答