许多谓词定义了通过二元关系定义的一些非循环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,?,?,?). :- […]
在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(#<, […]
如何编写将谓词PredName(Arg, Res)应用于List元素的Prolog过程map(List, PredName, Result) ,并将map(List, PredName, Result)返回到Result列表中? 例如: test(N,R) :- R is N*N. ?- map([3,5,-2], test, L). L = [9,25,4] ; no