假设我有一组文字(例如表示为一个列表)和一个动态指定的谓词,我想要的是生成一组文字,其中包含所有以前的文字以及可以通过应用谓词扣除的文字到集合。
一个例子,已经定义了谓词
pred(A, B) :- base(A, B).
pred(A, C) :- base(A, B), pred(B, C).
并假设谓词有这样的签名
deduce_set(+Set, +Pred, ?DeducedSet)
以下陈述成立(为真):
deduce_set([base(a,b), base(a,c), base(b,d), base(d, e)],
pred/2,
[base(a,b), base(a,c), base(b,d), base(d,e), pred(a,d), pred(a,e), pred(b,e)]
).
最有效和最通用的方法是什么?我一直在考虑类似的事情:
- 断言 Set 中的所有文字
- 调用 Pred
- 如果它成功断言它的头
- 收集结果集中所有断言的事实并放入列表中
没有更好的方法吗?
更新这个解决方案,由 CapelliC 更好地定义,通过使用元编程不能处理对象标识下集合中的变量。有什么解决方法吗?