有没有办法通过部分匹配来收回子句。假设我有以下语法:
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).
发布于 2020-12-08 12:59:05
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).
查找_s_谓词/0将列出s1和s2。如果你愿意,现在你可以收回它们。
我回答你的问题了吗?
https://stackoverflow.com/questions/65172748
复制相似问题