2013-05-17 5 views
1

Je suis en train d'étudier DCG et Grammaires arbres parse à l'aide Prolog Programmation de Ivan Bratko pour l'intelligence artificielle. Dans un programme qui utilise une grammaire DCG pour extrapoler le sens d'une phrase, je trouve ces deux prédicats qui, je pense, représentent une sorte de connaissances sémantiques:prédicat de représentation des connaissances sémantiques dans Prolog

properName(john) --> [john]. 
properName(mary) --> [mary]. 

Comment dois-je lire ces prédicats? Je pense qu'ils veulent dire: il est vrai qu'un élément d'une liste représentée par la chaîne "jean" est un nom propre et ce nom propre est Jean (même chose pour Marie).

Est-ce que ma lecture est correcte ou y a-t-il d'autres implications?

+0

La grammaire du livre ne semble pas être en ligne (par exemple ,. un aperçu Google Livres), mais plus de la grammaire est montré dans [cette question] (http://stackoverflow.com/q/16674593/1281433), pour ceux qui sont intéressés. –

Répondre

2

properName(X) est juste une règle unaire (dans le contexte de DCG, il est un prédicat ternaire dans Prolog - vérifier avec ?- listing(properName)). vous auriez pu l'appeler "chaussettes", ou "confiture", c'est totalement à vous. Donc, la connaissance sémantique à ce sujet représentant nom propre "john" ou "mary" est introuvable dans le code (il utilise le nommage comme fonction auto-documentée, mais la documentation n'est pas le code).

Le prédicat permet un atome john ou mary pour être présent dans le courant d'entrée, et rien d'autre; et exige que X unifié avec cet atome.

Vous auriez pu définir ainsi:

name(X) --> [X], { member(X, [john, mary]) }. 

puis,

4 ?- phrase(name(X), [john,jack], Z). 
X = john, 
Z = [jack] ; 
false. 

5 ?- phrase(name(X), [jack,john], Z). 
false. 

8 ?- phrase(name(X), [john,mary], Z). 
X = john, 
Z = [mary] ; 
false. 

9 ?- phrase(name(X), [mary,john,jack], Z). 
X = mary, 
Z = [john, jack]. 

11 ?- phrase(name(jack), [jack,mary,john], Z). 
false. 
+0

Ok, c'est plus clair pour moi. J'ai le doute suivant: quand, dans le shell Prolog, vous exécutez la commande: phrase (nom (X), [john, jack], Z). Qu'est-ce que exactement ce mot prédice? En y regardant, je pense que c'est un prédicat qui rapprese une phrase composée uniquement par un nom (qui doit être dans la liste [john, mary].) Est-ce quelque chose comme si, dans ma grammaire DCG, j'ai quelque chose comme : phrase (X) -> nom (X) (ou quelque chose comme ça)? – AndreaNobili

+0

@AndreaNobili ['phrase/3'] (http://www.swi-prolog.org/pldoc/man?predicate=phrase% 2F3) est juste ** un prédicat intégré ** pour appeler une certaine règle DCG sur une entrée.Essayez aussi '1? - apropos (phrase) .' dans votre console SWI-Prolog.' Name' est exactement le même Essayez-le: '? - phrase (nom propre (X), [john, mary, jack], Z) .' ou '? - phrase (nom propre (john), [john, mary, jack] , Z). 'Etc –

+0

@AndreaNobili vous pouvez essayer '? - liste (phrase) .' pour voir sa définition –

2

Il s'agit d'un prédicat trivial qui ne se prête pas à une interprétation en dehors du contexte dans lequel il est utilisé. En d'autres termes, il ne peut être utilisé que pour exiger qu'un nom propre soit utilisé d'une certaine manière, par une règle DCG qui l'utilise sur son côté droit. La façon dont vous l'avez montré, isolément, cela signifie rien de plus que:

'john' est un nom propre, tout comme 'mary'.

EDIT

Je peux me tromper, mais vous êtes encore abuser de la langue anglaise pour décrire les choses qui sont mieux décrites en utilisant un langage formel. Prolog est un langage formel, avec une syntaxe et une sémantique définies. Il peut être utilisé pour décrire formellement les relations logiques, ou le calcul. Essayer de le traduire fidèlement en anglais est forcément maladroit et inutile. Quelque chose d'aussi trivial que le prédicat dans votre question se transforme en quelque chose d'idiot, difficile à comprendre et difficile à travailler.

P.S. L'orthographe correcte du mot que vous aimez tant est représentation. http://machaut.uchicago.edu/?resource=Webster%27s&word=representation&use1913=on

+1

La lecture d'anglais est une habitude que j'encourage, mais je suis d'accord avec toi qu'Andrea l'a prise trop loin. Le point que j'ai essayé (et échoué, apparemment) de faire est simplement qu'il est faux et inutile d'essayer de lire Prolog impérativement comme C ou Python. L'anglais est une "cible" déclarative décente, mais pas une grande; Prolog est mieux lu comme Prolog seul. –

Questions connexes