Помогите с пунктами пролога

emissionOf(alpha).
emissionOf(beta).

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).

Я сталкиваюсь с проблемой, что по какой-то (вероятно, очевидной) причине Пролог не принимает последнюю строку приведенного выше кода. Причина как-то связана с:

detected(proton), detected(electron)

Если я попробую просто

detected(proton)

ведет себя правильно.

В чем проблема? Я пытаюсь утверждать, что если есть и эмиссия альфа и бета, то там есть обнаружения и протонов и электронов.

Спасибо

3 ответа

Решение

Вы правы, пункты в PROLOG - это роговые. Кроме того, бывает так, что соединение в заголовке предложения, такого как:

detected(proton), detected(electron) :- emissionOf(alpha), emissionOf(beta).

... (который не является клаузулой Рога) фактически эквивалентен следующим двум отдельным клаузлам Рога:

detected(proton) :- emissionOf(alpha), emissionOf(beta).
detected(electron) :- emissionOf(alpha), emissionOf(beta).

... так как оба факта detected(proton) а также detected(electron) подразумеваются соединением целей тела.

Обратите внимание, что может быть несколько других эквивалентных способов кодирования того, что вы намерены подразумевать в программе, например, следующее (в качестве примера):

emissionOf(alpha).
emissionOf(beta).

detected(X) :- 
  emissionOf(alpha), 
  emissionOf(beta), 
  (X = proton; X = electron).

Выполнение цели detected(X) будет связывать X на атом protonзатем electron на возврате.

Это эквивалентно

,(detected(proton),detected(electron)) :- emissionOf(alpha), emissionOf(beta).

Вы по сути пытаетесь переопределить ,/2 оператор, который не допускается. Какое сообщение об ошибке вы получили?

Что ты пытаешься сказать? Что оба detected(proton) а также detected(electron) верно, если emissionOf(alpha) а также emissionOf(beta) правда? В этом случае вам нужно разделить на две части, как сказал @sharky:

detected(proton) :- emissionOf(alpha), emissionOf(beta).
detected(electron) :- emissionOf(alpha), emissionOf(beta).

Это даст вам оба решения по возврату. Я думаю, что это определенно яснее, чем его второе предложение.

Из того, что мне сказали, это присуще алгоритму Пролога. Каждое высказанное предложение должно быть клаузулой Рога.

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