首页 文章

Prolog递归谓词覆盖返回值

提问于
浏览
0

我有一个递归谓词:

something(A, Object, Value, Complete) :-
     member(Value, Complete), Object = Value.

something(A, Object, _, Complete) :-
    objects(Object),
    \+ member(Object, Complete),
    !,
    <Predicates to get return values>,
    something(A, NewObject, Object, [Object|Complete]).

这个谓词的功能是迭代Object的所有事实,对它运行一些进一步的逻辑处理,然后输出每个Object对象事实的结果 .

我遇到的问题是我得到的所有返回值(按下;)都是第一次迭代,所以这个递归函数为Object返回的第一个值 .

EG:我看到的输出:

Object: obj1
Object: obj1

应该在哪里

Object: obj1
Object: obj2

(与其他变量一起,但是我把它们留下来以保持帖子清洁) .

在SWI Prolog实现中使用可视化调试器后,我可以看到,一旦内部递归调用返回,内部递归的值将丢失,并且's why I'm再次看到 obj1 作为第二个返回值 .

我不太确定如何保存这些内部值,我已经看了很多递归函数的例子,但我似乎无法将这些概念应用于这个特定的实例 .

1 回答

  • 1

    我认为这里存在对变量的简单误解 . Prolog有变量,而不是“assignables” . 两者之间没有区别

    something(A, Object, Value, Complete) :-
        member(Value, Complete), Object = Value.
    

    还有这个:

    something(A, Value, Value, Complete) :-
        member(Value, Complete).
    

    这种自然衍生物就是这一行:

    something(A, NewObject, Object, [Object|Complete]).
    

    与此相同:

    something(A, Object, Object, [Object|Complete]).
    

    这几乎肯定是你看到意外行为的地方 . 如果你的思想拒绝这一点,并且你觉得我的简化版本和代码之间应该存在差异,那么你就误解了变量在Prolog中的工作方式 . 在任何情况下,他们都不能被“覆盖” . 在递归调用中,它们可以以不同方式实例化,但这与任何其他语言中的形式参数没有什么不同 .

相关问题