0

如果我们fail在 cut ( ) 之后在谓词中使用!,它仍然会以某种方式找到另一个使用回溯的解决方案,但我认为它不应该。考虑 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,因为正如官方文档中所写,

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

此外,如果我们在 SWI-Prolog 中运行类似的代码,其输出将是1forp :- m(X), !, write(X), fail.1234for p :- m(X), write(X), fail.,正如预期的那样。我错过了什么?

4

0 回答 0