逻辑编程新手(Prolog)。遇到一个简单的问题,但不知道如何在prolog中编码。
问题就像你有几个论点:争论(a),争论(b)......,以及攻击(a,b)之类的几种攻击关系,这意味着攻击参数b。所以我给出了一个论据,我想知道它是否是基础的。对于参数而言,“接地”意味着如果b攻击a,则存在另一个参数,比如c攻击b。如果没有参数攻击c,那么我们说a和c都是基础的。
您能举例说明如何实现此基础/ 1程序以实现此目标。
不确定我说清楚......但欢迎提出任何建议(或代码)!!
答案 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} ,其中:
(例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在其他地方定义的等价参数标记作为支持。