我正在尝试编写一个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程序员),所以很可能我缺少基本知识。救命?
我正在跟踪序言程序
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)
该文件已创建但为空
现在的痕迹真的很多。我想将输出重定向到一个文件 我们可以将它重定向到一个文件吗?
我正在使用函子在 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) 我想了解为什么与之交互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和声明性编程的新手,我很难实现以下目标.
我正在学习本教程,现在想在页面上显示一些链接.要显示哪些链接取决于某些事实/变量.
这是我目前的代码:
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语句.我也希望条件是任意复杂的.
在使用 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) 我试图不使用列表来总结谓词的值。对值求和,最后得到这些值的总和。
%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。
前段时间我正在摆弄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) 我这样做是为了模拟全局变量:
update_queue(NewItem) :-
global_queue(Q),
retractall(global_queue(Q)),
append(Q, [NewItem], NewQ),
assert(global_queue(NewQ)).
Run Code Online (Sandbox Code Playgroud)
还有另外一种方法吗?(除了将变量作为参数传递之外).不一定更有效率,我只是好奇.