相关疑难解决方法(0)

不同/ 2 - 是否存在纯粹的,确定的定义?

different(Xs, Ys) :-
   member(X, Xs),
   non_member(X, Ys).
different(Xs, Ys) :-
   member(Y, Ys),
   non_member(Y, Xs).
Run Code Online (Sandbox Code Playgroud)

虽然这个定义使用member/2non_member/2几乎是1从声明的观点完美的,它产生于特定查询的冗余解决方案,并选择留点周围.

什么是改进的定义(以纯粹的方式可能使用if_/3(=)/3),使得完全相同的解决方案集被描述different/2但至少对于地面查询是确定的(因此不会留下任何无用的选择点)并且省略(如有可能)任何多余的答案?


1 实际上,different([a|nonlist],[]), different([],[b|nonlist])成功了.它同样可能失败.所以两者都失败的解决方案很好(甚至可能更精细).

prolog prolog-dif logical-purity

33
推荐指数
7
解决办法
791
查看次数

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
查看次数

列表中的数字小于给定数字

xMenores(_,[],[]).
xMenores(X,[H|T],[R|Z]) :-
   xMenores(X,T,Z),
   X > H,
   R is H.
Run Code Online (Sandbox Code Playgroud)

xMenores 有三个参数:

  • 第一个是数字.
  • 第二个是数字列表.
  • 第三个是列表,是包含结果的变量.

该规则的目标xMenores是获得一个列表,其中列表的编号(第二个参数)小于第一个参数的值.例如:

?- xMenores(3,[1,2,3],X).
X = [1,2].                        % expected result
Run Code Online (Sandbox Code Playgroud)

问题是xMenores返回falseX > H是假的,我的编程技巧在prolog几乎为空.所以:

?- xMenores(4,[1,2,3],X).
X = [1,2,3].                      % Perfect.

?- xMenores(2,[1,2,3],X).
false.                            % Wrong! "X = [1]" would be perfect.
Run Code Online (Sandbox Code Playgroud)

我认为X > H, R is H.因为我需要的只要X大于H,R取值H.但我不知道像Prolog中的if或者某种控制结构来处理这个问题.

请问,任何解决方案?谢谢.

list prolog

13
推荐指数
5
解决办法
2024
查看次数

实现一个 Prolog 谓词,说明一个元素是否属于一个列表。非数字列表的问题

我正在为大学考试学习 Prolog,但我在这个练习中遇到了问题:

not_member(X,L)如果元素X不属于列表,则实现为 TRUE的谓词L

如果我的推理是正确的,我已经找到了解决方案:

% FACT (BASE CASE): It is TRUE that X is not in the list if the list is empty.
not_member(_,[]).

% RULE (GENERAL CASE): If the list is non-empty, I can divide it in its Head
%   element and the sublist Tail. X does not belong to the list if it is different 
%   from the current Head element and if it does not belong to the sublist Tail.
not_member(X,[Head|Tail]) …
Run Code Online (Sandbox Code Playgroud)

prolog prolog-dif

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

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 ×5

list ×3

prolog-dif ×2

logical-purity ×1