2009-11-13 7 views
1

J'ai une question que je voudrais vous demander quelque chose au sujet d'un extrait de code:Prolog coupé dans la méthode

insert_pq(State, [], [State]) :- !. 
insert_pq(State, [H|Tail], [State, H|Tail]) :- 
    precedes(State, H). 
insert_pq(State, [H|T], [H|Tnew]) :- 
    insert_pq(State, T, Tnew). 
precedes(X, Y) :- X < Y. % < needs to be defined depending on problem 

la fonction ajoute très clairement un élément à une file d'attente prioritaire. Le problème que j'ai est l'opérateur de coupure dans la première ligne. Vraisemblablement, chaque fois que l'appel atteint cette ligne de code, ceci est la seule solution possible à la requête, et les appels de fonction se dérouleraient simplement (ou est-ce liquidation?), Il n'y aurait pas besoin de reculer et de chercher une autre solution. question.

Donc, cette coupure ici est superflue. Ai-je raison dans ma déduction?

Répondre

1

Oui, tout compilateur Prolog semi-décent remarquera qu'il n'y a pas d'autre clause où le second argument est une liste vide.

Il serait plus utile à la fin de la deuxième clause, bien que je préfère combiner la deuxième et la troisième clause et utiliser une coupe locale (précède (...) -> ...; ...).

0

Oui, vous avez raison. Même si le compilateur n'est pas à moitié décent (ce que SWI Prolog est certainement), le pire qu'il puisse faire est de faire correspondre les deuxième et troisième clauses, qui échoueront immédiatement. Cependant, si la seconde clause correspond, la troisième le fait également. Est-ce le comportement voulu?

1

La technique particulière que les utilisateurs du compilateur pour éliminer les prédicats candidats pour la correspondance est appelée indexation d'argument. Différentes implémentations de prologue pourraient potentiellement indexer différents nombres d'arguments par défaut. Donc, si vous êtes inquiet de savoir si un argument est indexé ou non, vous devriez vérifier combien d'arguments le prologue que vous utilisez les index. Selon le SWI reference manual, il indexe uniquement le premier argument par défaut. Donc, dans votre cas, la coupure n'est pas redondante. Vous pouvez cependant spécifier explicitement quels arguments doivent être indexés en utilisant les prédicats index/1 et hash/1 auxquels sont liés les liens ci-dessus.

Ou vous pouvez simplement réorganiser les arguments, ou vous pouvez simplement garder la coupe.