【问题标题】:Edit Prolog program to output the result of a computation编辑 Prolog 程序以输出计算结果
【发布时间】:2020-10-29 14:34:39
【问题描述】:

我在其他问题中发现了一些关于此的内容,但我的有点不同。

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

例如,给定 [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 为真,则该变量将包含该元素。 所以我的想法是遍历列表,如果它通过“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|_19316]。

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

【问题讨论】:

  • 快速提问。 noadjlist([],LS):-!. 应该是 noadjlist([],[]):-!.
  • @GuyCoder 哇,成功了。所以基本上在递归结束时,我添加了这个未实例化的 LS 变量,这是问题的根源。非常感谢

标签: prolog


【解决方案1】:
noadjlist([],LS):-!.

应该是

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

【讨论】:

  • 是的,这是正确的。我还在第二个 noadjlist 子句中添加了一个剪辑,以仅获得一个解决方案而不是多个解决方案,从而拒绝回溯。谢谢。
猜你喜欢
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 2021-07-11
  • 2017-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-14
相关资源
最近更新 更多