Task is to write a program that can decide whether two words are synonyms or not.
I have pairs of synonymous words, E.g.:
[big large]
[large huge]
[small little]
We can derive the synonymous relationship indirectly: if big is a synonym for large and large is a synonym for huge then big is a synonym for huge.
Being synonyms doesn’t depend on order, e.g. if big is a synonym for large then large is a synonym for big.
The program has to answer whether given two words are synonyms or not.
This seems to me as a good candidate for logic programming, e.g. with clojure.core.logic.
a. How to state the input pairs of synonyms as logical statements/constraints?
b. How to perform a query to find all synonyms of a given word?
Or perhaps I am yack shaving? What would be a simpler way to solve this?
In general, this just looks like you are interested in the transitive closure (of a graph)?
For undirected graphs ("Being synonyms doesn’t depend on order"), this is related to Connected Components (and here we directly see some logic-relation as 2-SAT algorithms also exploit connected components).
Maybe see also: Algowiki
Basically:
Or without preprocessing: just look for a path on-demand: