我有这个谓词:
start:-
write(‘Type your numbers:’),
read(L1),
call(oc([L1],N)). % Point 1 <=====
oc
是另一个这样的谓词:
oc([],[]).
oc([H|T],[[H,X]|Y]):-
count(H,[H|T],X),
deleteall(H,T,T1),
oc(T1,Y).
我该怎么做?
当我到达第1点并使用call
时,L1
变量上的值不起作用。
运行此代码时,我收到消息true
。函数oc
未运行。
如何调用oc
函数并传递存储在L1
中的值?
答案 0 :(得分:0)
如果我运行您的程序,并按您的预期修复了一些小错误
start:-
write('Type your numbers: '),
read(L1),
call(oc([L1],_N)).
oc([],[]).
oc([H|T],[[H,X]|Y]):-
count(H,[H|T],X),
deleteall(H,T,T1),
oc(T1,Y).
?- start.
Type your numbers: 1 2 3.
ERROR: Undefined procedure: count/3
ERROR: In:
ERROR: [10] count(123,[123],_4380)
ERROR: [9] oc([123],[[123|...]|_4424]) at c:/question.pl:14
ERROR: [8] start at c:/question.pl:10
ERROR: [7] <user>
Exception: (10) count(123, [123], _3886) ? creep
如果遇到这样的错误,则需要将错误放入问题中。问问题时不要假设任何事情。而且,如果您收到错误消息,那么在StackOverflow上就需要解决这些问题,因为它们对于找出问题很重要。
问题不是调用oc/2
,因为如果您查看错误,则会看到count(123,[123],_4380)
,这意味着调用了oc/2
。 count/3
是您的问题。另一个问题是,据我所知,您输入时所读内容并未转换为Prolog使用的正确列表。
此查询使用正确的Prolog列表,例如[1,2,3]
。
?- oc([1,2,3],Result).
ERROR: Undefined procedure: count/3
ERROR: In:
ERROR: [9] count(1,[1,2|...],_5528)
ERROR: [8] oc([1,2|...],[[1|...]|_5584]) at c:/question.pl:14
ERROR: [7] <user>
Exception: (9) count(1, [1, 2, 3], _5046) ?
要解决计数错误,请使用is/2
X是X + H
例如
?- X is 3 + 4.
X = 7.
我不知道你为什么有deleteall(H,T,T1)
。
要从用户那里读取电话号码列表,请尝试类似
read_list(Items) :-
write('Please enter number, enter "Done" when finished: ' ),
read_string(user, "\n", "\r", _, Response),
(
Response == "Done"
->
Items = []
;
valid_input(Response,Items)
).
valid_input(Response,Items) :-
(
number_string(Item,Response)
->
% Item was valid
% so get next number and
% add to list on backtracking
read_list(Items0),
Items = [Item|Items0]
;
% Item was invalid
% so warn user of invalid number and what they input
% and get next number.
% Do not add invalid Item to list on backtracking.
format('Invalid number: `~w''~n',[Response]),
read_list(Items0),
Items = Items0
).
示例运行:
?- read_list(List).
Please enter number, enter "Done" when finished: 1
Please enter number, enter "Done" when finished: a
Invalid number: `a'
Please enter number, enter "Done" when finished: 2
Please enter number, enter "Done" when finished: 3
Please enter number, enter "Done" when finished: Done
List = [1, 2, 3].
最后,您不需要call(oc([L1],N))
oc(List,N)
应该工作。
此外,由于您没有提供示例输入和示例输出,因此我无法做更多的事情。