Math prolog中的算术运算

Math prolog中的算术运算,math,prolog,arithmetic-expressions,Math,Prolog,Arithmetic Expressions,以这种顺序使用7 10 3 2,而不使用括号,怎么可能获得28?我在过去的1 1/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)

以这种顺序使用7 10 3 2,而不使用括号,怎么可能获得28?我在过去的1 1/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.

只要一步一步地做,把不断变化的状态传递下去

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.

这个答案建立在@williness的前一个答案的基础上,试图让它更简单:

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.

这个答案建立在@williness的前一个答案的基础上,试图让它更简单:

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.

欢迎来到SO。你能发布你尝试过的东西并解释为什么它不起作用吗?请把这变成一个编程问题。目前,它给人的印象是一个数学难题的副本,带有一个随机编程语言的纯粹偶然标记。@sutrivmz:28是*7+10-3,2。。我用了括号,但没有算术意义。Gubro你为什么不考虑这个答案?请定义允许的操作。欢迎这样做。你能发布你尝试过的东西并解释为什么它不起作用吗?请把这变成一个编程问题。目前,它给人的印象是一个数学难题的副本,带有一个随机编程语言的纯粹偶然标记。@sutrivmz:28是*7+10-3,2。。嗯,我用了括号,但不是算术意义。@ Gubro为什么不考虑这个答案?请定义允许的操作。