首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从列表prolog中的元素中提取

从列表prolog中的元素中提取
EN

Stack Overflow用户
提问于 2016-11-22 19:27:08
回答 1查看 259关注 0票数 0

假设我有一份名单

代码语言:javascript
复制
[5,4,6,9]

我想把名单上的头像去掉,但把剩下的部分还给你

所以:-3

代码语言:javascript
复制
[2,4,6,9]

-2

代码语言:javascript
复制
[3,4,6,9]

然后我想转到下一个元素,

-3

代码语言:javascript
复制
[5,1,6,9],

-2

代码语言:javascript
复制
[5,2,6,9]

我如何为这个生成一个prolog谓词,

到目前为止我已经

代码语言:javascript
复制
 change([],[]).
change([Head|Tail], [Head1|Tail]):-
    process(Head, Head1).


process([],[]).
process(Head, Head1):-
    Head1 is Head-3,
    Head1 >=0.

process(Head, Head1):-
    Head1 is Head-2,
    Head1 >=0.

我不确定我会在递归调用中返回什么,任何帮助都是很好的,谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-11-22 20:23:26

您的代码当前的编写方式是尝试更改给定解决方案中的多个list元素。但是,要求似乎只更改一个list元素。使用CLP(FD)将有助于算法的实现。

代码语言:javascript
复制
change([], []).           % Nothing to change
change([X|T], [Y|T]) :-   % Change only the head
    Y #= X - 2 ; Y #= X - 3.
change([X|Xs], [X|Ys]) :- % Keep the head and change something later
    change(Xs, Ys).

这个解决方案的潜在问题是它的change(L, L).是真的(列表没有改变)。为了避免这种情况,您可以将基本大小写更改为单个元素列表,并强制其他元素为两个元素:

代码语言:javascript
复制
change([X], [Y]) :-             % Change only the last or single element
    Y #= X - 2 ; Y #= X - 3.
change([X,X1|Xs], [Y,X1|Xs]) :- % Change only the head
    Y #= X - 2 ; Y #= X - 3.
change([X,X1|Xs], [X,Y1|Ys]) :- % Keep the head and change something later
    change([X1|Xs], [Y1|Ys]).
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40750080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档