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

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

Je suis confronté au problème que pour une raison (probablement évidente) Prolog n'accepte pas la dernière ligne du code ci-dessus. La raison a quelque chose à voir avec:Aide avec les clauses de prolog

detected(proton), detected(electron) 

Si j'essaie juste

detected(proton) 

il se comporte correctement.

Quel est le problème? J'essaie de dire que s'il y a une émission d'alpha et de bêta, alors il y a des détections des protons et des électrons.

Merci

Répondre

5

Vous avez raison, les clauses dans PROLOG sont des clauses Horn. De plus, il arrive qu'une conjonction dans la tête d'une clause telle que:

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

... (ce qui est une clause de Horn) est en fait équivalent aux deux clauses de Horn séparées suivantes:

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

... puisque les deux faits detected(proton) et detected(electron) sont sous-entendues par la conjonction des objectifs du corps.

Notez qu'il peut y avoir plusieurs autres moyens équivalents pour coder ce que vous avez l'intention du programme pour signifier, comme les suivantes (à titre d'exemple):

emissionOf(alpha). 
emissionOf(beta). 

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

but exécution detected(X) se lier X à l'atome proton, puis à electron sur le retour arrière.

0

D'après ce que m'a dit à, il est inhérent à l'algorithme de Prolog. Chaque phrase doit être un Horn clause.

1

Il est équivalent à

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

Vous essayez essentiellement de redéfinir l'opérateur ,/2, ce qui est interdit. Quel message d'erreur avez-vous reçu?

Qu'est-ce que vous essayez de dire? Que les deux detected(proton) et detected(electron) sont vrais si emissionOf(alpha) et emissionOf(beta) sont vrais? Dans ce cas, vous devez diviser en deux en clauses comme @sharky dit:

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

Cela vous donnera les solutions sur retours en arrière. Je pense que c'est nettement plus clair que sa deuxième suggestion.