Question

L'opérateur de tuyau dans les déclarations prolog une ou plusieurs têtes atomiques et une liste de queue.

?- [a,b,c] = [a,b|[c]].
true.

tubes multiples nichant dans une seule peut être fait semblable à ceci:

?- [a,b,c] = [a|[b|[c]]].
true.

Qu'est-ce que la déclaration [a|b|c] déduisent au sujet a, b et c?

EDIT

Jusqu'à présent, tout ce que je peux en déduire est:

?- [a,b,c] = [a|b|c].
false.

Je suis plus intéressé par techniques pour trouver la réponse plutôt que de répondre à cette question à la limite inutile.

EDIT2 Je ne suis évidemment pas trop familier avec Prolog, une simple affectation a répondu à ma question ...

?- R = [a|b|c].
R = [a| (b'|'c)].

Qu'est-ce qui se passe avec (b'|'c) exactement?

Était-ce utile?

La solution

Depuis que je suis votre professeur I, voici ma réponse.
(Oh, et je peux vous confirmer que ce n'est pas ses devoirs, il est lié à l'examen de la pratique).

La [a|b|c] de syntaxe ne semble pas réellement être Prolog standard, et certaines implémentations interpréter différemment. (Si j'avais su cela, je ne pourrais pas avoir utilisé.)

Certains l'interprètent comme [a|[b|c]]. (Comme je l'ai prévu.)

Mais avec SWI Prolog (et probablement d'autres):

?- [a|b|c] = [a|[b|c]].
false.

Le (b '|' c) est en fait construit à l'aide '|' plutôt que '.' comme une liste serait. Ainsi, le second | ne soit pas interprété comme faisant partie de la construction d'une liste à tous.

Pour confirmer, ce qui suit réussit:

   ?- X=(b|c), [a|b|c] = [a|X].
   X = (b'|'c) .

Le '|' semble ici être un autre opérateur binaire à des conditions tout comme '.'.

Au lieu de [a|b|c] la norme dans Prolog est d'utiliser [a,b|c].

(je ne décidé d'utiliser [a|b|c] dans la programmation Paradigmes car elle concerne plus directement la notation a::b::c de F #, et nous ne avons vu un petit aperçu de Prolog. À l'avenir, je pense que je vais raconter à [a|[b|c]] puis donner [a,b|c] comme une abréviation.)

Autres conseils

Il est pas une déclaration, c'est un terme, et cela ne signifie rien du tout a, b ou c. Il construit juste une liste non conforme.

Pour élaborer: La syntaxe de [|] est en fait du sucre syntaxique pour l'opérateur .(). Les listes sont construites en interne par l'intermédiaire '.'(a,[]), mais puisque cela devient extrêmement fastidieux de taper tout de suite, vous êtes autorisé à écrire [a] à la place. Ainsi, l'opérateur . est censé prendre une chose et une liste et contructs alors une liste plus longue, mais comme il n'y a pas de frappe, personne ne vous empêche de l'appliquer à deux atomes, ou toute autre paire de choses. Le résultat est une structure sur laquelle réussir certaines opérations de liste et d'autres échouent. Ceci est parfois utile (penser arbres binaires), mais pas aussi commun que les listes, donc il n'y a pas de syntaxe de lecture spéciale pour elle.

(Il en va de même se produit avec l'opérateur cons en Lisp;. Si vous google « liste incorrecte » vous êtes susceptible d'obtenir beaucoup plus de résultats sur Lisp, mais le principe est exactement le même)

Dans ISO-Prolog, [a|b|c] est une syntaxe incorrecte. Et dans l'intervalle, également dans SWI. Il semble que vous utilisez une version plus ancienne. Certains systèmes Prolog ont donné ce terme une certaine interprétation. Hélas, tous diffèrent de la manière très précise la façon dont ils ont interprété ce terme. Certains comme [(a'|'b)|c] ou [a|(b'|'c)] ou [a|(b;c)] ... eh bien, vous l'obtenez.

connexe est l'utilisation de la barre comme un opérateur infixe ('|')/2.

ISO / CEI 13211-1: 1995 / Cor.2: 2012 , rectificatif technique 2, publié 2012-02-15 l'utilisation de la barre | comme opérateur infixe est maintenant défini avec précision. Avant cela, | a dû être cité. Ici est son projet .

Maintenant, '|' peut être défini comme un opérateur infixe mais seulement d'une priorité supérieure 1000. De cette manière, les cas ambigus autrement que [a|b|c] restent syntaxiquement invalide, mais utilise de | pour DCG et CHR sont valides.

Si vous voulez apprendre la syntaxe de l'essayer, le mieux est d'utiliser writeq/1 et write_canonical/1.

Le système le plus conforme w.r.t syntaxe ISO-Prolog est GNU Prolog.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top