Frage

So ist der univ Operator. Ich weiß nicht genau verstehen.

Zum Beispiel dieses:

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).

Was tut das? Das sieht nach, ob ein weiteres Prädikat wahr ist. Ich verstehe nicht, was die „..“ der Fall ist.

Wie werden Sie diese neu zu schreiben, ohne den univ Operator?

War es hilfreich?

Lösung

Univ (=..) aufbricht einen Begriff in eine Liste von Bestandteilen oder konstruiert einen Begriff von einer solchen Liste. Versuchen Sie:

?- 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 scheint jedes Prädikat in PredList auf Item zu nennen, mit foo Rückzieher über die Items. (Unter Verwendung einer Variablen als ein Prädikat nicht tragbar ist;. Die call Prädikat bevorzugt werden sollte)

Bearbeiten : Kaarel richtig ist, kann univ durch functor/3 und arg/3 ersetzt werden, wie folgt:

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

Andere Tipps

Das am besten geeignete Umschreiben meiner Meinung nach wäre:

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

call/n ist noch nicht Teil des ISO Kernstandard, aber sie könnten in naher Zukunft (*) werden. Viele Prolog Systeme bereits sie unterstützen.

Es gibt einen Grund, warum call/n sollten über einfache (=..)/2 und functor/3 + arg/3 Lösungen bevorzugt werden. Die call/n Lösung ist in der Lage zu handhaben Verschlüsse (**).

Mit dem einfachen (=..)/2 und functor/3 + arg/3 Lösung kann man bar/2 nur mit Atomen in der ersten Liste Argument aufrufen. Zum Beispiel:

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

Mit Verschlüssen sind wir nicht auf Atom beschränkt, und wir könnten einigen Codierungsaufwand sparen. Zum Beispiel können wir die folgenden direkt tun:

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

Mit freundlichen Grüßen

(*)
Entwurf Korrektur 2
http://www.complang.tuwien.ac.at/ulrich / iso-prolog / DTC2 # call

(**)
Wer hat es erfunden ?: call/n Prädikate
http://www.complang.tuwien.ac.at/ulrich /Prolog-inedit/naish.html

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top