Domanda

Quindi, l'operatore univ. Non so esattamente lo capisco.

Per esempio, questo:

foo(PredList,[H|_]) :- bar(PredList,H).
foo(PredList,[_|T]) :- foo(PredList,T),!.

bar([H|_],Item) :- G =.. [H,Item],G.
bar([_|T],Item) :- bar(T,Item).

Cos'è questo facendo? Questo sembra di vedere se un altro predicato è vero. Non capisco che cosa ".." fa.

Come si riscrivere questo senza che l'operatore Univ?

È stato utile?

Soluzione

Univ (=..) rompe un termine in un elenco dei componenti, o costruisce un termine da tale elenco a. Prova:

?- f(x,y) =.. L.
L = [f, x, y].

?- f(x,y,z) =.. [f|Args].
Args = [x, y, z].

?- Term =.. [g,x,y].
Term = g(x, y).

bar sembra chiamare ogni predicato nella PredList su Item, con foo backtracking nel corso degli Items. (Usando una variabile come predicato non è portatile;. Il predicato call dovrebbe essere preferito)

Modifica : Kaarel è giusto, univ possono essere sostituiti da functor/3 e arg/3, come segue:

bar([H|_],Item) :-
    functor(Goal,H,1),   % unifies Goal with H(_)
    arg(1,Goal,Item),    % unifies first argument of Goal with Item
    call(Goal).          % use this for portability

Altri suggerimenti

La riscrittura più appropriato, a mio parere potrebbe essere:

 bar( [H|_], Item ) :- call(H, Item).

call/n non sono ancora parte dello standard ISO di base, ma potrebbe diventare in un futuro prossimo (*). Un sacco di sistemi Prolog già li supporta.

C'è una ragione per cui call/n dovrebbe essere preferito a semplice (=..)/2 e soluzioni functor/3 + arg/3. La soluzione è in grado di call/n chiusure maniglia (**).

Con la semplice (=..)/2 e functor/3 + arg/3 soluzione può invocare bar/2 soltanto con atomi nel primo argomento lista. Ad esempio:

 p1(1).
 p2(2).
 ?- bar( [p1, p2], 1 ).
 Yes
 ?- bar( [p1, p2], 2 ).
 Yes
 ?- bar( [p1, p2], 3 ).
 No

Con le chiusure non sono limitate a atomi, e potremmo risparmiare un po 'sforzo di codifica. Per esempio possiamo fare quanto segue direttamente:

 ?- bar( [=(1), =(2)], 1 ).
 Yes
 ?- bar( [=(1), =(2)], 2 ).
 Yes
 ?- bar( [=(1), =(2)], 3 ).
 No

Con i migliori saluti

(*)
Progetto di rettifica tecnica 2
http://www.complang.tuwien.ac.at/ulrich / iso-Prolog / dtc2 # chiamata

(**)
Chi ha inventato Si ?: call/n predicati
http://www.complang.tuwien.ac.at/ulrich /Prolog-inedit/naish.html

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top