“Good at what?” A small lesson in not over-generalising.
good-cobbler.pl · output · proof · check · try it in the playground
Joe is a good cobbler. Does that make Joe a good person? Not necessarily. “Good” here describes how he does his trade, not him in general.
Philosophers use this example to show that some words only make sense together with the word they describe.
Given short descriptions of three people, what can we safely conclude?
Each person comes with a description, kept as a short list of words:
description(joe, [good, cobbler]).
description(jane, [good, carpenter]).
description(sam, [novice, cobbler]).
good_at(Person, Trade) :+ description(Person, [good, Trade]).
classified_as(Person, Trade) :+ description(Person, [good, Trade]).
The rules only fire on the pattern [good, Trade], and they tie “good” to
that trade. There is deliberately no rule that says someone is simply
good.
good_at(joe, cobbler).
good_at(jane, carpenter).
classified_as(joe, cobbler).
classified_as(jane, carpenter).
Each conclusion traces back to one description:
good_at rule, with Person = joe,
Trade = cobbler, because of the fact description(joe, [good, cobbler]).classified_as rule, from the
same fact.Six steps in all: four conclusions and the two facts they rest on.
A separate checker read the proof against the program and confirmed that:
Verdict: checked. All 6 steps verified, nothing taken on trust.
node bin/eyedia.js examples/good-cobbler.pl
node bin/eyedia.js --proof examples/good-cobbler.pl
Or open it in the playground.
Add description(ann, [good, baker]). and run again: Ann is now good at
baking and classified as a baker, with her own proof.
What a computer concludes depends on exactly how the knowledge is written. Keeping “good” attached to the trade stops the program from claiming more than the facts say, and the proof shows it never did.