【问题标题】:Prolog - Recursive with factsProlog - 事实递归
【发布时间】:2018-04-18 18:25:20
【问题描述】:

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

代码描述如下:

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。

我尝试过跟踪模式,但这对我没有多大帮助。

谢谢。

【问题讨论】:

    标签: prolog


    【解决方案1】:

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

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

    【讨论】:

    • 解释得很好!!如果我能给你一千个赞,我会的! :)
    • @Vini 我不确定从 Prolog 切换到解释它是否会有所帮助。很高兴它对你有用。
    猜你喜欢
    • 2021-07-20
    • 2017-04-26
    • 2011-12-09
    • 2014-06-16
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多