相关疑难解决方法(0)

知道何时使用cut in prolog

我参加了一门课程,学习了一些序言.我无法弄清楚如何/何时使用削减.即使我得到了切割的一般概念,我也似乎无法正确使用它们.任何人都可以简单地解释一下,或者给出一个他们可以推荐的"削减"的好教程(那不是learnprolognow.org)吗?

prolog prolog-cut

38
推荐指数
3
解决办法
1万
查看次数

Prolog附加切割操作符

当我们使用带有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-cut

11
推荐指数
3
解决办法
1071
查看次数

好的Prolog代码的特点?

有什么设计启发式的人必须掌握好写Prolog?我听说需要一名经验丰富的程序员大约两年才能熟练掌握Prolog.有效地使用递归是其中的一部分,但这似乎是一个相对较小的障碍.究竟是什么给程序员带来了这么多麻烦?我应该在示例代码中寻找什么来判断其质量?

prolog failure-slice logical-purity

8
推荐指数
1
解决办法
920
查看次数

为什么双重否定在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),这将导致truenoOrphan(david)false(因为我没有定义父david),但我不知道为什么会有的检测没有积极主动地哪些人(michael,david,...)属于noOrphan/1关系?

这可能是Prolog的回溯机制的结果,但是Prolog可以维持一个状态,该状态验证一个人是否以积极方式(0,2,4,...)否定深度或负面方式(1,3) ,5,...)否定深刻.

prolog

8
推荐指数
1
解决办法
832
查看次数

没有if和else语句的Prolog

我目前正在尝试学习一些基本的序言.在我学习的过程中,我想远离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)

我走向正确的轨道吗?

logic prolog

7
推荐指数
3
解决办法
877
查看次数

Prolog - 参数未实例化

我试图了解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)

这里发生了什么?

prolog clpfd

6
推荐指数
1
解决办法
686
查看次数