纯粹的Prolog程序以清晰的方式区分术语的平等和不平等,导致执行效率低下; 即使所有相关术语都是基础的.
关于SO的最近一个例子是这个答案.在此定义中,所有答案和所有失败都是正确的.考虑:
?- Es = [E1,E2], occurrences(E, Es, Fs).
Es = Fs, Fs = [E, E],
E1 = E2, E2 = E ;
Es = [E, E2],
E1 = E,
Fs = [E],
dif(E, E2) ;
Es = [E1, E],
E2 = E,
Fs = [E],
dif(E, E1) ;
Es = [E1, E2],
Fs = [],
dif(E, E1),
dif(E, E2).
虽然程序从声明的角度来看是完美无缺的,但它在B,SICStus,SWI,YAP等当前系统上的直接执行效率却不必要地低效.对于以下目标,为列表的每个元素保留一个选择点.
?- occurrences(a,[a,a,a,a,a],M). M = [a, a, a, a, a] ; false. …
在CLP(FD)中,我们经常需要声明:"这是整数和有限域变量的列表(有时:严格地)升序/降序."
是否有任何CLP(FD)系统为此任务提供通用(参数化)内置约束?
SWI-Prolog提供了一个名为的约束chain/2,类似于我正在寻找的约束.但是,名称稍微过于具体,不能包含约束可以描述的所有关系(例如:#<不是部分顺序,但是可以接受chain/2,导致序列 - 作为一组整数 - 不再计算为链中定义的链数学顺序理论).因此,该名称并未完全描述约束实际实现的内容.
请给所述最一般相对于通常的二进制CLP(FD)约束定义-或包含至少一个合适的子集#<,#>,#=<和#>=- 包括根据代数结构的约束定义适当的名称.强加的条件是约束描述了在文献中具有正确名称的实际数学结构.
首先,请考虑使用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(#<, [A,B,C]).
A#=<B+-1,
B#=<C+-1.
?- connex(#=, [A,B,C]).
A = B, B = C,
C in inf..sup. …我最近开始学习Prolog,我无法解决如何组合三个列表的问题.
我能够组合2个列表:
%element
element(X,[X|_]).
element(X,[_|Y]):-
               element(X,Y).
%union
union([],M,M).
union([X|Y],L,S) :- element(X,L),union(Y,L,S).
union([X|Y],L,[X|S]) :- (not(element(X,L))),union(Y,L,S).
有人可以帮我吗?
我想查找列表列表中是否存在给定元素.如果元素存在于某处是第一个列表列表,我只会变为真.
有什么建议?
memberlist(X,[[X|T1]|T2]).
memberlist(X,[[H|T1]|T2]) :-
  memberlist(X,[T1|T2]).
我试图写一个谓词twice(El,L)将返回true.时El是名单正是两次.这是我有的:
twice(El,L) :- select(El,L,L1), member(El,L1), \+ twice(El,L1).
它的效果很好twice(2,[1,2,2,3,4])
但是twice(X,[1,1,2,2,3,3])它为每个数字加倍X = 1 ; X = 1 ; X = 2...我怎么能避免这种情况而不使用任何累加器呢?
我需要在列表中找到第一个重复值.
prep(3,[1,3,5,3,5]). 应该是真的.
prep(5,[1,3,5,3,5]). 应该是假的.
我想检查与当前值和先前列表成员的相等性,直到我找到重复,如果它找到一个它将测试与X的相等但我不知道如何在Prolog中做到这一点!
我感谢任何帮助!谢谢
我需要在列表列表中找到组合。例如,给出以下列表,
List = [[1, 2], [1, 2, 3]]
这些应该是输出,
Comb = [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3]]
另一个例子:
List = [[1,2],[1,2],[1,2,3]]
Comb = [[1,1,1],[1,1,2],[1,1,3],[1,2,1],[1,2,2],[1,2,3]....etc]
我知道如何为具有两个子列表的列表执行此操作,但它需要适用于任意数量的子列表。
我是 Prolog 的新手,请帮忙。
Prolog如何回应以下询问?为查询绘制搜索树.
?- member(2, [2, a, X]).
首先,这个调查意味着什么?
让我们再看一个更清晰的例子:
?-  member(vincent,[yolanda,trudy,vincent,jules]).
Prolog将检查是否vincent在列表中.它逐个检查,因此它将首先进行比较vincent和yolanda.没有匹配,现在递归规则又转到第二个子句.现在它看起来像这样:
?-  member(vincent,[trudy,vincent,jules]).
vincent并且trudy,没有匹配.递归规则:
?-  member(vincent,[vincent,jules]).
vincent并且vincent,匹配!所以回归true.
回到我们的例子.序言将立即返回true如2在列表(即它的头).
但是搜索树怎么样?我真的不知道,我很害怕他们会让我在测试中画一个搜索树...
我正在尝试将列表拆分为特定元素(特别是“停止”一词)之前的项目以及该元素之后的项目。我知道你可以使用 split 来做到这一点,但我是 prolog 的新手,所以我正试图在不使用这些函数的情况下操作东西,所以我真的很想知道这是否可能?(也许还有一些指向正确方向的指针)
即与列表;
L = [tea,coffee,sugar,cake,stop,meat,fish,eggs,flour]
理想情况下,我想在“停止”处拆分列表,让我留下,
L2 = [tea, coffee, sugar, cake] // and
L3 = [meat, fish, eggs, flour]