相关疑难解决方法(0)

术语平等/不平等的具体化

纯粹的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).
Run Code Online (Sandbox Code Playgroud)

虽然程序从声明的角度来看是完美无缺的,但它在B,SICStus,SWI,YAP等当前系统上的直接执行效率却不必要地低效.对于以下目标,列表的每个元素保留一个选择点.

?- occurrences(a,[a,a,a,a,a],M).
M = [a, a, a, a, a] ;
false. …

prolog prolog-dif

40
推荐指数
3
解决办法
1328
查看次数

最常见的高阶约束描述了关于关系排序的整数序列

在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).
Run Code Online (Sandbox Code Playgroud)

示例案例:

?- connex(#<, [A,B,C]).
A#=<B+-1,
B#=<C+-1.

?- connex(#=, [A,B,C]).
A = B, B = C,
C in inf..sup. …
Run Code Online (Sandbox Code Playgroud)

topology prolog clpfd meta-predicate

22
推荐指数
2
解决办法
1114
查看次数

AUBUC的Prolog联盟

我最近开始学习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).
Run Code Online (Sandbox Code Playgroud)

有人可以帮我吗?

list prolog

20
推荐指数
2
解决办法
2605
查看次数

Prolog中的"逻辑纯度"是什么意思?

什么是"逻辑纯度"(在Prolog编程的背景下)?该标记信息说,"使用程序只喇叭条款",但随后又怎么会谓词喜欢if_/3出线,使用因为它切为多,和各种元逻辑(什么是适当的术语?var/1和这样)谓词,即低级别的东西.

我明白它实现了一些"纯粹"的效果,但这究竟是什么意思呢?

有关更具体的说明,请解释如何if_/3符合逻辑纯度,在使用看到,例如在此答案中

logic prolog logical-purity

14
推荐指数
1
解决办法
685
查看次数

列表列表中是否存在元素?

我想查找列表列表中是否存在给定元素.如果元素存在于某处是第一个列表列表,我只会变为真.

有什么建议?

memberlist(X,[[X|T1]|T2]).
memberlist(X,[[H|T1]|T2]) :-
  memberlist(X,[T1|T2]).
Run Code Online (Sandbox Code Playgroud)

list prolog member

14
推荐指数
5
解决办法
1417
查看次数

谓词选择列表中的元素两次而不是更多

我试图写一个谓词twice(El,L)将返回true.El是名单正是两次.这是我有的:

twice(El,L) :- select(El,L,L1), member(El,L1), \+ twice(El,L1).
Run Code Online (Sandbox Code Playgroud)

它的效果很好twice(2,[1,2,2,3,4]) 但是twice(X,[1,1,2,2,3,3])它为每个数字加倍X = 1 ; X = 1 ; X = 2...我怎么能避免这种情况而不使用任何累加器呢?

prolog

7
推荐指数
1
解决办法
858
查看次数

Prolog:第一个重复值

我需要在列表中找到第一个重复值.

prep(3,[1,3,5,3,5]). 应该是真的.

prep(5,[1,3,5,3,5]). 应该是假的.

我想检查与当前值和先前列表成员的相等性,直到我找到重复,如果它找到一个它将测试与X的相等但我不知道如何在Prolog中做到这一点!

我感谢任何帮助!谢谢

list prolog prolog-dif

5
推荐指数
2
解决办法
2907
查看次数

多个列表的组合 - Prolog

我需要在列表列表中找到组合。例如,给出以下列表,

List = [[1, 2], [1, 2, 3]]
Run Code Online (Sandbox Code Playgroud)

这些应该是输出,

Comb = [[1,1],[1,2],[1,3],[2,1],[2,2],[2,3]]
Run Code Online (Sandbox Code Playgroud)

另一个例子:

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]
Run Code Online (Sandbox Code Playgroud)

我知道如何为具有两个子列表的列表执行此操作,但它需要适用于任意数量的子列表。

我是 Prolog 的新手,请帮忙。

list prolog

4
推荐指数
1
解决办法
466
查看次数

Prolog:说Prolog如何回应查询并为其绘制搜索树? - 成员(2,[2,a,X])

Prolog如何回应以下询问?为查询绘制搜索树.

?- member(2, [2, a, X]).
Run Code Online (Sandbox Code Playgroud)

首先,这个调查意味着什么?

让我们再看一个更清晰的例子:

?-  member(vincent,[yolanda,trudy,vincent,jules]).
Run Code Online (Sandbox Code Playgroud)

Prolog将检查是否vincent在列表中.它逐个检查,因此它将首先进行比较vincentyolanda.没有匹配,现在递归规则又转到第二个子句.现在它看起来像这样:

?-  member(vincent,[trudy,vincent,jules]).
Run Code Online (Sandbox Code Playgroud)

vincent并且trudy,没有匹配.递归规则:

?-  member(vincent,[vincent,jules]).
Run Code Online (Sandbox Code Playgroud)

vincent并且vincent,匹配!所以回归true.


回到我们的例子.序言将立即返回true2在列表(即它的头).

但是搜索树怎么样?我真的不知道,我很害怕他们会让我在测试中画一个搜索树...

prolog

3
推荐指数
1
解决办法
73
查看次数

在序言中的特定元素之前和之后拆分列表(不使用“拆分”谓词?)

我正在尝试将列表拆分为特定元素(特别是“停止”一词)之前的项目以及该元素之后的项目。我知道你可以使用 split 来做到这一点,但我是 prolog 的新手,所以我正试图在不使用这些函数的情况下操作东西,所以我真的很想知道这是否可能?(也许还有一些指向正确方向的指针)

即与列表;

L = [tea,coffee,sugar,cake,stop,meat,fish,eggs,flour]
Run Code Online (Sandbox Code Playgroud)

理想情况下,我想在“停止”处拆分列表,让我留下,

L2 = [tea, coffee, sugar, cake] // and
L3 = [meat, fish, eggs, flour]
Run Code Online (Sandbox Code Playgroud)

split list prolog

2
推荐指数
1
解决办法
977
查看次数