首页 > 解决方案 > 具有递增分量的动态 Prolog 谓词

问题描述

我有一个由一组规则组成的知识库,当某些条件发生时,每个规则的头部都会执行复杂术语的断言或撤回。

我怎样才能确保Id每增加一次 assert(term(Id,A,B,C))

标签: prologglobal-variablesswi-prologprolog-assert

解决方案


当您为term/3第一个参数是唯一(整数)标识符的谓词断言子句时,不需要辅助动态谓词来表示当前计数器。你可以简单地做:

:- dynamic(term/3).

assert_term(A, B, C) :-
    (   term(Id, _, _, _) ->
        NextId is Id + 1
    ;   NextId is 1
    ),
    asserta(term(NextId, A, B, C)).

调用asserta/1将使最新的断言子句term/3在调用时成为第一个被检索的子句,如上所述,所有参数都未绑定,从而提供对最后计数的访问。然而,该解决方案假定条款没有被任意撤回。


推荐阅读