有没有办法让prolog规则只执行一次? 例如,我有这个算法将第一个和第n个元素从List1复制到List2:
ith_element(N, List1, List2) :-
X is N - 1,
length(A,X),
append(A, [Head | Tail], List1),
everyNth(N, Tail, Rest ->
List2 = [Head | Rest]
; List2 = [Head | []]
).
我可以以某种方式制定一条规则,只复制一次List1中的第一个元素吗?我只是在学习Prolog而且我找不到任何类似的东西。
答案 0 :(得分:1)
我认为你应该将第一个元素'修补'保持在循环之外:
firstAndEveryNth(N, [F|List1], [F|List2]) :-
everyNth(N, [F|List1], List2).
编辑你可以在参数中编码更多信息,但当然这是一种“奇怪的黑客”
everyNth(N, [F|List1], [F|List2]) :-
integer(N), % or N \= every(_),
everyNth(every(N), [F|List1], List2).
everyNth(every(N), List1, List2) :-
X is N - 1,
length(A, X),
( append(A, [Head | Tail], List1),
everyNth(every(N), Tail, Rest)
-> List2 = [Head | Rest]
; List2 = []
).
编辑交换规则,也应该有效,无需检查N的“类型”
everyNth(every(N), List1, List2) :-
!, % needed to avoid an error on backtracking
X is N - 1,
length(A, X),
( append(A, [Head | Tail], List1),
everyNth(every(N), Tail, Rest)
-> List2 = [Head | Rest]
; List2 = []
).
everyNth(N, [F|List1], [F|List2]) :-
everyNth(every(N), [F|List1], List2).