通过部分匹配收回?

Retract by partial match?

有没有办法通过部分匹配来收回所有子句..假设我有以下语法:

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。现在您可以根据需要收回它们。

我回答你的问题了吗?