有没有办法通过部分匹配来撤回子句..假设我有以下语法:
s3-->[a, b, r, a].
s4-->[a, b].
s5-->s4, s4.
如何删除所有以 's' 开头的子句?
exists(Prefix, Max, X) :- between(1,Max,I), atom_concat(Prefix,I,X),current_predicate(X/2).
exists(X) :- exists('s', 10, X).
clean :- findall(X,(exists(X), abolish(X/2)), R).
Sten,您正在寻找谓词来回溯所有谓词,并对其名称进行约束。在 swi_prolog 中,它是 current_predicate 系列。
look_for_s_predicates :-
current_predicate(PredicateName, P),
atom_chars(PredicateName, [s|_]),
\+ predicate_property(P, built_in), /*ignore built-ins*/
write(PredicateName), nl, fail.
look_for_s_predicates.
编辑:在 current_predicate 中添加 P 以允许忽略以 's' 开头的内置谓词。
在上面的示例中,我将谓词限制为以 s 开头的谓词。所以如果我定义了
s1(a,b,c) :- test(a,b).
s2(a,b,c).
test(a,b).
look_for_s_predicates/0 将列出 s1 和 s2。现在,如果您愿意,您可以收回它们。
我回答你的问题了吗?