我有一些谓词,我在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
对于动态名称是否属实?
答案 0 :(得分:1)
您可以替代使用predicate_property/2
内置谓词和number_of_clauses/1
属性。
答案 1 :(得分:1)
:- dynamic
声明是合适的,因为它会使数据库中的符号已知。然后在断言之前尝试匹配(使用适当的参数,在以下示例中忽略):
...
( amountOfStudentsInCourseAsserted(_,_)
-> true
; assert(amountOfStudentsInCourseAsserted(X,Y))
),
...