Die Fakten Sie geschrieben haben, sind äquivalent zu den folgenden Regeln:
address(host1, '10.0.0.1') :- true.
address(host2, '10.0.0.2') :- true.
true/0
ist die allgemeinstes Ziel: Es gelingt immer.
Um constrain die Klauseln stärker, können Sie weitere Ziele hinzufügen. In Prolog fungiert jedes Ziel als Constraint auf Antworten.
@ Coders Antwort ist genau richtig: Sie können einfach Regeln schreiben, um diese Überprüfungen hinzuzufügen, und sie sind ähnlich (und ausdrucksstärker als) Ihre Datenbankeinschränkungen.
Zum Beispiel können Sie schreiben:
host_ip(host1, IP) :- IP = '10.0.0.1', good_ip(IP).
host_ip(host2, IP) :- IP = '10.0.0.2', good_ip(IP).
Hinweis der Prädikat Namenskonvention: Um deutlich zu machen, was jedes Argument ist, verwende ich host_ip/2
anstatt einfach address/2
.
Eine mögliche Definition von good_ip/1
wäre:
good_ip(IP) :- atom_concat('10.', _, IP).
Das mit 10.
wahr iffIP
startet ist.
An dieser Stelle stellt sich die Frage, ob Sie die am besten geeignete Darstellung von IP Adressen gewählt haben!
Wenn Sie häufig Komponenten analysieren müssen, sollten Sie zum Beispiel die Darstellung:
ip(A,B,C,D)
In dieser Darstellung können wir schreiben:
host_ip(host1, IP) :- IP = ip(10,0,0,1), good_ip(IP).
host_ip(host2, IP) :- IP = ip(10,0,0,2), good_ip(IP).
good_ip(ip(10,_,_,_)).
EDIT: Wie Sie richtig in den Kommentaren darauf hin, dies verhindert, dass nur falsch IPs zu holen, nicht oder Geltendmachung falsche Tatsachen oder Klauseln hinzuzufügen.
Um letzteres möglich zu machen, sollten Sie die von @lurker skizzierte Ansatz: Sie können einfach eine Regel wie definieren: Dieses Sie
add_host_ip(Host, IP) :-
good_ip(IP),
assertz(host_ip(Host,IP)).
von verhindert das Hinzufügen falsche IP-Adressen in der Datenbank, Sie konsequent unter der Annahme verwenden dieses Schnittstellenprädikat.
Beachten Sie auch, dass Sie dies mit dem Auslösen einer Ausnahme kombinieren, wenn eine falsche IP angegeben wird. Zum Beispiel:
good_ip(ip(First,_,_,_)) :-
dif(First, 10),
throw(wrong_subnet(First)).
good_ip(ip(10,_,_,_)).
Beispielsitzung:
?- add_host_ip(host3, ip(11,0,0,0)).
ERROR: Unhandled exception: wrong_subnet(11)
?- add_host_ip(host4, ip(10,0,0,1)).
true.
?- host_ip(host3, IP).
false.
?- host_ip(host4, IP).
IP = ip(10, 0, 0, 1).
Dies zeigt, dass ungültige IP-Adressen werden jetzt weder gespeichert noch als Antworten zurückgegeben.
Aber in Ihrem Beispiel ist es immer noch möglich, eine ungültige Adresse 'Host'_ip (Host3, IP) zu definieren: - IP = IP (1,2,3,4), Good_IP (IP) .' Der Effekt ist nur, dass es nicht mehr gefunden werden kann. Aber die Fakten-Datenbank ist immer noch korrupt, denn obwohl eine Adresse für 'host3' definiert wurde, fehlt sie. – ceving
Das stimmt; Ich habe Code hinzugefügt, der zeigt, wie Sie dies verhindern können. – mat