________________________________________________________________________

This file is part of Logtalk <https://logtalk.org/>  
SPDX-FileCopyrightText: 1998-2023 Paulo Moura <pmoura@logtalk.org>  
SPDX-License-Identifier: Apache-2.0

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
________________________________________________________________________


% start by loading the example:

| ?- logtalk_load(dcgs(loader)).
...


% DCG rules implementing a simple calculator:

| ?- calculator::parse("1+2-3*4", Result).

Result = -9
yes


% recognize MAC addresses:

| ?- macaddr::valid("00:1e:4a:ef:72:8b").

yes


% decode Morse code messages (as phrase/2-3 are private methods, we use the
% "logtalk" built-in object and the <</2 control construct to invoke the foo//0
% public grammar rule non-terminal as the backend Prolog system implementation
% of the phrase/2-3 predicates is not Logtalk aware and would mishandle the
% (::)/2 message sending operator):

| ?- logtalk << phrase(morse::morse(Message), "... --- ...").

Message = [sos] 
yes


% solve a cellphone keypad encoded enigma:

| ?- enigma::solve("4 96853 5683 86 4283 346637 9484 968 8664448", Message).

Message = [i, would, love, to, have, dinner, with, you, tonight] 
yes


% recognizing grammatically correct sentences:

| ?- sentence::parse([the, girl, likes, the, boy], Result).

Result = true
yes

| ?- sentence::parse([the, girl, scares, the, boy], Result).

Result = false
yes


% generating parse trees for sentences:

| ?- parsetree::parse([the, girl, likes, the, boy], Tree).

Tree = s(np(d(the), n(girl)), vp(v(likes), np(d(the), n(boy))))
yes


% bill of materials example:

| ?- bom::parts(bike, L).

L = [frame, crank, pedal, pedal, chain, spokes, rim, hub, spokes, rim, hub]
yes

| ?- bom::parts(wheel, L).

L = [spokes, rim, hub]
yes


% parsing command-line shell input:

| ?- shell::parse("pwd; cd ..; ls -a", L).

L = [pwd,'cd ..','ls -a'] ? 

yes


% convert a string to a list of tokens (words, numbers, punctuation):

| ?- tokenizer::tokens(" We owe $1,048,576.24 to Agent 007 for Version 3.14159! ", Tokens).

Tokens = [we,owe,$,1048576.24,to,agent,7,for,version,3.14159,!] ? 

yes


% walker movements:

| ?- walker::walk([n(5), e(4), s(2), nw(8), s(5), se(1), n(4)], Ending).

Ending = -0.94974746830583223,6.9497474683058318 ? 

yes


% conversion between compound terms and XML:

| ?- xml::convert(word(child, children), word(singular, plural), XML).

XML = '<word><singular>child</singular><plural>children</plural></word>' 
yes

| ?- xml::convert(Term, Interpretation, '<word><singular>child</singular><plural>children</plural></word>').

Term = word(child, children)
Interpretation = word(singular, plural) 
yes


% parsing URLs:

| ?- url::parse("https://logtalk.org", Components).

Components = [protocol(http), address([logtalk, org]), path([]), file('')] 
yes

| ?- url::parse("https://logtalk.org/", Components).

Components = [protocol(http), address([logtalk, org]), path(['']), file('')] 
yes

| ?- url::parse("https://logtalk.org/cvs", Components).

Components = [protocol(http), address([logtalk, org]), path([cvs]), file('')] 
yes

| ?- url::parse("https://logtalk.org/cvs.html", Components).

Components = [protocol(http), address([logtalk, org]), path([]), file('cvs.html')] 
yes

| ?- url::parse("http://193.136.64.5/files/update", Components).

Components = [protocol(http), address([193, 136, 64, 5]), path([files, update]), file('')] 
yes


% command language example:

| ?- faa::main.
Fly Amzi! Air
enter command> list flights
aa101
aa102
aa103
enter command> book elana aa102
enter command> book tom aa102
enter command> list passengers aa102
elana
tom
enter command> exit
yes


% IBAN validation:

| ?- iban::valid("GB82 WEST 1234 5698 7654 32").
yes


% double bypass using the {}/1 control constructs of grammar rules and Logtalk
% (as phrase/2-3 are private methods, we use the "logtalk" built-in object and the
% <</2 control construct to invoke the foo//0 public grammar rule non-terminal):

| ?- logtalk << phrase(bypass::foo, _, _).

bar predicate called
yes


% run the Logtalk DCG translator on the test cases:

| ?- dcgtest::run.

...


% try the meta_non_terminal/1 + call//N examples:

| ?- client::print.

1-one
2-two
3-three
a-one
b-two
c-three
yes

| ?- client::successors([1,2,3], Successors).

Successors = [2, 3, 4]
yes


% use lambda expressions in grammar rules

| ?- logtalk << phrase(lambdas::aa(Duplicates), [a,b,c]).

Duplicates = [a,a,b,b,c,c]
yes

| ?- logtalk << phrase(lambdas::aa([a,a,b,b,c,c]), Singletons).

Singletons = [a,b,c]
yes


% use call//1 and a lambda expressions to access
% the grammar rule input list for debugging:

| ?- debug::copy([1,2,3,4,5], Copy).
[1,2,3,4,5]
[2,3,4,5]
[3,4,5]
[4,5]
[5]
[]
Copy = [1, 2, 3, 4, 5] ;
no


% use a meta-non-terminal:

| ?- logtalk << phrase(meta::repeat(bases::octal, 2, 4, Digits), [3,7,4,1,0,3,6], Rest).

Digits = [3,7,4,1], Rest = [0,3,6]
yes
