Арифметические операции в прологе - PullRequest
0 голосов
/ 15 февраля 2019

Как можно получить 28, используя 7 10 3 2 в этом порядке и без использования скобок? Я размышлял последние полтора часа, и я не мог никуда добраться.

Ответы [ 2 ]

0 голосов
/ 15 февраля 2019

Этот ответ основан на предыдущем ответе @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.
0 голосов
/ 15 февраля 2019

Просто делайте это шаг за шагом, передавая изменяющееся состояние.

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.
...