在Prolog中过滤包含多个元素的列表

时间:2018-10-17 16:24:52

标签: prolog

我尝试编写一个谓词过滤器/ 3

示例filter([a,a,b,c,d,d],[a,d],L)和L与[b,c]统一

我已经写了一个delete / 3谓词,并将其用于过滤器

delete([],_,[]).
delete([A|X],E,Z) :- A==E, delete(X,E,Z).
delete([A|X],E,[A|Z]) :- A \== E, delete(X,E,Z).

filter(M,[],M).                                                                                                                                                                                             
filter([K|M],[E|N],Z) :- delete([K|M],E,Z), filter(Z,N,B).

删除工作正常,但过滤不佳,例如带有跟踪的示例

filtre([1,1,3,7,7],[1,7],Z).

跟踪的最后一行是:

N-3 Call: (10) filtre([3], [], _18304470) ? creep N-2 Exit: (10) filtre([3], [], [3]) ? creep N-1 Exit: (9) filtre([3, 7, 7], [7], [3]) ? creep N Exit: (8) filtre([1, 1, 3, 7, 7], [1, 7], [3, 7, 7]) ? creep

N-3和N-2行我看到序言找到正确的结果,但是他返回[3,7,7]而不是[3],我不明白为什么他不停在N-2行。

1 个答案:

答案 0 :(得分:0)

运行代码,首先要获得的是const { fabric } = require("fabric"); const canvas = new fabric.Canvas(null, {width: 500, height: 500}); const fs = require("fs"); const stream = canvas.createPNGStream(); const out = fs.createWriteStream("test.png"); var text = new fabric.Text("Hello world", { left: 100, top: 100, fill: "#f55", angle: 15 }); canvas.add(text); canvas.renderAll(); stream.on('data', function(chunk) { out.write(chunk); }); 。通常,单例变量指示逻辑错误,因为从不使用这些变量。在这种情况下,程序不会返回正确的结果,因为首先您应该在列表Singleton variables: [B]上调用delete([K|M],E,Z1),然后以这种方式Z1再次调用过滤器