Prolog 逆谓词

Prolog Inverse Predicate

我在 Prolog 中有以下语句:

speak("Portuguese","Brazil").
speak("Portuguese","Africa").
speak("English","EUA").
speak("Spanish","Spain").
capital("Brasilia", "Brazil").
capital("Washington", "EUA").
capital("Madrid", "Spain").

我正在尝试获取所有不会说一种语言的国家/地区。例如,获取所有不会说葡萄牙语的国家/地区将 return EUA 和西班牙。我尝试了以下代码:

notSpeak(X) :- speak(_,Y), not(speak(X,_)),write(Y),nl,fail.

然而,它只是 return 错误。有人可以指出错误在哪里吗?

提前致谢!

not(speak(X,_)) 应该是 not(speak(X,Y))。当用 ?- notSpeak("English"). 调用时,您的代码说“他们在巴西说葡萄牙语,没有国家说英语”,这是不正确的,所以它失败了。你想要它说“他们在巴西说葡萄牙语,而巴西不说英语”。


你也可以这样做:

notSpeak(X) :- speak(Lang, Country), dif(Lang, X), write(Country),nl,fail.

“乡下说郎,郎与禁言不同”。。不要使用这个;正如@false 的评论所解释的,“加拿大说法语,那不是英语,因此加拿大不会说英语”是有缺陷的。

Prolog是一种逻辑语言(Programming in Logic,明白了吗? )

您只需做出声明并让推理引擎完成其工作:

not_speak( L, C ) :- % to find countries that don't speak language L
  speak(X,C),        % - find a country that speaks any language X
  L \= X .           % - provided that that language X is not language L

找到所有的解决方案很容易:

not_speak_all( L, Cs ) :- findall( C , not_speak(L,C) , Cs ) .

给我们 this program.

not_speak( L, C ) :- speak(X,C), L \= X .

not_speak_all( L, Cs ) :- findall(C, not_speak(L,C) , Cs ) .

speak( portuguese , brazil         ) .
speak( portuguese , africa         ) .
speak( english    , usa            ) .
speak( spanish    , spain          ) .
speak( english    , united_kingdom ) .
speak( dutch      , netherlands    ) .