我参加了一门课程,学习了一些序言.我无法弄清楚如何/何时使用削减.即使我得到了切割的一般概念,我也似乎无法正确使用它们.任何人都可以简单地解释一下,或者给出一个他们可以推荐的"削减"的好教程(那不是learnprolognow.org)吗?
我发现这个很好的片段用于解析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) 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有点生疏,有一段时间没做过:)
我开始学习prolog,并希望让整个切割更加清晰.我已经读到"绿色切割不会改变程序的声明性含义,而红切不会".但是,程序的意义并不是真正纯粹的声明(仅仅是因为prolog实际上是为所有选项回溯).
这是一个例子:
p(1).
p(2) :- !.
p(3).
Run Code Online (Sandbox Code Playgroud)
据说这是绿色切割.但如果我运行这个:
p(X), X =:= 3.
Run Code Online (Sandbox Code Playgroud)
我会在没有剪辑的情况下获得"真实",并且在剪切时获得"假".所以,我错过了什么?
提前致谢.
当我们使用带有cut运算符的append时会出现什么问题?
append2([],L,L):-!.
append2([H|T],L,[H|TL]):-append2(T,L,TL).
Run Code Online (Sandbox Code Playgroud)
我尝试了几种不同的输入,但它总是成功的.
?- append2([1,2],[5],L).
L = [1, 2, 5].
?- append2([1,2],[1,2],L).
L = [1, 2, 1, 2].
?- append2([],[1,2],L).
L = [1, 2].
?- append2([1,2],[],L).
L = [1, 2].
Run Code Online (Sandbox Code Playgroud) 我正在读这个问题的答案,
p(X) :- read(A), q(A,X-[]).
q(end,X-X) :- !.
q(A,[A|X]-Y) :- read(B), q(B,X-Y).
Run Code Online (Sandbox Code Playgroud)
上面的代码使用语法List-List.我有点理解发生了什么,但我想知道" - "符号/谓词到底是做什么的.此外,这个SWI是否具体?
嘿伙计们我这学期正在学习人工智能课程,我们正在学习Prolog.我们的讲师告诉我们尽量避免在我们的任务中使用削减,但是,对于我似乎无法避免使用它们的几个问题.我只是好奇为什么削减被认为是罪(讲师的话)?我知道这是一种捷径,但我已经习惯了解它们如何影响我的节目.
谢谢.
免责声明:这是我自己的非正式和非评估课程.我自己尝试过,失败了,现在正在寻找一些指导.
我正在尝试实现一个成员/ 2函数的版本,它只返回一次列表的成员.
例如:
| ?- member(X, [1,2,3,1]).
X = 1 ? ;
X = 2 ? ;
X = 3 ? ;
X = 1 ? ;
Run Code Online (Sandbox Code Playgroud)
我希望它只能打印出最多一次的每个数字.
| ?- once_member(X, [1,2,3,1]).
X = 1 ? ;
X = 2 ? ;
X = 3 ? ;
no
Run Code Online (Sandbox Code Playgroud)
我们被告知用切割'!'做到这一点 操作员,但我已经查看了我的课程笔记和更多的在线,但仍然不能让它点击我的头!
到目前为止,我已设法得到:
once_member(E, [E | L]) :- !.
once_member(E, [_, L]) :-
once_member(E, L).
Run Code Online (Sandbox Code Playgroud)
哪个返回1然后没有别的,我觉得我的切割位置错误并阻止了每个可能的匹配的回溯但我真的不确定下一步该去哪里.
我查看了我的课程笔记,并查看了:http://www.cs.ubbcluj.ro/~csatol/log_funk/prolog/slides/5-cuts.pdf和Prolog编程(Google Books)
关于如何在逻辑上应用切割的指导将是最有用的,但答案可能有助于我自己解决这个问题.
我们也被告知要做另一种使用'\ +'否定失败的方法,但希望这一切可能更简单一旦削减了我?
我有这个跟踪元解释器,从以前的问题Prolog unbind绑定变量改变.
我不明白如何解释切.感谢用户@false告诉我切割工作很糟糕,我的问题是,我应该如何在这个元解释器中实现切割?
%tracer
mi_trace(Goal):-
mi_trace(Goal, 0).
mi_trace(V, _):-
var(V), !, throw(error(instantiation_error, _)).
mi_trace(true, _Depth):-!, true.
mi_trace(fail, _Depth):-!, fail.
mi_trace(A > B, _Depth):-!, A > B.
mi_trace(A < B, _Depth):-!, A < B.
mi_trace(A =< B, _Depth):-!, A =< B.
mi_trace(A >= B, _Depth):-!, A >= B.
mi_trace(A = B, _Depth):-!, A = B.
mi_trace(A is B, _Depth):-!, A is B.
mi_trace(\+A, _Depth):-!, \+mi_trace(A, _Depth).
mi_trace(!, _Depth):-!, fail. % <- this is wrong
mi_trace((Goal1, Goal2), Depth):-
!,
mi_trace(Goal1, …Run Code Online (Sandbox Code Playgroud) 首先,我已经阅读了有关Prolog削减使用的所有其他帖子,并且肯定会看到与使用它们相关的问题.但是,对我来说仍然有些不清楚,我想一劳永逸地解决这个问题.
在下面的简单示例中,我们递归遍历列表并检查每个第2个元素是否等于1.执行此操作时,递归过程可能会在以下任一基本情况中结束:空列表或具有单个元素的列表仍然存在.
base([]).
base([_]).
base([_,H|T]) :- H =:= 1, base(T).
Run Code Online (Sandbox Code Playgroud)
执行时:
?- time(base([1])).
% 0 inferences, 0.000 CPU in 0.000 seconds (74% CPU, 0 Lips)
true ;
% 2 inferences, 0.000 CPU in 0.000 seconds (83% CPU, 99502 Lips)
false.
?- time(base([3,1,3])).
% 2 inferences, 0.000 CPU in 0.000 seconds (79% CPU, 304044 Lips)
true ;
% 2 inferences, 0.000 CPU in 0.000 seconds (84% CPU, 122632 Lips)
false.
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我总是在第二个基本情况下使用显式切割运算符(即代表列表中剩下一个元素的那个),如下所示,以取消冗余选择点.
base([]).
base([_]) :- !.
base([_,H|T]) :- H =:= 1, base(T). …Run Code Online (Sandbox Code Playgroud) deterministic prolog non-deterministic prolog-cut logical-purity