为什么Cut不会阻止Visual Prolog查找其他解决方案

时间:2020-05-31 15:20:59

标签: prolog prolog-cut

如果我们在剪切(fail)之后的谓词中使用!,它仍然会通过回溯找到某种溶剂,但我认为不应该。 考虑下Visual Prolog中的下一个示例

implement main
    open core, stdio

class facts
    m : (integer M).

clauses
    m(1).
    m(2).
    m(3).
    m(4).

class predicates
    p : () failure.
clauses
    p() :-
        m(X),
        !,
        write(X),
        nl,
        fail.

clauses
    run() :-
        p().
    run().

end implement main

goal
    console::runUtf8(main::run).

其输出为

1
2
3
4

但是,我只希望1,因为正如official doc所写,

剪切“!”删除从当前谓词进入以来创建的所有回溯点,这意味着所有后续子句的回溯点,以及当前子句中在“!”之前的谓词调用中的回溯点。

此外,如果我们在SWI-Prolog中运行类似的代码,则按预期,其输出将为1的{​​{1}}和p :- m(X), !, write(X), fail.的{​​{1}}。我想念什么?

0 个答案:

没有答案