./configure --prefix=/opt/gupu --with-c-flags='-O3 -fomit-frame-pointer' && make
get_byte/1
, get_char/1
... mais
aussi putatom/1
(de DEC10 en 1978).
get_line_to_chars/2
on a end_of_file
,
et pour get_line_to_codes/2
on a -1
.
SO.
| ?- repeat, open(.,read,S), writeq(S),nl,fail. repeat, open(.,read,S), writeq(S),nl,fail. '$stream'(3) '$stream'(4) ... '$stream'(1023) uncaught exception: error(permission_error(open,source_sink,'.'),open/3) | ?-Attendu: resource_error.
ulrich@p0:/opt/gupu/src/gprolog-code$ /opt/gupu/gprolog-1.4.3/bin/gprolog GNU Prolog 1.4.3 By Daniel Diaz Copyright (C) 1999-2012 Daniel Diaz | ?- VN_list = 42, read_term(T,[variable_names(VN_list)]). a. no | ?- ulrich@p0:/opt/gupu/src/gprolog-code$ /opt/gupu/gprolog-1.4.4/bin/gprolog GNU Prolog 1.4.4 (64 bits) Compiled Jan 19 2015, 19:32:14 with gcc By Daniel Diaz Copyright (C) 1999-2014 Daniel Diaz | ?- VN_list = 42, read_term(T,[variable_names(VN_list)]). uncaught exception: error(domain_error(read_option,variable_names(42)),read_term/2)Attendu: échec.
| ?- O = alias(_), /**/ open(f,write,_,[O]). uncaught exception: error(domain_error(stream_option,alias(_30)),open/4)Attendu:
instantiation_error
maplist(P_7,X1s,X2s,X3s,X4s,X5s,X6s,X7s) :- maplist_i(X1s,X2s,X3s,X4s,X5s,X6s,X7s,P_7). maplist_i([],[],[],[],[],[],[],_P_7). maplist_i([X1|X1s],[X2|X2s],[X3|X3s],[X4|X4s],[X5|X5s],[X6|X6s],[X7|X7s],P_7) :- call(P_7,X1,X2,X3,X4,X5,X6,X7), maplist_i(X1s,X2s,X3s,X4s,X5s,X6s,X7s,P_7).par
maplist(P_7,X1s,X2s,X3s,X4s,X5s,X6s,X7s) :- maplist_i(X1s,P_7,X2s,X3s,X4s,X5s,X6s,X7s). maplist_i([],_P_7,[],[],[],[],[],[]). maplist_i([X1|X1s],P_7,[X2|X2s],[X3|X3s],[X4|X4s],[X5|X5s],[X6|X6s],[X7|X7s]) :- call(P_7,X1,X2,X3,X4,X5,X6,X7), maplist_i(X1s,P_7,X2s,X3s,X4s,X5s,X6s,X7s).
| ?- X #= -1 div 2. X #= -1 div 2. uncaught exception: error(type_error(fd_evaluable,(div)/2),(#=)/2)Attendu:
X = -1
$ cat n98.pl f(1). ^@f(99). f(2). g('ab^@cd'). g('ef^Agh'). $ od -c n98.pl 0000000 f ( 1 ) . \n \0 f ( 9 9 ) . \n \n f 0000020 ( 2 ) . \n g ( ' a b \0 c d ' ) . 0000040 \n \n g ( ' e f 001 g h ' ) . \n \n 0000057
| ?- X #>= 0, length(_,X). uncaught exception: error(type_error(integer,_#2097954(0..268435455)),(#>=)/2)Attendu:
X = 0 ; X = 1 ; X = 2 ...
| ?- L=[_|L], term_variables(L,Vs), L == Vs. **boucle**Attendu: échec.
iso_dif(X, Y) :- X \== Y, ( X \= Y -> true ; throw(error(instantiation_error,iso_dif/2)) ).C'est presque le vrai dif. Et dans les cas difficiles, on met
instantiation_error
| ?- fd_domain([D,E,F],0,1),fd_domain([B],1,2),fd_labeling([B]),B#=2*D*(E-F),B = 2. B = 2 D = 1 E = 1 F = 0 (88050 ms) yes
| ?- v(0,0)=v(A,D), fd_domain([A,D],0,1),A#==>0#>0/D,fd_labeling([A,D]), v(0,0)=v(A,D). A = 0 D = 0 yes | ?- fd_domain([A,D],0,1),A#==>0#>0/D,fd_labeling([A,D]), v(0,0)=v(A,D). no
div
et mod
n'est sont pas bien definie. Avant tout, il sont
les opérations
préférées. LIA-1
ne fait pas un mystère. Il faut:
Expression | Result = eval(Expression) | Signature | ISO |
E1 // E2 | tr(x/y) no longer specified by any part of LIA (ISO/IEC 10967) | ||
E1 rem E2 | ... no longer specified by any part of LIA (ISO/IEC 10967) | ||
div | ⌊x/y⌋ as defined by LIA-1 ISO/IEC 10967-1 | ||
mod | x - (⌊x/y⌋ ⋅ y) as defined by LIA-1 ISO/IEC 10967-1 | ||
avec (selon 4.1.3.4) tr(x) = if x ≥ 0 then ⌊x⌋ else -⌊-x⌋
à savoir: integer_rounding_function
est
toujour toward_zero
. Si tu mi ça en question, alors tu
n'a que des troubles. Il n'y a aucune implantation Prolog
avec down
.
| ?- format('**~t~d~20|~n',[10]). ** uncaught exception: error(domain_error(format_control_sequence,t),format/2)attendu (B)
| ?- format('**~t~d~20|~n',[10]). ** 10L'origine de format/2 est Quintus. Et donc SICStus 4
GNU Prolog 1.4.1 By Daniel Diaz Copyright (C) 1999-2012 Daniel Diaz | ?- write_term(V+_,[variable_names(['_18'=V])]). _18+_18Pas evident... Peut-être c'est bon comme ça.
| ?- length(Vs,3), fd_domain_bool(Vs), fd_all_different(Vs). Vs = [_#0(0..1),_#19(0..1),_#38(0..1)] yesAttendu:
maybe
.
Une élaboration
sur SO sur ce thème. Donc il est bon de dire yes
si
il y a au moins une solution, comme:
| ?- length(Vs,3), fd_domain_bool(Vs). Vs = [_#0(0..1),_#19(0..1),_#38(0..1)] yes
| ?- term_variables(1,1,1). yesPlutôt : term_variables(?term, ?term, ?term).
2+: term_variables/2 est ISO, term_variables/3 est GNU.
| ?- maplist(=,L,[1,2,3]). L = [1,2,3] ? ; noAttendu: Aucun point de choix ! SWI, YAP, Jekejeke sont capable de supprimer ce point de choix inutile.
Voici une définition évitant des points de choix:
maplist(_, Xs, Ys) :- Xs == [], !, Ys = []. maplist(_, Xs, Ys) :- Ys == [], !, Xs = []. maplist(_, [], []). maplist(Cont, [X|Xs], [Y|Ys]) :- call(Cont, X, Y), maplist(Cont, Xs, Ys).
| ?- X is min(2+0,1+1). X = 2 yes | ?- min_list([1+1,2+0],M). M = 1+1 yes | ?- min_list([2+0,1+1],M). M = 2+0mais selon le manuel:
min_list(+list, ?number)
.
2+ min_list
n'utilise pas min/2
. (Aussi, le nom
n'est pas idéal).
','(+callable_term,
+callable_term)
. Attendu : goal
. Si
non, (fail,_)
doit donner une erreur.
| ?- catch(read(X),error(E,_),true). 10000000000000000000. E = syntax_error('user_input:51 (char:1) integer overflow (exceeds max_integer)')Attendu :
representation_error(max_integer)
comme B. XSB
affiche un "warning" et donne le max_integer. Mais c'est pas
tellement claire, comme il n'y a aucune erreur pour les virgules
flottantes comme 1.0e1000000
ou 1.0e-1000000
.
| ?- X = 1.0e120. X = 9.9999999999999998e+119C'est bien correcte comme la relecture produit la même valeur, mais il est tellement plus lisible de voir la représentation plus compacte dans SWI où SICStus. Des autres systèmes sauf GNU, SICStus, SWI ne respectent pas la propriété 7.10.5c par. 2.
strict_iso
est problématique.
current_predicate/1
?IF, SWI, YAP, B, SICStus,
XSB donnent type_error(predicate_indicator, fail)
pour le
but current_predicate(fail)
seul GNU (strict_iso off) et
Ciao échouent.
current_predicate/1
demande pour
les prédicats prédéfinis et les CC. Mais je suis irrité par 13211-2
6.6.3. Cette procédure est tellement diffèrente de 13211-1 7.7.7. Il
faut relire les deux en même temps.
| ?- Xs=[a|Xs],atom_chars(A,Xs). Fatal Error: Segmentation ViolationAttendu:
type_error(list,Xs)
. C'est STO, donc c'est pas normatif.
| ?- [user]. compiling user for byte code... c :- X*Y#=2, X=Y. user compiled, 2 lines read - 374 bytes written, 17165 ms yes | ?- c. yesAttendu : Réponse conditionnelle. Par ex.
maybe
à
la place de yes
.
C'est
très confondrant pour les débutants.
Ou bien plus détaillé, des prédicats copy_term/3 et
call_residue_vars/2.
| ?- X=0+0, 0#=X. X = 0+0 yes | ?- 0#=X, X=0+0. noC'est un problème de tout les solveurs CLPFD. La commutativité n'est pas respectée. En SICStus, la première requête donne une erreur de typage, mais
X=0+0, call(0#=X).
est un succès. Ceci n'est
pas préférable d'un point de vue sémantique. C.a.d échanger une
erreur de typage par un succès. En SICStus, maplist(#<(X), Xs) se
comporte donc différemment d'un prédicat récursif correspondant.
J'aimerai bien d'avoir des contraintes munies des propriétés
algébriques. C'est Programmation en logique — et non
Programmation sans logique.
| ?- P #= X*X, X = 16384. no | ?- X = 16384, P #= X*X.Attendu: Selon 13211-1, 7.12.2 f, Representation Error.P = -268435456X = 16384 yes
Name | Last modified | Size | Description | |
---|---|---|---|---|
Parent Directory | - | |||
ackerg.pl | 11-Jul-2023 16:29 | 799 | ||
pow.pl | 11-Jul-2023 14:49 | 24 | ||
acker.pl | 09-Jul-2023 20:50 | 688 | ||
N.html | 08-Jul-2023 18:33 | 49K | ||
GNU-HEADER.html | 08-Jul-2023 18:33 | 49K | ||
n98.pl | 30-May-2015 22:55 | 47 | ||
a.pl | 29-May-2015 13:43 | 47 | ||
item77ter.html | 22-Nov-2013 16:24 | 4.2K | ||
item77bis.html | 22-Nov-2013 14:31 | 16K | ||
item78.html | 22-Nov-2013 14:30 | 16K | ||
item77.html | 22-Nov-2013 14:09 | 11K | ||
test_subsumes2.pl | 07-Dec-2010 03:40 | 1.8K | ||
item8.html | 23-Jun-2010 16:08 | 395 | ||
item7.html | 22-Jun-2010 00:19 | 11K | ||