Tag: 元谓语

序言:过滤列表?

我目前正在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适用,显然。 我在函数的基本结构上遇到了麻烦,所以如果任何人都可以为这样的函数提供一个基本的提纲,那将是非常有帮助的。 我尽可能地简化了我的情况,以便我可以根据需要提供和修改它。 提前致谢!

定义一条path/步道/步行

许多谓词定义了通过二元关系定义的一些非循环path,与定义传递闭包非常类似。 因此需要一个通用的定义。 请注意,图论中定义的概念并不容易匹配通常所期望的。 最值得注意的是,我们对边缘的名字不感兴趣。 更糟糕的是,图论也发生了一些变化,引入了步行的概念,注意到了 传统上,path指的是现在通常所说的开放式散步。 如今,当没有任何资格时,通常认为path是简单的,意味着没有顶点(并且因此没有边)被重复。 (术语链也被用来指代所有顶点和边缘是不同的步行。) 所以我的问题是:如何命名和定义这个function? 我迄今所做的是定义: path(Rel_2, Path, X0,X) 第一个论点必须是关系的延续。 然后来到Path或一对顶点。 用法示例 n(a, b). n(b, c). n(b, a). ?- path(n,Xs, a,X). Xs = [a], X = a ; Xs = [a, b], X = b ; Xs = [a, b, c], X = c ; false. 履行 :- meta_predicate path(2,?,?,?). :- […]

描述相对于关系sorting的整数序列的大多数一般的高阶约束

在CLP(FD)中,我们经常需要陈述:“这是一个整数和有限域variables的列表(有时: 严格地说 )是升序/降序。 是否有任何CLP(FD)系统为此任务提供一个通用(可参数化)的内置约束? SWI-Prolog提供了一个叫做chain/2的约束,与我正在寻找的相似。 然而,这个名字稍微有些特殊,不能包含约束可以描述的所有关系(例如: #<不是一个偏序,但是在第二个chain/2是可以接受的,导致序列被看作是一个整数集合 -math顺序理论中定义的一个链)。 因此,这个名字并没有完全描述约束实际实现的内容。 请给出关于通常的二进制CLP(FD)约束的最一般的定义 – 或者至less包含#< , #> , #=<和#>= – 的合适的子集, 包括根据代数结构约束定义。 强加的条件是约束描述了一个在文献中有一个真正的名字的实际math结构。 首先,请考虑使用SICStus Prolog或SWI: :- use_module(library(clpfd)). connex(Relation_2, List) :- connex_relation(Relation_2), connex_(List, Relation_2). connex_relation(#=). connex_relation(#<). connex_relation(#=<). connex_relation(#>). connex_relation(#>=). connex_([], _). connex_([L|Ls], Relation_2) :- foldl(adjacent(Relation_2), Ls, L, _). adjacent(Relation_2, X, Prev, X) :- call(Relation_2, Prev, X). 示例: ?- connex(#<, […]

自反传递闭包的定义

许多谓词本质上使用某种形式的传递闭包,只是发现终止也必须被解决。 为什么不用closure0/3解决这个问题closure0/3 : :- meta_predicate closure0(2,?,?). :- meta_predicate closure(2,?,?). :- meta_predicate closure0(2,?,?,+). % internal closure0(R_2, X0,X) :- closure0(R_2, X0,X, [X0]). closure(R_2, X0,X) :- call(R_2, X0,X1), closure0(R_2, X1,X, [X1,X0]). closure0(_R_2, X,X, _). closure0(R_2, X0,X, Xs) :- call(R_2, X0,X1), non_member(X1, Xs), closure0(R_2, X1,X, [X1|Xs]). non_member(_E, []). non_member(E, [X|Xs]) :- dif(E,X), non_member(E, Xs). 有没有这个定义不能用于实现传递闭包的情况? 为什么dif / 2? 要详细回答@ […]