Tag: 序言

在Prolog中展开列表

我只在Prolog工作了几天。 我了解一些事情,但这真让我困惑。 我想写一个函数,它需要一个列表并将其弄平。 ?- flatten([a,[b,c],[[d],[],[e]]],Xs). Xs = [a,b,c,d,e]. % expected result 该函数取出列表的内部结构。 这是我迄今为止: flatten2([],[]). flatten2([Atom|ListTail],[Atom|RetList]) :- atom(Atom), flatten2(ListTail,RetList). flatten2([List|ListTail],RetList) :- flatten2(List,RetList). 现在,当我打电话时, ?- flatten2([a,[b,c],[[d],[],[e]]], R). R = [a,b,c,d,e]. % works as expected! 但是当我打电话来查看我input的列表是否已经变平时,返回false而不是true : ?- flatten2([a,[b,c],[[d],[],[e]]], [a,b,c,d,e]). false. % BAD result! 它为什么一方面工作,而另一方面呢? 我觉得我错过了很简单的事情。

删除列表中的重复项目(Prolog)

我对Prolog完全陌生,并尝试一些练习。 其中之一是: 编写一个谓词集(InList,OutList),它将任意列表作为input,并返回一个列表,其中input列表的每个元素只出现一次。 这是我的解决scheme: member(X,[X|_]). member(X,[_|T]) :- member(X,T). set([],[]). set([H|T],[H|Out]) :- not(member(H,T)), set(T,Out). set([H|T],Out) :- member(H,T), set(T,Out). 我不允许使用任何内置谓词(即使不使用not/1也会更好)。 问题是, set/2给出了多个相同的解决scheme。 input列表中的重复次数越多,结果就越多。 我究竟做错了什么? 提前致谢。

Prolog只删除唯一的元素

我想返回一个列表,例如删除所有独特的元素 remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q). Q = [1,1,2,2,4,4,6,6,6]. 我的问题是,目前我有代码返回 remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q). Q = [1, 2, 4, 6, 6]. 这样只返回这些非唯一值的第一个实例。 这是我的代码: remUniqueVals([], []). remUniqueVals([Q1|RestQ],[Q1|Xs]) :- member(Q1,RestQ), remUniqueVals(RestQ,Xs). remUniqueVals([Q1|RestQ],Xs) :- remove(Q1,[Q1|RestQ], NewQ), remUniqueVals(NewQ,Xs). 我可以看到member(Q1,RestQ)在第二次检查1,2,4时失败,因为他们现在不在列表中,因此将其删除。 我想要一些帮助解决这个问题,我的想法是检查member(Q1, PreviousQ) ,这是最后Q的元素。 不知道如何去执行,虽然任何帮助,将不胜感激。 更新: 好的,谢谢你们提出的build议, remUniqueVals(_,[], []). remUniqueVals(_,[Q1|RestQ],[Q1|Xs]) :- member(Q1,RestQ), remUniqueVals(Q1,RestQ,Xs). remUniqueVals(PrevQ,[Q1|RestQ],[Q1|Xs]) :- Q1 = PrevQ, remUniqueVals(PrevQ,RestQ,Xs). remUniqueVals(PrevQ,[_|RestQ],Xs) :- remUniqueVals(PrevQ,RestQ,Xs). remUniqueVals(0,[4,1,1,3,2,2,5,5],Q). Q = [1, 1, 2, […]

ISO Prolog谓词的复杂性

标准Prolog谓词的时间复杂度上限是否有保证? 例如:在任何符合标准的Prolog系统中,确定sort(+List, ?SortedList)在O(nlog(n))时间(n是List的长度)中运行?

gprolog:在exception之后获取堆栈跟踪

在使用gprolog的时候,我经常会遇到这样的例外: uncaught exception: error(instantiation_error,(is)/2) 没有任何的上下文。 我知道我可以做一个trace但是tracedebugging需要很长时间,因为我需要在发生错误之前执行很多事情。 任何想法如何有这个堆栈跟踪? 还是一个dynamic的trace / notrace ? 编辑:或者只是自动打印整个trace输出。

序言:过滤列表?

我目前正在Prolog的一个非常短的项目上工作,只是试图将我创build的“filter”应用到列表中。 我有你可以称之为filter准备好,但我不能应用它。 如果我说明会更好: filter(A, B) 如果满足某些条件,则输出“真”。 filterList(A, [X, Y, Z]) …输出一个列表,其中包含第二个参数中使得filter输出为false的所有元素。 (所以如果filter(A,X)为真,输出是[Y,Z])。 我已经准备好了“filter”函数,但是现在我需要将它应用到第二个示例所示的列表中,排除在应用第一个参数时filter返回true的所有元素。 因此,如果filter是一个简单的A == B,函数应该接收A [A,B,A,C,D,A]并输出[B,C,D]该filter适用,显然。 我在函数的基本结构上遇到了麻烦,所以如果任何人都可以为这样的函数提供一个基本的提纲,那将是非常有帮助的。 我尽可能地简化了我的情况,以便我可以根据需要提供和修改它。 提前致谢!

在列表Prolog中find2的幂

我试图在Prolog(SWI Prolog)中创build一个列表,并检查哪些数字是2的幂,然后查找列表中具体数字的次数(在这个例子中,我试图找出数字的次数3在列表中)。 举个例子,如果你问 ?- check([0,2,3,-5,-2,1,8,7,4], MULT2, THREE). 你应该看看 MULT2=[2,8,4] THREE=1 我的第一个尝试find一个解决scheme是search头部和头部mod 2 = 0find所有的数字是2的权力,但出了问题,我只得到“假”作为答案。

Prolog后继符号产生不完整的结果和无限循环

我开始学习Prolog,并首先了解后继符号。 这是我在Prolog中写皮纳诺公理的地方。 见PDF第12页: sum(0, M, M). sum(s(N), M, s(K)) :- sum(N,M,K). prod(0,M,0). prod(s(N), M, P) :- prod(N,M,K), sum(K,M,P). 我把乘法规则放到Prolog中。 然后我做这个查询: ?- prod(X,Y,s(s(s(s(s(s(0))))))). 这意味着基本上find6的因素。 这是结果。 X = s(0), Y = s(s(s(s(s(s(0)))))) ? ; X = s(s(0)), Y = s(s(s(0))) ? ; X = s(s(s(0))), Y = s(s(0)) ? ; infinite loop 这个结果有两个问题: 不是所有的结果都显示出来,注意结果X = 6,Y = […]

Prolog – 在列表中统计重复次数

我试图查看一个列表,并计算给定单词出现的次数。 我到目前为止: count_repetitions([_], [], 0). count_repetitions([Word], [Word|Tail], Count):- count_repetitions([Word], Tail, X), Count is X + 1. count_repetitions([Word], [Z|Tail], Count):- Word \= Z, count_repetitions([Word], Tail, Count). 所以查询?- count_repetitions([yes],[yes,and,yes,and,no], X). 会给X = 2 。 这似乎工作。 现在我需要写一个谓词,用X = [(yes – 2)]的forms输出一个包含search词和出现次数的列表。 我完全卡住了,有什么build议?

删除列表中的元音

编写一个程序,删除元音( String , NoVowelsString ),从给定的string中删除所有的元音。 到目前为止,我已经得到了条件vowel(X):- member(X,[a,e,i,o,u]) 。 然后我想到了从另一个列表中删除所有元素的那个: delete2([],L1,L1). delete2([H|T],L1,L3) :- delete2(H,L1,R2), delete2(T,R2,L3). 所以有了这两个我想我可以把那些被删除的元素的条件,他们必须是[a,e,i,o,u] 。 虽然我还没有得到任何地方。