Existe-t-il? Comment sont-ils mis en œuvre? P>
the CorOUTINGER Prédicats de Swi-Prolog ( Je suis très nouveau à la programmation logique (avec PRAGolog et tout à fait) et quelque peu confus par le fait que ce n'est pas purement déclaratif et nécessite des considérations de procédure même dans des cas très simples (voir cette Question À propos de l'utilisation de gel code>,
quand code>,
dif code> etc.) ont la fonctionnalité de Guards . Comment s'adapte-t-il dans le style de programmation de prologs préféré? P>
\ == code> ou
). Est-ce que je manque quelque chose d'important? P> DIF code>
3 Réponses :
gel / 2 et quand / 2 sont comme un "goto" de la programmation logique. Ils ne sont pas purs, commutatifs, etc. p>
DIF / 2, d'autre part, est totalement pur et déclaratif, monotonique, commutatif, etc. DIF / 2 est un prédicat déclaratif, il détient si ses arguments sont différents. En ce qui concerne le "style de programmation préféré de Prolog": State ce qui détient. Si vous souhaitez exprimer la contrainte selon laquelle deux termes généraux sont différents, DIF / 2 est exactement ce qui indique cela. P>
Les considérations de procédure sont généralement les plus nécessaires lorsque vous ne programme pas dans le sous-ensemble déclaratif pur de Prolog, mais utilisez des prédicats impuraux qui ne sont pas commutatifs, etc. dans les systèmes de prologothes modernes, il y a peu de raisons de quitter le sous-ensemble pur et déclaratif. p>
Que voulez-vous dire ici par "commutative"? Pouvez-vous donner un exemple?
Je pensais à l'affaire Général: puisque Freeze / 2 et quand / 2 n'empêtit aucune restriction sur leur deuxième argument, vous pouvez par exemple les utiliser pour la sortie, où l'ordre des buts importe.
gel / 2 est la programmation logique goto de contrainte; mais clairement pas de programmation logique.
Oui, de contrainte i> Programmation logique. Clairement, nous ne sommes pas encore assez fragmentés.
@mat "dans les systèmes de prologoth modernes, il y a peu de raisons de quitter le sous-ensemble pur et déclaratif" une déclaration péremptoire, mon bon gars. J'affirmerais que nos interprètes sont rarement ascendants (Starlog peut-être? Datalog à coup sûr) et nous demandons des effets secondaires de peur que nous descendons dans la solipsisme!
Toujours viser la pureté. Par exemple, pour lire des fichiers, utilisez une entrée pure avec la bibliothèque Ulrich Neumerkel (PIO) code>. Pour imprimer des objets, utilisez la capacité intégrée de Toplevel pour afficher des solutions. Concentrez-vous une description déclarative claire en utilisant des contraintes et vous obtenez des programmes plus généraux pouvant être utilisés dans plus de directions.
Premier un problème terminologique: ni tête Comme clauses contenant une garde et la coupe seraient dans ce cas plutôt appelées un commit. Mais aucun ne s'applique aux primitives ci-dessus. Les gardes sont plutôt inspirés par Dijkstra's Langue de commande gardée de 1975. P> < code> gel (x, objectif) code> (appelé à l'origine une autre difficulté avec et il existe également plus de difficultés techniques liées à C'est pour des raisons pour lesquelles Un autre problème est gel / 2 code> ni
quand / 2 code> ni
dif / 2 code> sont appelés gardes sous aucune circonstance. Les gardes apparaissent dans de telles extensions telles que CHR ou des langues associées comme GHC (link en japonais) ou autre Langues de programmation logique simultanée ; vous (sous certaines restrictions) pourraient envisager des clauses de la forme
: - code> garde
,!, code> ... p>
blockQuote>
geler code>) est identique à celui
quand (non évèné (x), but) code> et ils sont les deux équivalents déclarés à
objectif code>. Il n'y a aucune relation directe avec la fonctionnalité des gardes. Cependant, lorsqu'il est utilisé avec si, alors, vous pourriez mettre en œuvre un tel gardien. Mais c'est assez différent. P>
gel / 2 code> et des constructions similaires ont été considérées depuis quelque temps considéré comme un moyen général d'améliorer le mécanisme d'exécution de Prolog. Cependant, ils se sont avérés très fragiles à utiliser. Souvent, ils étaient trop conservateurs retardant ainsi des objectifs inutilement. C'est-à-dire que presque toutes les questions intéressantes ont produit une réponse «flottante» comme requête ci-dessous. De plus, la frontière entre les programmes de terminaison et de non-terminaison est maintenant beaucoup plus complexe. Pour les programmes Pure Monotonic PROG qui résiliant, l'ajout d'un objectif de fin de terminaison dans le programme préservera la résiliation de l'ensemble du programme. Cependant, avec
gel / 2 code> Ce n'est plus le cas. Ensuite, d'un point de vue conceptuel,
gel / 2 code> n'a pas été très bien pris en charge par les toplevels des systèmes: Seuls quelques systèmes ont montré les objectifs retardés d'une manière globale (par exemple SICStus) qui est crucial pour comprendre la différence entre le succès / réponses et solution. Avec des buts différés, Prology peut désormais produire une réponse qui n'a pas de solution que celle-ci: p>
gel / 2 code> était que ces conditions de terminaison sont beaucoup plus difficile à déterminer. Ainsi, alors que
geler code> était censé résoudre tous les problèmes de résiliation, il a souvent créé de nouveaux problèmes. P>
gel / 2 < / Code> En particulier le dépôt WRT et d'autres techniques pour prévenir les boucles. Considérons un objectif
gel (x, y = 1) code> clairement,
y code> est maintenant
1 code> même s'il n'est pas encore lié, il attend toujours < code> x code> être lié en premier. Maintenant, une implémentation pourrait envisager de dépenser pour un objectif
g (y) code>.
g (y) code> n'aura aucune solution ou exactement une solution
y = 1 code>. Ce résultat serait désormais stocké en tant que solution em> em> pour
g / 1 code> car le
geler code> -goal n'a pas été directement visible pour atteindre l'objectif. p>
gel / 2 code> est considéré comme le goto de la programmation logique de contrainte. p>
dif / 2 code> Ce qui est aujourd'hui considéré comme une contrainte. Contrairement à
gel / 2 code> et les autres primitives de coroutining, les contraintes sont beaucoup mieux en mesure de gérer la cohérence et de maintenir aussi bien meilleures propriétés de terminaison. Cela est principalement dû au fait que les contraintes introduisent une langue bien définies sont les propriétés du béton peuvent être prouvées et des algorithmes spécifiques ont été développés et ne pas permettre des objectifs généraux. Cependant, même pour eux, il est possible d'obtenir des réponses qui ne sont pas des solutions. En savoir plus sur et le succès dans CLP . P> p>
Plus de confusion de terminologie, je crains. En dehors de l'univers de Prolog, "Guards" sont Guards : conditions préalables telles qu'utilisées par Dijkstra, une expression boolen qui évalue en vrais ou faux, et est utilisée pour spécifier le flux de contrôle de manière déclarative. Les "gardes" de GHC et de GDC et Parlog sont des parties des organismes de clause qui suspendent l'exécution des objectifs du corps Jusqu'à ce qu'une condition soit remplie, des têtes de règle du système de production. On dirait très comme 'gel / 2' (Coroutines, droite?), Moins comme Dijkstra.
@Davidtonhofer: La clé est qu'elles, assez similaires aux gardes de Dijkstren, ne sont que si, alors. Il n'y a plus d'autre. Si des gardes se chevauchent, il s'agit d'une rampe aléatoire / chronologique qui fait le choix. Donc, vous ne pouvez pas exprimer la négation comme échec avec des gardes.
Plus sur GHC / GDC, en particulier Historique du chapitre 3 ("Métamorphose") de "Programmation orientée de l'agent - de Prolog aux clauses définies" , une note de conférence dans un livret Science Springer qui peut également être obtenu par ... Autres moyens. Il a été écrit assez rapidement et contient un certain nombre d'erreurs techniques et de formulations déroutantes. En vaut toujours la peine.
N'ont-ils pas plus comme "dès que ... alors"? Le flux de contrôle provient du grand sac de fils disponibles dans le ciel (cela est différent des gardes de Dijkstra, qui ont un flux de fil unique). Attendez, que se passe-t-il quand sur les backtracks sur le gel? On ne peut jamais s'en débarrasser de cela comme la condition qu'il attend peut toujours devenir vraie plus tard. Ou suis-je mal interprété la sémantique ici? J'ai besoin d'une référence papier.
Si, quand, ... je dirais étudier cette direction ne vous aidera pas beaucoup. Le prologic simultané et similaire sont proches de Prolog, mais pas tout à fait. La seule langue courante avec une certaine inspiration de celles-ci est utilisée est la Chr.
Il y a un papier par Evan Tick expliquant CC:
de manière informelle, une invocation de procédure s'engage à une clause en faisant correspondre la Arguments de tête (unification passive) et satisfaisant les objectifs de la garde. Lorsqu'un objectif peut s'engager dans plus d'une clause dans une procédure, elle s'engage à l'un d'entre eux de manière non déterministe (les autres candidats sont jetés). Structures apparaissant dans la tête et la garde d'un La clause provoque la suspension de l'exécution si l'argument correspondant de l'objectif n'est pas suffisamment instancié. Une invocation suspendue peut être repris plus tard lorsque la variable associée à la suspension L'invocation devient suffisamment instanciée. P> BlockQuote>
La duevolution des langages de programmation logique simultanée
Evan Tick - 1995
https://core.ac.uk/download/pdf/82787481.pdf p>Donc, je suppose que avec certains quand / 2 magie, un code de choix commité peut être réécrit en prologic ordinaire. L'approche serait aussi suit. Pour un ensemble de règles de choix commitées du même prédicat: p>
xxx pré> Ceci peut être réécrit dans ce qui suit, où hi 'et gi' besoin de mettre en œuvre une unification passive. Par exemple en utilisant ISO Corrigendum SubSumes_term / 2. P>
H1' :- G1', !, B1. .. H1' :- Gn', !, Bn. H :- term_variables(H, L), when_nonvar(L, H).
Comme indiqué ci-dessous par éditeur "Faux" ci-dessous, le terme "garde" est le mauvais ici, car "Guards" est utilisé pour signifier la norme de tourbière Précontion , par exemple dans une expression «si-alors». La bonne est la "suspension gardée". J'espère. J'ai quitté la formulation originale comme "garde" dans la question cependant.
Avec certains mathématiques, vous pouvez faire en toute sécurité Freeze / 2, voir ici: Stackoverflow.com/a/35688017/502187