Include Paulo Moura's Logtalk OO LP system

git-svn-id: https://yap.svn.sf.net/svnroot/yap/trunk@53 b08c6af1-5177-4d33-ba66-4b1c6b8b522a
This commit is contained in:
vsc
2001-06-06 19:40:57 +00:00
parent 38247e38fc
commit cc4531cd1e
344 changed files with 27125 additions and 0 deletions

View File

@@ -0,0 +1,16 @@
=================================================================
Logtalk - Object oriented extension to Prolog
Release 2.8.4
Copyright (c) 1998-2001 Paulo Moura. All Rights Reserved.
=================================================================
To load all objects in this library consult the metapredicates.loader utility
file.
You will also need to load the library/types.loader file (note that the
*.loader files are Prolog files).
This example shows the use of metapredicates in Logtalk. Metapredicates are
predicates whose head contains arguments that will be called as goals in the
body of the predicate definition.

View File

@@ -0,0 +1,48 @@
=================================================================
Logtalk - Object oriented extension to Prolog
Release 2.8.4
Copyright (c) 1998-2001 Paulo Moura. All Rights Reserved.
=================================================================
% note that "user" is a pseudo-object representing the Prolog database
% this implies that the integer comparisons are done using the standard
% Prolog built-in predicates
| ?- sort(user)::sort([3, 1, 4, 2, 9], Sorted).
call: partition([1,4,2,9],3,_358,_359)
exit: partition([1,4,2,9],3,[1,2],[4,9])
call: sort([1,2],_740)
call: partition([2],1,_967,_968)
exit: partition([2],1,[],[2])
call: sort([],_1300)
exit: sort([],[])
call: sort([2],_1539)
call: partition([],2,_1765,_1766)
exit: partition([],2,[],[])
call: sort([],_2093)
exit: sort([],[])
call: sort([],_2332)
exit: sort([],[])
exit: sort([2],[2])
exit: sort([1,2],[1,2])
call: sort([4,9],_2831)
call: partition([9],4,_3058,_3059)
exit: partition([9],4,[],[9])
call: sort([],_3391)
exit: sort([],[])
call: sort([9],_3630)
call: partition([],9,_3856,_3857)
exit: partition([],9,[],[])
call: sort([],_4184)
exit: sort([],[])
call: sort([],_4423)
exit: sort([],[])
exit: sort([9],[9])
exit: sort([4,9],[4,9])
Sorted = [1,2,3,4,9] ?
yes

View File

@@ -0,0 +1,5 @@
:- initialization(
logtalk_load([
sort1,
tracer])).

View File

@@ -0,0 +1,61 @@
% sort code adopted from an example in the SICStus Prolog User Manual
% metapredicate example taken from Prolog Part 2, Modules - Committee Draft
:- object(sort(_Type)).
:- info([
version is 1.0,
authors is 'Paulo Moura',
date is 2000/7/24,
comment is 'List sorting parameterized by the type of the list elements.']).
:- uses(list).
:- uses(tracer).
:- calls(comparingp).
:- public(sort/2).
:- mode(sort(+list, -list), one).
:- info(sort/2, [
comment is 'Sorts a list in ascending order.',
argnames is ['List', 'Sorted']]).
:- private(partition/4).
:- mode(partition(+list, +nonvar, -list, -list), one).
:- info(partition/4, [
comment is 'Partition a list in two lists containing the elements smaller and larger than a pivot.',
argnames is ['List', 'Pivot', 'Small', 'Large']]).
sort([], []).
sort([Head| Tail], Sorted) :-
tracer::(
trace(partition(Tail, Head, Small, Large)),
trace(sort(Small, Sorted1)),
trace(sort(Large, Sorted2))),
list::append(Sorted1, [Head| Sorted2], Sorted).
partition([], _, [], []).
partition([Head| Tail], Pivot, Small, Large) :-
parameter(1, Type),
( Type::(Head < Pivot) ->
Small = [Head| Small1], Large = Large1
; Small = Small1, Large = [Head| Large1]
),
partition(Tail, Pivot, Small1, Large1).
:- end_object.

View File

@@ -0,0 +1,37 @@
% example adopted from:
% Programming Language Prolog Part 2, Modules
% Committee Draft - January 14, 1998 X3J17/97/5
:- object(tracer).
:- info([
version is 2,
authors is 'Paulo Moura',
date is 2000/7/24,
comment is 'Tracer for a goal call and exit ports.']).
:- public(trace/1).
:- metapredicate(trace(::)).
:- mode(trace(+callable), zero_or_more).
:- info(trace/1, [
comment is '.',
argnames is ['Goal']]).
trace(Goal) :-
write('call: '), writeq(Goal), nl,
call(Goal),
write('exit: '), writeq(Goal), nl.
trace(Goal) :-
write('fail: '), writeq(Goal), nl,
fail.
:- end_object.