编辑Prolog程序以输出计算结果

编辑Prolog程序以输出计算结果,prolog,Prolog,我在其他问题中发现了一些这方面的问题,但我的问题有点不同 给定一个字符串,我必须输出另一个没有相邻重复项的字符串 例如,给定[a,a,b,b,c,d,a],我的输出将是[a,b,c,d,a] 现在,我编写了以下递归程序来检查某个给定字符串是否有相邻的重复项: notequal(A,[]). notequal(A,[X|S]) :- not(A=X). noadj([]):-!. noadj([A|S]) :- notequal(A,S), noadj(S). 我将如何修改它以输出我所描

我在其他问题中发现了一些这方面的问题,但我的问题有点不同

给定一个字符串,我必须输出另一个没有相邻重复项的字符串

例如,给定[a,a,b,b,c,d,a],我的输出将是[a,b,c,d,a]

现在,我编写了以下递归程序来检查某个给定字符串是否有相邻的重复项:

notequal(A,[]).

notequal(A,[X|S]) :- not(A=X).

noadj([]):-!.

noadj([A|S]) :- notequal(A,S), noadj(S).

我将如何修改它以输出我所描述的内容?我尝试过多次,但我对prolog还不熟悉,似乎无法理解它的逻辑

当然,我还需要另一个变量,如果notequal对该元素为true,则该变量将包含一个元素。 因此,我的想法是遍历列表,只有通过“notequal”测试,才能向结果中添加某个术语

我将对此进行编辑:通过添加

noadjlist([X|S],[X|LS]) :- notequal(X,S), noadjlist(S,LS).

noadjlist([X|S],LS) :- noadjlist(S,LS).

noadjlist([],LS):-!.

但是,我的结果如下:

?-noadjlist([1,2,2,3],LS)

LS=[1,2,3|u 19316]

为什么我会在最后得到那个未实例化的变量

noadjlist([],LS):-!.
应该是

noadjlist([],[]):-!.

快速搜索<代码>noadjlist([],LS):-应该是
noadjlist([],[]):-@GuyCoder哇,真管用。基本上,在递归结束时,我添加了这个未实例化的LS变量,它是问题的根源。谢谢你,这是正确的。我还向第二个noadjlist子句添加了一个cut,以只获得一个解决方案,而不是多个,从而拒绝回溯。谢谢