首先,我想提一下,这个问题是在之前的考试中提出的,但我不太明白答案。我只需要有人来解释一下。
代码描述如下:
state( 1, f, 2 ).
state( 2, o, 3 ).
state( 2, l, 4 ).
state( 3, n, 5 ).
state( 3, r, 6 ).
state( 4, o, 7 ).
state( 5, d, 8 ).
state( 6, t, 9 ).
state( 6, m, 10 ).
state( 7, u, 11 ).
state( 8, u, 12 ).
state( 10, e, 13 ).
find_( Y1, [ L | ES ], X ) :-
state( Y1, L, Y2 ),
find_( Y2, ES, X ).
find_( Y, [], Y ).
我们打电话给find_(1, Z, 9)
答案为Z = [f,o,r,t]
。
在递归调用之前,是否会统一Y2
的所有可能值?如果是这样,为什么答案不包括state( 2, l, 4)
的第二次统一中的l。
我已尝试过跟踪模式,但这对我没什么帮助。
感谢。
答案 0 :(得分:2)
如果您将状态事实绘制为节点和边缘的图形。
现在查询要求从1到9的路径,结果是从1到9的边的列表。它们显示为绿色。边缘是f,o,r,t。
有时试图理解问题,因为Prolog比以不同方式理解问题更难。正如我经常注意到的那样,一个通常有用的选择就是拿出笔和纸。
在递归调用之前,它是否会与所有可能的统一 Y2的价值?
没有。 Prolog按照它们编写的顺序统一谓词/事实,然后在失败时回溯到下一个。因此首先尝试state(2,o,3)
并成功打印答案。然后,因为state(2,_,_)
有一个选择点,然后选择state(2,l,4)
。然而,这最终失败了,因此不作为单独的答案包括在内。
TL; DR
构建了图表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