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