小编Gnu*_*gen的帖子

Prolog:如何在没有削减的情况下避免回溯?

所以我试图在prolog中编写一个谓词,它可以获取列表L1和列表L2,并返回L1中不在L2中的所有元素的列表.这是我到目前为止:

% Append an element to a list.
myappendelem(X,L,[X|L]).

% True if input list contains X.
mycontains([H | T], X) :-
    H == X;
    mycontains(T,X).

% Does the work for notin().
nocontains([],_,A,A).
nocontains([H|T],L,A,R):-
    mycontains(L,H),
    nocontains(T,L,A,R);
    myappendelem(H,A,AR),
    nocontains(T,L,AR,R).

% Returns all elements in L1 not in L2.
notin(L1,L2,R):-
    nocontains(L1,L2,[],X).
Run Code Online (Sandbox Code Playgroud)

这有效,但它提供了多个答案,例如:

notin([5,1],[4,3,2,1],X).
X = [5];
X = [5,1].
Run Code Online (Sandbox Code Playgroud)

这是一个问题,因为我使用这个谓词来排序图中的路径(L1是我可能去的节点列表,L2是我已经去过的节点)以确保我不会访问同一个节点不止一次,陷入困境.但是这个实现让我陷入了一个循环,因为它在尝试第一个X之后回溯并且它失败了,对于未改变的X,进入可以相互到达的相同两个节点之间的无限循环.我知道通过向nocontains添加切割就可以轻松解决这个问题:

% Does the work for notin().
nocontains([],_,A,A).
nocontains([H|T],L,A,R):-
    mycontains(L,H),!,
    nocontains(T,L,A,R);
    myappendelem(H,A,AR),!,
    nocontains(T,L,AR,R).
Run Code Online (Sandbox Code Playgroud)

但有没有办法在没有削减的情况下实现同样的目标?所以,当我使用notin时,我只得到一个可能的答案?(它用于学校,部分任务是不使用任何内置谓词或控制操作符)

编辑:

只是为了更具体地说明赋值的局限性:它应该由纯粹的事实和规则组成,我们不允许使用任何内置的谓词或控制结构(包括但不限于算术,削减或否定 - 失败).分号没问题.我们需要定义自己的任何实用程序谓词.

感谢所有的答案,但我开始认为这可能是我用于在图中的两个节点之间找到路径的方法的一个问题,因为从答案看起来不是很简单的方法这个.

prolog backtracking prolog-dif logical-purity

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

无法卸载GlassFish 3

好的,所以这是交易:

我试图安装java jdk所以我可以在这台计算机上的eclipse上运行一个android项目,但是有这么多不同的java安装是不可能的,至少对我来说,要弄明白我需要哪一个.所以我选择了"带Java EE的JDK 7u3".但是这也安装了这个GlassFish的东西,我不知道它是什么或它做什么,当我经历所有的日食时我决定让我的另一台电脑工作.所以我删除了eclipsed和所需的东西,我删除了java的东西,但是当我尝试卸载GlassFish时,它不能,并给我错误:

"无法在'(null)'中找到所需的Java(TM)2运行时环境版本."

我现在已经尝试了几个小时,在网上搜索找出一些删除它的方法,安装各种java东西,再次删除它,重新安装,但没有任何作用.我真的不在乎GlassFish是什么或它做什么,我只是想要它,并且所有的java东西都不错.

我怎么能做到这一点?

uninstall glassfish

0
推荐指数
1
解决办法
5999
查看次数