Ich will erstellen Sie dynamische Fakten in prolog
Schrieb ich folgenden einfachen code, und ich erwarte, dass, wenn ich Schreibe " Mann.', dieser code bitten, mir einmal: "ist es Männlich?" und wenn ich input 'Nein', Sie schreiben auf dem Bildschirm "Sie eine Frau ist".
male :- ( print('is it male ? '),read(yes)) -> true; asserta( not(male)),female.
female:- not(male),print('she is female').
not(P) :- (call(P) -> fail ; true) .
aber dieser code hat folgenden Fehler:
uncaught exception: error(permission_error(modify,static_procedure,not/1),asserta/1);
den Fehler in swi-prolog :
ERROR: asserta/1: No permission to modify static_procedure `not/1'
- nicht/1 ist eine vordefinierte statische Verfahren. Ändern Sie den Namen in etwas anderes. Auch scheint es nicht ganz richtig, was Sie tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Als gusbro gesagt, nicht/1 ist eine vordefinierte statische Verfahren (und daher ist es nicht eine gute Idee, denselben Namen zu verwenden). Dies ist jedoch nicht der Grund, warum du den Fehler in swi-prolog-wie können Sie überschreiben die standard-definition:
das problem ist, dass Sie bereits definiert haben, die nicht/1 in Ihrem code, wenn Sie nicht erklären, ein Prädikat, das explizit als dynamische, swi-prolog davon aus, dass es statisch und wird Ihnen nicht erlauben, um es zu ändern.
Können Sie deklarieren es als dynamische, durch einfügen dieser Zeile im code:
Ich denke, dass dies nicht das problem lösen, in anderen prolog-Implementierungen (zB gnu-prolog), wie die Fehlermeldung sagt
permission_error(modify,static_procedure,not/1)
; in jedem Fall ist es empfehlenswert, den Namen zu ändern.Durch die Art und Weise, es wäre einfacher und sauberer, einfach testen, was das argument ist, und drucken Sie die entsprechende Nachricht. Wenn, jedoch, Sie wollen etwas schaffen, mehr komplexe (mit einem Staat, vielleicht) könnte man Globale Variablen verwenden, da Sie effizienter sind, dass assert/retract.