逻辑编程新手(Prolog)。遇到一个简单的问题,但不知道如何用prolog编码。
问题就像你有几个论据:参数(A),参数( b) ...,和几个攻击关系,比如attack(a,b ),这意味着参数a攻击参数b,所以给定一个参数,我想知道它是否是一个有根据的参数。对于一个参数a来说,“接地”意味着如果b攻击a,那么存在另一个参数,比如c攻击b。如果没有参数攻击c,那么我们说a和c是接地的。
你能举例说明如何实现这个扎根/1计划来实现这一目标吗?
不确定我是否clear....But欢迎给出任何建议(或代码)!!
发布于 2013-02-08 22:25:23
从你的解释中我所理解的是,当没有其他根深蒂固的论点攻击它时,一个论点就是有根据的。
您可以在prolog中直接定义一个遵循此规则的过程grounded/1:
grounded(A):-
argument(A), % A is an argument
\+ % for which there does not exist
(
attack(B, A), % an attacker
grounded(B) % which is grounded
).由OP在评论后编辑:如果你必须处理周期,那么你可能需要保留一个访问过的“攻击”列表,没有禁止的周期:
grounded(A):-
grounded(A, []).
grounded(A, L):-
argument(A),
\+
(
attack(B, A),
\+ member(B, L), % Here we forbid cycles
grounded(B, [A|L]) % We add the current argument to the list of forbidden arguments
).发布于 2017-05-11 11:18:54
我不知道如何用Prolog编写,但是根植的语义是从没有被攻击的参数开始计算的,给定了参数树。
(希望它能指导@gusbro找到这个帖子的正确答案。)
为了解释它是如何计算的,我将介绍以下函数F(x) = {x defends y},其中:


中的最小固定点
(示例1)给定以下论证图,接地扩展为Eg = {c,e,f,a}。
因此,第一个函数以:

现在让我们考虑带循环的接地扩展的计算。
(示例2)在给定的论证图中,e为b和d辩护,但b受到d的攻击,则它不能包含在扎根的语义中。从这一点开始,我们得到了一个无冲突的集合{e,d}。从{e,d}我们可以应用函数F({e,d}) = {e,d,a},其中d从b保护a。再次应用函数F({e,d,a}) = {e,d,a},表明{e,d,a}是F中的最小不动点。因此,{e,d,a}是扎根扩张。
(示例3)在下面的论证树中,接地扩展

,因为没有不被攻击的论点。否则,如果参数e没有攻击自己,那么固定的扩展应该是

,事实并非如此。
在最后一个示例中,循环上升到不同的首选扩展,在这些扩展中,您可以使用Martin Caminada在其他地方定义的等效参数标记概念作为支持。
https://stackoverflow.com/questions/14772892
复制相似问题