小编use*_*815的帖子

SWI-Prolog中的面向对象编程

我在某处读到你可以将模块视为Prolog中的对象.我试图解决这个问题,如果这是一个很好的编码方式.

如果我有两个文件,一个定义一个类狗,然后另一个使用这个类来生成两个狗对象.

:- module(dog,
      [ create_dog/4,bark/1 ]).

create_dog(Name,Age,Type,Dog):-
   Dog = dog(name(Name),age(Age),type(Type)).

bark(Dog):-
   Dog = dog(name(_Name),age(_Age),type(Type)),
   Type = bassethound,
   woof.
bark(Dog):-
   Dog = dog(name(_Name),age(_Age),type(Type)),
   Type \= bassethound,
   ruff.

woof:-format("woof~n").

ruff:-format("ruff~n").
Run Code Online (Sandbox Code Playgroud)

第二个档案

use_module(library(dog)).

run:-
   dog:create_dog('fred',5,bassethound,Dog),
   forall(between(1,5,_X),
       dog:bark(Dog)
      ),
   dog:create_dog('fido',6,bloodhound,Dog2),
   dog:bark(Dog2).
Run Code Online (Sandbox Code Playgroud)

这使得一只狗对象Dog是一只巴塞特猎犬并且让它吠5次,然后我再制作另一只狗对象Dog2,它是一只猎犬并使它也吠叫.我知道在oop中你有对象有行为和状态.所以我现在根据自己的状态有两个具有不同行为的对象,但目前我将对象的状态存储在Dog变量中,主程序中的代码可以看到它们.有没有办法隐藏对象的状态,即拥有私有变量?例如,我可能希望有一种方法可以为每个狗对象存储状态has_barked,如果它在程序中较早出现,则为true,否则为false,然后bark/1根据此更改行为.

您还将如何处理继承和覆盖方法等?任何指向读数的指针都欢迎.谢谢.

oop module object prolog swi-prolog

13
推荐指数
2
解决办法
2898
查看次数

不经过一次删除不正确的后续解

我有一个谓词,找到正确的解决方案,但接着找到不正确的解决方案.

?- data(D),data_threshold_nonredundantbumps(D,5,Bs),write(D).
[3,6,7,8,2,4,5,6,9,4,7,3]
D = [3, 6, 7, 8, 2, 4, 5, 6, 9|...],
Bs = [bump([11], [7]), bump([8, 9], [6, 9]), bump([2, 3, 4], [6, 7, 8])] ;
[3,6,7,8,2,4,5,6,9,4,7,3]
D = [3, 6, 7, 8, 2, 4, 5, 6, 9|...],
Bs = [bump([8, 9], [6, 9]), bump([2, 3, 4], [6, 7, 8])] ;
[3,6,7,8,2,4,5,6,9,4,7,3]
D = [3, 6, 7, 8, 2, 4, 5, 6, 9|...],
Bs = [bump([8], [6]), bump([2, 3, 4], [6, 7, 8])] ;
[3,6,7,8,2,4,5,6,9,4,7,3]
D …
Run Code Online (Sandbox Code Playgroud)

prolog dcg clpfd

11
推荐指数
1
解决办法
200
查看次数

prolog深度第一次迭代加深

我试图实现深度优先深度搜索状态空间图.我有一个带有三个顶点的图形,它们是两个激活边和两个禁止边.每个节点都有一个二进制值,统称这是图的状态.通过查看其中一个节点是高于阈值还是低于阈值(通过对所有传入节点求和计算),图形可以转换到新状态.每个转换最多只有一个节点会发生变化.由于它们是三个节点,它们是三个状态转换边缘,在状态转换图中留下每个状态.国家图

我认为我的state_change/3工作正常,例如我可以查询:

?-g_s_s(0,1,1,Begin),node(Arc),state_change(g_s(Begin),Second,Arc).
Run Code Online (Sandbox Code Playgroud)

它给了我三个正确的答案:

Begin = [node(v1, 0), node(v2, 1), node(v3, 1)],
Arc = v1,
Second = g_s([node(v1, 1), node(v2, 1), node(v3, 1)]) ;

Begin = [node(v1, 0), node(v2, 1), node(v3, 1)],
Arc = v2,
Second = g_s([node(v1, 0), node(v2, 0), node(v3, 1)]) ;

Begin = [node(v1, 0), node(v2, 1), node(v3, 1)],
Arc = v3,
Second = g_s([node(v1, 0), node(v2, 1), node(v3, 0)]) 
Run Code Online (Sandbox Code Playgroud)

我正在尝试使用Bratkos Prolog中为AI书提供的谓词id_path,这是问题11.3的解决方案,但我在使用/调整它时遇到了问题. 我想创建一个从起始节点到其他节点的路径,而没有进入循环 - 我不希望它有重复元素或在路径不存在时卡住.我希望路径说出起始状态,然后是一系列可以从起始状态访问的状态.如果有一个自循环,我希望每次到达那里都包含一次.即我想跟踪我进入状态空间的方式并使其独特,而不仅仅是状态空间在路径中是唯一的.

例如,从011开始,我希望所有三条长度为1的路径都可以找到弧线.

 ?-id_path(g_s([node(v1,0),node(v2,1),node(v3,1)],Last,[Temp],Path).
Path = [[node(v1,0),node(v2,1),node(v3,1)],to([node(v1,1),node(v2,1),node(v3,1)],v1)];
Path =[[node(v1,0),node(v2,1),node(v3,1)], to([node(v1,0),node(v2,0),node(v3,1)],v2)];
Path=[[node(v1,0),node(v2,1),node(v3,1)],to([node(v1,1),node(v2,1),node(v3,0)],v3)];
Run Code Online (Sandbox Code Playgroud)

然后在下一个级别所有具有三个节点的路径,显示它需要到达节点的两个弧,然后在下一个级别所有具有四个节点的路径显示它需要的三个弧等

如果这有用,我还将我的代码放在SWISH中?(第一次尝试这个?!) …

prolog depth-first-search iterative-deepening state-space recursive-backtracking

10
推荐指数
1
解决办法
1675
查看次数

SWI-Prolog读取http标头

我不完全理解SWI Prolog如何处理http.我有以下代码,这些代码主要与...不同get_header/1.我需要能够读取http请求的头文件以获取值.我怎么做?我用http_read_header/2吗?如果是这样的话?

:- http_handler(root(handle), myhandle,[]).

myhandle(Request):-
  get_header(H),
  http_read_json_dict(Request,DictIn),
  handle_dict(DictIn,DictOut),
  reply_json(DictOut).

get_header(H):-
  http_read_header(current_input, H),
  something(H).
Run Code Online (Sandbox Code Playgroud)

http prolog swi-prolog

6
推荐指数
1
解决办法
164
查看次数

为文件输入创建dcg的一般模式是什么?

我似乎总是很难写DCG来解析输入文件.但它似乎应该很简单?有什么提示或技巧可以考虑这个问题吗?

举一个具体的例子,假设我要解析一个fasta文件.(https://en.wikipedia.org/wiki/FASTA_format).我想在回溯上阅读每个描述和每个序列.

:- use_module(library(pio)).
:- use_module(library(dcg/basics)).
:- portray_text(true).
:- set_prolog_flag(double_quotes, codes).
:- set_prolog_flag(back_quotes,string).

fasta_file([]) -->[].
fasta_file([Section|Sections]) -->
   fasta_section(Section),
   fasta_file(Sections).


fasta_section(Section) -->
    fasta_description(Description),
    fasta_seq(Sequence),
    {Section =.. [section,Description,Sequence]}.

fasta_description(Description) -->
    ">",
    string(Description),
    {no_gt(Description),
     no_nl(Description)}.


fasta_seq([]) --> [].
fasta_seq(Seq) -->
    nt([S]),
    fasta_seq(Ss),
    {S="X"->Seq =Ss;Seq=[S|Ss]}.

 nt("A") --> "A".
 nt("C") --> "C".
 nt("G") --> "G".
 nt("T") --> "T".
 nt("X") --> "\n".

 no_gt([]).
 no_gt([E|Es]):-
     dif([E],">"),
     no_gt(Es).

 no_nl([]).
 no_nl([E|Es]):-
     dif([E],"\n"),
     no_nl(Es).
Run Code Online (Sandbox Code Playgroud)

现在这显然是错误的.我想要的行为是

 ?-phrase(fasta_section(S),">frog\nACGGGGTACG\n>duck\nACGTTAG").
 S = section("frog","ACGGGGTACG");
 S = section("duck","ACGTTAG");
 false.
Run Code Online (Sandbox Code Playgroud)

但是,如果我做了phrase(fasta_file(Sections),">frog\nACGGGGTACG\n>duck\nACGTTAG). Sections与一个/ 2的列表统一,这是我想要的,但我当前的代码似乎很hacky-我如何处理换行符例如.

prolog fasta swi-prolog dcg

5
推荐指数
1
解决办法
164
查看次数

是否可以声明升序列表?

我可以像这样制作升序整数列表:

?- findall(L,between(1,5,L),List).
Run Code Online (Sandbox Code Playgroud)

我知道我也可以使用以下方法生成值:

?- length(_,X).
Run Code Online (Sandbox Code Playgroud)

但我不认为我可以在findall中使用它,如下面的循环:

?- findall(X,(length(_,X),X<6),Xs).
Run Code Online (Sandbox Code Playgroud)

我也可以使用生成一个列表.

:- use_module(library(clpfd)).

list_to_n(N,List) :-
   length(List,N),
   List ins 1..N,
   all_different(List),
   once(label(List)).
Run Code Online (Sandbox Code Playgroud)

要么

list_to_n2(N,List) :-
   length(List,N),
   List ins 1..N,
   chain(List,#<),
   label(List).
Run Code Online (Sandbox Code Playgroud)

最后的方法似乎最好的给我,因为它是最声明,并且不使用once/1between/3findall/3等.

还有其他方法吗?在'纯'Prolog中有没有声明性的方法来做到这一点?有最好的方式吗?

list prolog clpfd

5
推荐指数
1
解决办法
393
查看次数

优化swi prolog

我想找到argmax(x,y,z)-1/2(20x ^ 2 + 32xy + 16y ^ 2)+ 2x + 2y.

受制于:x> = 0,y> = 0,z> = 0且-x-y + z = 0.

我知道偏导数设置为0是:

-20x-16y + 2 = 0和-16x-16y + 2 = 0

所以我们可以得x = 0和y = 1/8,z = 1/8.

我如何在Swi-prolog中做到这一点?我看到有用于线性求解的库单形,但这是一个二次问题,但偏导数不是.(我有一点困惑!)

这就是我所拥有的:

:- use_module(library(simplex)).

my_constraints(S):-
 gen_state(S0),
 constraint([-20*x, -16*y] = 0, S0, S1),
 constraint([-16*x,-16*y] = 0, S1,S2),
 constraint([x] >= 0,S2,S3),
 constraint([y] >= 0,S3,S4),
 constraint([z] >= 0,S4,S5),
 constraint([-x-y+z] = 0,S5,S).

?- my_constraints(S), variable_value(S,x,Val1),variable_value(S,y,Val2).
false.
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog quadratic-programming

5
推荐指数
1
解决办法
322
查看次数

Clpfd不是方形数字

是否可以对整数进行约束,使其不能是(完美)平方数?

我有:

square(Square):- N#>0, Square #= N*N.
Run Code Online (Sandbox Code Playgroud)

我该如何定义 notsquare(Notsquare):- ...

我的第一个想法是拥有P*P =Q*Q*NotsquareRemainder #>0, Remainder #= P rem Q.

但是P和Q需要能够是非整数,所以这不起作用.

prolog clpfd

4
推荐指数
1
解决办法
173
查看次数

在最新版本的Swi中验证签名链SWI-Prolog 2-不同?

跟进来自/sf/answers/3116723991/?noredirect=1

:-use_module(library(http/http_client)).
:-use_module(library(http/http_open)).
:-use_module(library(clpfd)).


url2('https://s3.amazonaws.com/echo.api/echo-api-cert-4.pem').

get_pem(Url,Certs):-
 setup_call_cleanup(
           http_open(Url,Stream,[]),
           ssl_peer_certificate_chain(Stream,Certs),
           close(Stream)
          ).

test(Key):-
 url2(U),
 get_pem(U,[A|Certs]),
 checkcertvalid_time(A),
 checkchain([A|Certs]),
 memberchk(key(Key),A).


 checkcertvalid_time(Acert):-
%what about The domain echo-api.amazon.com is present in the Subject   Alternative Names (SANs) section of the signing certificate
 memberchk(notbefore(NotBefore),Acert),
 memberchk(notafter(NotAfter),Acert),
 get_time(NowA),
 Now is round(NowA),
 Now #>NotBefore,
 Now #<NotAfter.

checkchain(Chain):-
 length(Chain,L),
 L#>1, %Insure chain has more than one cert
 checkchain_h(Chain).

checkchain_h([_]). %Reached the root.
checkchain_h([C1,C2|Rest]):-
 memberchk(signature(Sig),C1),
 memberchk(to_be_signed(Signed),C1),
 memberchk(key(Key),C2),
 hex_bytes(Signed,Bytes),
 crypto_data_hash(Bytes,Hash,[algorithm(sha256),encoding(octet)]),
 rsa_verify(Key,Hash,Sig,[type(sha256)]),
 checkchain_h([C2|Rest]).
Run Code Online (Sandbox Code Playgroud)

如果我打电话,test/1那么这段代码在7.5.3-1-g647ce9a中有效但在7.5.9中有效.7.5.9 checkchain_h/1memberchk(to_be_signed(Signed),C1)调用时失败.

这是在两台不同的计算机上测试的.是否有可能导致这种差异的外部软件?

另外据我所知,还应该有一个'subject_alternative_name'字段,我无法看到.

更新:在7.5.9: …

ssl prolog pem swi-prolog

4
推荐指数
1
解决办法
95
查看次数

与clpfd的桥梁横穿难题

我试图用clpfd解决'逃离Zurg'的问题.https://web.engr.oregonstate.edu/~erwig/papers/Zurg_JFP04.pdf 玩具从左侧开始向右侧移动.这就是我所拥有的:

:-use_module(library(clpfd)).

toy(buzz,5).
toy(woody,10).
toy(res,20).
toy(hamm,25).

%two toys cross, the time is the max of the two.
cross([A,B],Time):-
  toy(A,T1),
  toy(B,T2),
  dif(A,B),
  Time#=max(T1,T2).
%one toy crosses
cross(A,T):-
  toy(A,T).

%Two toys travel left to right
solve_L(Left,Right,[l_r(A,B,T)|Moves]):-
  select(A,Left,L1),
  select(B,L1,Left2),
  cross([A,B],T),
  solve_R(Left2,[A,B|Right],Moves).

%One toy has to return with the flash light
solve_R([],_,[]).
solve_R(Left,Right,[r_l(A,empty,T)|Moves]):-
  select(A,Right,Right1),
  cross(A,T),
  solve_L([A|Left],Right1,Moves).

solve(Moves,Time):-
   findall(Toy,toy(Toy,_),Toys),
   solve_L(Toys,_,Moves),
   all_times(Moves,Times),
   sum(Times,#=,Time).

all_times([],[]).
all_times(Moves,[Time|Times]):-
  Moves=[H|Tail],
  H=..[_,_,_,Time],
  all_times(Tail,Times).
Run Code Online (Sandbox Code Playgroud)

查询?-solve(M,T)?-solve(Moves,T), labeling([min(T)],[T]).我得到一个解决方案但不是一个= <60.(我也看不到一个..)我怎么用clpfd做这个?或者最好在链接中使用该方法?

仅供参考:我也找到了这个http://www.metalevel.at/zurg/zurg.html 哪个有DCG解决方案.在其中内置约束Time = <60,它没有找到最低时间.

puzzle prolog clpfd river-crossing-puzzle

3
推荐指数
1
解决办法
972
查看次数

验证签名链SWI-Prolog

此问题与打开和检查SWI-Prolog中的Pem文件有关

下载并打开证书后,如何验证签名链?我有:

:-use_module(library(http/http_client)).

url('https://s3.amazonaws.com/echo.api/echo-api-cert-4.pem').

url_data1(Url,Certs):-
 http_open(Url,Stream,[]),
 all_certs(Stream,Certs),
 forall(member(C,Certs),my_validate(C)),
 close(Stream).

all_certs(Stream,[C1|Certs]):-
 catch(load_certificate(Stream,C1),_,fail),
 all_certs(Stream,Certs),!.
 all_certs(_Stream,[]).

my_validate(C):-
 memberchk(to_be_signed(Signed),C),
 memberchk(key(Key),C),
 memberchk(signature(Signature),C),
 memberchk(signature_algorithm(A),C),
 algo_code(A,Code),
 rsa_verify(Key,Signed,Signature,[type(Code)]).

algo_code('RSA-SHA256',sha256).
algo_code('RSA-SHA1',sha1).
Run Code Online (Sandbox Code Playgroud)

这目前失败了.

ssl prolog pem swi-prolog

3
推荐指数
1
解决办法
144
查看次数