我正在尝试构建一个简单的谓词,它将两个列表作为输入,结果是第三个由前两个列表的交集组成。 我决定使用逻辑陈述。我很确定我的逻辑是正确的,但我的谓词不起作用。有什么想法吗?:
df1$Admission_Type[df1$Admission_Type %in% c("Inpatient","inpatient","INPATIENT")]<-"ip"
请不要发布替代方法我想知道为什么每次都返回FALSE。
答案 0 :(得分:9)
你的定义正确太笼统了。它承认,例如[]
是任何两个列表的交集,这些列表过于笼统。即它错误地成功intersection([],[a],[a])
。它没有第三个“为所有人”的习语,说明两个列表中的所有元素都将出现在结果列表中。
但是否则你的定义很好。对于地面案例。有点不寻常的是交叉点是第一个而不是最后一个参数。变量名称让我非常恼火。我相信R
意味着“结果”,因此是交集。 L1
和L2
是构建交集的两个集合。
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).
以下查询:
b(X), not(a(X))
。not(a(X)), b(X)
。第一个产生X = 3
,而第二个产生false
。这是因为第一个查询首先使用1实例化X
,然后使用2,然后使用3,直到最后not(a(X))
成功。
第二个查询首先实例化X
1,a(1)
成功,因此not(a(1))
失败。没有回溯!