我有以下程序:
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)).
但是它会产生堆栈溢出。谁能解释一下为什么吗?
这是已经循环的程序片段:
depends_on(集合,元素):- false,属于(元素,集合)。 取决于(集合,元素):- dependent_on(集合, 子集), false,属于(元素,子集)。 ?- 取决于(c1,用户(X))。 % 您的原始查询 循环。 ?- 用户(X),取决于(c1,X)。 % 你真正的意思 循环。
因为这个片段(称为[ŧag:failure-slice])不会终止,整个程序也不会终止。您需要以某种方式修改可见部分。只要可见部分保持原样,循环就不会消失。
解决这个问题最简单的方法就是交换两个目标。