通过部分匹配撤回?

问题描述 投票:0回答:1

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

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).
prolog
1个回答
1
投票

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。现在,如果您愿意,您可以收回它们。

我回答你的问题了吗?

© www.soinside.com 2019 - 2024. All rights reserved.