current_predicate / 1不适用于: - 动态?

时间:2015-12-27 22:49:23

标签: prolog swi-prolog

我有一些谓词,我在Prolog中定义了使用断言。

我正在使用current_predicate/1来了解断言是否已经运行(只需要断言一个值)。

然而,swipl一直在抱怨:

Warning: The predicates below are not defined. If these are defined
Warning: at runtime using assert/1, use :- dynamic Name/Arity.
Warning: 
Warning: amountOfStudentsInCourseAsserted/2, which is referenced by

所以,我添加了:- dynamic amountOfStudentsInCourseAsserted/2,但遗憾的是,这会将谓词添加到current_predicate(Predicate)。因此,如果我使用此动态命名,则不能再使用current_predicate/1

是否有其他谓词如current_predicate/1对于动态名称是否属实?

2 个答案:

答案 0 :(得分:1)

您可以替代使用predicate_property/2内置谓词和number_of_clauses/1属性。

答案 1 :(得分:1)

:- dynamic声明是合适的,因为它会使数据库中的符号已知。然后在断言之前尝试匹配(使用适当的参数,在以下示例中忽略):

...
(  amountOfStudentsInCourseAsserted(_,_)
-> true
;  assert(amountOfStudentsInCourseAsserted(X,Y))
),
...