我应该在prolog上写一条规则,它找到列表的最后一个元素并向其添加1。这是我到目前为止所提出的。它有效,但我的问题是这条规则是否可以写成:
element(D ,[_|B]):- element(D, B).
element(D, [X]):- D is X+1.
答案 0 :(得分: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.