【发布时间】:2013-02-13 09:25:36
【问题描述】:
假设我有一组文字(例如表示为一个列表)和一个动态指定的谓词,我想要生成一组文字,其中包含所有以前的文字,以及可以通过以下方式扣除的文字将谓词应用于集合。
一个例子,已经定义了谓词
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 更好地定义,通过使用元编程不能处理对象标识下集合中的变量。有什么解决方法吗?
【问题讨论】:
-
您是否要根据谓词
Pred的(动态定义的)推理规则,用Set的完整列表(闭包)填充DeducedSet?在这种情况下,DeducedSet将始终由(初始)列表Set(可能由具有各种函子的项组成)后跟由函子Pred的新项组成的尾部。通过引入累加器参数可能有助于在此类推理规则下找到闭包。 -
是的,但为什么在这种情况下累加器会更有效?
-
我想到的是,累加器可以很容易地构造
DeducedSet,直到无法进行进一步的推断,然后“返回”已经组装的列表。我主要是在问您是否想要“关闭”或只是对您的DeducedSet进行一次修改。 -
我已经了解编程的简单性,我还想找到一个有效的解决方案来找到一个闭包,并可能在 OI 下处理 vars