Обратный предикат Пролога

У меня есть следующие утверждения в Prolog:

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

Я пытаюсь получить все страны, которые не говорят на каком-либо языке. Например, получение всех стран, не говорящих по-португальски, вернет EUA и Испанию. Я попробовал следующий код:

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

Однако он просто возвращает false. Кто-нибудь может указать мне, где ошибка?

Заранее спасибо!

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
0
37
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

not(speak(X,_)) должно быть not(speak(X,Y)). При вызове с помощью ?- notSpeak("English"). ваш код говорит: «В Бразилии говорят по-португальски, и ни одна страна не говорит по-английски», что неверно, поэтому он не работает. Вы хотите, чтобы он сказал: «В Бразилии говорят по-португальски, а Бразилия не говорит по-английски».


Вы также можете сделать:

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

«В стране говорят на ланге, а ланг отличается от запретного».. Не используйте это; как поясняет комментарий @false, «Канада говорит по-французски, это не по-английски, поэтому Канада не говорит по-английски» ошибочно.

Это второе решение, рассмотрим Бельгию с французским, голландским и немецким языками. Теперь notSpeak/1 выполняется для всех трех таких языков.

false 17.05.2022 08:34

@false хорошее замечание! Ответ отредактирован.

TessellatingHeckler 17.05.2022 23:45
Ответ принят как подходящий

Пролог — это логический язык (Программирование в Журналic, понятно?)

Вы просто делаете утверждение и позволяете механизму вывода делать свою работу:

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

Дает нам эта программа.

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

См. комментарий к другому ответу.

false 17.05.2022 08:36

Другие вопросы по теме