Помогите с пунктами пролога - PullRequest
0 голосов
/ 23 сентября 2010
emissionOf(alpha).
emissionOf(beta).

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

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

detected(proton), detected(electron)

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

detected(proton)

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

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

Спасибо

Ответы [ 3 ]

5 голосов
/ 25 сентября 2010

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

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

1 голос
/ 25 сентября 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).

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

0 голосов
/ 24 сентября 2010

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

...