CINXE.COM
B-Prolog - Wikipedia
<!DOCTYPE html> <html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available" lang="en" dir="ltr"> <head> <meta charset="UTF-8"> <title>B-Prolog - Wikipedia</title> <script>(function(){var className="client-js vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-sticky-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-feature-night-mode-enabled skin-theme-clientpref-day vector-toc-available";var cookie=document.cookie.match(/(?:^|; )enwikimwclientpreferences=([^;]+)/);if(cookie){cookie[1].split('%2C').forEach(function(pref){className=className.replace(new RegExp('(^| )'+pref.replace(/-clientpref-\w+$|[^\w-]+/g,'')+'-clientpref-\\w+( |$)'),'$1'+pref+'$2');});}document.documentElement.className=className;}());RLCONF={"wgBreakFrames":false,"wgSeparatorTransformTable":["",""],"wgDigitTransformTable":["",""],"wgDefaultDateFormat":"dmy", "wgMonthNames":["","January","February","March","April","May","June","July","August","September","October","November","December"],"wgRequestId":"d846da05-d88f-4516-b462-77440e027751","wgCanonicalNamespace":"","wgCanonicalSpecialPageName":false,"wgNamespaceNumber":0,"wgPageName":"B-Prolog","wgTitle":"B-Prolog","wgCurRevisionId":1213779900,"wgRevisionId":1213779900,"wgArticleId":10875123,"wgIsArticle":true,"wgIsRedirect":false,"wgAction":"view","wgUserName":null,"wgUserGroups":["*"],"wgCategories":["Prolog programming language family"],"wgPageViewLanguage":"en","wgPageContentLanguage":"en","wgPageContentModel":"wikitext","wgRelevantPageName":"B-Prolog","wgRelevantArticleId":10875123,"wgIsProbablyEditable":true,"wgRelevantPageIsProbablyEditable":true,"wgRestrictionEdit":[],"wgRestrictionMove":[],"wgNoticeProject":"wikipedia","wgCiteReferencePreviewsActive":false,"wgFlaggedRevsParams":{"tags":{"status":{"levels":1}}},"wgMediaViewerOnClick":true,"wgMediaViewerEnabledByDefault":true, "wgPopupsFlags":0,"wgVisualEditor":{"pageLanguageCode":"en","pageLanguageDir":"ltr","pageVariantFallbacks":"en"},"wgMFDisplayWikibaseDescriptions":{"search":true,"watchlist":true,"tagline":false,"nearby":true},"wgWMESchemaEditAttemptStepOversample":false,"wgWMEPageLength":20000,"wgRelatedArticlesCompat":[],"wgCentralAuthMobileDomain":false,"wgEditSubmitButtonLabelPublish":true,"wgULSPosition":"interlanguage","wgULSisCompactLinksEnabled":false,"wgVector2022LanguageInHeader":true,"wgULSisLanguageSelectorEmpty":false,"wgWikibaseItemId":"Q4833686","wgCheckUserClientHintsHeadersJsApi":["brands","architecture","bitness","fullVersionList","mobile","model","platform","platformVersion"],"GEHomepageSuggestedEditsEnableTopics":true,"wgGETopicsMatchModeEnabled":false,"wgGEStructuredTaskRejectionReasonTextInputEnabled":false,"wgGELevelingUpEnabledForUser":false};RLSTATE={"ext.globalCssJs.user.styles":"ready","site.styles":"ready","user.styles":"ready","ext.globalCssJs.user":"ready","user":"ready", "user.options":"loading","ext.cite.styles":"ready","ext.pygments":"ready","skins.vector.search.codex.styles":"ready","skins.vector.styles":"ready","skins.vector.icons":"ready","ext.wikimediamessages.styles":"ready","ext.visualEditor.desktopArticleTarget.noscript":"ready","ext.uls.interlanguage":"ready","wikibase.client.init":"ready","ext.wikimediaBadges":"ready"};RLPAGEMODULES=["ext.cite.ux-enhancements","ext.pygments.view","site","mediawiki.page.ready","mediawiki.toc","skins.vector.js","ext.centralNotice.geoIP","ext.centralNotice.startUp","ext.gadget.ReferenceTooltips","ext.gadget.switcher","ext.urlShortener.toolbar","ext.centralauth.centralautologin","ext.popups","ext.visualEditor.desktopArticleTarget.init","ext.visualEditor.targetLoader","ext.echo.centralauth","ext.eventLogging","ext.wikimediaEvents","ext.navigationTiming","ext.uls.interface","ext.cx.eventlogging.campaigns","ext.cx.uls.quick.actions","wikibase.client.vector-2022","ext.checkUser.clientHints","ext.quicksurveys.init", "ext.growthExperiments.SuggestedEditSession","wikibase.sidebar.tracking"];</script> <script>(RLQ=window.RLQ||[]).push(function(){mw.loader.impl(function(){return["user.options@12s5i",function($,jQuery,require,module){mw.user.tokens.set({"patrolToken":"+\\","watchToken":"+\\","csrfToken":"+\\"}); }];});});</script> <link rel="stylesheet" href="/w/load.php?lang=en&modules=ext.cite.styles%7Cext.pygments%2CwikimediaBadges%7Cext.uls.interlanguage%7Cext.visualEditor.desktopArticleTarget.noscript%7Cext.wikimediamessages.styles%7Cskins.vector.icons%2Cstyles%7Cskins.vector.search.codex.styles%7Cwikibase.client.init&only=styles&skin=vector-2022"> <script async="" src="/w/load.php?lang=en&modules=startup&only=scripts&raw=1&skin=vector-2022"></script> <meta name="ResourceLoaderDynamicStyles" content=""> <link rel="stylesheet" href="/w/load.php?lang=en&modules=site.styles&only=styles&skin=vector-2022"> <meta name="generator" content="MediaWiki 1.44.0-wmf.4"> <meta name="referrer" content="origin"> <meta name="referrer" content="origin-when-cross-origin"> <meta name="robots" content="max-image-preview:standard"> <meta name="format-detection" content="telephone=no"> <meta name="viewport" content="width=1120"> <meta property="og:title" content="B-Prolog - Wikipedia"> <meta property="og:type" content="website"> <link rel="alternate" media="only screen and (max-width: 640px)" href="//en.m.wikipedia.org/wiki/B-Prolog"> <link rel="alternate" type="application/x-wiki" title="Edit this page" href="/w/index.php?title=B-Prolog&action=edit"> <link rel="apple-touch-icon" href="/static/apple-touch/wikipedia.png"> <link rel="icon" href="/static/favicon/wikipedia.ico"> <link rel="search" type="application/opensearchdescription+xml" href="/w/rest.php/v1/search" title="Wikipedia (en)"> <link rel="EditURI" type="application/rsd+xml" href="//en.wikipedia.org/w/api.php?action=rsd"> <link rel="canonical" href="https://en.wikipedia.org/wiki/B-Prolog"> <link rel="license" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en"> <link rel="alternate" type="application/atom+xml" title="Wikipedia Atom feed" href="/w/index.php?title=Special:RecentChanges&feed=atom"> <link rel="dns-prefetch" href="//meta.wikimedia.org" /> <link rel="dns-prefetch" href="//login.wikimedia.org"> </head> <body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject mw-editable page-B-Prolog rootpage-B-Prolog skin-vector-2022 action-view"><a class="mw-jump-link" href="#bodyContent">Jump to content</a> <div class="vector-header-container"> <header class="vector-header mw-header"> <div class="vector-header-start"> <nav class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-dropdown" class="vector-dropdown vector-main-menu-dropdown vector-button-flush-left vector-button-flush-right" > <input type="checkbox" id="vector-main-menu-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-main-menu-dropdown" class="vector-dropdown-checkbox " aria-label="Main menu" > <label id="vector-main-menu-dropdown-label" for="vector-main-menu-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-menu mw-ui-icon-wikimedia-menu"></span> <span class="vector-dropdown-label-text">Main menu</span> </label> <div class="vector-dropdown-content"> <div id="vector-main-menu-unpinned-container" class="vector-unpinned-container"> <div id="vector-main-menu" class="vector-main-menu vector-pinnable-element"> <div class="vector-pinnable-header vector-main-menu-pinnable-header vector-pinnable-header-unpinned" data-feature-name="main-menu-pinned" data-pinnable-element-id="vector-main-menu" data-pinned-container-id="vector-main-menu-pinned-container" data-unpinned-container-id="vector-main-menu-unpinned-container" > <div class="vector-pinnable-header-label">Main menu</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-main-menu.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-main-menu.unpin">hide</button> </div> <div id="p-navigation" class="vector-menu mw-portlet mw-portlet-navigation" > <div class="vector-menu-heading"> Navigation </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-mainpage-description" class="mw-list-item"><a href="/wiki/Main_Page" title="Visit the main page [z]" accesskey="z"><span>Main page</span></a></li><li id="n-contents" class="mw-list-item"><a href="/wiki/Wikipedia:Contents" title="Guides to browsing Wikipedia"><span>Contents</span></a></li><li id="n-currentevents" class="mw-list-item"><a href="/wiki/Portal:Current_events" title="Articles related to current events"><span>Current events</span></a></li><li id="n-randompage" class="mw-list-item"><a href="/wiki/Special:Random" title="Visit a randomly selected article [x]" accesskey="x"><span>Random article</span></a></li><li id="n-aboutsite" class="mw-list-item"><a href="/wiki/Wikipedia:About" title="Learn about Wikipedia and how it works"><span>About Wikipedia</span></a></li><li id="n-contactpage" class="mw-list-item"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us" title="How to contact Wikipedia"><span>Contact us</span></a></li> </ul> </div> </div> <div id="p-interaction" class="vector-menu mw-portlet mw-portlet-interaction" > <div class="vector-menu-heading"> Contribute </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="n-help" class="mw-list-item"><a href="/wiki/Help:Contents" title="Guidance on how to use and edit Wikipedia"><span>Help</span></a></li><li id="n-introduction" class="mw-list-item"><a href="/wiki/Help:Introduction" title="Learn how to edit Wikipedia"><span>Learn to edit</span></a></li><li id="n-portal" class="mw-list-item"><a href="/wiki/Wikipedia:Community_portal" title="The hub for editors"><span>Community portal</span></a></li><li id="n-recentchanges" class="mw-list-item"><a href="/wiki/Special:RecentChanges" title="A list of recent changes to Wikipedia [r]" accesskey="r"><span>Recent changes</span></a></li><li id="n-upload" class="mw-list-item"><a href="/wiki/Wikipedia:File_upload_wizard" title="Add images or other media for use on Wikipedia"><span>Upload file</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> <a href="/wiki/Main_Page" class="mw-logo"> <img class="mw-logo-icon" src="/static/images/icons/wikipedia.png" alt="" aria-hidden="true" height="50" width="50"> <span class="mw-logo-container skin-invert"> <img class="mw-logo-wordmark" alt="Wikipedia" src="/static/images/mobile/copyright/wikipedia-wordmark-en.svg" style="width: 7.5em; height: 1.125em;"> <img class="mw-logo-tagline" alt="The Free Encyclopedia" src="/static/images/mobile/copyright/wikipedia-tagline-en.svg" width="117" height="13" style="width: 7.3125em; height: 0.8125em;"> </span> </a> </div> <div class="vector-header-end"> <div id="p-search" role="search" class="vector-search-box-vue vector-search-box-collapses vector-search-box-show-thumbnail vector-search-box-auto-expand-width vector-search-box"> <a href="/wiki/Special:Search" class="cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only search-toggle" title="Search Wikipedia [f]" accesskey="f"><span class="vector-icon mw-ui-icon-search mw-ui-icon-wikimedia-search"></span> <span>Search</span> </a> <div class="vector-typeahead-search-container"> <div class="cdx-typeahead-search cdx-typeahead-search--show-thumbnail cdx-typeahead-search--auto-expand-width"> <form action="/w/index.php" id="searchform" class="cdx-search-input cdx-search-input--has-end-button"> <div id="simpleSearch" class="cdx-search-input__input-wrapper" data-search-loc="header-moved"> <div class="cdx-text-input cdx-text-input--has-start-icon"> <input class="cdx-text-input__input" type="search" name="search" placeholder="Search Wikipedia" aria-label="Search Wikipedia" autocapitalize="sentences" title="Search Wikipedia [f]" accesskey="f" id="searchInput" > <span class="cdx-text-input__icon cdx-text-input__start-icon"></span> </div> <input type="hidden" name="title" value="Special:Search"> </div> <button class="cdx-button cdx-search-input__end-button">Search</button> </form> </div> </div> </div> <nav class="vector-user-links vector-user-links-wide" aria-label="Personal tools"> <div class="vector-user-links-main"> <div id="p-vector-user-menu-preferences" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-userpage" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-dropdown" class="vector-dropdown " title="Change the appearance of the page's font size, width, and color" > <input type="checkbox" id="vector-appearance-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-appearance-dropdown" class="vector-dropdown-checkbox " aria-label="Appearance" > <label id="vector-appearance-dropdown-label" for="vector-appearance-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-appearance mw-ui-icon-wikimedia-appearance"></span> <span class="vector-dropdown-label-text">Appearance</span> </label> <div class="vector-dropdown-content"> <div id="vector-appearance-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <div id="p-vector-user-menu-notifications" class="vector-menu mw-portlet emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> <div id="p-vector-user-menu-overflow" class="vector-menu mw-portlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en" class=""><span>Donate</span></a> </li> <li id="pt-createaccount-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:CreateAccount&returnto=B-Prolog" title="You are encouraged to create an account and log in; however, it is not mandatory" class=""><span>Create account</span></a> </li> <li id="pt-login-2" class="user-links-collapsible-item mw-list-item user-links-collapsible-item"><a data-mw="interface" href="/w/index.php?title=Special:UserLogin&returnto=B-Prolog" title="You're encouraged to log in; however, it's not mandatory. [o]" accesskey="o" class=""><span>Log in</span></a> </li> </ul> </div> </div> </div> <div id="vector-user-links-dropdown" class="vector-dropdown vector-user-menu vector-button-flush-right vector-user-menu-logged-out" title="Log in and more options" > <input type="checkbox" id="vector-user-links-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-user-links-dropdown" class="vector-dropdown-checkbox " aria-label="Personal tools" > <label id="vector-user-links-dropdown-label" for="vector-user-links-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-ellipsis mw-ui-icon-wikimedia-ellipsis"></span> <span class="vector-dropdown-label-text">Personal tools</span> </label> <div class="vector-dropdown-content"> <div id="p-personal" class="vector-menu mw-portlet mw-portlet-personal user-links-collapsible-item" title="User menu" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-sitesupport" class="user-links-collapsible-item mw-list-item"><a href="https://donate.wikimedia.org/wiki/Special:FundraiserRedirector?utm_source=donate&utm_medium=sidebar&utm_campaign=C13_en.wikipedia.org&uselang=en"><span>Donate</span></a></li><li id="pt-createaccount" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:CreateAccount&returnto=B-Prolog" title="You are encouraged to create an account and log in; however, it is not mandatory"><span class="vector-icon mw-ui-icon-userAdd mw-ui-icon-wikimedia-userAdd"></span> <span>Create account</span></a></li><li id="pt-login" class="user-links-collapsible-item mw-list-item"><a href="/w/index.php?title=Special:UserLogin&returnto=B-Prolog" title="You're encouraged to log in; however, it's not mandatory. [o]" accesskey="o"><span class="vector-icon mw-ui-icon-logIn mw-ui-icon-wikimedia-logIn"></span> <span>Log in</span></a></li> </ul> </div> </div> <div id="p-user-menu-anon-editor" class="vector-menu mw-portlet mw-portlet-user-menu-anon-editor" > <div class="vector-menu-heading"> Pages for logged out editors <a href="/wiki/Help:Introduction" aria-label="Learn more about editing"><span>learn more</span></a> </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="pt-anoncontribs" class="mw-list-item"><a href="/wiki/Special:MyContributions" title="A list of edits made from this IP address [y]" accesskey="y"><span>Contributions</span></a></li><li id="pt-anontalk" class="mw-list-item"><a href="/wiki/Special:MyTalk" title="Discussion about edits from this IP address [n]" accesskey="n"><span>Talk</span></a></li> </ul> </div> </div> </div> </div> </nav> </div> </header> </div> <div class="mw-page-container"> <div class="mw-page-container-inner"> <div class="vector-sitenotice-container"> <div id="siteNotice"><!-- CentralNotice --></div> </div> <div class="vector-column-start"> <div class="vector-main-menu-container"> <div id="mw-navigation"> <nav id="mw-panel" class="vector-main-menu-landmark" aria-label="Site"> <div id="vector-main-menu-pinned-container" class="vector-pinned-container"> </div> </nav> </div> </div> <div class="vector-sticky-pinned-container"> <nav id="mw-panel-toc" aria-label="Contents" data-event-name="ui.sidebar-toc" class="mw-table-of-contents-container vector-toc-landmark"> <div id="vector-toc-pinned-container" class="vector-pinned-container"> <div id="vector-toc" class="vector-toc vector-pinnable-element"> <div class="vector-pinnable-header vector-toc-pinnable-header vector-pinnable-header-pinned" data-feature-name="toc-pinned" data-pinnable-element-id="vector-toc" > <h2 class="vector-pinnable-header-label">Contents</h2> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-toc.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-toc.unpin">hide</button> </div> <ul class="vector-toc-contents" id="mw-panel-toc-list"> <li id="toc-mw-content-text" class="vector-toc-list-item vector-toc-level-1"> <a href="#" class="vector-toc-link"> <div class="vector-toc-text">(Top)</div> </a> </li> <li id="toc-Matching_clauses" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Matching_clauses"> <div class="vector-toc-text"> <span class="vector-toc-numb">1</span> <span>Matching clauses</span> </div> </a> <ul id="toc-Matching_clauses-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Action_rules" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Action_rules"> <div class="vector-toc-text"> <span class="vector-toc-numb">2</span> <span>Action rules</span> </div> </a> <ul id="toc-Action_rules-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-CLP(FD)" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#CLP(FD)"> <div class="vector-toc-text"> <span class="vector-toc-numb">3</span> <span>CLP(FD)</span> </div> </a> <ul id="toc-CLP(FD)-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Arrays_and_the_array_subscript_notation" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Arrays_and_the_array_subscript_notation"> <div class="vector-toc-text"> <span class="vector-toc-numb">4</span> <span>Arrays and the array subscript notation</span> </div> </a> <ul id="toc-Arrays_and_the_array_subscript_notation-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Loops_with_foreach_and_list_comprehension" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Loops_with_foreach_and_list_comprehension"> <div class="vector-toc-text"> <span class="vector-toc-numb">5</span> <span>Loops with foreach and list comprehension</span> </div> </a> <ul id="toc-Loops_with_foreach_and_list_comprehension-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-Tabling" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#Tabling"> <div class="vector-toc-text"> <span class="vector-toc-numb">6</span> <span>Tabling</span> </div> </a> <ul id="toc-Tabling-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-See_also" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#See_also"> <div class="vector-toc-text"> <span class="vector-toc-numb">7</span> <span>See also</span> </div> </a> <ul id="toc-See_also-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-References" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#References"> <div class="vector-toc-text"> <span class="vector-toc-numb">8</span> <span>References</span> </div> </a> <ul id="toc-References-sublist" class="vector-toc-list"> </ul> </li> <li id="toc-External_links" class="vector-toc-list-item vector-toc-level-1 vector-toc-list-item-expanded"> <a class="vector-toc-link" href="#External_links"> <div class="vector-toc-text"> <span class="vector-toc-numb">9</span> <span>External links</span> </div> </a> <ul id="toc-External_links-sublist" class="vector-toc-list"> </ul> </li> </ul> </div> </div> </nav> </div> </div> <div class="mw-content-container"> <main id="content" class="mw-body"> <header class="mw-body-header vector-page-titlebar"> <nav aria-label="Contents" class="vector-toc-landmark"> <div id="vector-page-titlebar-toc" class="vector-dropdown vector-page-titlebar-toc vector-button-flush-left" > <input type="checkbox" id="vector-page-titlebar-toc-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-titlebar-toc" class="vector-dropdown-checkbox " aria-label="Toggle the table of contents" > <label id="vector-page-titlebar-toc-label" for="vector-page-titlebar-toc-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--icon-only " aria-hidden="true" ><span class="vector-icon mw-ui-icon-listBullet mw-ui-icon-wikimedia-listBullet"></span> <span class="vector-dropdown-label-text">Toggle the table of contents</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-titlebar-toc-unpinned-container" class="vector-unpinned-container"> </div> </div> </div> </nav> <h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">B-Prolog</span></h1> <div id="p-lang-btn" class="vector-dropdown mw-portlet mw-portlet-lang" > <input type="checkbox" id="p-lang-btn-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-p-lang-btn" class="vector-dropdown-checkbox mw-interlanguage-selector" aria-label="This article exist only in this language. Add the article for other languages" > <label id="p-lang-btn-label" for="p-lang-btn-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet cdx-button--action-progressive mw-portlet-lang-heading-0" aria-hidden="true" ><span class="vector-icon mw-ui-icon-language-progressive mw-ui-icon-wikimedia-language-progressive"></span> <span class="vector-dropdown-label-text">Add languages</span> </label> <div class="vector-dropdown-content"> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> <div class="after-portlet after-portlet-lang"><span class="uls-after-portlet-link"></span><span class="wb-langlinks-add wb-langlinks-link"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q4833686#sitelinks-wikipedia" title="Add interlanguage links" class="wbc-editpage">Add links</a></span></div> </div> </div> </div> </header> <div class="vector-page-toolbar"> <div class="vector-page-toolbar-container"> <div id="left-navigation"> <nav aria-label="Namespaces"> <div id="p-associated-pages" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-associated-pages" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-nstab-main" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/B-Prolog" title="View the content page [c]" accesskey="c"><span>Article</span></a></li><li id="ca-talk" class="vector-tab-noicon mw-list-item"><a href="/wiki/Talk:B-Prolog" rel="discussion" title="Discuss improvements to the content page [t]" accesskey="t"><span>Talk</span></a></li> </ul> </div> </div> <div id="vector-variants-dropdown" class="vector-dropdown emptyPortlet" > <input type="checkbox" id="vector-variants-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-variants-dropdown" class="vector-dropdown-checkbox " aria-label="Change language variant" > <label id="vector-variants-dropdown-label" for="vector-variants-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">English</span> </label> <div class="vector-dropdown-content"> <div id="p-variants" class="vector-menu mw-portlet mw-portlet-variants emptyPortlet" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> </ul> </div> </div> </div> </div> </nav> </div> <div id="right-navigation" class="vector-collapsible"> <nav aria-label="Views"> <div id="p-views" class="vector-menu vector-menu-tabs mw-portlet mw-portlet-views" > <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-view" class="selected vector-tab-noicon mw-list-item"><a href="/wiki/B-Prolog"><span>Read</span></a></li><li id="ca-edit" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=B-Prolog&action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-history" class="vector-tab-noicon mw-list-item"><a href="/w/index.php?title=B-Prolog&action=history" title="Past revisions of this page [h]" accesskey="h"><span>View history</span></a></li> </ul> </div> </div> </nav> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-dropdown" class="vector-dropdown vector-page-tools-dropdown" > <input type="checkbox" id="vector-page-tools-dropdown-checkbox" role="button" aria-haspopup="true" data-event-name="ui.dropdown-vector-page-tools-dropdown" class="vector-dropdown-checkbox " aria-label="Tools" > <label id="vector-page-tools-dropdown-label" for="vector-page-tools-dropdown-checkbox" class="vector-dropdown-label cdx-button cdx-button--fake-button cdx-button--fake-button--enabled cdx-button--weight-quiet" aria-hidden="true" ><span class="vector-dropdown-label-text">Tools</span> </label> <div class="vector-dropdown-content"> <div id="vector-page-tools-unpinned-container" class="vector-unpinned-container"> <div id="vector-page-tools" class="vector-page-tools vector-pinnable-element"> <div class="vector-pinnable-header vector-page-tools-pinnable-header vector-pinnable-header-unpinned" data-feature-name="page-tools-pinned" data-pinnable-element-id="vector-page-tools" data-pinned-container-id="vector-page-tools-pinned-container" data-unpinned-container-id="vector-page-tools-unpinned-container" > <div class="vector-pinnable-header-label">Tools</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-page-tools.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-page-tools.unpin">hide</button> </div> <div id="p-cactions" class="vector-menu mw-portlet mw-portlet-cactions emptyPortlet vector-has-collapsible-items" title="More options" > <div class="vector-menu-heading"> Actions </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="ca-more-view" class="selected vector-more-collapsible-item mw-list-item"><a href="/wiki/B-Prolog"><span>Read</span></a></li><li id="ca-more-edit" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=B-Prolog&action=edit" title="Edit this page [e]" accesskey="e"><span>Edit</span></a></li><li id="ca-more-history" class="vector-more-collapsible-item mw-list-item"><a href="/w/index.php?title=B-Prolog&action=history"><span>View history</span></a></li> </ul> </div> </div> <div id="p-tb" class="vector-menu mw-portlet mw-portlet-tb" > <div class="vector-menu-heading"> General </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-whatlinkshere" class="mw-list-item"><a href="/wiki/Special:WhatLinksHere/B-Prolog" title="List of all English Wikipedia pages containing links to this page [j]" accesskey="j"><span>What links here</span></a></li><li id="t-recentchangeslinked" class="mw-list-item"><a href="/wiki/Special:RecentChangesLinked/B-Prolog" rel="nofollow" title="Recent changes in pages linked from this page [k]" accesskey="k"><span>Related changes</span></a></li><li id="t-upload" class="mw-list-item"><a href="/wiki/Wikipedia:File_Upload_Wizard" title="Upload files [u]" accesskey="u"><span>Upload file</span></a></li><li id="t-specialpages" class="mw-list-item"><a href="/wiki/Special:SpecialPages" title="A list of all special pages [q]" accesskey="q"><span>Special pages</span></a></li><li id="t-permalink" class="mw-list-item"><a href="/w/index.php?title=B-Prolog&oldid=1213779900" title="Permanent link to this revision of this page"><span>Permanent link</span></a></li><li id="t-info" class="mw-list-item"><a href="/w/index.php?title=B-Prolog&action=info" title="More information about this page"><span>Page information</span></a></li><li id="t-cite" class="mw-list-item"><a href="/w/index.php?title=Special:CiteThisPage&page=B-Prolog&id=1213779900&wpFormIdentifier=titleform" title="Information on how to cite this page"><span>Cite this page</span></a></li><li id="t-urlshortener" class="mw-list-item"><a href="/w/index.php?title=Special:UrlShortener&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FB-Prolog"><span>Get shortened URL</span></a></li><li id="t-urlshortener-qrcode" class="mw-list-item"><a href="/w/index.php?title=Special:QrCode&url=https%3A%2F%2Fen.wikipedia.org%2Fwiki%2FB-Prolog"><span>Download QR code</span></a></li> </ul> </div> </div> <div id="p-coll-print_export" class="vector-menu mw-portlet mw-portlet-coll-print_export" > <div class="vector-menu-heading"> Print/export </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="coll-download-as-rl" class="mw-list-item"><a href="/w/index.php?title=Special:DownloadAsPdf&page=B-Prolog&action=show-download-screen" title="Download this page as a PDF file"><span>Download as PDF</span></a></li><li id="t-print" class="mw-list-item"><a href="/w/index.php?title=B-Prolog&printable=yes" title="Printable version of this page [p]" accesskey="p"><span>Printable version</span></a></li> </ul> </div> </div> <div id="p-wikibase-otherprojects" class="vector-menu mw-portlet mw-portlet-wikibase-otherprojects" > <div class="vector-menu-heading"> In other projects </div> <div class="vector-menu-content"> <ul class="vector-menu-content-list"> <li id="t-wikibase" class="wb-otherproject-link wb-otherproject-wikibase-dataitem mw-list-item"><a href="https://www.wikidata.org/wiki/Special:EntityPage/Q4833686" title="Structured data on this page hosted by Wikidata [g]" accesskey="g"><span>Wikidata item</span></a></li> </ul> </div> </div> </div> </div> </div> </div> </nav> </div> </div> </div> <div class="vector-column-end"> <div class="vector-sticky-pinned-container"> <nav class="vector-page-tools-landmark" aria-label="Page tools"> <div id="vector-page-tools-pinned-container" class="vector-pinned-container"> </div> </nav> <nav class="vector-appearance-landmark" aria-label="Appearance"> <div id="vector-appearance-pinned-container" class="vector-pinned-container"> <div id="vector-appearance" class="vector-appearance vector-pinnable-element"> <div class="vector-pinnable-header vector-appearance-pinnable-header vector-pinnable-header-pinned" data-feature-name="appearance-pinned" data-pinnable-element-id="vector-appearance" data-pinned-container-id="vector-appearance-pinned-container" data-unpinned-container-id="vector-appearance-unpinned-container" > <div class="vector-pinnable-header-label">Appearance</div> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-pin-button" data-event-name="pinnable-header.vector-appearance.pin">move to sidebar</button> <button class="vector-pinnable-header-toggle-button vector-pinnable-header-unpin-button" data-event-name="pinnable-header.vector-appearance.unpin">hide</button> </div> </div> </div> </nav> </div> </div> <div id="bodyContent" class="vector-body" aria-labelledby="firstHeading" data-mw-ve-target-container> <div class="vector-body-before-content"> <div class="mw-indicators"> </div> <div id="siteSub" class="noprint">From Wikipedia, the free encyclopedia</div> </div> <div id="contentSub"><div id="mw-content-subtitle"></div></div> <div id="mw-content-text" class="mw-body-content"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p><b>B-Prolog</b> was a high-performance implementation of the standard <a href="/wiki/Prolog" title="Prolog">Prolog</a> language with several extended features including matching clauses, action rules for event handling, finite-domain constraint solving, arrays and hash tables, declarative loops, and tabling. First released in 1994, B-Prolog is now a widely used <a href="/wiki/Constraint_logic_programming" title="Constraint logic programming">CLP</a> system. The constraint solver of B-Prolog was ranked top in two categories in the <a href="/w/index.php?title=Second_International_Solvers_Competition&action=edit&redlink=1" class="new" title="Second International Solvers Competition (page does not exist)">Second International Solvers Competition</a>,<sup id="cite_ref-1" class="reference"><a href="#cite_note-1"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> and it also took the second place in P class in the second ASP solver competition <sup id="cite_ref-2" class="reference"><a href="#cite_note-2"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> and the second place overall in the third ASP solver competition.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> B-Prolog underpins the <a href="/w/index.php?title=PRISM_system&action=edit&redlink=1" class="new" title="PRISM system (page does not exist)">PRISM system</a>, a logic-based probabilistic reasoning and learning system. B-Prolog is a commercial product, but it can be used for learning and non-profit research purposes free of charge (since version 7.8 for individual users, including commercial individual users, B-Prolog is free of charge <sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>). B-Prolog is not anymore actively developed, but it forms the basis for the Picat programming language. </p> <meta property="mw:PageProp/toc" /> <div class="mw-heading mw-heading2"><h2 id="Matching_clauses">Matching clauses</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=1" title="Edit section: Matching clauses"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>A matching clause is a form of a clause where the determinacy and input/output unifications are denoted explicitly. The compiler translates matching clauses into matching trees and generates indexes for all input arguments. The compilation of matching clauses is much simpler than that of normal Prolog clauses because no complex program analysis or specialization is necessary; and the generated code tends to be more compact and faster. The B-Prolog compiler and most of the library predicates are written in matching clauses. </p><p>A matching clause takes the following form: </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">H</span><span class="p">,</span> <span class="nv">G</span> <span class="s s-Atom">=></span> <span class="nv">B</span> </pre></div> <p>where <code>H</code> is an atomic formula, <code>G</code> and <code>B</code> are two sequences of atomic formulas. <code>H</code> is called the head, <code>G</code> the guard, and <code>B</code> the body of the clause. No call in <code>G</code> can bind variables in <code>H</code> and all calls in <code>G</code> must be in-line tests. In other words, the guard must be flat. The following gives an example predicate in matching clauses that merges two sorted lists: </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">merge</span><span class="p">([],</span><span class="nv">Ys</span><span class="p">,</span><span class="nv">Zs</span><span class="p">)</span> <span class="s s-Atom">=></span> <span class="nv">Zs</span><span class="o">=</span><span class="nv">Ys</span><span class="p">.</span> <span class="nf">merge</span><span class="p">(</span><span class="nv">Xs</span><span class="p">,[],</span><span class="nv">Zs</span><span class="p">)</span> <span class="s s-Atom">=></span> <span class="nv">Zs</span><span class="o">=</span><span class="nv">Xs</span><span class="p">.</span> <span class="nf">merge</span><span class="p">([</span><span class="nv">X</span><span class="p">|</span><span class="nv">Xs</span><span class="p">],[</span><span class="nv">Y</span><span class="p">|</span><span class="nv">Ys</span><span class="p">],</span><span class="nv">Zs</span><span class="p">),</span><span class="nv">X</span><span class="o"><</span><span class="nv">Y</span> <span class="s s-Atom">=></span> <span class="nv">Zs</span><span class="o">=</span><span class="p">[</span><span class="nv">X</span><span class="p">|</span><span class="nv">ZsT</span><span class="p">],</span><span class="nf">merge</span><span class="p">(</span><span class="nv">Xs</span><span class="p">,[</span><span class="nv">Y</span><span class="p">|</span><span class="nv">Ys</span><span class="p">],</span><span class="nv">ZsT</span><span class="p">).</span> <span class="nf">merge</span><span class="p">(</span><span class="nv">Xs</span><span class="p">,[</span><span class="nv">Y</span><span class="p">|</span><span class="nv">Ys</span><span class="p">],</span><span class="nv">Zs</span><span class="p">)</span> <span class="s s-Atom">=></span> <span class="nv">Zs</span><span class="o">=</span><span class="p">[</span><span class="nv">Y</span><span class="p">|</span><span class="nv">ZsT</span><span class="p">],</span><span class="nf">merge</span><span class="p">(</span><span class="nv">Xs</span><span class="p">,</span><span class="nv">Ys</span><span class="p">,</span><span class="nv">ZsT</span><span class="p">).</span> </pre></div> <p>The cons <code>[Y|Ys]</code> occurs in both the head and the body of the third clause. To avoid reconstructing the term, we can rewrite the clause into the following: </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">merge</span><span class="p">([</span><span class="nv">X</span><span class="p">|</span><span class="nv">Xs</span><span class="p">],</span><span class="nv">Ys</span><span class="p">,</span><span class="nv">Zs</span><span class="p">),</span><span class="nv">Ys</span><span class="o">=</span><span class="p">[</span><span class="nv">Y</span><span class="p">|</span><span class="k">_</span><span class="p">],</span><span class="nv">X</span><span class="o"><</span><span class="nv">Y</span> <span class="s s-Atom">=></span> <span class="nv">Zs</span><span class="o">=</span><span class="p">[</span><span class="nv">X</span><span class="p">|</span><span class="nv">ZsT</span><span class="p">],</span><span class="nf">merge</span><span class="p">(</span><span class="nv">Xs</span><span class="p">,</span><span class="nv">Ys</span><span class="p">,</span><span class="nv">ZsT</span><span class="p">).</span> </pre></div> <p>The call <code>Ys=[Y|_]</code> in the guard matches <code>Ys</code> against the pattern <code>[Y|_]</code>. </p> <div class="mw-heading mw-heading2"><h2 id="Action_rules">Action rules</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=2" title="Edit section: Action rules"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>The lack of a facility for programming "active" sub-goals that can be reactive to the environment has been considered one of the weaknesses of logic programming. To overcome this, B-Prolog provides a simple and yet powerful language, called Action Rules (AR), for programming agents. An agent is a subgoal that can be delayed and can later be activated by events. Each time an agent is activated, some action may be executed. Agents are a more general notion than delay constructs in early Prolog systems and processes in concurrent logic programming languages in the sense that agents can be responsive to various kinds of events including instantiation, domain, time, and user-defined events. </p><p>An action rule takes the following </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">H</span><span class="p">,</span> <span class="nv">G</span><span class="p">,</span> <span class="p">{</span><span class="nv">E</span><span class="p">}</span> <span class="s s-Atom">=></span> <span class="nv">B</span> </pre></div> <p>where <code>H</code> is a pattern for agents, <code>G</code> is a sequence of conditions on the agents, <code>E</code> is a set of patterns for events that can activate the agents, and <code>B</code> is a sequence of actions performed by the agents when they are activated. When the event pattern <code>E</code> together with the enclosing braces is missing, an action rule degenerates into a matching clause. </p><p>A set of built-in events is provided for programming constraint propagators and interactive graphical user interfaces. For example, <code>ins(X)</code> is an event that is posted when the variable <code>X</code> is instantiated. A user program can create and post its own events and define agents to handle them. A user-defined event takes the form of <code>event(X,O)</code> where <code>X</code> is a variable, called a suspension variable, that connects the event with its handling agents, and <code>O</code> is a Prolog term that contains the information to be transmitted to the agents. The built-in <code>post(E)</code> posts the event <code>E</code>. </p><p>Consider the following examples: </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">echo</span><span class="p">(</span><span class="nv">X</span><span class="p">),{</span><span class="nf">event</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Mes</span><span class="p">)}</span><span class="s s-Atom">=></span><span class="nf">writeln</span><span class="p">(</span><span class="nv">Mes</span><span class="p">).</span> <span class="nf">ping</span><span class="p">(</span><span class="nv">T</span><span class="p">),{</span><span class="nf">time</span><span class="p">(</span><span class="nv">T</span><span class="p">)}</span> <span class="s s-Atom">=></span> <span class="nf">writeln</span><span class="p">(</span><span class="s s-Atom">ping</span><span class="p">).</span> </pre></div> <p>The agent <code>echo(X)</code> echoes whatever message it receives. For example, </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span><span class="nf">echo</span><span class="p">(</span><span class="nv">X</span><span class="p">),</span><span class="nf">post</span><span class="p">(</span><span class="nf">event</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="s s-Atom">hello</span><span class="p">)),</span><span class="nf">post</span><span class="p">(</span><span class="nf">event</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="s s-Atom">world</span><span class="p">)).</span> </pre></div> <p>outputs the message <code>hello</code> followed by <code>world</code>. The agent <code>ping(T)</code> responds to time events from the timer <code>T</code>. Each time it receives a time event, it prints the message <code>ping</code>. For example, </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">?-</span><span class="nf">timer</span><span class="p">(</span><span class="nv">T</span><span class="p">,</span><span class="mi">1000</span><span class="p">),</span><span class="nf">ping</span><span class="p">(</span><span class="nv">T</span><span class="p">),</span><span class="s s-Atom">repeat</span><span class="p">,</span><span class="s s-Atom">fail</span><span class="p">.</span> </pre></div> <p>creates a timer that posts a time event every second and creates an agent <code>ping(T)</code> to respond to the events. The loop after the agent is needed to make the agent perpetual. </p><p>AR has been found useful for programming simple concurrency, implementing constraint propagators, and developing interactive graphical user interfaces. It has served as an intermediate language for compiling <a href="/wiki/Constraint_Handling_Rules" title="Constraint Handling Rules">Constraint Handling Rules</a> (CHR) and <a href="/wiki/Answer_set_programming" title="Answer set programming">Answer Set Programs</a> (ASP). </p> <div class="mw-heading mw-heading2"><h2 id="CLP(FD)"><span id="CLP.28FD.29"></span>CLP(FD)</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=3" title="Edit section: CLP(FD)"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Like many Prolog-based finite-domain constraint solvers, B-Prolog's finite-domain solver was heavily influenced by the <a href="/wiki/CHIP_(programming_language)" title="CHIP (programming language)">CHIP</a> system. The first fully-fledged solver was released with B-Prolog version 2.1 in March 1997. That solver was implemented in an early version of AR, called delay clauses. During the past decade, the implementation language AR has been extended to support a rich class of domain events (<code>ins(X)</code>,<code>bound(X)</code>,<code>dom(X,E)</code>, and <code>dom_any(X,E)</code>) for programming constraint propagators and the system has been enriched with new domains (Boolean, trees, and finite sets), global constraints, and specialized fast constraint propagators. Recently, the two built-ins <code>in/2</code> and <code>notin/2</code> have been extended to allow positive and negative table (also called extensional) constraints. </p><p>Thanks to the employment of AR as the implementation language, the constraint solving part of B-Prolog is relatively small (3800 lines of Prolog code and 6000 lines of C code, including comments and spaces) but its performance is very competitive. The AR language is open to the user for implementing problem-specific propagators. For example, the following defines a propagator for maintaining arc consistency for the constraint <code>X+Y #= C</code>. Whenever an inner element <code>Ey</code> is excluded from the domain of <code>Y</code>, this propagator is triggered to exclude <code>Ex</code>, the counterpart of <code>Ey</code>, from the domain of <code>X</code>. For the constraint <code>X+Y #= C</code>, we need to generate two propagators, namely, <code>'X_in_C_Y_ac'(X,Y,C)</code> and <code>'X_in_C_Y_ac'(Y,X,C)</code>, to maintain the arc consistency. In addition to these two propagators, we also need to generate propagators for maintaining interval consistency since no <code>dom(Y,Ey)</code> event is posted if the excluded value happens to be a bound. The constraint needs to be preprocessed to make it arc consistent before the propagators are generated. </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="s s-Atom">'X_in_C_Y_ac'</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">,</span><span class="nv">C</span><span class="p">),</span><span class="nf">var</span><span class="p">(</span><span class="nv">X</span><span class="p">),</span><span class="nf">var</span><span class="p">(</span><span class="nv">Y</span><span class="p">),</span> <span class="p">{</span><span class="nf">dom</span><span class="p">(</span><span class="nv">Y</span><span class="p">,</span><span class="nv">Ey</span><span class="p">)}</span> <span class="s s-Atom">=></span> <span class="nv">Ex</span> <span class="o">is</span> <span class="nv">C</span><span class="o">-</span><span class="nv">Ey</span><span class="p">,</span> <span class="nf">domain_set_false</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Ex</span><span class="p">).</span> <span class="s s-Atom">'X_in_C_Y_ac'</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">,</span><span class="nv">C</span><span class="p">)</span> <span class="s s-Atom">=></span> <span class="s s-Atom">true</span><span class="p">.</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Arrays_and_the_array_subscript_notation">Arrays and the array subscript notation</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=4" title="Edit section: Arrays and the array subscript notation"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>In B-Prolog, the maximum arity of a structure is 65535. This entails that a structure can be used as a one-dimensional array, and a multi-dimensional array can be represented as a structure of structures. To facilitate creating arrays, B-Prolog provides a built-in, called <code>new_array(X,Dims)</code>, where <code>X</code> must be an uninstantiated variable and <code>Dims</code> a list of positive integers that specifies the dimensions of the array. For example, the call <code>new_array(X,[10,20])</code> binds <code>X</code> to a two dimensional array whose first dimension has 10 elements and second dimension has 20 elements. All the array elements are initialized to be free variables. </p><p>The built-in predicate <code>arg/3</code> can be used to access array elements, but it requires a temporary variable to store the result, and a chain of calls to access an element of a multi-dimensional array. To facilitate accessing array elements, B-Prolog supports the array subscript notation <code>X[I1,...,In]</code>, where <code>X</code> is a structure and each <code>Ii</code> is an integer expression. This common notation for accessing arrays is, however, not part of the standard Prolog syntax. To accommodate this notation, the parser is modified to insert a token <code>^</code> between a variable token and <code>[</code>. So, the notation <code>X[I1,...,In]</code> is just a shorthand for <code>X^[I1,...,In]</code>. This notation is interpreted as an array access when it occurs in an arithmetic expression, a constraint, or as an argument of a call to <code>@=/2</code>. In any other context, it is treated as the term itself. The array subscript notation can also be used to access elements of lists. For example, the <code>nth/3</code> predicate can be defined as follows: </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">nth</span><span class="p">(</span><span class="nv">I</span><span class="p">,</span><span class="nv">L</span><span class="p">,</span><span class="nv">E</span><span class="p">)</span> <span class="p">:-</span> <span class="nv">E</span> <span class="s s-Atom">@=</span> <span class="nv">L</span><span class="p">[</span><span class="nv">I</span><span class="p">].</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Loops_with_foreach_and_list_comprehension">Loops with foreach and list comprehension</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=5" title="Edit section: Loops with foreach and list comprehension"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Prolog relies on recursion to describe loops. The lack of powerful loop constructs has arguably made Prolog less acceptable to beginners and less productive to experienced programmers because it is often tedious to define small auxiliary recursive predicates for loops. The emergence of constraint programming constructs such as <a href="/wiki/CLP(FD)" class="mw-redirect" title="CLP(FD)">CLP(FD)</a> has further revealed this weakness of Prolog as a modeling language. B-Prolog provides a built-in, called <code>foreach</code>, for iterating over collections and the <a href="/wiki/List_comprehension" title="List comprehension">list comprehension</a> notation for constructing lists. </p><p>The <code>foreach</code> built-in has a very simple syntax and semantics. For example, </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">foreach</span><span class="p">(</span><span class="nv">A</span> <span class="s s-Atom">in</span> <span class="p">[</span><span class="s s-Atom">a</span><span class="p">,</span><span class="s s-Atom">b</span><span class="p">],</span> <span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1..2</span><span class="p">,</span> <span class="nf">write</span><span class="p">((</span><span class="nv">A</span><span class="p">,</span><span class="nv">I</span><span class="p">)))</span> </pre></div> <p>outputs four tuples <code>(a,1)</code>, <code>(a,2)</code>, <code>(b,1)</code>, and <code>(b,2)</code>. Syntactically, <code>foreach</code> is a variable-length call whose last argument specifies a goal to be executed for each combination of values in a sequence of collections. A <code>foreach</code> call may also give a list of variables that are local to each iteration and a list of accumulators that can be used to accumulate values from each iteration. With accumulators, we can use <code>foreach</code> to describe recurrences for computing aggregates. Recurrences have to be read procedurally and thus do not fit well with Prolog. For this reason, we adopt the list comprehension notation from functional languages. A list comprehension is a list whose first element has the functor '<code>:</code>'. A list of this form is interpreted as a list comprehension in calls to <code>@=/2</code> and arithmetic constraints. For example, the query </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nv">X</span> <span class="s s-Atom">@=</span> <span class="p">[(</span><span class="nv">A</span><span class="p">,</span><span class="nv">I</span><span class="p">)</span> <span class="s s-Atom">:</span> <span class="nv">A</span> <span class="s s-Atom">in</span> <span class="p">[</span><span class="s s-Atom">a</span><span class="p">,</span><span class="s s-Atom">b</span><span class="p">],</span> <span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1..2</span><span class="p">]</span> </pre></div> <p>binds <code>X</code> to the list <code>[(a,1),(a,2),(b,1),(b,2)]</code>. A list comprehension is treated as a <code>foreach</code> call with an accumulator in the implementation. </p><p>Calls to <code>foreach</code> and list comprehensions are translated into tail-recursive predicates. Therefore, there is no or little penalty of using these constructs compared with using recursion. </p><p>The loop constructs considerably enhance the modeling power of CLP(FD). The following gives a program for the N-queens problem in B-Prolog: </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">queens</span><span class="p">(</span><span class="nv">N</span><span class="p">):-</span> <span class="nf">length</span><span class="p">(</span><span class="nv">Qs</span><span class="p">,</span><span class="nv">N</span><span class="p">),</span> <span class="nv">Qs</span> <span class="s s-Atom">::</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="nf">foreach</span><span class="p">(</span><span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nv">J</span> <span class="s s-Atom">in</span> <span class="nv">I</span><span class="o">+</span><span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="p">(</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">I</span><span class="p">]</span> <span class="s s-Atom">#\=</span> <span class="nv">Qs</span><span class="p">[</span><span class="nv">J</span><span class="p">],</span> <span class="nf">abs</span><span class="p">(</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">I</span><span class="p">]</span><span class="o">-</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">J</span><span class="p">])</span> <span class="s s-Atom">#\=</span> <span class="nv">J</span><span class="o">-</span><span class="nv">I</span><span class="p">)),</span> <span class="nf">labeling</span><span class="p">([</span><span class="s s-Atom">ff</span><span class="p">],</span><span class="nv">Qs</span><span class="p">),</span> <span class="nf">writeln</span><span class="p">(</span><span class="nv">Qs</span><span class="p">).</span> </pre></div> <p>The array notation on lists helps shorten the description. Without it, the <code>foreach</code> loop in the program would have to be written as follows: </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">foreach</span><span class="p">(</span><span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="nv">J</span> <span class="s s-Atom">in</span> <span class="nv">I</span><span class="o">+</span><span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,[</span><span class="nv">Qi</span><span class="p">,</span><span class="nv">Qj</span><span class="p">],</span> <span class="p">(</span><span class="nf">nth</span><span class="p">(</span><span class="nv">Qs</span><span class="p">,</span><span class="nv">I</span><span class="p">,</span><span class="nv">Qi</span><span class="p">),</span> <span class="nf">nth</span><span class="p">(</span><span class="nv">Qs</span><span class="p">,</span><span class="nv">J</span><span class="p">,</span><span class="nv">Qj</span><span class="p">),</span> <span class="nv">Qi</span> <span class="s s-Atom">#\=</span> <span class="nv">Qj</span><span class="p">,</span> <span class="nf">abs</span><span class="p">(</span><span class="nv">Qi</span><span class="o">-</span><span class="nv">Qj</span><span class="p">)</span> <span class="s s-Atom">#\=</span> <span class="nv">J</span><span class="o">-</span><span class="nv">I</span><span class="p">)),</span> </pre></div> <p>where <code>Qi</code> and <code>Qj</code> are declared local to each iteration. The following gives a program for the N-queens problem, which uses a Boolean variable for each square on the board. </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="nf">bool_queens</span><span class="p">(</span><span class="nv">N</span><span class="p">):-</span> <span class="nf">new_array</span><span class="p">(</span><span class="nv">Qs</span><span class="p">,[</span><span class="nv">N</span><span class="p">,</span><span class="nv">N</span><span class="p">]),</span> <span class="nv">Vars</span> <span class="s s-Atom">@=</span> <span class="p">[</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">I</span><span class="p">,</span><span class="nv">J</span><span class="p">]</span> <span class="s s-Atom">:</span> <span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="nv">J</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">],</span> <span class="nv">Vars</span> <span class="s s-Atom">::</span> <span class="mf">0..1</span><span class="p">,</span> <span class="nf">foreach</span><span class="p">(</span><span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="c1">% one queen in each row</span> <span class="nf">sum</span><span class="p">([</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">I</span><span class="p">,</span><span class="nv">J</span><span class="p">]</span> <span class="s s-Atom">:</span> <span class="nv">J</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">])</span> <span class="s s-Atom">#=</span> <span class="mi">1</span><span class="p">),</span> <span class="nf">foreach</span><span class="p">(</span><span class="nv">J</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="c1">% one queen in each column</span> <span class="nf">sum</span><span class="p">([</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">I</span><span class="p">,</span><span class="nv">J</span><span class="p">]</span> <span class="s s-Atom">:</span> <span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">])</span> <span class="s s-Atom">#=</span> <span class="mi">1</span><span class="p">),</span> <span class="nf">foreach</span><span class="p">(</span><span class="nv">K</span> <span class="s s-Atom">in</span> <span class="mi">1</span><span class="o">-</span><span class="nv">N</span><span class="p">..</span><span class="nv">N</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span> <span class="c1">% at most one queen in each left-down diag</span> <span class="nf">sum</span><span class="p">([</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">I</span><span class="p">,</span><span class="nv">J</span><span class="p">]</span> <span class="s s-Atom">:</span> <span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="nv">J</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="nv">I</span><span class="o">-</span><span class="nv">J</span><span class="o">=:=</span><span class="nv">K</span><span class="p">])</span> <span class="s s-Atom">#=<</span> <span class="mi">1</span><span class="p">),</span> <span class="nf">foreach</span><span class="p">(</span><span class="nv">K</span> <span class="s s-Atom">in</span> <span class="mf">2..2</span><span class="o">*</span><span class="nv">N</span><span class="p">,</span> <span class="c1">% at most one queen in each left-up diag</span> <span class="nf">sum</span><span class="p">([</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">I</span><span class="p">,</span><span class="nv">J</span><span class="p">]</span> <span class="s s-Atom">:</span> <span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="nv">J</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,</span> <span class="nv">I</span><span class="o">+</span><span class="nv">J</span><span class="o">=:=</span><span class="nv">K</span><span class="p">])</span> <span class="s s-Atom">#=<</span> <span class="mi">1</span><span class="p">),</span> <span class="nf">labeling</span><span class="p">(</span><span class="nv">Vars</span><span class="p">),</span> <span class="nf">foreach</span><span class="p">(</span><span class="nv">I</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">,[</span><span class="nv">Row</span><span class="p">],</span> <span class="p">(</span><span class="nv">Row</span> <span class="s s-Atom">@=</span> <span class="p">[</span><span class="nv">Qs</span><span class="p">[</span><span class="nv">I</span><span class="p">,</span><span class="nv">J</span><span class="p">]</span> <span class="s s-Atom">:</span> <span class="nv">J</span> <span class="s s-Atom">in</span> <span class="mf">1.</span><span class="p">.</span><span class="nv">N</span><span class="p">],</span> <span class="nf">writeln</span><span class="p">(</span><span class="nv">Row</span><span class="p">))).</span> </pre></div> <div class="mw-heading mw-heading2"><h2 id="Tabling">Tabling</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=6" title="Edit section: Tabling"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <p>Tabling has been found increasingly important for not only helping beginners write workable declarative programs but also developing real-world applications such as natural language processing, model checking, and machine learning applications. B-Prolog implements a tabling mechanism, called linear tabling, which is based on iterative computation of looping subgoals rather than suspension of them to compute the fixed points. The PRISM system, which heavily relies on tabling, has been the main driving force for the design and implementation of B-Prolog's tabling system. </p><p>The idea of tabling is to memorize the answers to tabled calls and use the answers to resolve subsequent variant calls. In B-Prolog, as in XSB, tabled predicates are declared explicitly by declarations in the following form: </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="p">:-</span><span class="s s-Atom">table</span> <span class="nv">P1</span><span class="o">/</span><span class="nv">N1</span><span class="p">,...,</span><span class="nv">Pk</span><span class="o">/</span><span class="nv">Nk</span><span class="p">.</span> </pre></div> <p>For example, the following tabled predicate defines the <a href="/wiki/Transitive_closure" title="Transitive closure">transitive closure</a> of a relation as given by <code>edge/2</code>. </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="p">:-</span><span class="s s-Atom">table</span> <span class="s s-Atom">path</span><span class="o">/</span><span class="mf">2.</span> <span class="nf">path</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">):-</span><span class="nf">edge</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">).</span> <span class="nf">path</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">):-</span><span class="nf">path</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Z</span><span class="p">),</span><span class="nf">edge</span><span class="p">(</span><span class="nv">Z</span><span class="p">,</span><span class="nv">Y</span><span class="p">).</span> </pre></div> <p>With tabling, any query to the program is guaranteed to terminate as long as the term sizes are bounded. </p><p>By default, all the arguments of a tabled call are used in variant checking and all answers are tabled for a tabled predicate. B-Prolog supports table modes, which allow the system to use only input arguments in variant checking and table answers selectively. The table mode declaration </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="p">:-</span><span class="s s-Atom">table</span> <span class="nf">p</span><span class="p">(</span><span class="nv">M1</span><span class="p">,...,</span><span class="nv">Mn</span><span class="p">)</span><span class="s s-Atom">:</span><span class="nv">C</span><span class="p">.</span> </pre></div> <p>instructs the system how to do tabling on <code>p/n</code>, where <code>C</code>, called a <i>cardinality limit</i>, is an integer which limits the number of answers to be tabled, and each <code>Mi</code> is a mode which can be <code>min</code>, <code>max</code>, <code>+</code> (input), or <code>-</code> (output). An argument with the mode <code>min</code> or <code>max</code> is assumed to be output. If the cardinality limit <code>C</code> is <code>1</code>, it can be omitted with the preceding '<code>:</code>'. </p><p>Table modes are very useful for declarative description of dynamic programming problems. For example, the following program encodes the Dijkstra's algorithm for finding a path with the minimum weight between a pair of nodes. </p> <div class="mw-highlight mw-highlight-lang-prolog mw-content-ltr" dir="ltr"><pre><span></span><span class="p">:-</span><span class="s s-Atom">table</span> <span class="nf">sp</span><span class="p">(</span><span class="s s-Atom">+</span><span class="p">,</span><span class="s s-Atom">+</span><span class="p">,</span><span class="s s-Atom">-</span><span class="p">,</span><span class="s s-Atom">min</span><span class="p">).</span> <span class="nf">sp</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">,[(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">)],</span><span class="nv">W</span><span class="p">)</span> <span class="p">:-</span> <span class="nf">edge</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">,</span><span class="nv">W</span><span class="p">).</span> <span class="nf">sp</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Y</span><span class="p">,[(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Z</span><span class="p">)|</span><span class="nv">Path</span><span class="p">],</span><span class="nv">W</span><span class="p">)</span> <span class="p">:-</span> <span class="nf">edge</span><span class="p">(</span><span class="nv">X</span><span class="p">,</span><span class="nv">Z</span><span class="p">,</span><span class="nv">W1</span><span class="p">),</span> <span class="nf">sp</span><span class="p">(</span><span class="nv">Z</span><span class="p">,</span><span class="nv">Y</span><span class="p">,</span><span class="nv">Path</span><span class="p">,</span><span class="nv">W2</span><span class="p">),</span> <span class="nv">W</span> <span class="o">is</span> <span class="nv">W1</span><span class="o">+</span><span class="nv">W2</span><span class="p">.</span> </pre></div> <p>The table mode states that only one path with the minimum weight is tabled for each pair of nodes. </p> <div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=7" title="Edit section: See also"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a href="/wiki/Comparison_of_Prolog_implementations" title="Comparison of Prolog implementations">Comparison of Prolog implementations</a></li> <li><a href="/wiki/Prolog_syntax_and_semantics" title="Prolog syntax and semantics">Prolog syntax and semantics</a></li></ul> <div class="mw-heading mw-heading2"><h2 id="References">References</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=8" title="Edit section: References"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <style data-mw-deduplicate="TemplateStyles:r1239543626">.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}</style><div class="reflist"> <div class="mw-references-wrap"><ol class="references"> <li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><style data-mw-deduplicate="TemplateStyles:r1238218222">.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("//upload.wikimedia.org/wikipedia/commons/6/65/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("//upload.wikimedia.org/wikipedia/commons/d/d6/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("//upload.wikimedia.org/wikipedia/commons/a/aa/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("//upload.wikimedia.org/wikipedia/commons/4/4c/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="http://www.cril.univ-artois.fr/CPAI06/">"Results of the Second International Competition of CSP and Max-CSP Solvers"</a>. <i>www.cril.univ-artois.fr</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-02-20</span></span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=unknown&rft.jtitle=www.cril.univ-artois.fr&rft.atitle=Results+of+the+Second+International+Competition+of+CSP+and+Max-CSP+Solvers&rft_id=http%3A%2F%2Fwww.cril.univ-artois.fr%2FCPAI06%2F&rfr_id=info%3Asid%2Fen.wikipedia.org%3AB-Prolog" class="Z3988"></span></span> </li> <li id="cite_note-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-2">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://dtai.cs.kuleuven.be/events/ASP-competition/index.shtml">"The Second Answer Set Programming Competition"</a>. <i>dtai.cs.kuleuven.be</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-02-20</span></span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Ajournal&rft.genre=unknown&rft.jtitle=dtai.cs.kuleuven.be&rft.atitle=The+Second+Answer+Set+Programming+Competition&rft_id=https%3A%2F%2Fdtai.cs.kuleuven.be%2Fevents%2FASP-competition%2Findex.shtml&rfr_id=info%3Asid%2Fen.wikipedia.org%3AB-Prolog" class="Z3988"></span></span> </li> <li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text"><a rel="nofollow" class="external text" href="http://www.cs.nmsu.edu/ALP/2011/06/bpsolvers-solutions-to-the-third-asp-competition-problems/">BPSolver鈥檚 Solutions to the Third ASP Competition Problems | Association for Logic Programming</a></span> </li> <li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text"><link rel="mw-deduplicated-inline-style" href="mw-data:TemplateStyles:r1238218222"><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://web.archive.org/web/20140309181721/http://lists.probp.com/pipermail/bp-users/2012-November/000050.html">"[bp-users]SAT Compiler in B-Prolog version 7.8"</a>. Archived from <a rel="nofollow" class="external text" href="http://lists.probp.com/pipermail/bp-users/2012-November/000050.html">the original</a> on 2014-03-09<span class="reference-accessdate">. Retrieved <span class="nowrap">2013-01-30</span></span>.</cite><span title="ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Abook&rft.genre=unknown&rft.btitle=%26%2391%3Bbp-users%26%2393%3BSAT+Compiler+in+B-Prolog+version+7.8&rft_id=http%3A%2F%2Flists.probp.com%2Fpipermail%2Fbp-users%2F2012-November%2F000050.html&rfr_id=info%3Asid%2Fen.wikipedia.org%3AB-Prolog" class="Z3988"></span></span> </li> </ol></div></div> <div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2><span class="mw-editsection"><span class="mw-editsection-bracket">[</span><a href="/w/index.php?title=B-Prolog&action=edit&section=9" title="Edit section: External links"><span>edit</span></a><span class="mw-editsection-bracket">]</span></span></div> <ul><li><a rel="nofollow" class="external text" href="http://www.picat-lang.org/bprolog/">Official website</a></li> <li><a rel="nofollow" class="external text" href="http://www.cs.nmsu.edu/ALP/2010/08/how-to-solve-it-with-b-prolog/">How to Solve it With B-Prolog</a></li> <li><a rel="nofollow" class="external text" href="https://arxiv.org/abs/1103.0812">The Language Features and Architecture of B-Prolog</a></li> <li><a rel="nofollow" class="external text" href="https://web.archive.org/web/20100227050426/http://www.probp.com/performance.htm">Performance comparison of Prolog and CLP(FD) systems</a></li> <li><a rel="nofollow" class="external text" href="https://logtalk.org/performance.html">Logtalk performance</a></li></ul> <!-- NewPP limit report Parsed by mw鈥恮eb.codfw.main鈥恌69cdc8f6鈥恈df8n Cached time: 20241122135307 Cache expiry: 2592000 Reduced expiry: false Complications: [vary鈥恟evision鈥恠ha1, show鈥恡oc] CPU time usage: 0.181 seconds Real time usage: 1.780 seconds Preprocessor visited node count: 317/1000000 Post鈥恊xpand include size: 4534/2097152 bytes Template argument size: 72/2097152 bytes Highest expansion depth: 8/100 Expensive parser function count: 19/500 Unstrip recursion depth: 1/20 Unstrip post鈥恊xpand size: 34453/5000000 bytes Lua time usage: 0.071/10.000 seconds Lua memory usage: 3031303/52428800 bytes Number of Wikibase entities loaded: 0/400 --> <!-- Transclusion expansion time report (%,ms,calls,template) 100.00% 122.590 1 Template:Reflist 100.00% 122.590 1 -total 80.98% 99.277 3 Template:Cite_web 1.44% 1.761 1 Template:Main_other --> <!-- Saved in parser cache with key enwiki:pcache:idhash:10875123-0!canonical and timestamp 20241122135307 and revision id 1213779900. Rendering was triggered because: page-view --> </div><!--esi <esi:include src="/esitest-fa8a495983347898/content" /> --><noscript><img src="https://login.wikimedia.org/wiki/Special:CentralAutoLogin/start?type=1x1" alt="" width="1" height="1" style="border: none; position: absolute;"></noscript> <div class="printfooter" data-nosnippet="">Retrieved from "<a dir="ltr" href="https://en.wikipedia.org/w/index.php?title=B-Prolog&oldid=1213779900">https://en.wikipedia.org/w/index.php?title=B-Prolog&oldid=1213779900</a>"</div></div> <div id="catlinks" class="catlinks" data-mw="interface"><div id="mw-normal-catlinks" class="mw-normal-catlinks"><a href="/wiki/Help:Category" title="Help:Category">Category</a>: <ul><li><a href="/wiki/Category:Prolog_programming_language_family" title="Category:Prolog programming language family">Prolog programming language family</a></li></ul></div></div> </div> </main> </div> <div class="mw-footer-container"> <footer id="footer" class="mw-footer" > <ul id="footer-info"> <li id="footer-info-lastmod"> This page was last edited on 15 March 2024, at 02:40<span class="anonymous-show"> (UTC)</span>.</li> <li id="footer-info-copyright">Text is available under the <a href="/wiki/Wikipedia:Text_of_the_Creative_Commons_Attribution-ShareAlike_4.0_International_License" title="Wikipedia:Text of the Creative Commons Attribution-ShareAlike 4.0 International License">Creative Commons Attribution-ShareAlike 4.0 License</a>; additional terms may apply. By using this site, you agree to the <a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Terms_of_Use" class="extiw" title="foundation:Special:MyLanguage/Policy:Terms of Use">Terms of Use</a> and <a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy" class="extiw" title="foundation:Special:MyLanguage/Policy:Privacy policy">Privacy Policy</a>. Wikipedia庐 is a registered trademark of the <a rel="nofollow" class="external text" href="https://wikimediafoundation.org/">Wikimedia Foundation, Inc.</a>, a non-profit organization.</li> </ul> <ul id="footer-places"> <li id="footer-places-privacy"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Privacy_policy">Privacy policy</a></li> <li id="footer-places-about"><a href="/wiki/Wikipedia:About">About Wikipedia</a></li> <li id="footer-places-disclaimers"><a href="/wiki/Wikipedia:General_disclaimer">Disclaimers</a></li> <li id="footer-places-contact"><a href="//en.wikipedia.org/wiki/Wikipedia:Contact_us">Contact Wikipedia</a></li> <li id="footer-places-wm-codeofconduct"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Universal_Code_of_Conduct">Code of Conduct</a></li> <li id="footer-places-developers"><a href="https://developer.wikimedia.org">Developers</a></li> <li id="footer-places-statslink"><a href="https://stats.wikimedia.org/#/en.wikipedia.org">Statistics</a></li> <li id="footer-places-cookiestatement"><a href="https://foundation.wikimedia.org/wiki/Special:MyLanguage/Policy:Cookie_statement">Cookie statement</a></li> <li id="footer-places-mobileview"><a href="//en.m.wikipedia.org/w/index.php?title=B-Prolog&mobileaction=toggle_view_mobile" class="noprint stopMobileRedirectToggle">Mobile view</a></li> </ul> <ul id="footer-icons" class="noprint"> <li id="footer-copyrightico"><a href="https://wikimediafoundation.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/static/images/footer/wikimedia-button.svg" width="84" height="29" alt="Wikimedia Foundation" loading="lazy"></a></li> <li id="footer-poweredbyico"><a href="https://www.mediawiki.org/" class="cdx-button cdx-button--fake-button cdx-button--size-large cdx-button--fake-button--enabled"><img src="/w/resources/assets/poweredby_mediawiki.svg" alt="Powered by MediaWiki" width="88" height="31" loading="lazy"></a></li> </ul> </footer> </div> </div> </div> <div class="vector-settings" id="p-dock-bottom"> <ul></ul> </div><script>(RLQ=window.RLQ||[]).push(function(){mw.config.set({"wgHostname":"mw-web.codfw.main-669b4ddb54-x26dm","wgBackendResponseTime":133,"wgPageParseReport":{"limitreport":{"cputime":"0.181","walltime":"1.780","ppvisitednodes":{"value":317,"limit":1000000},"postexpandincludesize":{"value":4534,"limit":2097152},"templateargumentsize":{"value":72,"limit":2097152},"expansiondepth":{"value":8,"limit":100},"expensivefunctioncount":{"value":19,"limit":500},"unstrip-depth":{"value":1,"limit":20},"unstrip-size":{"value":34453,"limit":5000000},"entityaccesscount":{"value":0,"limit":400},"timingprofile":["100.00% 122.590 1 Template:Reflist","100.00% 122.590 1 -total"," 80.98% 99.277 3 Template:Cite_web"," 1.44% 1.761 1 Template:Main_other"]},"scribunto":{"limitreport-timeusage":{"value":"0.071","limit":"10.000"},"limitreport-memusage":{"value":3031303,"limit":52428800}},"cachereport":{"origin":"mw-web.codfw.main-f69cdc8f6-cdf8n","timestamp":"20241122135307","ttl":2592000,"transientcontent":false}}});});</script> <script type="application/ld+json">{"@context":"https:\/\/schema.org","@type":"Article","name":"B-Prolog","url":"https:\/\/en.wikipedia.org\/wiki\/B-Prolog","sameAs":"http:\/\/www.wikidata.org\/entity\/Q4833686","mainEntity":"http:\/\/www.wikidata.org\/entity\/Q4833686","author":{"@type":"Organization","name":"Contributors to Wikimedia projects"},"publisher":{"@type":"Organization","name":"Wikimedia Foundation, Inc.","logo":{"@type":"ImageObject","url":"https:\/\/www.wikimedia.org\/static\/images\/wmf-hor-googpub.png"}},"datePublished":"2007-04-24T18:16:57Z","dateModified":"2024-03-15T02:40:40Z"}</script> </body> </html>