标签: prolog

Prolog中的\ +是什么意思?

我在这里看到了一些使用它的答案,我不知道它意味着什么或如何使用它.我也很难通过搜索引擎找到它:)

prolog

20
推荐指数
2
解决办法
3万
查看次数

AUBUC的Prolog联盟

我最近开始学习Prolog,我无法解决如何组合三个列表的问题.

我能够组合2个列表:

%element
element(X,[X|_]).
element(X,[_|Y]):-
               element(X,Y).

%union

union([],M,M).
union([X|Y],L,S) :- element(X,L),union(Y,L,S).
union([X|Y],L,[X|S]) :- (not(element(X,L))),union(Y,L,S).
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

list prolog

20
推荐指数
2
解决办法
2605
查看次数

图表DB与Prolog(或miniKanren)

最近我一直在研究像Neo4j这样的图形数据库,以及Prolog和miniKanren中的逻辑编程.根据我迄今所学到的知识,它们都允许指定它们之间的事实和关系,并且还可以查询生成的系统以进行某些选择.所以,实际上我看不出它们之间的差别很大,因为它们都可以用来构建图形并查询它,但是使用不同的语法.但是,它们是完全不同的软件.

除了数据库可能提出更多时空有效存储技术的技术性,除了像miniKanren这样的微小逻辑核心更简单和可嵌入之外,图形数据库和逻辑编程语言之间的实际区别是什么,如果它们都只是一个图形数据库+查询API?

prolog neo4j graph-databases minikanren

20
推荐指数
3
解决办法
2371
查看次数

在GNU-Prolog中,我能"抓住"linux信号吗?

有没有办法在GNU Prolog中"陷阱"(例如"捕获")操作系统信号?(我正在使用Ubuntu/Linux,最新的gprolog).

我想很久以前我在WAMCC中使用过这种方法,然后才变成GNU Prolog:

:- catch(Long_Running_Goal,signal(2),write('program interrupted'))
Run Code Online (Sandbox Code Playgroud)

但是,如果我使用(重复,失败)无限循环测试它,例如

:- catch((repeat,fail),X,write(X)).
Run Code Online (Sandbox Code Playgroud)

在解释按Ctrl-C还带我去跟踪/调试器,编译后的程序只是退出,如果我打断它kill -1,kill -2等等.

我已经尝试编译程序,--no-top-level以防默认顶层以某种方式捕获信号,但这没有任何区别.

SWI-Prolog似乎有一个合适的内置谓词on_signal,但是我正在寻找gprolog的解决方案,如果可能的话.

linux prolog gnu-prolog

20
推荐指数
2
解决办法
352
查看次数

如何在没有多余答案/解决方案的情况下紧凑地表达不等式的分离

考虑一下我尝试过的:

dif_to_orto(A, B, C) :-
   (  dif(A, B)
   ;  dif(A, C)
   ).
Run Code Online (Sandbox Code Playgroud)

虽然从声明性的角度来看,这个定义很好,但它包含许多冗余。考虑到:

?- dif_to_orto(A, B, C), A = 1, B = 2, C = 2.
   A = 1, B = 2, C = 2
;  A = 1, B = 2, C = 2.   % unexpected redundant solution
Run Code Online (Sandbox Code Playgroud)

即使在这种情况下也不行:

?- dif_to_orto(A, B, C), A = 1, B = 2, C = 3.
   A = 1, B = 2, C = 3
;  A = 1, B = 2, C …
Run Code Online (Sandbox Code Playgroud)

prolog prolog-dif

20
推荐指数
4
解决办法
394
查看次数

什么更有趣或更强大:咖喱,水星还是Lambda-Prolog?

我想问一下从头开始/逆向工程师实施什么样的正式系统会更有趣.

我查看了一些逻辑/声明性编程系统的现有和开源项目.我决定在空闲时间编写类似的内容,或者至少要了解实现的一般概念.

如果这些系统中的一些能够提供逻辑中现代学术研究的大部分表达能力和简洁性以及它与计算模型的关系,那将是很好的.

你建议至少在概念层面学习什么?例如,Lambda-Prolog很有意思,因为它允许更高阶的关系,但AFAIK基于直觉主义逻辑,因此缺乏排除中间原则; 这通常对我不利.

我也欢迎任何有关现代逻辑编程系统的建议,这些系统不太受欢迎,但更具表现力/强大功能.

logic prolog logic-programming mercury curry

19
推荐指数
2
解决办法
2997
查看次数

在没有削减的情况下解析Prolog?

我发现这个很好的片段用于解析Prolog中的lisp(从这里开始):

ws --> [W], { code_type(W, space) }, ws.
ws --> [].

parse(String, Expr) :- phrase(expressions(Expr), String).

expressions([E|Es]) -->
    ws, expression(E), ws,
    !, % single solution: longest input match
    expressions(Es).
expressions([]) --> [].

% A number N is represented as n(N), a symbol S as s(S).

expression(s(A))         --> symbol(Cs), { atom_codes(A, Cs) }.
expression(n(N))         --> number(Cs), { number_codes(N, Cs) }.
expression(List)         --> "(", expressions(List), ")".
expression([s(quote),Q]) --> "'", expression(Q).

number([D|Ds]) --> digit(D), number(Ds).
number([D])    --> digit(D).

digit(D) --> …
Run Code Online (Sandbox Code Playgroud)

lisp parsing prolog dcg prolog-cut

19
推荐指数
2
解决办法
1108
查看次数

如何同时进行Prolog?

我在网上找不到任何信息...我也是Prolog的新手......

在我看来,Prolog可能是高度并发的,也许在尝试匹配规则时会立即尝试多种可能性.现代Prolog编译器/解释器本身是*并发的吗?哪个?默认情况下是并发吗?我需要以某种方式启用它吗?

*我对多线程,只是内在的并发性不感兴趣.

concurrency performance multicore prolog

19
推荐指数
3
解决办法
3252
查看次数

字符串列表的最长公共前缀(LCP)

lcs([ H|L1],[ H|L2],[H|Lcs]) :-
    !,
    lcs(L1,L2,Lcs).
lcs([H1|L1],[H2|L2],Lcs):-
    lcs(    L1 ,[H2|L2],Lcs1),
    lcs([H1|L1],    L2 ,Lcs2),
    longest(Lcs1,Lcs2,Lcs),
    !.
lcs(_,_,[]).

longest(L1,L2,Longest) :-
    length(L1,Length1),
    length(L2,Length2),
    (  Length1 > Length2
    -> Longest = L1
    ;  Longest = L2
    ).
Run Code Online (Sandbox Code Playgroud)

到目前为止这是我的代码.我怎样才能优化它以便打印前缀,例如:

["interview", "interrupt", "integrate", "intermediate"]
Run Code Online (Sandbox Code Playgroud)

应该回来 "inte"

Prolog有点生疏,有一段时间没做过:)

list prolog prolog-cut prolog-dif logical-purity

19
推荐指数
4
解决办法
1184
查看次数

Prolog - 参数没有充分实例化

我正在写一个小程序,它计算列表中有多少元素不是数字.这是我的代码:

not_number([],0).
not_number([X|T],R):- 
    not(number(X)),
    R1 is R+1,  
    not_number(T,R1). 

not_number([_|Tail],Result):-
    not_number(Tail,Result).  
Run Code Online (Sandbox Code Playgroud)

如果我执行这样的代码:

?- not_number([1,2,3,5], R).
Run Code Online (Sandbox Code Playgroud)

我得到R = 0(应该是)

R = 0.
Run Code Online (Sandbox Code Playgroud)

但是,如果我在列表中放置一个字符:

?- not_number([1,2,3,5,a], R).
Run Code Online (Sandbox Code Playgroud)

然后我收到这个错误:

ERROR: not_number/2: Arguments are not sufficiently instantiated
   Exception: (10) not_number([a], _G247) ? 
Run Code Online (Sandbox Code Playgroud)

有人能解释代码有什么问题吗?我是prolog的新手.

arguments prolog clpfd instantiation-error

18
推荐指数
2
解决办法
4万
查看次数