关于多代理论证的简单Prolog实现

时间:2013-02-08 12:44:30

标签: prolog multi-agent

逻辑编程新手(Prolog)。遇到一个简单的问题,但不知道如何在prolog中编码。

问题就像你有几个论点:争论(a),争论(b)......,以及攻击(a,b)之类的几种攻击关系,这意味着攻击参数b。所以我给出了一个论据,我想知道它是否是基础的。对于参数而言,“接地”意味着如果b攻击a,则存在另一个参数,比如c攻击b。如果没有参数攻击c,那么我们说a和c都是基础的。

您能举例说明如何实现此基础/ 1程序以实现此目标。

不确定我说清楚......但欢迎提出任何建议(或代码)!!

2 个答案:

答案 0 :(得分:3)

我从你的解释中理解的是,当没有其他基础论据攻击它时,一个论点是有根据的。

您可以在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
  ).

答案 1 :(得分:0)

我不知道如何在Prolog中写字,但是根据参数树,从没有被攻击的参数开始计算基础语义。

(希望它指导@gusbro找到这个主题的正确答案。)

为了解释它是如何计算的,我将介绍以下函数 F(x)= {x defends y} ,其中:

  • 如果一个被辩护的论点被其他被侮辱的论点攻击,那么被攻击的论点将从集合中移除。
  • 依此类推,直到该函数无法通过更多参数进行扩展,并且它已达到 F 中的最小修复点。

(例1)如果给出以下论证图,则接地扩展名为 Eg = {c,e,f,a}

所以,第一个函数以:

开头

现在让我们考虑用循环计算接地扩展。

(示例2)在下面的给定论证图中, e 保护 b d ,但< em> b 受 d 的攻击,然后它不能被包含在接地语义中。从这一点开始,我们有一个无冲突的集合 {e,d} 。从 {e,d} 我们可以在函数 F({e,d})= {e,d,a} 中应用agin,其中 d b 保护 a 。再次应用函数 F({e,d,a})= {e,d,a} ,表明 {e,d,a} 是最小修正指向 F 。因此,{e,d,a}是基础扩展。

(示例3)在下面的论证树中,基础扩展,因为没有被攻击的参数。否则,如果参数e没有攻击自己,那么扎根的扩展应该是,但事实并非如此。

在最后一个例子中,循环上升到不同的首选扩展,您可以使用Martin Caminada在其他地方定义的等价参数标记作为支持。