Unverified Commit f29ea787 authored by Kevin Lyda's avatar Kevin Lyda
Browse files

Debugged with SWI prolog.

parent 75ef492a
Loading
Loading
Loading
Loading
+3 −4
Original line number Diff line number Diff line
@@ -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, !.
`

rules/source/rules.pdb

0 → 100644
+76 −0
Original line number Diff line number Diff line
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.