Prolog Problem
-
Hi
Ich hoffe mir kann irgendeiner helfen.
Es geht um folgendes ich möchte ein Prädikat definieren, dass folgendermassen aussehen soll.not_true_all(+Term,+List1,?List2)
Es soll alle elemente der Liste1 die nicht for Term wahr sind in Liste2 wieder geben.
Mein Problem ist nicht so sehr die definition sondern ein verhalten das ich nicht verstehe.
Bsp:
not_true_all(Pred,List,Res):-not_true_all(Pred,List,[],Res). not_true_all(_,[],_,_). not_true_all(Pred,[Head|Tail],Sofar,Res):-Goal=..[Pred,Head], (Goal),!,not_true_all(Pred,Tail,Sofar,Res); append(Sofar,[Head],RL),not_true_all(Pred,Tail,RL,RL).
So weit sogut. Das Prädikat not_true_all/4 funktionert das heist Res wird dann mit der Liste der Elemente die nicht wahr waren unifiziert. Aber ich ruf aus dem Program not_true_all/3 auf
und dann ist Res nicht an die Liste gebunden sondern an gar nichts.Warum kann ich den Wert nicht an not_true_all/3 durchreichen ?
-
HI Prolog, hier kennt sich GARANTIERT(!) niemand mit Prolog aus.
-
Original erstellt von prolog:
**Aber ich ruf aus dem Program not_true_all/3 auf
und dann ist Res nicht an die Liste gebunden sondern an gar nichts.Warum kann ich den Wert nicht an not_true_all/3 durchreichen ?**
Hm, macht das was? Res bleibt halt ungebunden bis not_true_all/4 was da unifiziert. Sonst hättest du dasselbe problem ansich doch bei not_true_all/4. Meckert Prolog das an?
@Progra: wie war das mit garantiert?
[ Dieser Beitrag wurde am 01.07.2003 um 23:05 Uhr von TriPhoenix editiert. ]
-
Hi
Genau das is ja das problem. Wenn ich mir den Wert ausgeben lasse bei not_tue_all/3, bei der Abbruchbedingung dann ist alles ok.
also wenn die Abruch bedingung so aussieht:
not_true_all(,[],,Erg):-write(Erg),nl.
und ich rufe not_true_all/4 direkt auf bekomme ich als output zB:
?- not_true_all(integer,[1,2,3,b,4,c,6,d],[],Erg). [b,c,d] Erg=_G187
Also bei der Abruchbedingung ist der Wert da aber wird nicht gebunden. Warum ?
Ich hab irgendwie das gefühl das das n ganz dummer fehler is.
btw. Ich hab schon ein Prädikat not_true1(+Pred,+List,?List) das einwandfrei funktioniert. not_true_all/4 is eigentlich nur eine erweiterung. Die sind beide
fast identisch und trotzdem funtioniert eins und eins nicht.not_true1(_,[],_). not_true1(Pred,[Head|Tail],Res):-Goal=..[Pred,Head],(Goal),!, not_true1(Pred,Tail,Res); Result=Head,not_true1(Pred,[],Result).
Das funktioniert.
Res wird erfolgreich gebunden.[ Dieser Beitrag wurde am 02.07.2003 um 11:38 Uhr von prolog editiert. ]
-
HI
Ich habs geloest. Ich habs mal wieder viel zu kompliziert gemacht.
Es hat sich jetzt folgende einfache Lösung ergeben.
not_true_all(,[],[]).
not_true_all(Pred,[H|T],[H|Rest]):-Goal=..[Pred,H],not(Goal),not_true_all(Pred,T,Rest).
not_true_all(Pred,[|T],Rest):-not_true_all(Pred,T,Rest).Die vorherige Version war garnicht als Generator geeignet.
@TriPhoenix gut zu wissen, dass ich nicht der einzige bin der sich mit sowas rumschlägt.[ Dieser Beitrag wurde am 02.07.2003 um 12:44 Uhr von prolog editiert. ]