使用not设置Intersection谓词Prolog

时间:2016-04-14 18:08:55

标签: prolog

我正在尝试构建一个简单的谓词,它将两个列表作为输入,结果是第三个由前两个列表的交集组成。 我决定使用逻辑陈述。我很确定我的逻辑是正确的,但我的谓词不起作用。有什么想法吗?:

df1$Admission_Type[df1$Admission_Type %in% c("Inpatient","inpatient","INPATIENT")]<-"ip"

请不要发布替代方法我想知道为什么每次都返回FALSE。

2 个答案:

答案 0 :(得分:9)

你的定义正确太笼统了。它承认,例如[]是任何两个列表的交集,这些列表过于笼统。即它错误地成功intersection([],[a],[a])。它没有第三个“为所有人”的习语,说明两个列表中的所有元素都将出现在结果列表中。

但是否则你的定义很好。对于地面案例。有点不寻常的是交叉点是第一个而不是最后一个参数。变量名称让我非常恼火。我相信R意味着“结果”,因此是交集。 L1L2是构建交集的两个集合。

但是,它有点过于笼统 - 就像许多Prolog谓词一样(想到append([], non_list, non_list)。除了列表之外,你的定义还承认既不是列表也不是部分列表的术语:

?- intersection(non_list1,[1,2|non_list2],[3,4|non_list3]).

为了使非常有用安全,请按照以下方式使用它:

?- when(ground(intersection(I, A, B)), intersection(I, A, B)).

左右:

?- (  ground(intersection(I, A, B))
   -> intersection(I, A, B)
   ;  throw(error(instantiation_error, intersection(I, A, B)))
   ).

或者,使用iwhen/2

?- iwhen(ground(intersection(I, A, B)), intersection(I, A, B) ).

作为一个小问题,请写(\+)/1来代替not/1

答案 1 :(得分:7)

问题在于not/1仅仅否定了element/2的结果。它不会导致element/2回溯以查找封闭的not/1为真的其他实例。

考虑以下计划。

a(1).
a(2).

b(1).
b(2).
b(3).

以下查询:

  1. b(X), not(a(X))
  2. not(a(X)), b(X)
  3. 第一个产生X = 3,而第二个产生false。这是因为第一个查询首先使用1实例化X,然后使用2,然后使用3,直到最后not(a(X))成功。
    第二个查询首先实例化X 1,a(1)成功,因此not(a(1))失败。没有回溯!