我最近开始学习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)
有人可以帮我吗?
最近我一直在研究像Neo4j这样的图形数据库,以及Prolog和miniKanren中的逻辑编程.根据我迄今所学到的知识,它们都允许指定它们之间的事实和关系,并且还可以查询生成的系统以进行某些选择.所以,实际上我看不出它们之间的差别很大,因为它们都可以用来构建图形并查询它,但是使用不同的语法.但是,它们是完全不同的软件.
除了数据库可能提出更多时空有效存储技术的技术性,除了像miniKanren这样的微小逻辑核心更简单和可嵌入之外,图形数据库和逻辑编程语言之间的实际区别是什么,如果它们都只是一个图形数据库+查询API?
有没有办法在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的解决方案,如果可能的话.
考虑一下我尝试过的:
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) 我想问一下从头开始/逆向工程师实施什么样的正式系统会更有趣.
我查看了一些逻辑/声明性编程系统的现有和开源项目.我决定在空闲时间编写类似的内容,或者至少要了解实现的一般概念.
如果这些系统中的一些能够提供逻辑中现代学术研究的大部分表达能力和简洁性以及它与计算模型的关系,那将是很好的.
你建议至少在概念层面学习什么?例如,Lambda-Prolog很有意思,因为它允许更高阶的关系,但AFAIK基于直觉主义逻辑,因此缺乏排除中间原则; 这通常对我不利.
我也欢迎任何有关现代逻辑编程系统的建议,这些系统不太受欢迎,但更具表现力/强大功能.
我发现这个很好的片段用于解析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) 我在网上找不到任何信息...我也是Prolog的新手......
在我看来,Prolog可能是高度并发的,也许在尝试匹配规则时会立即尝试多种可能性.现代Prolog编译器/解释器本身是*并发的吗?哪个?默认情况下是并发吗?我需要以某种方式启用它吗?
*我对多线程,只是内在的并发性不感兴趣.
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有点生疏,有一段时间没做过:)
我正在写一个小程序,它计算列表中有多少元素不是数字.这是我的代码:
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的新手.
prolog ×10
list ×2
prolog-cut ×2
prolog-dif ×2
arguments ×1
clpfd ×1
concurrency ×1
curry ×1
dcg ×1
gnu-prolog ×1
linux ×1
lisp ×1
logic ×1
mercury ×1
minikanren ×1
multicore ×1
neo4j ×1
parsing ×1
performance ×1