说我有一个清单
[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.
我不确定在递归电话中我会返回什么, 任何帮助都会非常感谢你
答案 0 :(得分:2)
您的代码当前编写的方式是尝试更改给定解决方案中的多个列表元素。但是,要求似乎只是更改一个列表元素。使用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]).