Как это сделать в одной функции - PullRequest
0 голосов
/ 04 мая 2011

Мне было интересно, как сделать ответ (или первую функцию) на этот вопрос в Прологе, используя только один предикат?Ссылка, на которую я ссылаюсь: здесь .

Вот пример того, что я имею в виду, называя только один предикат:

reverse([X|Y],Z,W) :- reverse(Y,[X|Z],W).
reverse([],X,X).

1 Ответ

0 голосов
/ 04 мая 2011

Что вы пытаетесь сделать и почему вы хотите только одно предложение для предиката?
лично я считаю, что возможность писать много предложений - одна из замечательных вещей пролога, а код более элегантный ичитаемый таким образом

В любом случае, вы, вероятно, захотите использовать или.предполагая, что у вас есть следующие пункты:

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, _) вместо первого.

Если честно, я не вижу смысла в этом;Я сомневаюсь, что вы не добьетесь значительного ускорения, и код станет намного сложнее.
Конечно, это ваш код, и могут быть ограничения, о которых мы не знаем (поэтому я спросил, чего вы хотите достичь)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...