我开始学习prolog,并希望让整个切割更加清晰.我已经读到"绿色切割不会改变程序的声明性含义,而红切不会".但是,程序的意义并不是真正纯粹的声明(仅仅是因为prolog实际上是为所有选项回溯).
这是一个例子:
p(1).
p(2) :- !.
p(3).
Run Code Online (Sandbox Code Playgroud)
据说这是绿色切割.但如果我运行这个:
p(X), X =:= 3.
Run Code Online (Sandbox Code Playgroud)
我会在没有剪辑的情况下获得"真实",并且在剪切时获得"假".所以,我错过了什么?
提前致谢.
我正在我的人工智能实验室学习Prolog,从源头学习Prolog Now!.
在第5章中,我们来了解累加器.作为示例,给出了这两个代码片段. 查找列表的长度
没有累加器:
len([],0).
len([_|T],N) :- len(T,X), N is X+1.
Run Code Online (Sandbox Code Playgroud)
与累加器:
accLen([_|T],A,L) :- Anew is A+1, accLen(T,Anew,L).
accLen([],A,A).
Run Code Online (Sandbox Code Playgroud)
我无法理解,这两个片段在概念上有何不同?累加器到底有什么不同?有什么好处?
蓄能器听起来像中间变量.(如果我错了,请纠正我.)到目前为止,我已经在我的程序中使用过它们,所以它真的是一个很大的概念吗?
在Prolog中,统一X = [1|X]是一种获得无限列表的理智方式吗?SWI-Prolog没有任何问题,但GNU Prolog只是挂起.
我知道在大多数情况下我可以替换列表
one(1).
one(X) :- one(X).
Run Code Online (Sandbox Code Playgroud)
但我的问题是明确是否可以X = [1|X], member(Y, X), Y = 1在"理智"的Prolog实现中使用该表达式.
我在这里找到了 Haskell 中移位重置分隔延续的示例:
Run Code Online (Sandbox Code Playgroud)resetT $ do alfa bravo x <- shiftT $ \esc -> do charlie lift $ esc 1 delta lift $ esc 2 return 0 zulu x这会:
履行
alfa履行
bravo履行
charlie绑定
x到1,从而执行zulu 1从末尾掉下来
resetT,然后跳回到后面esc 1履行
delta绑定
x到2,从而执行zulu 2从末尾掉下来
resetT,然后跳回到后面esc 2逃离
resetT,导致它产生 0
我不知道如何使用 SWI-Prolog 的shift/1和reset/3编写等效代码。
下面的代码是我的尝试。输出是相同的,但看起来很混乱和倒退,我觉得我误用了与Haskell 示例中的和Ball类似的东西。另外,我不知道该怎么办。esc 1esc 2return 0 …
continuations haskell prolog swi-prolog delimited-continuations
本页上的练习09 http://www.ic.unicamp.br/~meidanis/courses/mc336/2009s2/prolog/problemas/要求创建一个谓词,将重复的元素打包到子列表中.
一个直截了当的解决方案很简单
pack([], []).
pack([H|T], [I|U]) :-
split(H, T, I, P),
pack(P, U).
Run Code Online (Sandbox Code Playgroud)
split split(Head, Tail, HeadGroup, Rest)的定义为
split(A, [], [A], []).
split(A, [B|T], [A], [B|T]) :- A \= B.
split(A, [A|T], [A|U], B) :- split(A, T, U, B).
Run Code Online (Sandbox Code Playgroud)
工作正常,几乎与上述网页上提供的示例解决方案一致.
这个解决方案失败的地方是查询pack(X, [[a], [b, b]])..2个解集之间的对应关系是双射(对于每个A在pack(A, B)有一个且只有一个B),所以必须有一个更好的解决方案.
解决它的一种方法是改变评估的顺序,帮助prolog根据参数的类型选择非无限分支,如下所示
pack([], []).
pack(A, B) :-
( var(A) ->
A = [H|T],
B = [I|U],
pack(P, U),
split(H, T, I, P)
; A = …Run Code Online (Sandbox Code Playgroud) 我正在尝试编译一个SWI-Prolog程序,但一直在努力test is always true, var (sum) error on line 7.我无法弄清楚这意味着什么.有人可以帮忙吗?这是一个我希望最终解决拉丁方的程序.谢谢.
:- use_module(library(clpfd)).
magic_counter(Count) :-
findall(a, magic_1(_Soln), As),
length(As, Count).
magic_1(Soln) :-
Row1 = [W1, W2, W3],
Row2 = [X1, X2, X3],
Row3 = [Y1, Y2, Y3],
Row1 ins 1..3,
Row2 ins 1..3,
Row3 ins 1..3,
Sum #= 6,
all_different(Row1),
all_different(Row2),
all_different(Row3),
all_different([W1,X1,Y1]),
all_different([W2,X2,Y2]),
all_different([W3,X3,Y3]),
W1 + W2 + W3 #= Sum,
X1 + X2 + X3 #= Sum,
Y1 + Y2 + Y3 #= Sum,
W1 + X1 …Run Code Online (Sandbox Code Playgroud) 我有以下3个谓词:
times(X, Y):-
Result is X * Y.
minus(X, Y):-
Result is X - Y.
plus(X, Y):-
Result is X + Y.
Run Code Online (Sandbox Code Playgroud)
我想通过例如times(2,2)在plus(X, Y)这样的plus(times(2,2), minus(X, Y))。
我是初学者; 我来自结构化编程背景,因为很明显:)
我正在构建一个涉及撤消数字的序言查询; 例如.reverse_num(123,X)结果X = 321.我提出了以下定义,但它仅在我提供数字作为第一个参数时才有效.
reverse_num(Num, Revnum) :-
number_chars(Num, Atoms),
reverse(Revatoms, Atoms),
number_chars(Reversed, Revatoms),
Reversed = Revnum.
Run Code Online (Sandbox Code Playgroud)
number_chars/2如果我做的话,谓词不喜欢未经证实的变量:( reverse_num(X,123)我期待X的是321).
我是否努力使reverse_num做一些不应该做的事情(应该理解它只能用数字作为第一个参数而变量作为第二个)?
或者是否有一种简单/直接的方式来处理变量作为第一个参数?
我正在研究一个更长的问题,我在列表表单中复制了N次元素,我相信使用append是正确的方法.这个小谓词理论上应该是这样的:
?- repl(x,5,L).
L = [x, x, x, x, x] ;
false.
Run Code Online (Sandbox Code Playgroud)
我似乎无法在网上找到任何提示,复制单个元素,但我相信我们需要使用append,但没有递归解决方案.我来自更多的Haskell背景,这个问题会更容易执行.有人可以帮我开始吗?:)
我的目前为止:
repl(E, N, R) :-
N > 0, append([E], [], R), writeln(R), repl(E, N-1, R), fail.
Run Code Online (Sandbox Code Playgroud)
这给了我:
?- repl(x,5,L).
[x]
[x]
[x]
[x]
[x]
false.
Run Code Online (Sandbox Code Playgroud)
关闭但不完全!
我正在使用Mac OS X版本10.9.我安装了SVN版本1.8.8.另外我在我的STS中使用Subclipse 1.10.4作为插件.我安装了SVNKit v1.8.4.10145以及作为客户端SVN接口安装的JavaHL(JNI)1.8.8(r1568071).
不幸的是,我无法在我的STS中看到SVN菜单右键单击我工作区中的JAVA文件并导航到Team子菜单.
我尝试过很多东西但似乎没什么用.
任何人都知道这里有什么问题?
prolog ×9
list ×3
swi-prolog ×2
accumulator ×1
coinduction ×1
constraints ×1
cyclic ×1
duplicates ×1
expression ×1
haskell ×1
iso-prolog ×1
javahl ×1
parameters ×1
predicate ×1
prolog-cut ×1
prolog-dif ×1
recursion ×1
replicate ×1
subclipse ×1
svn ×1