5
votes

HiLog ajoute-t-il quelque chose qui ne peut pas être fait avec "appel" dans Prolog?

L'article Wikipedia pour Prolog déclare:

Le style de programmation d'ordre supérieur de Prolog a été lancé dans HiLog et Î »Prolog.

La motivation de HiLog inclut sa capacité à implémenter des prédicats d'ordre supérieur comme maplist :

maplist(_, [], []).
maplist(P, [X|Xs], [Y|Ys]) :- call(P, X, Y), maplist(P, Xs, Ys).

L'article qui décrit HiLog suppose que Prolog n'a que l' call/1 , pas l' call/3 .

Cependant, puisque Prolog (maintenant) a call/3 , maplist peut être facilement implémenté dedans:

maplist(F)([],[]).
maplist(F)([X|Xs],[Y|Ys]) <- F(X,Y), maplist(F)(Xs,Ys).

HiLog a-t-il principalement un intérêt historique, ou sa logique "d'ordre supérieur" est-elle plus générale que ce qui est disponible dans Prolog maintenant?


2 commentaires

Maintenant que je repense à cette question, j'aurais dû lui donner un vote serré pour ne pas être objectif. J'ai été dans quelques autres forums ce matin et je ne me suis pas contenté de poser des questions objectives.


@GuyCoder J'ai édité le titre pour mieux refléter la question réelle. Je pense que c'est objectif et responsable. Voir ma réponse


3 Réponses :


3
votes

Un peu vaguement:

HiLog n'est pas dans Prolog (Prolog reste Prolog) mais est utilisé dans Flora , qui est essentiellement une base de données orientée objet basée sur la logique. Il a sa propre syntaxe et fonctionne sur XSB Prolog .

Si je comprends bien, l'idée de HiLog est d'avoir une syntaxe pratique définie pour les prédicats "d'ordre supérieur", en autorisant les variables dans les positions de nom de prédicat. C'est la différence entre les deux exemples maplist .

Cela ressemble à une logique du 2 ème ordre (qui devient non calculable / intraitable car il n'y a aucun moyen de savoir si un prédicat F est lié à un prédicat G en général car vous pouvez être obligé de comparer leur étendue, tous les points où ils réussissent) mais est aplati au premier ordre (calculable) par restriction à l'égalité syntaxique ( F et G sont les mêmes si le nom du même prédicat, foo/2 ) à quel point on peut déployer call/N pour générer Code Prolog.

Donc, oui, actuellement, vous devez sauter à travers des obstacles pour exprimer des déclarations dans Prolog qui peuvent être une seule ligne dans HiLog (je n'ai pas d'exemples cependant, je n'ai pas trop réfléchi à ce sujet). C'est la différence entre C et ... euh ... Prolog!

Semblable à une foule d'autres idées d'extensions / modifications de Prolog dans divers X-logs, qui n'ont pas toutes été implémentées (j'ai une fois essayé de faire une image de vue d'ensemble ici ), la "syntaxe HiLog" (ou quelque chose de similaire) peut être trouvé dans un X-log spécialisé du futur qui sort de sa niche.


6 commentaires

may be found in a specialized X-log of the future XSB l'inclut (c'est pourquoi je pense que c'est utile), mais je ne peux pas non plus penser à des exemples.


@MaxB En effet, c'est en XSB - page 80 du manuel (PDF). Je pensais que c'était seulement à Flora.


Exemple, je pense: foo(X) :- P(X), P(-X). " foo(X) est vrai s'il existe un prédicat P tel que P(X) et P(-X) ". Je ne pense pas que cela puisse être exprimé avec un call .


@MaxB Eh bien, au niveau le plus bas, il faudrait parcourir la base de données Prolog, trouver tous les prédicats P de l'arité 1, essayer de savoir quels arguments ils prennent, puis pour tous les arguments X collectés, appeler P(X),P(-X) pour vérifier si vous avez une solution. Ouais, c'est une grave explosion combinatoire. C'est aussi semi-décidable je pense: s'il y a une solution, vous la trouverez (malheureusement, l'univers ne vivra peut-être pas assez longtemps pour que vous puissiez profiter de ce petit fait mathématique), mais s'il n'y en a pas, vous ne serez jamais sûr.


Aucune explosion. C'est linéaire. Mais de toute façon, c'est juste un exemple de quelque chose que l' call ne peut pas faire, AFAIK.


Il semble que j'ai répondu à ma propre question is its "higher-order" logic more general that what's available in Prolog now , mais votre message m'a inspiré à réfléchir



3
votes

Depuis le wiki

Bien que, syntaxiquement, HiLog étende strictement la logique du premier ordre, HiLog peut être intégré dans cette logique.

Tout terme HiLog peut être traduit en terme Prolog ( HiLog: A foundation for Higher-Order Logic Programming - Weidong Chen, Michael Kifer, David S.Warren - 1993 ). Donc dans un sens oui, ce n'est pas plus général que Prolog.

Permettez-moi de citer quelques conclusions du document

Premièrement, la programmation dans HiLog rend plus logiques les programmes logiques. Nous exhortons tous les programmeurs Prolog à rendre leurs programmes aussi purs que possible et à éviter les méfaits des constructions non logiques de Prolog. Dans Prolog, le mélange des symboles de prédicat et de fonction, en particulier dans le prédicat, call / 1, est non logique, alors que dans HiLog, il est complètement logique et est un citoyen de premier ordre. Ainsi, dans HiLog, les programmeurs n'ont pas besoin d'éviter d'utiliser call / l, et ont ainsi plus de flexibilité dans leur tâche d'écrire des programmes en logique pure.

Deuxièmement, même si l'on peut dire que HiLog est simplement une variante syntaxique de Prolog, la syntaxe est importante quand on fait de la méta-programmation. Comme dans la méta-programmation, la syntaxe détermine les structures de données à manipuler, une syntaxe plus simple signifie que les méta-programmes peuvent être beaucoup plus simples.


4 commentaires

C'est vrai, dans un sens, mais vous devez accepter de n'utiliser qu'un seul prédicat ( apply ) pour tous vos faits, règles et requêtes.


L '"ordre supérieur" dans l'article est en fait le "méta" utilisé généralement, "Prédicat d'ordre supérieur" / "Meta prédicat" - vous pouvez écrire des déclarations traitant d'autres prédicats, en particulier les appeler ou rechercher des solutions syntaxiques dans le base de données. Ce n'est pas vraiment l '«ordre supérieur» de la « logique d'ordre supérieur» logique qui est ... complexe.


@DavidTonhofer @MaxB: Je parle de l'expressivité du langage lui-même (pas de la gentillesse de la syntaxe). Il y a des déclarations qui ne peuvent pas être exprimées en logique du premier ordre, pour lesquelles nous avons besoin d'une quantification sur des ensembles d'ensembles, etc. Alors que HiLog étend (strictement) la logique du premier ordre, ce n'est pas plus expressif. Toute expression dans sa langue peut être traduite en une expression équivalente dans prolog (et oui, elle aura beaucoup d' call et d' apply ). Regardez la section 3.3 du document.


@rajashekar D'accord avec cela.



1
votes

Puisque j'ai répondu à ma propre question dans les commentaires, je la posterai ici:

Il y a des choses que vous pouvez faire dans HiLog, qui ne peuvent pas être faites avec un call dans Prolog, par exemple:

Requêtes comme:

foo(X, Y) :- Z(X), Z(Y(X)).

Des affirmations comme:

?- X(dog, 55, Y).

Comme indiqué dans l'article HiLog susmentionné et la page HiLog Wikipedia, Prolog peut émuler HiLog. Cependant, cela nécessite de convertir l'ensemble du programme et toutes les requêtes en un seul prédicat.


2 commentaires

Vous pouvez obtenir l'effet du premier d'entre eux en utilisant quelque chose comme query(P, Args) :- length(Args, Arity), current_predicate(P/Arity), Goal =.. [P | Args], catch(Goal, _, false). (appeler comme query(X, [dog, 55, Y]). ). La seconde est plus difficile mais devrait également être possible en utilisant de telles techniques.


pourriez-vous s'il vous plaît ajouter des liens vers «le papier» et «la page WP» dans la réponse proprement dite, afin qu'elle soit autosuffisante?