如果您将状态事实绘制为节点和边的图。
现在查询请求从 1 到 9 的路径,结果是从 1 到 9 的边列表。它们是绿色的。边是 f,o,r,t。
有时尝试以 Prolog 的方式理解问题比尝试以不同的方式理解问题更难。正如我经常注意到的,当遇到困难时,一个通常有帮助的选择是拿出笔和纸。
在递归调用之前,它是否会与所有可能的统一
Y2 的值?
没有。 Prolog 按照它们的写入顺序统一谓词/事实,然后在失败时回溯到下一个。所以 state(2,o,3) 首先尝试并成功,然后打印答案。然后因为state(2,_,_) 有一个选择点,然后选择state(2,l,4)。但是,这最终会失败,因此不包含在单独的答案中。
TL;DR
我使用 graphviz dot 和文件构建了图表
so_question_07.gv
digraph so_question_07 {
node_01 [label="1", color="green", fontcolor="green"];
node_02 [label="2", color="green", fontcolor="green"];
node_03 [label="3", color="green", fontcolor="green"];
node_04 [label="4"];
node_05 [label="5"];
node_06 [label="6", color="green", fontcolor="green"];
node_07 [label="7"];
node_08 [label="8"];
node_09 [label="9", color="green", fontcolor="green"];
node_10 [label="10"];
node_11 [label="11"];
node_12 [label="12"];
node_13 [label="13"];
color=black;
node_01 -> node_02 [label="f",shape=oval, color="green", fontcolor="green"];
node_02 -> node_03 [label="o",shape=oval, color="green", fontcolor="green"];
node_02 -> node_04 [label="l",shape=oval];
node_03 -> node_05 [label="n",shape=oval];
node_03 -> node_06 [label="r",shape=oval, color="green", fontcolor="green"];
node_04 -> node_07 [label="o",shape=oval];
node_05 -> node_08 [label="d",shape=oval];
node_06 -> node_09 [label="t",shape=oval, color="green", fontcolor="green"];
node_06 -> node_10 [label="m",shape=oval];
node_07 -> node_11 [label="u",shape=oval];
node_08 -> node_12 [label="u",shape=oval];
node_10 -> node_13 [label="e",shape=oval];
}
这是一个简单的批处理文件,用于将 gv 文件转换为 svg
SET PATH="C:\Program Files (x86)\Graphviz2.38\bin";PATH=%PATH%
dot -Tsvg so_question_07.gv -o so_question_07.svg