Prolog使规则执行一次

时间:2014-09-21 05:35:28

标签: prolog

有没有办法让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而且我找不到任何类似的东西。

1 个答案:

答案 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).