相关疑难解决方法(0)

知道何时使用cut in prolog

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

prolog prolog-cut

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

将谓词应用于列表元素的Prolog映射过程

如何编写map(List, PredName, Result)将谓词应用于PredName(Arg, Res)元素的Prolog过程,并将List结果返回到列表中Result

例如:

test(N,R) :- R is N*N.

?- map([3,5,-2], test, L).
L = [9,25,4] ;
no
Run Code Online (Sandbox Code Playgroud)

prolog meta-predicate map-function

35
推荐指数
1
解决办法
2万
查看次数

好的Prolog代码的特点?

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

prolog failure-slice logical-purity

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

依靠规则顺序

为了计算两个相同长度的列表之间的汉明距离,我使用foldl(hamm, A, B, 0, R).这个定义hamm/4:

hamm(A, A, V, V) :- !.
hamm(A, B, V0, V1) :- A \= B, V1 is V0 + 1.
Run Code Online (Sandbox Code Playgroud)

第一条规则中的切入可以防止不必要的回溯.但是,第二条规则的写法可能不同:

hamm2(A, A, V, V) :- !.
hamm2(_, _, V0, V1) :- V1 is V0 + 1.
Run Code Online (Sandbox Code Playgroud)

并且对于A和B都被接地的查询hamm2/4仍然是正确的foldl/5.

那么有一个很好的理由更喜欢一个而不是另一个吗?或者有理由按规定保留规则或切换它们吗?

我知道查询

hamm(a, B, 0, 1).
Run Code Online (Sandbox Code Playgroud)

是假的,而

hamm2(a, B, 0, 1).
Run Code Online (Sandbox Code Playgroud)

是的,但我无法确定哪一个更有意义...

prolog meta-predicate

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

Prolog:第一个重复值

我需要在列表中找到第一个重复值.

prep(3,[1,3,5,3,5]). 应该是真的.

prep(5,[1,3,5,3,5]). 应该是假的.

我想检查与当前值和先前列表成员的相等性,直到我找到重复,如果它找到一个它将测试与X的相等但我不知道如何在Prolog中做到这一点!

我感谢任何帮助!谢谢

list prolog prolog-dif

5
推荐指数
2
解决办法
2907
查看次数

如何在下面的代码中修剪选择点使其更有效(Prolog)?

在下面给出的代码中,有!(剪切)修剪效率的选择点.我很确定reverse谓词和agent_do_moves谓词是必不可少的.

solve_task(Task,Cost):-
    agent_current_position(oscar,P),
    solve_task_a(Task,[b(0,0,P)],[],R,Cost,_NewPos),!,  % prune choice point for efficiency
    reverse(R,[_Init|Path]),
    agent_do_moves(oscar,Path).
Run Code Online (Sandbox Code Playgroud)

prolog prolog-cut

4
推荐指数
1
解决办法
146
查看次数