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 ) .
我在 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 ) .