$
\newcommand{\cansay}[2]{#1\text{ can say }\unicode{0x2018}#2\unicode{0x2019}}
\newcommand{\says}[2]{#1\text{ says }\unicode{0x2018}#2\unicode{0x2019}}
$Here is a way to construct a solution to this puzzle, and many like it.
We want to know whether some specific $\;P\;$ (e.g., "Does this path lead to the ruins?") is true, from the answer $\;a\;$ ($\;\text{true}\;$ for yes, $\;\text{false}\;$ for no) to a question $\;q\;$.
Formally, for some specific villager $\;x\;$, we are asked to find a $\;q\;$ that makes
$$
(0) \;\;\; \says x {q \equiv a} \;\Rightarrow\; (P \equiv a)
$$
true for all $\;a\;$. And we are given that
\begin{align}
(1) \;\;\; & \says x P \;\Rightarrow\; \cansay x P \\
(2) \;\;\; & \cansay x P \;\equiv\; T(x) \equiv P \\
\end{align}
where $\;T(x)\;$ means that $\;x\;$ is a truth-teller.
(Note that in $(2)$ I use the fact that $\;\equiv\;$ is associative, so that I can leave out the parentheses.)
With the above, we can calculate
\begin{align}
& \says x {q \equiv a} \;\Rightarrow\; (P \equiv a) \;\;\;\;\;\text{-- $(0)$} \\
\Leftarrow & \;\;\;\;\;\text{"by $(1)$ -- the only thing we know about $\;\says{\cdot}{\ldots}\;$"} \\
& \cansay x {q \equiv a} \;\Rightarrow\; (P \equiv a) \\
= & \;\;\;\;\;\text{"by $(2)$ -- the only other thing we know about $\;\cansay{\cdot}{\ldots}\;$"} \\
& (T(x) \equiv q \equiv a) \;\Rightarrow\; (P \equiv a) \\
\Leftarrow & \;\;\;\;\;\text{"weaken -- the only way forward, as far as I can see"} \\
& T(x) \equiv q \equiv a \equiv P \equiv a \\
= & \;\;\;\;\;\text{"reorder using symmetry of $\;\equiv\;$; simplify"} \\
& q \;\equiv\; T(x) \equiv P \\
= & \;\;\;\;\;\text{"by $(2)$ -- to turn $\;q\;$ in to a real question"} \\
& q \;\equiv\; \cansay x P \\
\end{align}
So we ask the villager, "Can you say that this path leads to the ruins?" An answer of "yes" means it does lead there, an answer of "no" means it doesn't.