fork download
  1.  
  2. :- op(100, yfx, '@').
  3.  
  4. reduction(if @ A @ B @ C, Y) :- !,
  5. reduction(A, X),
  6. (X == 0 ->
  7. reduction(C, Y) ;
  8. reduction(B, Y)).
  9.  
  10. reduction(A @ B, Y) :- !,
  11. reduction(A, P),
  12. reduction(B, Q),
  13. copy_term(P, z(Q, X)), reduction(X, Y).
  14.  
  15. reduction(z(X,Y), z(X,Y)) :- !.
  16.  
  17. reduction(A * B, C) :- !,
  18. reduction(A, A2),
  19. reduction(B, B2),
  20. C is A2 * B2.
  21.  
  22. reduction(A - B, C) :- !,
  23. reduction(A, A2),
  24. reduction(B, B2),
  25. C is A2 - B2.
  26.  
  27. reduction(X, X) :- integer(X), !.
  28. reduction(X, X) :- write('cannot reduction' :- X), nl, halt.
  29.  
  30. ?-
  31. Y = z(F, z(X, F @ z(V, X @ X @ V)) @ z(X, F @ z(V, X @ X @ V))),
  32. reduction(Y @ z(H, z(N, if @ N @ (H @ (N - 1) * N) @ 1)) @ 7, Result),
  33. write(Result), nl,
  34.  
  35.  
Success #stdin #stdout 0.02s 6160KB
stdin
Standard input is empty
stdout
5040