diff --git a/rules/rules.go b/rules/rules.go index 9a9946d32d3c694753b21bfa27ed8b6081739e2d..d0830b540d4b9f7c95bcac2ba5b8ed9cc79186b0 100644 --- a/rules/rules.go +++ b/rules/rules.go @@ -59,10 +59,10 @@ var ( ratio(X, Y, Ratio) :- ratio(Y, X, Z), Ratio is 1/Z, !. ratio(X, Y, Ratio) :- - ratio(Y, Step, R1), - ratio(Step, Z, R2), + ratio(X, Step, R1), + ratio(Step, Y, R2), + Step =\= X, Step =\= Y, - Step =\= Z, Ratio is R1 * R2, !. convert(GivenQuant, GivenUnit, TargetQuant, TargetUnit) :- @@ -70,7 +70,6 @@ var ( unit_kind(TargetUnit, temperature), rule(GivenQuant, GivenUnit, TargetQuant, TargetUnit). convert(GivenQuant, GivenUnit, TargetQuant, TargetUnit) :- - write("foo"), nl, ratio(GivenUnit, TargetUnit, Ratio), TargetQuant is GivenQuant * Ratio, !. ` diff --git a/rules/source/rules.pdb b/rules/source/rules.pdb new file mode 100644 index 0000000000000000000000000000000000000000..d170af3f9a25c87f90897e81a70211c97114866b --- /dev/null +++ b/rules/source/rules.pdb @@ -0,0 +1,76 @@ +unit_kind(f, temperature). +unit_kind(k, temperature). +unit_kind(c, temperature). +unit_kind(m2, area). +unit_kind(cm2, area). +unit_kind(mm, distance). +unit_kind(cm, distance). +unit_kind(m, distance). +unit_kind(km, distance). +unit_kind(feet, distance). +unit_kind(mg, mass). +unit_kind(g, mass). +unit_kind(kg, mass). +unit_kind(lb, mass). +unit_kind(cup, volume). +unit_kind(litre, volume). +unit_kind(butter, density). +unit_kind(water, density). + +rule(GivenQuant, f, TargetQuant, c) :- + TargetQuant is (GivenQuant - 32) * 5 / 9. +rule(GivenQuant, c, TargetQuant, f) :- + TargetQuant is (GivenQuant / 5 * 9) + 32. +rule(GivenQuant, c, TargetQuant, k) :- + TargetQuant is GivenQuant + 273.15. +rule(GivenQuant, k, TargetQuant, c) :- + TargetQuant is GivenQuant - 273.15. + +rule(GivenQuant, GivenUnit, TargetQuant, TargetUnit) :- + rule(GivenQuant, GivenUnit, X, Y), + rule(X, Y, TargetQuant, TargetUnit). + +rat(m, km, 0.001). +rat(m, cm, 100). +rat(m, mm, 1000). +rat(feet, m, 0.3048). +rat(feet, inches, 12). + +rat(g, mg, 1000). +rat(g, kg, 0.001). + +ratio(X, Y, Ratio) :- + write("simple ratio "), write(X), write(" "), write(Y), nl, + rat(X, Y, Ratio). +ratio(X, Y, Ratio) :- + write("reverse ratio "), write(X), write(" "), write(Y), nl, + rat(Y, X, Z), !, Ratio = 1/Z. +ratio(X, Y, Ratio) :- + write("complex ratio 1 "), write(X), write(" "), write(Y), nl, + X \== Y, + rat(Step, _, _), + Step \== X, + Step \== Y, + write(" trying step "), write(Step), nl, + ratio(X, Step, R1), + ratio(Step, Y, R2), + Ratio = R1 * R2. +ratio(X, Y, Ratio) :- + write("complex ratio 2 "), write(X), write(" "), write(Y), nl, + X \== Y, + rat(_, Step, _), + Step \== X, + Step \== Y, + write(" trying step "), write(Step), nl, + write(" trying step "), write(Step), nl, + ratio(X, Step, R1), + ratio(Step, Y, R2), + Ratio = R1 * R2. + +convert(GivenQuant, GivenUnit, TargetQuant, TargetUnit) :- + unit_kind(GivenUnit, temperature), + unit_kind(TargetUnit, temperature), + rule(GivenQuant, GivenUnit, TargetQuant, TargetUnit). +convert(GivenQuant, GivenUnit, TargetQuant, TargetUnit) :- + ratio(GivenUnit, TargetUnit, Ratio), + TargetQuant is GivenQuant * Ratio.