IPv4地址的Prolog确定子句语法程序

IPv4地址的Prolog确定子句语法程序,prolog,dcg,Prolog,Dcg,我目前正在尝试设置一个小程序,以便在使用中接受IPv4虚线四元字符串(在假期里走出舒适区?是的,我可以!)。这可能需要我再花一个小时左右的时间,但也许读者中有人已经准备好了。在这种情况下,我可以攻击。我将尝试回答SWISH,on 这是代码,以防链接不稳定 :- use_module(library(dcg/basics)). atom_ipv4(A, IPV4) :- atom_codes(A, Cs), phrase(ipv4(IPV4), Cs). ipv4(D) -->

我目前正在尝试设置一个小程序,以便在使用中接受IPv4虚线四元字符串(在假期里走出舒适区?是的,我可以!)。这可能需要我再花一个小时左右的时间,但也许读者中有人已经准备好了。在这种情况下,我可以攻击。

我将尝试回答SWISH,on

这是代码,以防链接不稳定

:- use_module(library(dcg/basics)).

atom_ipv4(A, IPV4) :- atom_codes(A, Cs), phrase(ipv4(IPV4), Cs).

ipv4(D) -->
    dotted(D).
ipv4(range(D, R)) -->
    dotted(D), "/", integer(R).

dotted(address(A, B, C, D)) -->
    octet(A), ".", octet(B), ".", octet(C), ".", octet(D).

octet(A) --> integer(A), {A < 256}.
:-使用_模块(库(dcg/basics))。
atom_ipv4(A,ipv4):-atom_代码(A,Cs),短语(ipv4(ipv4),Cs)。
ipv4(D)-->
点(D)。
ipv4(范围(D,R))-->
点(D),“/”,整数(R)。
虚线(地址(A、B、C、D))-->
八重奏(A),“,”八重奏(B),“,”八重奏(C),“,”八重奏(D)。
八位位组(A)-->整数(A),{A<256}。
注意:这个规范肯定比这个代码段捕获的更复杂,因为它允许十六进制,以及更多。。。我的目的是指出图书馆的可用性(dcg/basics)

答案2:

%原子“X”是有效的IPv4地址吗?
%将原子“X”转换为字符代码列表,然后对其进行处理
is_ipv4(X):-字符串_代码(X,代码),短语(ipv4,代码)。
%测试上述
测试:-is_ipv4('127.0.0.1'),
是ipv4('255.255.255.255'),
is_ipv4(“10.10.10.1”),
is_ipv4('0010.00010.000.0000'),
\+is_ipv4('256.0.0.1'),
\+is_ipv4('12.0'),
\+是ipv4(“”)。
% ----------------------
%使用Definite子句语法分析字符代码列表
%子元素的查询方式如下:
%短语(四部分,`255`,[])。
%短语(pdigits(X,Y),`123`,[])。
ipv4-->四部分,点,四部分,点,四部分,点,四部分,点,四部分。
点-->`。
四部分-->pdigits(Q,Q),{Q<256}。
pdigit(向上功率,向上值)->pdigit(值)!,pdigits(DownPower,DownPower),{UpValue是DownPower*Value+DownPower,UpPower是DownPower*10}。
pdigits(1,0)--->[]。
pdigit(值)->[D],{code_type(D,digit(值))}。
% ---------------------

非常好,甚至可以使用子网表示法。这就是答案!我有一个可以将地址转换为一个列表字符而不是一个原子列表,并且不做子网表示法和手动计算整数值:哦,该死的,我做了一些操作错误并划伤了你的代码。。。人能康复吗?显然不是,帮助文件说“将来,我们将添加版本控制。”。。。对不起@false:这是我第一次测试SWISH。我将在这里复制这个片段,但是测试本身更有趣。我不认为这些文件是临时的,只是一把小提琴。。。但是由于它们缺少版本控制,我肯定会在这里发布代码。
% Is the atom 'X' a valid IPv4 address?
% Transform the atom 'X' into a list of character codes, which is then processed

is_ipv4(X) :- string_codes(X,Codes), phrase(ipv4, Codes).

% Testing the above

test :- is_ipv4('127.0.0.1'),
    is_ipv4('255.255.255.255'),
    is_ipv4('10.10.10.1'),
    is_ipv4('0010.00010.000.0000'),
    \+is_ipv4('256.0.0.1'),
    \+is_ipv4('12.0.'),
    \+is_ipv4('').


% ----------------------
% Use Definite Clause Grammer to parse a list of character codes
% Subelements can be queried like this: 
% phrase(quadpart, `255`, []).
% phrase(pdigits(X,Y), `123`, []).

ipv4                     --> quadpart, dot, quadpart, dot, quadpart, dot, quadpart.
dot                      --> `.`.
quadpart                 --> pdigits(_,Q), { Q < 256 }.
pdigits(UpPower,UpValue) --> pdigit(Value), !, pdigits(DownPower, DownValue), { UpValue is DownPower*Value+DownValue, UpPower is DownPower*10 }.
pdigits(1,0)             --> [].
pdigit(Value)            --> [D], { code_type(D, digit(Value)) }.
% ---------------------