我参加了一门课程,学习了一些序言.我无法弄清楚如何/何时使用削减.即使我得到了切割的一般概念,我也似乎无法正确使用它们.任何人都可以简单地解释一下,或者给出一个他们可以推荐的"削减"的好教程(那不是learnprolognow.org)吗?
如何编写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?我听说需要一名经验丰富的程序员大约两年才能熟练掌握Prolog.有效地使用递归是其中的一部分,但这似乎是一个相对较小的障碍.究竟是什么给程序员带来了这么多麻烦?我应该在示例代码中寻找什么来判断其质量?
为了计算两个相同长度的列表之间的汉明距离,我使用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)
是的,但我无法确定哪一个更有意义...
我需要在列表中找到第一个重复值.
prep(3,[1,3,5,3,5]). 应该是真的.
prep(5,[1,3,5,3,5]). 应该是假的.
我想检查与当前值和先前列表成员的相等性,直到我找到重复,如果它找到一个它将测试与X的相等但我不知道如何在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)