我参加了一门课程,学习了一些序言.我无法弄清楚如何/何时使用削减.即使我得到了切割的一般概念,我也似乎无法正确使用它们.任何人都可以简单地解释一下,或者给出一个他们可以推荐的"削减"的好教程(那不是learnprolognow.org)吗?
当我们使用带有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) 有什么设计启发式的人必须掌握好写Prolog?我听说需要一名经验丰富的程序员大约两年才能熟练掌握Prolog.有效地使用递归是其中的一部分,但这似乎是一个相对较小的障碍.究竟是什么给程序员带来了这么多麻烦?我应该在示例代码中寻找什么来判断其质量?
说我有以下理论:
a(X) :- \+ b(X).
b(X) :- \+ c(X).
c(a).
Run Code Online (Sandbox Code Playgroud)
它只是说真的,这当然是正确的,a(X)因为没有b(X)(因为有限的失败否定).因为只有一个b(X)如果没有c(X),我们就有c(a),可以说这是真的.我想知道为什么Prolog没有提供答案X = a?比如说我介绍一些语义:
noOrphan(X) :- \+ orphan(X).
orphan(X) :- \+ parent(_,X).
parent(david,michael).
Run Code Online (Sandbox Code Playgroud)
当然,如果我查询noOrphan(michael),这将导致true与noOrphan(david)在false(因为我没有定义父david),但我不知道为什么会有的检测没有积极主动地哪些人(michael,david,...)属于noOrphan/1关系?
这可能是Prolog的回溯机制的结果,但是Prolog可以维持一个状态,该状态验证一个人是否以积极方式(0,2,4,...)否定深度或负面方式(1,3) ,5,...)否定深刻.
我目前正在尝试学习一些基本的序言.在我学习的过程中,我想远离if else语句来真正理解语言.我这样做有困难.我有一个看起来像这样的简单函数:
if a > b then 1
else if
a == b then c
else
-1;;
Run Code Online (Sandbox Code Playgroud)
这只是一个非常简单的逻辑,我想转换成prolog.
所以在这里我非常困惑.我想首先检查一个> b,如果是这样输出1.我只是这样做:
sample(A,B,C,O):-
A > B, 1,
A < B, -1,
0.
Run Code Online (Sandbox Code Playgroud)
这就是我提出的.o作为输出,但我不明白如何使输出1.有什么想法可以帮我更好地理解这个吗?
在做了一些之后我想出了这个,但它似乎不正确:
Greaterthan(A,B,1.0).
Lessthan(A,B,-1.0).
Equal(A,B,C).
Sample(A,B,C,What):-
Greaterthan(A,B,1.0),
Lessthan(A,B,-1.0),
Equal(A,B,C).
Run Code Online (Sandbox Code Playgroud)
我走向正确的轨道吗?
我试图了解Prolog的工作原理.我正在使用SWI-Prolog.这是一些代码:
forall(C1,C2) :- \+ (C1, \+ C2).
foo(N) :- N < 10.
bar(N) :- N > 5.
foobar(N) :- forall(foo(N),bar(N)).
Run Code Online (Sandbox Code Playgroud)
如果我执行以下操作,它会产生所需的输出:
?- foobar(5).
false.
Run Code Online (Sandbox Code Playgroud)
但是当我试图看到所有可能的值时,我得到一个错误:
?- foobar(N).
ERROR: </2: Arguments are not sufficiently instantiated
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?