如何从另一个谓词调用谓词-Prolog

时间:2019-04-14 19:39:43

标签: prolog predicate

我有这个谓词:

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中的值?

1 个答案:

答案 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/2count/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) 

应该工作。


此外,由于您没有提供示例输入和示例输出,因此我无法做更多的事情。