Prolog中的算术运算

时间:2019-02-15 16:49:43

标签: math prolog puzzle arithmetic-expressions

如何使用7 10 3 2而不使用括号来获得28?我一直在思考过去的1 1/2小时,但我什么都没得到。

2 个答案:

答案 0 :(得分:2)

只需一步一步地完成,将不断变化的状态传递下去。

step(S,A,X, S2,A2) :-
   (  S = [+ | S2], A2 is A + X
   ;  S = [- | S2], A2 is A - X
   ;  S = [* | S2], A2 is A * X
   ;  S = [/ | S2], A2 is A div X 
   ).

puzzle(S) :- 
   step(S,  7, 10,  S2, A2),
   step(S2, A2, 3,  S3, A3),
   step(S3, A3, 2,  [], 28).

尝试:

?- puzzle(X).
X = [+,-,*] ;
false.

答案 1 :(得分:2)

此答案基于@WillNess的上一个答案,试图使其更简单:

x_y_xy(A, B, A + B).
x_y_xy(A, B, A - B).
x_y_xy(A, B, A * B).
x_y_xy(A, B, A div B).

puzzle(C) :- 
   x_y_xy(7, 10, A),
   x_y_xy(A, 3,  B),
   x_y_xy(B, 2,  C).

样品使用:

?- puzzle(Expr), Expr =:= 28.
Expr = (7+10-3)*2 ;
false.