diff --git a/C/arith2.c b/C/arith2.c index d3b11b8e9..4224b7a7f 100755 --- a/C/arith2.c +++ b/C/arith2.c @@ -674,7 +674,7 @@ p_gcd(Term t1, Term t2) Int i1 = IntegerOfTerm(t1), i2 = IntegerOfTerm(t2); i1 = (i1 >= 0 ? i1 : -i1); i2 = (i2 >= 0 ? i2 : -i2); - + RINT(gcd(i1,i2)); } case double_e: @@ -965,7 +965,6 @@ static InitBinEntry InitBinTab[] = { {"\\/", op_or}, {"#", op_xor}, {"><", op_xor}, - {"atan", op_atan2}, {"atan2", op_atan2}, /* C-Prolog exponentiation */ {"^", op_power}, diff --git a/C/unify.c b/C/unify.c index 445e80950..eb639ff69 100644 --- a/C/unify.c +++ b/C/unify.c @@ -1009,9 +1009,9 @@ Yap_InitUnify(void) { Term cm = CurrentModule; Yap_InitCPred("unify_with_occurs_check", 2, p_ocunify, SafePredFlag); + Yap_InitCPred("acyclic_term", 1, p_acyclic, SafePredFlag|TestPredFlag); CurrentModule = TERMS_MODULE; Yap_InitCPred("cyclic_term", 1, p_cyclic, SafePredFlag|TestPredFlag); - Yap_InitCPred("acyclic_term", 1, p_acyclic, SafePredFlag|TestPredFlag); Yap_InitCPred("protected_unifiable", 3, p_unifiable, 0); CurrentModule = cm; } diff --git a/changes-6.0.html b/changes-6.0.html index 2cee566ab..cc5e16eeb 100644 --- a/changes-6.0.html +++ b/changes-6.0.html @@ -17,7 +17,14 @@

Yap-6.0.7:

Yap-6.0.6:

diff --git a/docs/yap.tex b/docs/yap.tex index f039d3a8e..e17376ddb 100644 --- a/docs/yap.tex +++ b/docs/yap.tex @@ -198,6 +198,7 @@ Subnodes of Library * AVL Trees:: Predicates to add and lookup balanced binary trees. * Heaps:: Labelled binary tree where the key of each node is less than or equal to the keys of its children. +* Lambda:: Ulrich Neumerkel's Lambda Library * LineUtilities:: Line Manipulation Utilities * Lists:: List Manipulation * MapList:: SWI-Compatible Apply library. @@ -3350,6 +3351,22 @@ is bound to the empty list (nil) or a term with functor '.' and arity 2. Same as @code{variant/2}, succeeds if @var{Term1} and @var{Term2} are variant terms. + +@item subsumes_term(?@var{Subsumer}, ?@var{Subsumed}) +@findex subsumes_term/2 +@syindex subsumes_term/2 +@cnindex subsumes_term/2 + +Succeed if @var{Submuser} subsumes @var{Subsuned} but does not bind any +variable in @var{Subsumer}. + +@item acyclic_term(?@var{Term}) +@findex cyclic_term/1 +@syindex cyclic_term/1 +@cnindex cyclic_term/1 +Succeed if the argument @var{Term} is an acyclic term. + + @end table @node Predicates on Atoms, Predicates on Characters, Testing Terms, Top @@ -3916,11 +3933,8 @@ Arc cosine. @item atan(@var{X}) [ISO] Arc tangent. -@item atan(@var{X},@var{Y}) -Four-quadrant arc tangent. - @item atan2(@var{X},@var{Y}) -Four-quadrant arc tangent, same as atan/2. +Four-quadrant arc tangent. @item sinh(@var{X}) Hyperbolic sine. @@ -8452,6 +8466,7 @@ Library, Extensions, Built-ins, Top * Heaps:: Labelled binary tree where the key of each node is less than or equal to the keys of its children. * LAM:: LAM MPI +* Lambda:: Ulrich Neumerkel's Lambda Library * Lists:: List Manipulation * LineUtilities:: Line Manipulation Utilities * MapList:: SWI-Compatible Apply library. @@ -11574,12 +11589,6 @@ efficiency. They are available through the @table @code -@item acyclic_term(?@var{Term}) -@findex cyclic_term/1 -@syindex cyclic_term/1 -@cnindex cyclic_term/1 -Succeed if the argument @var{Term} is an acyclic term. - @item cyclic_term(?@var{Term}) @findex cyclic_term/1 @syindex cyclic_term/1 @@ -12496,7 +12505,7 @@ The path @var{Path} is a path starting at vertex @var{Vertex} in graph @end table -@node UnDGraphs, LAM , DGraphs, Library +@node UnDGraphs, Lambda , DGraphs, Library @section Undirected Graphs @cindex undirected graphs @@ -12592,7 +12601,83 @@ directed graph @var{DGraph}. @end table -@node LAM, , UnDGraphs, Library +@node Lambda, LAM, UnDGraphs, Library +@section Lambda Expressions +@cindex Lambda Expressions + + +This library, designed and implemented by Ulrich Neumerkel, provides +lambda expressions to simplify higher order programming based on @code{call/N}. + +Lambda expressions are represented by ordinary Prolog terms. There are +two kinds of lambda expressions: + +@example + Free+\X1^X2^ ..^XN^Goal + + \X1^X2^ ..^XN^Goal +@end example + +The second is a shorthand for@code{ t+\X1^X2^..^XN^Goal}, where @code{Xi} are the parameters. + +@var{Goal} is a goal or continuation (Syntax note: @var{Operators} within @var{Goal} +require parentheses due to the low precedence of the @code{^} operator). + +Free contains variables that are valid outside the scope of the lambda +expression. They are thus free variables within. + +All other variables of @var{Goal} are considered local variables. They must +not appear outside the lambda expression. This restriction is +currently not checked. Violations may lead to unexpected bindings. + +In the following example the parentheses around @code{X>3} are necessary. + +@example +?- use_module(library(lambda)). +?- use_module(library(apply)). + +?- maplist(\X^(X>3),[4,5,9]). +true. +@end example + +In the following @var{X} is a variable that is shared by both instances +of the lambda expression. The second query illustrates the cooperation +of continuations and lambdas. The lambda expression is in this case a +continuation expecting a further argument. + +@example +?- Xs = [A,B], maplist(X+\Y^dif(X,Y), Xs). +Xs = [A, B], +dif(X, A), +dif(X, B). + +?- Xs = [A,B], maplist(X+\dif(X), Xs). +Xs = [A, B], +dif(X, A), +dif(X, B). + +@end example + +The following queries are all equivalent. To see this, use +the fact @code{f(x,y)}. + +@example +?- call(f,A1,A2). +?- call(\X^f(X),A1,A2). +?- call(\X^Y^f(X,Y), A1,A2). +?- call(\X^(X+\Y^f(X,Y)), A1,A2). +?- call(call(f, A1),A2). +?- call(f(A1),A2). +?- f(A1,A2). +A1 = x, +A2 = y. +@end example + +Further discussions +at @url{http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord}. + + +@node LAM, , Lambda, Library @section LAM @cindex lam diff --git a/library/Makefile.in b/library/Makefile.in index af5c2a2ad..ced0b98f9 100644 --- a/library/Makefile.in +++ b/library/Makefile.in @@ -44,6 +44,7 @@ PROGRAMS= \ $(srcdir)/gensym.yap \ $(srcdir)/hacks.yap \ $(srcdir)/heaps.yap \ + $(srcdir)/lambda.pl \ $(srcdir)/lineutils.yap \ $(srcdir)/lists.yap \ $(srcdir)/nb.yap \ diff --git a/library/lambda.pl b/library/lambda.pl new file mode 100644 index 000000000..48da88f2a --- /dev/null +++ b/library/lambda.pl @@ -0,0 +1,204 @@ +/* + Author: Ulrich Neumerkel + E-mail: ulrich@complang.tuwien.ac.at + Copyright (C): 2009 Ulrich Neumerkel. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + +1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + +THIS SOFTWARE IS PROVIDED BY Ulrich Neumerkel ``AS IS'' AND ANY +EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Ulrich Neumerkel OR +CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, +PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF +LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING +NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +The views and conclusions contained in the software and documentation +are those of the authors and should not be interpreted as representing +official policies, either expressed or implied, of Ulrich Neumerkel. + + + +*/ + +:- module(lambda, [ + (^)/3, (^)/4, (^)/5, (^)/6, (^)/7, (^)/8, (^)/9, + (\)/1, (\)/2, (\)/3, (\)/4, (\)/5, (\)/6, (\)/7, + (+\)/2, (+\)/3, (+\)/4, (+\)/5, (+\)/6, (+\)/7, + op(201,xfx,+\)]). + +/** Lambda expressions + +This library provides lambda expressions to simplify higher order +programming based on call/N. + +Lambda expressions are represented by ordinary Prolog terms. +There are two kinds of lambda expressions: + + Free+\X1^X2^ ..^XN^Goal + + \X1^X2^ ..^XN^Goal + +The second is a shorthand for t+\X1^X2^..^XN^Goal. + +Xi are the parameters. + +Goal is a goal or continuation. Syntax note: Operators within Goal +require parentheses due to the low precedence of the ^ operator. + +Free contains variables that are valid outside the scope of the lambda +expression. They are thus free variables within. + +All other variables of Goal are considered local variables. They must +not appear outside the lambda expression. This restriction is +currently not checked. Violations may lead to unexpected bindings. + +In the following example the parentheses around X>3 are necessary. + +== +?- use_module(library(lambda)). +?- use_module(library(apply)). + +?- maplist(\X^(X>3),[4,5,9]). +true. +== + +In the following X is a variable that is shared by both instances of +the lambda expression. The second query illustrates the cooperation of +continuations and lambdas. The lambda expression is in this case a +continuation expecting a further argument. + +== +?- Xs = [A,B], maplist(X+\Y^dif(X,Y), Xs). +Xs = [A, B], +dif(X, A), +dif(X, B). + +?- Xs = [A,B], maplist(X+\dif(X), Xs). +Xs = [A, B], +dif(X, A), +dif(X, B). +== + +The following queries are all equivalent. To see this, use +the fact f(x,y). +== +?- call(f,A1,A2). +?- call(\X^f(X),A1,A2). +?- call(\X^Y^f(X,Y), A1,A2). +?- call(\X^(X+\Y^f(X,Y)), A1,A2). +?- call(call(f, A1),A2). +?- call(f(A1),A2). +?- f(A1,A2). +A1 = x, +A2 = y. +== + +Further discussions +http://www.complang.tuwien.ac.at/ulrich/Prolog-inedit/ISO-Hiord + +@tbd Static expansion similar to apply_macros. +@author Ulrich Neumerkel +*/ + +:- meta_predicate no_hat_call(0). + +:- meta_predicate + ^(?,0,?), + ^(?,1,?,?), + ^(?,2,?,?,?), + ^(?,3,?,?,?,?), + ^(?,4,?,?,?,?,?). + +^(V1,Goal,V1) :- + no_hat_call(Goal). +^(V1,Goal,V1,V2) :- + call(Goal,V2). +^(V1,Goal,V1,V2,V3) :- + call(Goal,V2,V3). +^(V1,Goal,V1,V2,V3,V4) :- + call(Goal,V2,V3,V4). +^(V1,Goal,V1,V2,V3,V4,V5) :- + call(Goal,V2,V3,V4,V5). +^(V1,Goal,V1,V2,V3,V4,V5,V6) :- + call(Goal,V2,V3,V4,V5,V6). +^(V1,Goal,V1,V2,V3,V4,V5,V6,V7) :- + call(Goal,V2,V3,V4,V5,V6,V7). + +:- meta_predicate + \(0), + \(1,?), + \(2,?,?), + \(3,?,?,?), + \(4,?,?,?,?), + \(5,?,?,?,?,?), + \(6,?,?,?,?,?,?). + +\(FC) :- + copy_term_nat(FC,C),no_hat_call(C). +\(FC,V1) :- + copy_term_nat(FC,C),call(C,V1). +\(FC,V1,V2) :- + copy_term_nat(FC,C),call(C,V1,V2). +\(FC,V1,V2,V3) :- + copy_term_nat(FC,C),call(C,V1,V2,V3). +\(FC,V1,V2,V3,V4) :- + copy_term_nat(FC,C),call(C,V1,V2,V3,V4). +\(FC,V1,V2,V3,V4,V5) :- + copy_term_nat(FC,C),call(C,V1,V2,V3,V4,V5). +\(FC,V1,V2,V3,V4,V5,V6) :- + copy_term_nat(FC,C),call(C,V1,V2,V3,V4,V5,V6). + +:- meta_predicate + +\(?,0), + +\(?,1,?), + +\(?,2,?,?), + +\(?,3,?,?,?), + +\(?,4,?,?,?,?), + +\(?,5,?,?,?,?,?), + +\(?,6,?,?,?,?,?,?). + ++\(GV,FC) :- + copy_term_nat(GV+FC,GV+C),no_hat_call(C). ++\(GV,FC,V1) :- + copy_term_nat(GV+FC,GV+C),call(C,V1). ++\(GV,FC,V1,V2) :- + copy_term_nat(GV+FC,GV+C),call(C,V1,V2). ++\(GV,FC,V1,V2,V3) :- + copy_term_nat(GV+FC,GV+C),call(C,V1,V2,V3). ++\(GV,FC,V1,V2,V3,V4) :- + copy_term_nat(GV+FC,GV+C),call(C,V1,V2,V3,V4). ++\(GV,FC,V1,V2,V3,V4,V5) :- + copy_term_nat(GV+FC,GV+C),call(C,V1,V2,V3,V4,V5). ++\(GV,FC,V1,V2,V3,V4,V5,V6) :- + copy_term_nat(GV+FC,GV+C),call(C,V1,V2,V3,V4,V5,V6). + + +%% no_hat_call(:Goal) +% +% Like call, but issues an error for a goal (^)/2. Such goals are +% likely the result of an insufficient number of arguments. + +no_hat_call(MGoal) :- + strip_module(MGoal, _, Goal), + ( nonvar(Goal), + Goal = (_^_) + -> throw(error(existence_error(lambda_parameters,Goal),_)) + ; call(MGoal) + ). + +% I would like to replace this by: +% V1^Goal :- throw(error(existence_error(lambda_parameters,V1^Goal),_)). diff --git a/library/terms.yap b/library/terms.yap index 682215ccf..67af3f912 100644 --- a/library/terms.yap +++ b/library/terms.yap @@ -24,7 +24,6 @@ subsumes/2, subsumes_chk/2, cyclic_term/1, - acyclic_term/1, variable_in_term/2, variables_within_term/3, new_variables_in_term/3 diff --git a/packages/clib/maildrop/rfc2045/rfc2045mkboundary.c b/packages/clib/maildrop/rfc2045/rfc2045mkboundary.c index 427d6419b..04e137628 100644 --- a/packages/clib/maildrop/rfc2045/rfc2045mkboundary.c +++ b/packages/clib/maildrop/rfc2045/rfc2045mkboundary.c @@ -23,7 +23,7 @@ /* $Id$ */ -#if HAS_GETHOSTNAME +#if HAS_GETHOSTNAME||HAVE_GETHOSTNAME #else diff --git a/packages/clpqr b/packages/clpqr index 11cbb2960..5d2631883 160000 --- a/packages/clpqr +++ b/packages/clpqr @@ -1 +1 @@ -Subproject commit 11cbb29604383f4cfddc2bb98d59819f6ab6ad94 +Subproject commit 5d263188330d4c66b88d25247dfdbd482a39b75a diff --git a/pl/grammar.yap b/pl/grammar.yap index b51919a08..4e2c90239 100644 --- a/pl/grammar.yap +++ b/pl/grammar.yap @@ -15,11 +15,11 @@ * * *************************************************************************/ -:- meta_predicate ^(?,0,?). -^(Xs, Goal, Xs) :- call(Goal). +% :- meta_predicate ^(?,0,?). +% ^(Xs, Goal, Xs) :- call(Goal). -:- meta_predicate ^(?,1,?,?). -^(Xs0, Goal, Xs0, Xs) :- call(Goal, Xs). +% :- meta_predicate ^(?,1,?,?). +% ^(Xs0, Goal, Xs0, Xs) :- call(Goal, Xs). /* Variables X in grammar rule bodies are translated as diff --git a/pl/utils.yap b/pl/utils.yap index 6e47fa905..7ceb01e24 100644 --- a/pl/utils.yap +++ b/pl/utils.yap @@ -643,3 +643,7 @@ nb_current(GlobalVariable, Val) :- ). +subsumes_term(A,B) :- + \+ \+ terms:subsumes(A,B). + +