You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Clingo初学者求助:合并OR规则及通配符匹配问题

Clingo合并OR条件规则及模糊匹配实现方案

一、合并OR条件规则

你可以利用Clingo规则体中的**分号(;)**表示逻辑OR,将两条规则合并为单一规则,同时简化匹配逻辑:

activity("Not", "unknown", "910-248-4781", "2022-12-01", "12:16", "Login", "burner").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "12:19", "Created My Burner number", "unknown").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:28", "Received Picture", "OG use of Cookies").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:30", "Saved Picture", "OG use of Cookies").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:31", "Sent Message", "burner").

% 合并规则:匹配App或Content字段含"burner"的记录
contains_burner(App, ContactID, PhoneNumber, Date, Time, Action, Content) :- 
    activity(App, ContactID, PhoneNumber, Date, Time, Action, Content),
    (contains_word_burner(Content); contains_word_burner(App)).

% 简化匹配值定义
contains_word_burner("burner").
contains_word_burner("Burner").

#show contains_burner/7.

规则体中的(A; B)表示逻辑OR,只要contains_word_burner(Content)或contains_word_burner(App)任一条件满足,规则就会触发。

二、模糊匹配(子串检查)实现

Clingo核心ASP语法无内置模糊匹配功能,但可通过两种方式实现:

1. 纯ASP子串检查

通过拆分字符串为字符序列,利用append谓词检查目标子串是否存在:

activity("Not", "unknown", "910-248-4781", "2022-12-01", "12:16", "Login", "burner").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "12:19", "Created My Burner number", "unknown").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:28", "Received Picture", "OG use of Cookies").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:30", "Saved Picture", "OG use of Cookies").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:31", "Sent Message", "burner").

% 辅助谓词:拆分字符串为字符列表
split_str("", []).
split_str(S, [C|Cs]) :- 
    S = C ++ Rest,
    split_str(Rest, Cs).

% 检查字符串是否包含"burner"子串(大小写兼容)
contains_substr_burner(S) :-
    split_str(S, Chars),
    append(_, ['b','u','r','n','e','r'|_], Chars).
contains_substr_burner(S) :-
    split_str(S, Chars),
    append(_, ['B','u','r','n','e','r'|_], Chars).

% 模糊匹配规则
contains_burner(App, ContactID, PhoneNumber, Date, Time, Action, Content) :- 
    activity(App, ContactID, PhoneNumber, Date, Time, Action, Content),
    (contains_substr_burner(Content); contains_substr_burner(App)).

#show contains_burner/7.

该方法通过字符序列检查实现子串匹配,适合简单场景,复杂模式需额外处理。

2. 利用Clingo Lua扩展(高效方案)

调用Lua字符串函数直接做子串检查,效率更高:

activity("Not", "unknown", "910-248-4781", "2022-12-01", "12:16", "Login", "burner").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "12:19", "Created My Burner number", "unknown").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:28", "Received Picture", "OG use of Cookies").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:30", "Saved Picture", "OG use of Cookies").
activity("Burner", "unknown", "910-248-4781", "2022-12-01", "13:31", "Sent Message", "burner").

% 加载Lua扩展脚本
#script(lua)
function contains_burner(s)
    -- 检查是否包含"burner"或"Burner"子串
    return string.find(s, "burner", 1, true) ~= nil or string.find(s, "Burner", 1, true) ~= nil
end
#end.

% 调用Lua函数的匹配规则
contains_burner(App, ContactID, PhoneNumber, Date, Time, Action, Content) :- 
    activity(App, ContactID, PhoneNumber, Date, Time, Action, Content),
    lua_contains_burner(Content);
    activity(App, ContactID, PhoneNumber, Date, Time, Action, Content),
    lua_contains_burner(App).

% 声明外部Lua谓词
#external lua_contains_burner(S) :- lua("contains_burner(S)").

#show contains_burner/7.

该方案依赖Clingo的Lua扩展支持,适合复杂字符串匹配需求。

内容的提问来源于stack exchange,提问作者James Simmons

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 00:56:25