标签: swi-prolog

序言:将列表中的所有原子都小写

我正在尝试编写一个Prolog程序,该程序需要获取用户的自然语言输入并将其与一组原子匹配。我正在使用SWI Prolog readln/1来获取输入并将其放在原子列表中,但是我无法保证用户输入的大小写,因此在尝试匹配之前,我只想小写我得到的所有输入。我现在所拥有的是:

downcase_list(AnyCase, LowerCase) :- dcl(AnyCase, X), flatten(X,LowerCase).

dcl([], List) :- List.
dcl([Head|Rest], []) :- downcase_atom(Head,X), dcl(Rest,X).
dcl([Head|Rest], List) :- downcase_atom(Head,X), dcl(Rest, [List|X]).
Run Code Online (Sandbox Code Playgroud)

追加使用[List|X]似乎是我的问题,但是我不知道如何解决它,因为我已经尝试过使用append/3并且遇到无限循环:

downcase_list([], List) :- List.
downcase_list([Head|Rest], []) :- downcase_atom(Head,X), downcase_list(Rest, X).
downcase_list([Head|Rest], NewList) :- downcase_atom(Head,X), append(NewList,X,Z), writeln(Z), downcase_list(Rest,Z).
Run Code Online (Sandbox Code Playgroud)

我对Prolog还是很陌生(目前我将自己归类为Lisp程序员),所以很可能我缺少基本知识。救命?

list prolog swi-prolog

2
推荐指数
1
解决办法
419
查看次数

如何将跟踪输出重定向到文件

我正在跟踪序言程序

1 ?- trace.
true.

[trace] 1 ?- solve.
   Call: (7) solve ? 
Run Code Online (Sandbox Code Playgroud)

我也试过

tell('trace_op.txt').
Run Code Online (Sandbox Code Playgroud)

该文件已创建但为空

现在的痕迹真的很多。我想将输出重定向到一个文件 我们可以将它重定向到一个文件吗?

prolog swi-prolog

2
推荐指数
1
解决办法
1460
查看次数

在 prolog 中断言和使用快速、大型数组

我正在使用函子在 SWI-Prolog 中使用 arg/3 来获取随机访问数组。我正在做的是将样本中的值加载到我创建的函子中,并断言该数组以供将来使用。

加载后,随机访问确实是 O(1),正如我使用 time/1 验证的那样。问题是从断言加载函子需要花费大量时间( time/1 表明它与数组的大小呈线性关系)。有什么办法可以将其加快到恒定时间吗?

最少的复制代码:

:- dynamic
    current_sample/1.

xrange(L,R,X):-
    L < R,
    ( X = L;
    X1 is L+1, xrange(X1,R,X)
    ).


arraybase_from_list__set_arg_from_list([], _, _).
arraybase_from_list__set_arg_from_list([Head|Tail], I, ResArray):-
    I1 is I+1,
    nb_setarg(I1, ResArray, Head),
    arraybase_from_list__set_arg_from_list(Tail, I1, ResArray).

arraybase_from_list(List, ResArray):-
    length(List, L),
    functor(ResArray, custom_array_data, L),
    arraybase_from_list__set_arg_from_list(List, 0, ResArray ).


test_array_create( N ):- % Creates a dummy array of squares of numbers fromo [0,N)
    findall( X2, (xrange( 0,N,X), X2 is X*X), XList ),
    arraybase_from_list( XList, Arr …
Run Code Online (Sandbox Code Playgroud)

arrays prolog swi-prolog prolog-directive-dynamic

2
推荐指数
1
解决办法
562
查看次数

为什么来自swipl的反应不一致?

我想了解为什么与之交互swipl似乎不一致.

这是一个典型的例子.假设我查阅了包含以下定义的知识库:

acc_max([H|T], A, Max) :- H  > A, acc_max(T, H, Max).
acc_max([H|T], A, Max) :- H =< A, acc_max(T, A, Max).
acc_max([], A, A).

max([H|T], Max) :- acc_max(T, H, Max).
Run Code Online (Sandbox Code Playgroud)

下面我显示max([0, 1, 2], X).在输入提示符后我的屏幕显示的内容,并点击Enter:

?- max([0, 1, 2], X).
X = 2 ?
Run Code Online (Sandbox Code Playgroud)

(?表示光标的位置.)

请特别注意,解释器的下一个提示尚未出现.

这是我输入后屏幕的样子;:

?- max([0, 1, 2], X).
X = 2 ;
false.

?- ?
Run Code Online (Sandbox Code Playgroud)

现在我终于得到了翻译的提示.

相比之下,下面我显示了max([2, 0, 1], X).在输入提示符后我的屏幕显示的内容,并点击Enter:

?- max([2, …
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog prolog-toplevel

2
推荐指数
1
解决办法
121
查看次数

Prolog HTTP动态添加到html的链接

我是prolog和声明性编程的新手,我很难实现以下目标.

我正在学习本教程,现在想在页面上显示一些链接.要显示哪些链接取决于某些事实/变量.

这是我目前的代码:

link_collection(Request) :-
http_parameters(Request,
[
    foo(Foo, [optional(true)])
]),
reply_html_page(
    [title('Dynamic Link Collection')],
    [
        a([href='/questionalice'], 'Question Alice'),       /* Should only show if has(investigate, body) is true */
        a([href='/questionbob'], 'Question Bob'),          /* Should only show if Foo = bar */
        a([href='/investigatebody'], 'Investigate Body')   /* Show always */
    ]
).
Run Code Online (Sandbox Code Playgroud)

请注意,"排列"的数量不允许我只是"或" link_collection语句.我也希望条件是任意复杂的.

prolog swi-prolog

2
推荐指数
1
解决办法
107
查看次数

在 SWI-Prolog 中,是否有一种简单的方法可以使用 REPL 将数字从一个基数转换为另一个基数?

在使用 REPL 的 SWI-Prolog 中,可以轻松地从任何基数转换为基数 10,例如

?- X = 16'FF.
X = 255.

?- X = 2'11111111.
X = 255.
Run Code Online (Sandbox Code Playgroud)

然而这失败了。(没想到它会起作用,但显示了我的想法。)

?- 2'X = 16'FF.
ERROR: Syntax error: Operator expected
ERROR: 
ERROR: ** here **
ERROR: 2'X = 16'FF . 
Run Code Online (Sandbox Code Playgroud)

prolog swi-prolog

2
推荐指数
1
解决办法
533
查看次数

如何不使用列表对谓词值求和?

我试图不使用列表来总结谓词的值。对值求和,最后得到这些值的总和。

%shop(TicketNumber, Client, Month).
shop(1, ash, 12).
shop(2, nelson, 11).
shop(3, rob, 10).

%cart(TicketNumber, Product, Price).
cart(1, eggs, 15).
cart(1, milk, 20).
cart(1, meat, 30).
cart(2, eggs, 10).
cart(2, soil, 5).
Run Code Online (Sandbox Code Playgroud)

totalCostShop应该返回总成本,例如shop(1,ash,12)的总成本应为65。

prolog swi-prolog

2
推荐指数
1
解决办法
81
查看次数

SWI-Prolog编辑器的问题

前段时间我正在摆弄SWI-Prolog编辑器,试图让某些东西起作用,我改变了一些配置设置.它没有用,所以我把它改回来了.现在SWI-Prolog编辑器工作不正常.我将加载文件但是当我点击'consult'时它会抛出这个错误:

协商( 'C:/Users/Cubearth/Documents/Prolog/'filename.pl').

我无法在知识库上执行查询......它什么也没做.我知道它应该返回:

% library(win_menu) compiled into win_menu 0.00 sec, 20,952 bytes
% library(swi_hooks) compiled into pce_swi_hooks ......... (etc, etc)

For help, use ?- help(Topic). or ?- apropos(Word).
Run Code Online (Sandbox Code Playgroud)

但我甚至没有得到那个.我尝试卸载prolog和编辑器,但仍然没有运气.

有想法该怎么解决这个吗?

为了帮助,我已经包含了prolog的配置转储:

安装

  C:\Program Files (x86)\SWIPrologEditor\SWIMachine.ini
  C:\Users\Cubearth\AppData\Roaming\SWIPrologEditor\SWIUser.ini
  C:\Users\Cubearth\AppData\Roaming\SWIPrologEditor\SWIColor.ini

[SWI]
PortableApplication=0 
Verzeichnis=C:\Program Files\pl
Manual=C:\Program Files\pl\bin\doc\Manual\Contents.html
XPCE=C:\Program Files\pl\bin\doc\UserGuide\Contents.html 

[Program] 
InterpreterParameter=-L32M 
FileExtension=.pl 

[Editor] 
TabWidth=2 
Indent=2 
Indenthelp=1 
AutomaticIndent=1 
FileTab=1 
Linenumbering=1 
BracketPair=0 
CursorBehindLine=1 
Author= 
Encoding=0 
Structure=0 

[Code] 
Code-Completion=1 
Parameter-Hints=1 
Delay=100 

[Options] 
ColoredConsole=1 
IntegratedWindow=1 
ReturnToContinue=1 
TraceStopsDebugToo=1 
BAKFiles=1 
RemoveWriteProtection=1 
FileTabsMultiline=1 
Language=C:\Program Files (x86)\SWIPrologEditor\english.ini 

[Browser]
UseIEinternForDocuments=1 …
Run Code Online (Sandbox Code Playgroud)

editor swi-prolog

1
推荐指数
1
解决办法
5263
查看次数

断言和撤消以模拟全局变量

我这样做是为了模拟全局变量:

update_queue(NewItem) :-
    global_queue(Q),
    retractall(global_queue(Q)),
    append(Q, [NewItem], NewQ),
    assert(global_queue(NewQ)).
Run Code Online (Sandbox Code Playgroud)

还有另外一种方法吗?(除了将变量作为参数传递之外).不一定更有效率,我只是好奇.

global-variables prolog swi-prolog dcg prolog-assert

1
推荐指数
1
解决办法
470
查看次数

libpl.so在Prolog版本6.6.4中?

我试图使用pyswip包从python连接到Prolog.我使用自制软件安装了swipl,并按照pyswip安装说明,添加了--enable-shared我在安装swipl时尝试执行'./configure'的时间.

但我libpl.so在swipl文件夹中找不到该文件.

有线索吗?

python shared-libraries swi-prolog

1
推荐指数
1
解决办法
966
查看次数