Prolog: Prädikat invertieren

OP #4966642
Lesenswert?

Hallo zusammen,
falls sich hier jemand mit Prolog auskennt. Ich habe ein Prädikat das 
beweisbar ist, wenn das Element E in der Liste enthalten ist.
1
member( E, [E|_] ).
2
member( E, [_|R] ) :- member( E, R ).

Wie kann ich davon die Negation bilden? Mir fallen die Möglichkeiten 
"fail" und vielleicht "!" ein, aber irgendwie fehlt mir der Ansatz das 
zu realisieren.

Gruß
Dennis
Gast #4967302
Lesenswert?

Dennis S. schrieb:
> member( E, [E|_] ).
> member( E, [_|R] ) :- member( E, R ).
>
> Wie kann ich davon die Negation bilden?

Oh, ein Prolog Programmierer.

member/2 ist bereits in Prolog implementiert. Du solltest andere Namen
wählen.

Zwei Möglichkeiten sind:
1
member1(E,[E|_]).
2
member1(E,[_|T]) :- 
3
        member1(E,T).
4

5
notmember1(E,L) :-
6
        member1(E,L),!,fail.
7
notmember1(E,L).
8

9
notmember2(E,L) :-
10
        member1(E,L), !, fail
11
        ;
12
        true.

Viele Prolog Implementierungen haben bereits ein not implementiert:
Damit wird ein Aufruf zu:
1
not member1(a,[x,y,z]).

Im Standard gibt es den Operator \+
1
\+member1(a,[x,y,z]).
OP #4967439
Lesenswert?

Josef schrieb:
> Oh, ein Prolog Programmierer.
Das würde ich so nicht unterschreiben! :-D

> member/2 ist bereits in Prolog implementiert. Du solltest andere Namen
> wählen.
Ja, du hast Recht. War jetzt auch erst mal eine Pen-and-Paper-Übung.

> notmember1(E,L) :-
>         member1(E,L),!,fail.
> notmember1(E,L).
> \+member1(a,[x,y,z]).
So einfach.. ich wusste, dass ich das irgendwie mit ! und fail 
hinbekommen kann, aber mir fehlt doch noch ein bisschen das Verständnis.

Vielen Dank für deinen Input.

Gruß
Dennis

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren