一阶逻辑中的大象
Elephants in first order logic
我有这些事实(el 代表大象):
el(Sam) el(Clyde) el(Oscar)
pink(Sam)
gray(Clyde) likes(Clyde, Oscar)
pink(Oscar)Vgray(Oscar) likes(Oscar, Sam)
现在,我想证明(?):一些灰色的大象喜欢一些粉红色的大象,这转化为:(exists x)(el(x) /\ gray (x) /\ (exists y) (el(y) /\ pink(y) /\ likes(x, y))。所以,我们需要取它的否定并将它解析(?)到基础中,以便到达 void(?).
取反是(会用~
表示取反):
~el(x) V ~gray(x) V ~el(y) V ~pink(y) V ~likes(x, y)
按照我的看法,我将分配 x
和 y
值(Sam、Clyde 或 Oscar)并在基础中插入后面的语句,以 "kill" 事实已经在那里了。
我的尝试:
我设置了x = Clyde, y = Oscar
,这给了我:
~el(Clyde) V ~gray(Clyde) V ~el(Oscar) V ~pink(Oscar) V ~likes(Clyde, Oscar)
如果我将其放入基数中,"kill" 他们的 "pairs" 基数将变为:
el(Sam)
pink(Sam)
gray(Oscar) likes(Oscar, Sam)
然后呢?我们运行出了大象!
理想情况下,我想要 x' = Oscar, y' = Sam
,这样我会得到:
~el(Oscar) V ~gray(Oscar) V ~el(Sam) V ~pink(Sam) V ~likes(Oscar, Sam)
它会进入基地杀死一切,但 ~el(Oscar)
仍然活着!我该如何进行?
后续问题:
基地:
a
b
c V d
然后我投入基地~a/\~b/\~c/\~d
。基地内的一切,都会以同样的方式消失?我的意思是 V
运算符不会影响事情吗?
你可以有这样的东西:
el(sam).
el(clyde).
el(oscar).
pink(sam).
grey(clyde).
likes(clyde,oscar).
likes(oscar,sam).
canbe(oscar,grey).
canbe(oscar,pink).
gelephant_likes_pelephant(GE,PE):-
grey(GE),el(GE),
pink(PE),el(PE),
likes(GE,PE).
gelephant_likes_pelephant(GE,PE):-
canbe(GE,grey),el(GE),
pink(PE),el(PE),
likes(GE,PE).
gelephant_likes_pelephant(GE,PE):-
grey(GE),el(GE),
canbe(PE,pink),el(PE),
likes(GE,PE).
问题:
?- gelephant_likes_pelephant(GE,PE).
GE = oscar,
PE = sam ;
GE = clyde,
PE = oscar.
你必须小心如何使用像 canbe/2 这样的谓词。正如它所说,奥斯卡可以是灰色或粉红色。然后我的查询是说哪些灰色大象喜欢哪些粉红色大象,答案可以解释为:如果奥斯卡是灰色大象,那么奥斯卡喜欢山姆,或者如果克莱德喜欢奥斯卡,那么奥斯卡是粉红色大象。
我有这些事实(el 代表大象):
el(Sam) el(Clyde) el(Oscar)
pink(Sam)
gray(Clyde) likes(Clyde, Oscar)
pink(Oscar)Vgray(Oscar) likes(Oscar, Sam)
现在,我想证明(?):一些灰色的大象喜欢一些粉红色的大象,这转化为:(exists x)(el(x) /\ gray (x) /\ (exists y) (el(y) /\ pink(y) /\ likes(x, y))。所以,我们需要取它的否定并将它解析(?)到基础中,以便到达 void(?).
取反是(会用~
表示取反):
~el(x) V ~gray(x) V ~el(y) V ~pink(y) V ~likes(x, y)
按照我的看法,我将分配 x
和 y
值(Sam、Clyde 或 Oscar)并在基础中插入后面的语句,以 "kill" 事实已经在那里了。
我的尝试:
我设置了x = Clyde, y = Oscar
,这给了我:
~el(Clyde) V ~gray(Clyde) V ~el(Oscar) V ~pink(Oscar) V ~likes(Clyde, Oscar)
如果我将其放入基数中,"kill" 他们的 "pairs" 基数将变为:
el(Sam)
pink(Sam)
gray(Oscar) likes(Oscar, Sam)
然后呢?我们运行出了大象!
理想情况下,我想要 x' = Oscar, y' = Sam
,这样我会得到:
~el(Oscar) V ~gray(Oscar) V ~el(Sam) V ~pink(Sam) V ~likes(Oscar, Sam)
它会进入基地杀死一切,但 ~el(Oscar)
仍然活着!我该如何进行?
后续问题:
基地:
a
b
c V d
然后我投入基地~a/\~b/\~c/\~d
。基地内的一切,都会以同样的方式消失?我的意思是 V
运算符不会影响事情吗?
你可以有这样的东西:
el(sam).
el(clyde).
el(oscar).
pink(sam).
grey(clyde).
likes(clyde,oscar).
likes(oscar,sam).
canbe(oscar,grey).
canbe(oscar,pink).
gelephant_likes_pelephant(GE,PE):-
grey(GE),el(GE),
pink(PE),el(PE),
likes(GE,PE).
gelephant_likes_pelephant(GE,PE):-
canbe(GE,grey),el(GE),
pink(PE),el(PE),
likes(GE,PE).
gelephant_likes_pelephant(GE,PE):-
grey(GE),el(GE),
canbe(PE,pink),el(PE),
likes(GE,PE).
问题:
?- gelephant_likes_pelephant(GE,PE).
GE = oscar,
PE = sam ;
GE = clyde,
PE = oscar.
你必须小心如何使用像 canbe/2 这样的谓词。正如它所说,奥斯卡可以是灰色或粉红色。然后我的查询是说哪些灰色大象喜欢哪些粉红色大象,答案可以解释为:如果奥斯卡是灰色大象,那么奥斯卡喜欢山姆,或者如果克莱德喜欢奥斯卡,那么奥斯卡是粉红色大象。