相关疑难解决方法(0)

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的纯度谓词使用不纯的原语

我知道这一点var/1,nonvar/1并且!/0是不纯的基元,但它们的使用是否会使每个使用它们的程序都不纯净?

我写了下面的谓词plus/3,表现得好像是纯粹的,或者至少是我声称的那样.谓词是示范性的,不是为了提高效率.

% nat(X) is true if X is a natural number

nat(0).
nat(X):- nonvar(X), !, X > 0.
nat(X):- nat(X1), X is X1 + 1.

% plus(A, B, C) is true if A,B and C are natural numbers and A+B=C

plus(A, B, C):-
    nat(A),
    (nonvar(C), C < A, !, false ; true),
    plus_(B, A, C).

plus_(A, B, C):-
    nat(A),
    (nonvar(C), C < A, !, false ; true),
    C1 is …
Run Code Online (Sandbox Code Playgroud)

prolog logic-programming logical-purity

8
推荐指数
2
解决办法
337
查看次数

Prolog仅删除独特元素

我想返回一个列表,删除所有独特的元素,例如

remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q).   
Q = [1,1,2,2,4,4,6,6,6].  
Run Code Online (Sandbox Code Playgroud)

我的问题是,目前我有返回的代码

remUniqueVals([1,1,2,2,3,4,4,5,6,6,6],Q).  
Q = [1, 2, 4, 6, 6].
Run Code Online (Sandbox Code Playgroud)

这样只返回这些非唯一值的第一个实例.这是我的代码:

remUniqueVals([], []).  
remUniqueVals([Q1|RestQ],[Q1|Xs]) :-        
   member(Q1,RestQ),  
   remUniqueVals(RestQ,Xs).  
remUniqueVals([Q1|RestQ],Xs) :-  
   remove(Q1,[Q1|RestQ], NewQ),  
   remUniqueVals(NewQ,Xs).  
Run Code Online (Sandbox Code Playgroud)

我可以看到member(Q1,RestQ)它在第二次检查1,2,4时失败,因为它们现在不再在列表中,因此将它们删除.我想帮助解决这个问题,我的想法是检查member(Q1, PreviousQ),这是决赛中的元素Q.不知道如何实施,虽然任何帮助将不胜感激.

更新:

好的,谢谢你最终的结论:

remUniqueVals(_,[], []).  
remUniqueVals(_,[Q1|RestQ],[Q1|Xs]) :-        
   member(Q1,RestQ), 
   remUniqueVals(Q1,RestQ,Xs).  
remUniqueVals(PrevQ,[Q1|RestQ],[Q1|Xs]) :-        
   Q1 = PrevQ, 
   remUniqueVals(PrevQ,RestQ,Xs).  
remUniqueVals(PrevQ,[_|RestQ],Xs) :-  
   remUniqueVals(PrevQ,RestQ,Xs). 

remUniqueVals(0,[4,1,1,3,2,2,5,5],Q).
Q = [1, 1, 2, 2, 5, 5].

remUniqueVals(0, [A,B,C], [1,1]).
A = 1,
B = 1,
C = 1.
Run Code Online (Sandbox Code Playgroud)

list prolog

5
推荐指数
3
解决办法
2549
查看次数

Prolog和回溯的局限性

这可能是一个函数的最简单的实现,它返回Prolog中列表的长度

count([], 0).
count([_|B], T) :- count(B, U), T is U + 1.
Run Code Online (Sandbox Code Playgroud)

关于Prolog的一件事我仍然无法理解,那就是使用变量作为参数的灵活性.

所以例如我可以跑步count([a, b, c], 3).和得到true.我也可以跑步count([a, b], X).并得到答案X = 2..奇怪(至少对我而言)是我还可以运行count(X, 3).并获得至少一个结果,这看起来像X = [_G4337877, _G4337880, _G4337883] ;解释器消失在无限循环之前.我甚至可以运行一些真正"灵活"的东西,count(X, A).并且得到X = [], A = 0 ; X = [_G4369400], A = 1.,这显然是不完整的,但不知何故真的很好.

因此,我的多方面问题.我可以以某种方式向Prolog解释在执行时不要超越第一个结果count(X, 3).吗?我可以以某种方式让Prolog为其生成任意数量的解决方案count(X, A).吗?我可以产生什么样的解决方案?这个特定的谓词是什么阻止我为所有可能的查询生成所有解决方案?

prolog

5
推荐指数
1
解决办法
570
查看次数

标签 统计

prolog ×4

list ×2

logic-programming ×1

logical-purity ×1