2011-05-10 5 views
3

J'essaie actuellement d'apprendre quelques Prolog (en utilisant ECLiPSe). De temps en temps je tombe sur le prédicat clause/2, mais je ne comprends pas à quoi il sert. J'ai lu quelques références (par exemple this one), mais je ne comprends toujours pas dans quel cas cela pourrait être utile. Quelqu'un peut-il me fournir un exemple ou une explication facile de ceci?Comprendre le prédicat clause/2

Répondre

3

Ce prédicat permet la métaprogrammation, c'est-à-dire le raisonnement relatif à votre programme Prolog.

SWI-Prolog utilise clause/2 dans, A.O., le prédicat explain:

?- explain(member). 
"member" is an atom 
     Referenced from 12-th clause of pce_meta:pce_to_pl_type/3 
lists:member/2 is a predicate defined in 
     c:/program files/swi-prolog/library/lists.pl:81 
     Referenced from 1-th clause of prolog_dialect:source_exports/2 
     Referenced from 1-th clause of pce_config:term_description/2 
     Referenced from 1-th clause of pce_config:config_attribute/2 
     Referenced from 1-th clause of pce_config:load_config_key/2 
     Referenced from 1-th clause of pce_config:term_description/3 
     Referenced from 1-th clause of pce_config:current_config_path/1 
     Referenced from 4-th clause of persistent_frame:has_specifier/1 
true. 

et dans la mise en œuvre de Constraint Handling Rules. Je pense qu'il est également utile pour faire inductive logic programming et diverses autres extensions Prolog.

Pour une introduction complète à la métaprogrammation dans Prolog, voir L'Art de Prolog par Sterling et Shapiro.

+0

Ainsi, le prédicat permet de vérifier si il y a une clause dynamique, qui réussirait avec la tête et le corps donnés? – Lennart

+1

@redfalcon: pas forcément une clause dynamique, elle trouve aussi des clauses statiques. –

+0

Merci, cela a du sens pour moi. – Lennart

1

une utilisation est une Quine vraiment élégante: b

quine :- 
    clause(quine, A), 
    portray_clause((quine:-A)). 

trouvé here

qui est évidemment un cas de méta-programmation comme larsmans dit