Что вы пытаетесь сделать и почему вы хотите только одно предложение для предиката?
лично я считаю, что возможность писать много предложений - одна из замечательных вещей пролога, а код более элегантный ичитаемый таким образом
В любом случае, вы, вероятно, захотите использовать или.предполагая, что у вас есть следующие пункты:
foo(Arg11,Arg12,Arg13):-
(Body1).
foo(Arg21,Arg22,Arg23):-
(Body2).
foo(Arg31,Arg32,Arg33):-
(Body3).
, вы должны сначала убедиться, что каждое предложение имеет одинаковые аргументы (пока, пока шаблон соответствует!):
foo(Arg1,Arg2,Arg3):-
(Body1b).
foo(Arg1,Arg2,Arg3):-
(Body2b).
foo(Arg1,Arg2,Arg3):-
(Body3b).
и затем выбудет использовать или (;):
foo(Arg1,Arg2,Arg3):-
(Body1b)
; (Body2b)
; (Body3b).
, например,
reverse([X|Y],Z,W):-
reverse(Y,[X|Z],W).
reverse([],X,X).
станет:
reverse(X,Y,Z):-
X = [H|T],
reverse(T,[H|Y],X).
reverse(X,Y,Z):-
X = [],
Z = Y.
, а затем:
reverse(X,Y,Z):-
(X = [H|T],
reverse(T,[H|Y],X) )
; (X = [],
Z = Y). *%ew ew ugly!*
Относительно примера из вашего первого поста, есть два разных предиката, каждый из которых имеет только одно предложение.у второго предиката есть 2 аргумента, в то время как у первого - 1, поэтому они разныеЕдинственный способ «объединить» их - просто вызвать второй вместо has_equal_sums (List, _) вместо первого.
Если честно, я не вижу смысла в этом;Я сомневаюсь, что вы не добьетесь значительного ускорения, и код станет намного сложнее.
Конечно, это ваш код, и могут быть ограничения, о которых мы не знаем (поэтому я спросил, чего вы хотите достичь)