反转成员身份时 Prolog 中的堆栈溢出

问题描述 投票:0回答:1

我有以下程序:

depends_on(Set, Element) :-
    belongs_to(Element, Set).
depends_on(Set, Element) :-
    depends_on(Set, Subset),
    belongs_to(Element, Subset).

user(u1).
user(u2).

department(d1).

company(c1).

belongs_to(u1, d1).
belongs_to(u2, d1).
belongs_to(d1, c1).

我尝试找到该公司的所有用户

c1
。我尝试了查询:

depends_on(c1, user(X)).

但是它会产生堆栈溢出。谁能解释一下为什么吗?

prolog failure-slice
1个回答
0
投票

这是已经循环的程序片段:

depends_on(集合,元素):- false属于(元素,集合)。
取决于(集合,元素):-
    dependent_on(集合, 子集), false,
    属于(元素,子集)。

?- 取决于(c1,用户(X))。 % 您的原始查询
   循环。
?- 用户(X),取决于(c1,X)。 % 你真正的意思
   循环。

因为这个片段(称为[ŧag:failure-slice])不会终止,整个程序也不会终止。您需要以某种方式修改可见部分。只要可见部分保持原样,循环就不会消失。

解决这个问题最简单的方法就是交换两个目标。

© www.soinside.com 2019 - 2024. All rights reserved.