我应该在Prolog上写一个规则,它找到列表的最后一个元素并向其添加1。这是我到目前为止想出的。它有效,但我的问题是这个规则可以写成其他方式吗:
element(D ,[_|B]):- element(D, B).
element(D, [X]):- D is X+1.
(1(我将谓词重命名为类似last_element_incremented
的内容,这将比仅仅element
更具描述性,后者没有说太多。
(2( 要使规则不重叠,请更改递归规则:
last_element_incremented(Xinc, [_,X|T]) :- last_element_incremented(Xinc, [X|T]).
(3(如果您使用CLP(FD(,则可以使解决方案更加通用。此外,交换子句的顺序,以便您不会遇到更一般查询的非终止问题:
last_element_incremented(Xinc, [X]) :- Xinc #= X + 1.
last_element_incremented(Xinc, [_,X|T]) :- last_element_incremented(D, [X|T]).
然后,您可以查询,例如:
| ?- last_element_incremented(3, L).
L = [2] ? ;
L = [_,2] ? ;
L = [_,_,2] ? ;
L = [_,_,_,2] ? ;
(4(最后,你可以只使用append/3
:
last_element_incremented(Xinc, L) :- append(_, [X], L), Xinc #= X + 1.