Forum: PC-Programmierung Prolog: Prädikat invertieren


von Dennis S. (eltio)


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

von Josef (Gast)


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]).

von Dennis S. (eltio)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.