From f29ea787545923815be1847d79eb2b35c2ee4690 Mon Sep 17 00:00:00 2001 From: Kevin Lyda <kevin@lyda.ie> Date: Sat, 15 Jun 2024 19:29:10 +0100 Subject: [PATCH] Debugged with SWI prolog. --- rules/rules.go | 7 ++-- rules/source/rules.pdb | 76 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 79 insertions(+), 4 deletions(-) create mode 100644 rules/source/rules.pdb diff --git a/rules/rules.go b/rules/rules.go index 9a9946d..d0830b5 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 0000000..d170af3 --- /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. -- GitLab