Did you know ... | Search Documentation: |
Pack logtalk -- logtalk-3.86.0/examples/dcgs/SCRIPT.txt |
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