Prolog - 递归事实

时间:2018-04-18 18:25:20

标签: prolog

首先,我想提一下,这个问题是在之前的考试中提出的,但我不太明白答案。我只需要有人来解释一下。

代码描述如下:

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。

我已尝试过跟踪模式,但这对我没什么帮助。

感谢。

1 个答案:

答案 0 :(得分:2)

如果您将状态事实绘制为节点和边缘的图形。

enter image description here

现在查询要求从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