Prolog 如果前提条件为真,如何定义规则?

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

我尝试将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) :-
    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)).