prolog 中的剪切位置如何影响输出?

问题描述 投票:0回答:1

我对剪切的位置很困惑。不确定它们如何影响输出。以下位置的各个切口有什么区别?

subset([], _) :- ![1].
subset([H|T], S) :- ![2], member(H, S), ![3], subset(T, S), ![4].

您能用简单的英语解释一下吗?每个位置如何影响输出?

prolog prolog-cut
1个回答
0
投票

这是一个理论性很强的解释,因为我试图清晰简洁地解释:

Prolog 按照标准语言以及我们直观的假设,从上到下,然后从左到右执行程序。执行顺序是完全可预测的(否则不可能编写可靠的程序)。

随着代码执行的进行,Prolog 选择第一个以前未尝试过的可用选项,但会记下当时可用的替代代码路径以供尝试(“选择点”),以便触发回溯。

剪切将删除同一谓词内的那些选择点,即相同谓词名称和谓词数量的组合。 Arity 只是谓词的head 中参数的数量。之前遇到的所有其他选择点将保留为有效选择点。

执行剪切后,该谓词中的唯一路径是前向。 回溯仍然可以到达先前遇到的不同谓词中的选择点。

谓词可以包含零次、一次或多次切割。

两个立即连续的剪切是有效的代码,但毫无意义,因为中间不会遇到可供第二次剪切删除的选择点。

Prolog 中的隐式程序流程可以通过使用例如

trace
gtrace
- Prolog 程序可以调试

© www.soinside.com 2019 - 2024. All rights reserved.