You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. :- use_module(library(apply)).
  2. :- use_module(library(lists)).
  3. % :- use_module(library(tabling)).
  4. % :- table valid_rules/2, op_rule/2.
  5. %%%%%%%%%%%%%%%%%%%%%%%%%%%%
  6. %% DCG parser for equations
  7. %%%%%%%%%%%%%%%%%%%%%%%%%%%%
  8. %% symbols to be mapped
  9. digit(1).
  10. digit(0).
  11. % digits
  12. digits([D]) --> [D], { digit(D) }. % empty list [] is not a digit
  13. digits([D | T]) --> [D], !, digits(T), { digit(D) }.
  14. digits(X):-
  15. phrase(digits(X), X).
  16. % More integrity constraints 1:
  17. % This two clauses forbid the first digit to be 0.
  18. % You may uncomment them to prune the search space
  19. % length(X, L),
  20. % (L > 1 -> X \= [0 | _]; true).
  21. % Equation definition
  22. eq_arg([D]) --> [D], { \+ D == '+', \+ D == '=' }.
  23. eq_arg([D | T]) --> [D], !, eq_arg(T), { \+ D == '+', \+ D == '=' }.
  24. equation(eq(X, Y, Z)) -->
  25. eq_arg(X), [+], eq_arg(Y), [=], eq_arg(Z).
  26. % More integrity constraints 2:
  27. % This clause restricts the length of arguments to be sane,
  28. % You may uncomment them to prune the search space
  29. % { length(X, LX), length(Y, LY), length(Z, LZ),
  30. % LZ =< max(LX, LY) + 1, LZ >= max(LX, LY) }.
  31. parse_eq(List_of_Terms, Eq) :-
  32. phrase(equation(Eq), List_of_Terms).
  33. %%%%%%%%%%%%%%%%%%%%%%
  34. %% Bit-wise operation
  35. %%%%%%%%%%%%%%%%%%%%%%
  36. % Abductive calculation with given pseudo-labels, abduces pseudo-labels as well as operation rules
  37. calc(Rules, Pseudo) :-
  38. calc([], Rules, Pseudo).
  39. calc(Rules0, Rules1, Pseudo) :-
  40. parse_eq(Pseudo, eq(X,Y,Z)),
  41. bitwise_calc(Rules0, Rules1, X, Y, Z).
  42. % Bit-wise calculation that handles carrying
  43. bitwise_calc(Rules, Rules1, X, Y, Z) :-
  44. reverse(X, X1), reverse(Y, Y1), reverse(Z, Z1),
  45. bitwise_calc_r(Rules, Rules1, X1, Y1, Z1),
  46. maplist(digits, [X,Y,Z]).
  47. bitwise_calc_r(Rs, Rs, [], Y, Y).
  48. bitwise_calc_r(Rs, Rs, X, [], X).
  49. bitwise_calc_r(Rules, Rules1, [D1 | X], [D2 | Y], [D3 | Z]) :-
  50. abduce_op_rule(my_op([D1],[D2],Sum), Rules, Rules2),
  51. ((Sum = [D3], Carry = []); (Sum = [C, D3], Carry = [C])),
  52. bitwise_calc_r(Rules2, Rules3, X, Carry, X_carried),
  53. bitwise_calc_r(Rules3, Rules1, X_carried, Y, Z).
  54. %%%%%%%%%%%%%%%%%%%%%%%%%
  55. % Abduce operation rules
  56. %%%%%%%%%%%%%%%%%%%%%%%%%
  57. % Get an existed rule
  58. abduce_op_rule(R, Rules, Rules) :-
  59. member(R, Rules).
  60. % Add a new rule
  61. abduce_op_rule(R, Rules, [R|Rules]) :-
  62. op_rule(R),
  63. valid_rules(Rules, R).
  64. % Integrity Constraints
  65. valid_rules([], _).
  66. valid_rules([my_op([X1],[Y1],_)|Rs], my_op([X],[Y],Z)) :-
  67. op_rule(my_op([X],[Y],Z)),
  68. [X,Y] \= [X1,Y1],
  69. [X,Y] \= [Y1,X1],
  70. valid_rules(Rs, my_op([X],[Y],Z)).
  71. valid_rules([my_op([Y],[X],Z)|Rs], my_op([X],[Y],Z)) :-
  72. X \= Y,
  73. valid_rules(Rs, my_op([X],[Y],Z)).
  74. op_rule(my_op([X],[Y],[Z])) :- digit(X), digit(Y), digit(Z).
  75. op_rule(my_op([X],[Y],[Z1,Z2])) :- digit(X), digit(Y), digits([Z1,Z2]).

An efficient Python toolkit for Abductive Learning (ABL), a novel paradigm that integrates machine learning and logical reasoning in a unified framework.