Помогите с пунктами пролога
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).
Это даст вам оба решения по возврату. Я думаю, что это определенно яснее, чем его второе предложение.
Из того, что мне сказали, это присуще алгоритму Пролога. Каждое высказанное предложение должно быть клаузулой Рога.