Помощь с предложениями пролога

emissionOf(alpha).
emissionOf(beta).

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

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

detected(proton), detected(electron)

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

detected(proton)

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

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

Спасибо


person devoured elysium    schedule 23.09.2010    source источник


Ответы (3)


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

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

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

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 при возврате.

person Community    schedule 24.09.2010

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

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

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

person rvirding    schedule 25.09.2010

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

person devoured elysium    schedule 24.09.2010