2

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

问题就像您有几个论点:argument(a),argument(b)...,以及几个攻击关系,例如 attack(a,b),这意味着论点 a 攻击论点 b。因此,给定一个论点,我想知道它是否有根据。论点 a 的“接地”意味着如果 b 攻击 a,则存在另一个论点,例如 c 攻击 b。如果没有参数攻击 c,那么我们说 a 和 c 是接地的。

您能否举例说明如何实施此接地/1 程序以实现此目标。

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

4

2 回答 2

3

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

您可以grounded/1在 prolog 中直接定义遵循此规则的过程:

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
  ).
于 2013-02-08T14:25:23.383 回答
0

我不知道如何在 Prolog 中编写,但根据参数树,从没有受到攻击的参数开始计算接地语义。

(希望它能指导@gusbro找到该线程的正确答案。)

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

  • 如果一个被辩护的论点被另一个被辩护的论点攻击,那么被攻击的论点将从集合中删除。
  • 依此类推,直到函数无法使用更多参数进行更多扩展,它达到了F中的最小固定点。

(示例 1)给定以下论证图,接地扩展是Eg = {c, e, f, a}

所以,第一个函数开始于:

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

(例2)在下面给定的论证图中,e为bd辩护,但bd攻击,则不能包含在扎根语义中。从这一点开始,我们有一个无冲突的集合{e, d}。从{e, d}我们可以再次应用函数F({e, d}) = {e, d, a},其中d保护a免受b攻击。再次应用函数F({e, d, a}) = {e, d, a},表明{e, d, a}F中的最小不动点。因此,{e, d, a} 是接地扩展。

(示例 3)在下面的论证树中,接地扩展,因为没有没有被攻击的论点。否则,如果参数 e 没有攻击自己,则接地扩展应该是,情况并非如此。

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

于 2017-05-11T03:18:53.827 回答