2016-12-04 2 views
5

D'abord quand je lis sur différents prédicats sur Prolog, comme par exemple http_server, il est écrit comme ceci: http_server(:Goal, +Options) qu'est-ce que : et + signifie ici? Parfois, ? est également écrit.
Deuxièmement, parfois, je vois des variables déclarées avec un trait de soulignement avant comme _Request, même s'il n'y en a pas d'autres Request, pourquoi?Qu'est-ce que cela signifie dans prolog?

Répondre

7

Les +, -, : etc. sigils sont appelés déclarations en mode. Ils décrivent l'instanciation attendue des arguments de prédicat, c'est-à-dire, si vous devez appeler le prédicat avec une variable non liée, un terme instancié, etc. Ceux-ci ne sont pas complètement normalisés; voici une description des conventions pour SWI-Prolog: http://www.swi-prolog.org/pldoc/man?section=modes

En première approximation, un argument + est une entrée au prédicat, vous êtes censé fournir un terme au sol. Un argument - est un sortie du prédicat, le prédicat essayera de l'unifier avec un terme. Un terme ? peut être partiellement instancié lors de l'appel, et le prédicat peut l'instancier davantage. Un argument : est un méta-argument, c'est-à-dire que c'est un but qui doit être appelé par le prédicat (comme dans setof/3, par exemple).

Dans l'exemple de http_server(:Goal, +Options), vous devez appeler ce prédicat avec le premier argument lié à un objectif, probablement un nom de prédicat. Le deuxième argument doit être instancié, vraisemblablement à une liste dont le format est décrit plus en détail dans la documentation. Si vous faites pas appelez ce prédicat comme ceci, par exemple, si vous passez une variable non liée comme second argument, vous pouvez obtenir un comportement inattendu ou une erreur d'instanciation. En ce qui concerne votre deuxième question (qui aurait mieux valu être séparée), une variable commençant par un trait de soulignement est appelée une variable anonyme . Chacune de ces variables ne peut se produire qu'une seule fois par clause, sauf _ elle-même, ce qui peut se produire plusieurs fois et fait référence à des variables distinctes à chaque occurrence. Les systèmes Prolog émettent généralement un avertissement "variable singleton" pour les variables non-anonymes qui ne se produisent qu'une fois, car il peut s'agir de fautes de frappe ou d'un signe que le programmeur a oublié quelque chose. Vous utilisez des variables anonymes pour exprimer la notion selon laquelle "il doit y avoir quelque chose ici (par exemple, un argument de prédicat), mais je me fiche de ce que c'est". Dans votre exemple, vous appelez vraisemblablement un prédicat qui a un argument "request", mais dans votre cas d'utilisation particulier, vous ne vous souciez pas de la requête.

+0

Merci, très belle explication. Il y a quand même une chose que je ne comprends pas, pourquoi l'appeler '_Request' et pas seulement' _'? Est-ce juste pour la clarté que c'est une demande? – Ferus

+1

Oui, c'est juste pour rendre le nom de la variable plus expressif. –