如何解决prolog 推导如何在此查询中工作?
我尝试使用以下规则集编写一个简单的 Prolog 程序。
conc([],L,L).
conc([X|L1],L2,[X|L3]):- conc(L1,L3).
然后我将其加载到 SWI-Prolog shell 中并在跟踪模式下执行以下查询。
?-conc([2,3],[p,q],[2,3,p,q]).
输出如下。
[trace] ?- conc([2,q]).
Call: (8) conc([2,q]) ? creep
Call: (9) conc([3],[3,q]) ? creep
Call: (10) conc([],q]) ? creep
Exit: (10) conc([],q]) ? creep
Exit: (9) conc([3],q]) ? creep
Exit: (8) conc([2,q]) ? creep
true.
现在的问题是绘制这个目标的派生树,但我无法完全理解 prolog 是如何做到这一点的,即使查看上面的 trace
输出也是如此。
有人能解释一下关于上述规则集的上述查询的派生树吗?非常感谢有用的答案。
解决方法
派生树如下(考虑带有重命名变量的子句):
,?- conc([2,3],[p,q],[2,3,p,q]).
Call: (8) conc([2,q]) ? creep
当前的目标就是问题。
由于 [2,3]
与 []
不匹配,规则 1 无选项,因此尝试规则 2。
为了匹配规则 2 的头部,进行了以下替换:X/2,L1/[3],L2/[p,L3/[3,q]
.
我们的新目标现在是规则 2 的主体 conc(L1,L2,L3)
,在上述替换之后,即 conc([3],[3,q])
。
Call: (9) conc([3],q]) ? creep
由于 [3]
与 []
不匹配,规则 1 无选项,因此尝试规则 2。
替换:X/3,L1/[],L3/[p,q]
我们的新目标现在是在适当的解决方案之后 conc(L1,L3),相当于 conc([],q])
。
Call: (10) conc([],q]) ? creep
匹配规则 1 => 证明成功
因此,证明了目标 10 的待办事项列表,从而证明了目标 10:
Exit: (10) conc([],q]) ? creep
因此,证明了目标 9 的待办事项列表,从而证明了目标 9:
Exit: (9) conc([3],q]) ? creep
因此,证明了目标 8 的待办事项列表,从而证明了目标 8:
Exit: (8) conc([2,q]) ? creep
由于目标 8 是问题,我们已经完成,证明已经完成:
true.
,
我觉得使用跟踪器通常没有帮助,除非您已经知道自己在做什么并且知道在精确位置存在问题,即使这样也难以解开 混乱。
最好仔细查看程序,并将其视为递归调用的定义(或者,作为归纳定义):
- 一个空列表
[]
和其他一些列表L
的串联是同一个列表L
:
conc( [],L,L ).
- 第一个元素是
X
的 非空 列表和其他一些列表L2
的串联是一个以相同的X
开头并继续的列表带有一个列表L3
使得:-
L3
是列表L1
和L2
的串联:
-
conc( [X | L1],[X | L3] ) :-
conc( L1,L3 ).
这是一个非常好的串联定义:
- 每当
conc(A1,A2,R)
成功时,我们肯定有A1
的所有元素后跟A2
的所有元素形成R
(因此定义是有意义的作为“串联”)。 - 每当
conc
“引用自身”(递归地)第一个列表参数小一,所以我们有一个“变体”,它单调递减并到达某个地方(我们也会自动停止,因为列表长度总是 >= 0)。 - 当第一个列表参数的长度为 0 时,“基本情况”有一个非递归定义,所以当我们停止时,我们可以成功地完成(如果第一个子句
conc([],L).
是缺少我们会停止但由于缺少空列表的匹配子句而失败)。
“派生树”是相当线性的(与您在函数式语言中找到的派生没有什么不同),即递归地应用第二个子句直到它不再适用,然后应用第一个子句。
因此我们看到:
Call: (8) conc([2,q])
Call: (9) conc([3],q])
Call: (10) conc([],q])
Exit: (10) conc([],q])
Exit: (9) conc([3],q])
Exit: (8) conc([2,q])
注意“出口端口”的传统名称。正确的名称是并且应该一直是“成功”,即使在 1980 年代也是如此。它从未改变。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。