address(host1, '10.0.0.1') :- true.
address(host2, '10.0.0.2') :- true.
true/0
是最一般的目標:它總是成功。
要約束條款更強烈,您可以添加更多目標。在Prolog中,每個目標在回答上充當約束。 @ coder的答案是現貨:你可以簡單地編寫規則來添加這些檢查,它們與你的數據庫約束相似(並且比表達更強)。
例如,你可以寫:
host_ip(host1, IP) :- IP = '10.0.0.1', good_ip(IP).
host_ip(host2, IP) :- IP = '10.0.0.2', good_ip(IP).
注意謂語命名約定:要明確每個參數是什麼,我使用host_ip/2
而不是簡單地address/2
。
的good_ip/1
一個可能的定義是:
good_ip(IP) :- atom_concat('10.', _, IP).
這是真的當且僅當IP
開始與10.
。
在這一點上,問題出現在您是否選擇了IP 地址的最合適的表示!
如果您經常需要分析的組件,例如考慮表示:
ip(A,B,C,D)
在此表示,我們可以這樣寫:
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,_,_,_)).
編輯:正如你在正確的評論指出,這只是阻止取錯誤 IP地址,而不是斷言或加入錯誤事實或條款。
,使它們成爲可能,考慮@lurker介紹的方法:你可以簡單地定義如下規則:從添加錯誤的IP地址到數據庫
add_host_ip(Host, IP) :-
good_ip(IP),
assertz(host_ip(Host,IP)).
這可以防止你的,假設你一直使用這個接口謂詞。
還請注意,如果給出了錯誤的IP,則將此與投擲例外相結合。例如:
good_ip(ip(First,_,_,_)) :-
dif(First, 10),
throw(wrong_subnet(First)).
good_ip(ip(10,_,_,_)).
實施例的會話:
?- 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).
這說明無效的IP現在既沒有存儲也不返回的答案。
但在你的例子中,仍然可以定義一個無效地址'host'_ip(host3,IP): - IP = ip(1,2,3,4),good_ip(IP) 。效果就是,它不能被發現了。但事實數據庫仍然是腐敗的,因爲儘管'host3'的地址已經被定義了,但是它缺失了。 – ceving
沒錯,我添加了代碼,顯示如何防止這種情況。 – mat