我希望澄清有关溯因逻辑编程与答案集编程的一些事情。
我和一些同学正在制作一个游戏。在这个游戏中有“英雄”(特殊的NPC)。英雄有目标和行为。
(所有这一切都是故事驱动的) 我希望英雄对玩家或其他英雄的行为做出反应,然后决定接下来要做什么。
一位老师告诉我们一篇名为“角色模型:走向故事生成的戏剧角色的形式模型”的论文,它解释了溯因逻辑编程。通过我的研究,我发现了答案集编程。
问题: ALP 范式和 ASP 范式有区别吗? 对于我的目的来说,一个比另一个更好吗? 还有其他选择吗?
你真的问了三个问题。我没有资格回答其中任何一个,但无论如何我都会尝试一下。
- ALP范式和ASP范式有区别吗?
是的。 ASP 是一种范例,其中您的搜索问题被制作成可以交给不同求解器的模型。 你引用的论文在4.1节中说他们遵循ASP范式并同时使用演绎和溯因推理。因此,您可以看到溯因和演绎在更大的 ASP 流程中充当战术求解器。
根据我在维基百科上读到的内容,这是一个很好的方法,因为溯因推理是提供解释而不是逻辑结果。我可以想象你在故事生成中会多么喜欢这样; “玛丽讨厌苏,因此玛丽杀了苏”是一个推论,但根据我粗略的阅读,“玛丽讨厌苏,因为苏碾压了她的狗”似乎更像是绑架。你会希望两者都能充实一个故事,否则故事会变得相当乏味。
- 对于我的目的来说,一个比另一个更好吗?
您所说的所有目的都是您正在制作游戏。我不是游戏开发者,但我相当有信心向您保证,典型游戏中不会使用类似的内容。游戏AI是它自己的整个领域。如果这些东西被用在大型游戏中,我会感到震惊。
也就是说,RoleModel 表明您可以做到这一点,并且它同时使用这两种方法,并通过 ASP 控制组合的 ALP/DLP 流程。在我看来,两者是相当可分离的,并且由于一个可以使用另一个,所以我猜它们并不是严格对立的。如果它适用于 RoleModel 游戏,那么真正的问题不是它能否完成,这是一个好主意,而是它是否适合您想要实现的目标?如果您正在尝试构建一款动作射击游戏,我敢打赌其他更简单的方法会效果更好;如果你想制作一款丰富的角色扮演游戏,也许就可以了。
- 还有其他选择吗?
也许吧。我会研究游戏的人工智能。优先事项足够不同,我希望他们的文献从完全不同的地方开始,并朝着完全不同的方向发展,但我可能是错的。
仅供参考:正如已经提到的,一些执行归纳和归纳逻辑编程的系统使用 ASP 系统。一个免费的开源示例是 XHAIL https://github.com/stefano-bragaglia/XHAIL
还有一篇论文描述了这个版本:
Bragaglia S., Ray O. (2015) 大型生物网络中的非单调学习。见:Davis J.、Ramon J.(编)归纳逻辑编程。计算机科学讲义,第 9046 卷。Springer,Cham
可以说,夏洛克·福尔摩斯实际上以溯因推理而不是演绎推理而闻名……所以我认为使用 ALP 的侦探游戏有一些有趣的范围。 :)。
任何支持假设推理的逻辑编程都可以支持 ALP。由于ASP支持假设推理,因此它也可以支持ALP。假设推理是暂时假设事实的搜索。
使用标准 ISO 核心 Prolog,我们可以通过以下代码来模拟假设事实。代码留下了一个选择点,如果涉及剪切,则无法正常工作,这就是为什么仍然需要专门的系统的原因:
assumez(P) :- assertz(P).
assumez(P) :- retract(P), fail.
我们现在可以解决以下溯因问题:
abducible :- (assumez(amount(glucose,low));assumez(amount(glucose,medium))),
(assumez(amount(lactose,medium));assumez(amount(lactose,hi))).
feed(lactose) :- amount(glucose,low), amount(lactose,hi).
feed(lactose) :- amount(glucose,medium), amount(lactose,medium).
可能的查询运行如下:
?- abducible, feed(lactose), listing(amount/2).
amount(glucose, low).
amount(lactose, hi).
Yes;
amount(glucose, medium).
amount(lactose, medium).
Yes ;
No
上述解决方案使用了向后链接。还可以提供前向链接解决方案以及更接近 ASP 选择运算符的解决方案。 ASP 中的选择运算符将执行假设的变体,我们仅使用 (;)/2 作为选择运算符:
:- use_module(library(minimal/delta)).
:- multifile abducible/0.
:- dynamic abducible/0, amount/2, feed/1.
:- forward feed/2.
post(amount(glucose,low));post(aamount(glucose,medium)) <= posted(abducible).
post(amount(lactose,medium));post(amount(lactose,hi)) <= posted(abducible).
post(feed(lactose)) <= posted(amount(glucose,low)), posted(amount(lactose,hi)).
post(feed(lactose)) <= posted(amount(glucose,medium)), posted(amount(lactose,medium)).
可能的查询运行如下:
?- post(abducible), feed(lactose), listing(amount/2).
amount(glucose, low).
amount(lactose, hi).
Yes ;
amount(glucose, medium).
amount(lactose, medium).
Yes ;
No