prolog - 序言。为变量赋值后,程序输出从 `yes` 变为 `no`
问题描述
我有一个简单的任务是在另一个数组中查找数组的位置。顺便说一句,我正在使用GNU Prolog 1.4.5
.
parse([], _) :- true. %parsed sub means that we found it
parse([SHead|STail], [Head|Tail]) :-
write(SHead), write(' '), write(STail), write(' | '), write(Head), write(' '), write(Tail), nl,
(
SHead =:= Head ->
parse(STail, Tail)
;
false
)
.
findsub([_|_], [], _) :- false. %unparsed sub & empty string means there is no sub
findsub([SHead|STail], [Head|Tail], Pos) :-
(
var(Pos) -> Pos = 0 ; true %first-time init
),
XPos is Pos + 1,
(
SHead =:= Head ->
(
parse(STail, Tail) ->
true %subarray found
;
findsub([SHead|STail], Tail, XPos) %continue to next el
)
;
findsub([SHead|STail], Tail, XPos)
)
.
程序正常工作,但我找不到正确设置Pos
变量值的方法,因此它会返回实际位置。添加Pos is XPos,
后parse(STail, Tail) ->
,改变程序行为不正确。不明白为什么。测试数据:findsub("a", "sdfsfgasfdsfsdf", Pos).
解决方案
请注意,在 Prolog 中没有赋值操作(如在过程语言中)。=/0
运算符用于术语统一。
查看您的代码,我们可以从简化parse/2
谓词开始:
parse([], _). %parsed sub means that we found it
parse([SHead|STail], [Head|Tail]) :-
write(SHead), write(' '), write(STail), write(' | '),
write(Head), write(' '), write(Tail), nl,
SHead =:= Head,
parse(STail, Tail).
对于您的findsub/3
谓词,您将需要使用一个累加器,即一个辅助参数来携带当前位置,在进行递归调用时将其递增:
findsub(SList, List, Position) :-
findsub(SList, List, 1, Position).
findsub([_|_], [], _, _) :-
% unparsed sub & empty string means there is no sub
false.
findsub([SHead|STail], [Head|Tail], Position0, Position) :-
( SHead =:= Head ->
( parse(STail, Tail) ->
% subarray found
Position = Position0
; % continue to next element
Position1 is Position0 + 1,
findsub([SHead|STail], Tail, Position1, Position)
)
; Position1 is Position0 + 1,
findsub([SHead|STail], Tail, Position1, Position)
).
您的示例电话:
| ?- findsub("a", "sdfsfgasfdsfsdf", Pos).
Pos = 7
yes
推荐阅读
- regex - 数据框转换产生空值
- javascript - JavaScript_Truthy 和 Falsy 作业_codecademy
- r - 使用复制按钮时如何从 DT::datatable 中删除标题
- python - 每个 epoch 后的 TensorFlow 分布式训练暂停
- eclipse - 初始项目创建后访问 SDK 向导/在 MCUXpresso 中安装其他驱动程序
- java - 如何删除时间测量逻辑
- terminal - ZSH:重命名嵌套文件夹中的文件,大写特定字母
- sql - 无法访问我刚刚在 Spark 中创建的表
- reactjs - 您可以将 2 路通信绑定到 redux 变量吗?
- c++ - 在使用 Open GL 的 Qt Creator C++ 应用程序中需要帮助