Prolog 如果前提条件为真,如何定义规则?
我尝试将IP地址分配给具有Prolog 如果前提条件为真,如何定义规则?,prolog,Prolog,我尝试将IP地址分配给具有host\u IP的主机。但我希望定义的任何IP地址都应该满足一些先决条件。首先,地址八位字节不应超过有效范围,其次,我只希望地址来自A类网络10.0.0.0/8 我尝试使用assertz,但它没有按预期工作: byte(X) :- integer(X), X >= 0, X =< 255. ip(A, B, C, D) :- byte(A), byte(B), byte(C), byte(D). valid_ip(A, B, C, D) :- i
host\u IP
的主机。但我希望定义的任何IP地址都应该满足一些先决条件。首先,地址八位字节不应超过有效范围,其次,我只希望地址来自A类网络10.0.0.0/8
我尝试使用assertz
,但它没有按预期工作:
byte(X) :- integer(X), X >= 0, X =< 255.
ip(A, B, C, D) :- byte(A), byte(B), byte(C), byte(D).
valid_ip(A, B, C, D) :-
ip(A, B, C, D),
A = 10.
add_host(Name, A, B, C, D) :-
valid_ip(A, B, C, D),
assertz(host_ip(Name, A, B, C, D)).
add_host(host1, 10, 0, 0, 1).
add_host(host2, 11, 0, 0, 1).
?- valid_ip(1,2,3,4).
false.
?- valid_ip(10,2,3,4).
true.
?- valid_ip(1000,2,3,4).
false.
?- host_ip(H, A, B, C, D).
H = host1,
A = 10,
B = C, C = 0,
D = 1.
但是我无法查询主机1的IP地址
?- host_ip(host1, X).
ERROR: toplevel: Undefined procedure: host_ip/2 (DWIM could not correct goal)
我的
assertz
使用有什么问题?两个独立的问题:
事实与指令
您的程序当前只包含事实add\u host/5
形式的事实
您可以通过以下方式查询这些事实:
?- add_host(H, A, B, C, D).
H = host1,
A = 10,
B = C, C = 0,
D = 1 ;
H = host2,
A = 11,
B = C, C = 0,
D = 1.
请注意,加载此文件时,您将收到类似以下内容的警告:
Initialization goal failed
在这种情况下,错误消息会告诉您什么是错误的:您正在断言形式为host\u ip/5
的事实,它们如预期的那样存在:
byte(X) :- integer(X), X >= 0, X =< 255.
ip(A, B, C, D) :- byte(A), byte(B), byte(C), byte(D).
valid_ip(A, B, C, D) :-
ip(A, B, C, D),
A = 10.
add_host(Name, A, B, C, D) :-
valid_ip(A, B, C, D),
assertz(host_ip(Name, A, B, C, D)).
add_host(host1, 10, 0, 0, 1).
add_host(host2, 11, 0, 0, 1).
?- valid_ip(1,2,3,4).
false.
?- valid_ip(10,2,3,4).
true.
?- valid_ip(1000,2,3,4).
false.
?- host_ip(H, A, B, C, D).
H = host1,
A = 10,
B = C, C = 0,
D = 1.
-主机ip(H、A、B、C、D)。
H=主机1,
A=10,
B=C,C=0,
D=1。
将数字保持在一起,考虑使用例如“代码> AdjTZ(HoestyIP(主机,IP(A,B,C,D))< /代码>,断言表单<代码> HoSTip IP/2 ,其中第二个参数表示IP,使用适当的<强>复合项< /强> .< /P> < P>两个独立问题:
事实与指令 您的程序当前只包含事实add\u host/5
形式的事实
您可以通过以下方式查询这些事实:
?- add_host(H, A, B, C, D).
H = host1,
A = 10,
B = C, C = 0,
D = 1 ;
H = host2,
A = 11,
B = C, C = 0,
D = 1.
请注意,加载此文件时,您将收到类似以下内容的警告:
Initialization goal failed
在这种情况下,错误消息会告诉您什么是错误的:您正在断言形式为host\u ip/5
的事实,它们如预期的那样存在:
byte(X) :- integer(X), X >= 0, X =< 255.
ip(A, B, C, D) :- byte(A), byte(B), byte(C), byte(D).
valid_ip(A, B, C, D) :-
ip(A, B, C, D),
A = 10.
add_host(Name, A, B, C, D) :-
valid_ip(A, B, C, D),
assertz(host_ip(Name, A, B, C, D)).
add_host(host1, 10, 0, 0, 1).
add_host(host2, 11, 0, 0, 1).
?- valid_ip(1,2,3,4).
false.
?- valid_ip(10,2,3,4).
true.
?- valid_ip(1000,2,3,4).
false.
?- host_ip(H, A, B, C, D).
H = host1,
A = 10,
B = C, C = 0,
D = 1.
-主机ip(H、A、B、C、D)。
H=主机1,
A=10,
B=C,C=0,
D=1。
将数字保持在一起,考虑使用例如“代码> AdjTZ(HoestyIP(主机,IP(A,B,C,D))< /代码>,断言表单<代码> HoSTip IP/ 2 ,其中第二个参数用适当的<强>复合词< /强>表示:IP:<代码> AsjTZ(Hoestip IP(名称,A,B,C,D))。< /代码>添加了条款<代码>(名称,A,B,C,D)在Prolog数据库中。此定义是一个具有五个参数的谓词主机ip,但当您查询
主机ip(host1,X)时。
您要求一个具有两个参数的谓词主机ip
你可以简单地将A,B,C,D连接在一个原子中,就像:
add_host(Name, A, B, C, D) :-
valid_ip(A, B, C, D),
atom_concat(A,B,X),
atom_concat(X,C,Y),
atom_concat(Y,D,Z),
assertz(host_ip(Name, Z)).
行:assertz(host_ip(Name,A,B,C,D))。
在Prolog数据库中添加了子句host_ip(Name,A,B,C,D)
。此定义是一个具有五个参数的谓词host_ip,但当您查询host_ip(host1,X)时。
您需要一个具有两个参数的谓词host_ip
你可以简单地将A,B,C,D连接在一个原子中,就像:
add_host(Name, A, B, C, D) :-
valid_ip(A, B, C, D),
atom_concat(A,B,X),
atom_concat(X,C,Y),
atom_concat(Y,D,Z),
assertz(host_ip(Name, Z)).