Prolog GNU - operatore Univ? Spiegazione di esso
-
29-09-2019 - |
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?
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 Item
s. (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