2010-09-23 1 views
0
emissionOf(alpha). 
emissionOf(beta). 

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

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

detected(proton), detected(electron) 

Если я пытаюсь просто

detected(proton) 

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

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

Благодаря

ответ

5

Вы правы, предложения в PROLOG являются предложениями Horn. Кроме того, бывает так, что конъюнкция в главе статьи, такие как:

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

... (который не является пунктом 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 на обратном пути.

0

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

1

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

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

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