3 Stimmen

Ist ein Prädikat mit variabler Arität in Prolog akzeptabel?

Ist es möglich, eine "Variable Arität Prädikat" in Prolog haben?

Ich meine so etwas wie das hier:

my_predicate( [a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)

wobei die Anzahl der ursprünglichen Listen zu Beginn unbekannt ist?

Die Verwendung des univ Operator ( =.. ) wäre es möglich, sie mit einer Liste von Begriffen zu vereinen und sie wie jede andere Liste zu durchlaufen. Aber wie schreibt man das Ziel?

my_predicate(??) =.. [??]

Ich weiß wirklich nicht, ob das überhaupt möglich ist

5voto

Thanos Tintinidis Punkte 5798

Können Sie Prädikate mit verschiedenen Aritäten definieren, die denselben Namen haben, aber unterschiedliche Prädikate sind.

foo(1).
foo(2,1).

?-foo(2).
false

Ich schlage vor, die Kodierung zu ändern und statt einer Reihe von Ausgangslisten eine Liste von Ausgangslisten zu erstellen.
Die andere Lösung bestünde darin, Prädikate für alle möglichen Anzahlen von Argumenten zu schreiben (oder sie dynamisch zu erzeugen).

4voto

false Punkte 10407

Wie @thanosQR vorschlägt, ist es wahrscheinlich das Beste, die Darstellung in eine Liste zu ändern.

Es gibt jedoch - sehr selten, aber dennoch - Situationen, in denen Sie eine Prädikatisierung l .

3voto

ony Punkte 10685

Y

C

target(my_predicate( [a,b,c], [a,c], [a], [a,b,c,d], N, RESULT)) :- RESULT=[a], N=1.
target(H) :- H =.. [my_predicate|_].
target(using_my_predicate(X, Y)) :- target(my_predicate(X,1,Y)).

S

:- module(sumtest).

target(sum(0)).
target(H) :-
    H =.. [sum, S, X|XS],
    H1 =.. [sum, S1|XS],
    H1,
    S is (S1+X).

target(sumtest:G):- target(G). % HACK: strip-off module

:- unknown(_, target(_)).

test:-
    sum(X,1), write(X), nl,
    sum(Y,2,3), write(Y), nl,
    sum(Z,3,4,2), write(Z), nl,
    target(sum(X1,1)), write(X1), nl,
    target(sum(Y1,2,3)), write(Y1), nl,
    target(sum(Z1,3,4,2)), write(Z1), nl.

:- test, halt.
% % yap -l sumtest.pl
% YAP 6.2.0 (amd64): Thu Oct 21 10:31:27 EEST 2010
% MYDDAS version MYDDAS-0.9.1
% 1
% 5
% 9
% 1
% 5
% 9
%  % YAP execution halted

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X