假设我有一份名单
[5,4,6,9]我想把名单上的头像去掉,但把剩下的部分还给你
所以:-3
[2,4,6,9]-2
[3,4,6,9]然后我想转到下一个元素,
-3
[5,1,6,9],-2
[5,2,6,9]我如何为这个生成一个prolog谓词,
到目前为止我已经
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.我不确定我会在递归调用中返回什么,任何帮助都是很好的,谢谢
发布于 2016-11-22 20:23:26
您的代码当前的编写方式是尝试更改给定解决方案中的多个list元素。但是,要求似乎只更改一个list元素。使用CLP(FD)将有助于算法的实现。
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).是真的(列表没有改变)。为了避免这种情况,您可以将基本大小写更改为单个元素列表,并强制其他元素为两个元素:
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]).https://stackoverflow.com/questions/40750080
复制相似问题