Question

Je commence tout juste avec Prolog, et je ne comprends pas pourquoi ce qui suit ne fonctionne pas comme prévu. J'essaie de créer un prédicat qui renvoie true si la liste L2 est contenue dans L1. C'est ce que j'ai écrit:

assert(contains (L1, L1)).
assert(contains(L1, [X|L2]):-member(X, L1), contains(L1, L2)).
assert(contains(L1, [])).

J'ai pensé que ce serait l'équivalent de & "; si X de 'L3 = X | L2' est dans L1, et que L2 est aussi dans L1, alors vrai! &" ;, avec contient (L1, L2 ) en cours de traduction récursive jusqu'à ce que tous les membres aient été traversés et que la dernière option nous reste, ou que nous trouvions un membre qui n'est pas dans la L1 et que le prédicat échouera.

Malheureusement, cela ne semble pas fonctionner de cette façon. Il semble ne renvoyer que la valeur du membre (X, L1), donc contient ([1,2,3], [1,4,5]) passe, mais contient ([1,2,3], [4, 1,5]) ne.

Qu'est-ce que je fais mal?

Était-ce utile?

La solution

Je n'ai pas complètement compris votre question, mais j'écrirais le prédicat contains/2 comme ceci:

% An empty list is contained by any list
contains(_, []).

% If a list is not empty, then its
% first element must be an element of L1,
% and its tail must be contained by L1.
contains(L1, [X | L2]) :-
    member(X, L1),
    contains(L1, L2).

Btw, notez que votre première règle (fait)

contains (L1, L1).

est une erreur de syntaxe (il ne devrait pas y avoir d'espace après le nom du prédicat). En outre, si corrigé, cela créerait un point de choix indésirable. Donc, supprimez-le plutôt.

Si vous souhaitez utiliser assert/1 à l'invite de Prolog, exécutez

.
?- assert(contains(_, [])).

Yes
?- assert(contains(L1, [X | L2]) :- (member(X, L1), contains(L1, L2))).

Yes

Pour voir ce qui a fini dans la base de connaissances, utilisez listing/0.

?- listing.

:- dynamic contains/2.

contains(_, []).
contains(B, [A|C]) :-
    member(A, B),
    contains(B, C).

Yes

Je ne pense pas que le problème vienne de & "affirmer des variables libres &"; comme vous l'indiquez dans votre propre réponse. Au lieu de cela, vérifiez votre bracketing.

Autres conseils

Apparemment, l’utilisation d’assertions sur des variables libres peut poser des problèmes (du moins dans cette version), c’est pourquoi il s’est mal comporté. Supprimer les assertions et utiliser une commande de consultation (fichier) a résolu ce problème.

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