序言参数未充分实例化错误

时间:2021-02-15 15:23:31

标签: prolog instantiation-error

我必须写一个 prolog 查询来打印每个孩子的总收入超过他们父母的家庭的详细信息,我已经写了但是我收到这个错误

Arguments are not sufficiently instantiated
In:
   [3] _1770 is _1776+0
   [2] totalx([person(_1844,_1846,_1848,...)],_1834) at  line 50
   [1] '<meta-call>'((...,...)) <foreign>

这是基本代码:

family(person( john, cohen, date(17,may,1990), unemployed), person( lily, cohen, 
date(9,may,1990), unemployed),[ ] ).
family(person( john, armstrong, date(7,may,1988), unemployed), person( lily, Armstrong, 
date(29,may,1961), unemployed), [ ] ).
family(person( eric, baily, date(7,may,1963), works( bbc, 2200)), person( grace, baily, 
date(9,may,1965), works( ntu, 1000)), [person( louie, baily, date(25,may,1983), unemployed) ] ).
family(person( eric, baily, date(7,may,1963), works( acc, 21200)), person( grace, baily, 
date(9,may,1965), works( ntnu, 12000)), [person( louie, baily, date(25,may,1983), unemployed) ] ).
family(person( eric, fox, date(27,may,1970), works( bbc, 25200)), person( grace, fox, 
date(9,may,1971), works( ntbu, 13000)), [person( louie, fox, date(5,may,1993), unemployed) ] ).

    husband(X) :- family(X, _, _).
    wife(X) :- family(_, X, _).
    child(X) :- family(_, _, Children), member(X, Children).

    salary(person(_, _, _, works(_, S)), S).
    salary(person(_, _, _, unemployed), 0).

这是我的需求代码:

    48-totalx([],0).
    49-totalx([Person|L],Sum):-salary(Person,S),totalx(L,Rest),
    50-Sum is S+Rest

以及对需求的查询:

family(Husband,Wife,Child),totalx(Children,IChildren),totalx([Husband],IHusband), 
totalx([Wife],IWife),IChildren > IHusband+IWife.

有人可以向我解释为什么它不起作用吗?

1 个答案:

答案 0 :(得分:0)

您的代码中有两个错误。

  • 第一个是原子 armstrong,在谓词 family/3 的第二个子句中,必须以小写字母开头。
  • 第二个是变量Child,在查询的第一个目标中,必须是Children(实例化错误是由于变量Children没有实例化在查询的第二个目标中)。
family(person(john, cohen, date(17,may,1990), unemployed),
       person(lily, cohen, date( 9,may,1990), unemployed),
       []).

family(person(john, armstrong, date( 7,may,1988), unemployed),
       person(lily, armstrong, date(29,may,1961), unemployed), % lowercase
       []).

family(person(eric,  baily, date(7,may,1963), works( bbc, 2200)),
       person(grace, baily, date(9,may,1965), works( ntu, 1000)),
       [person( louie, baily, date(25,may,1983), unemployed)]).

family(person(eric,  baily, date(7,may,1963), works( acc, 21200)),
       person(grace, baily, date(9,may,1965), works( ntnu, 12000)),
       [person(louie, baily, date(25,may,1983), unemployed)] ).

family(person(eric,  fox, date(27,may,1970), works( bbc, 25200)),
       person(grace, fox, date( 9,may,1971), works( ntbu, 13000)),
       [person(louie, fox, date(5,may,1993), unemployed)] ).


husband(X) :- family(X, _, _).
wife(X) :- family(_, X, _).
child(X) :- family(_, _, Children), member(X, Children).

salary(person(_, _, _, works(_, S)), S).
salary(person(_, _, _, unemployed), 0).


totalx([], 0).
totalx([Person|L],Sum) :-
    salary(Person, S),
    totalx(L, Rest),
    Sum is S + Rest.

查询:

?- family(Husband,Wife,Children), totalx(Children,IChildren),totalx([Husband],IHusband),totalx([Wife],IWife),IChildren > IHusband+IWife.
false.

查询失败,因为不存在孩子收入超过父母的家庭。但是,去除该约束后,查询可以正常工作并产生一些答案。

?- family(Husband,Wife,Children), totalx(Children,IChildren),totalx([Husband],IHusband),totalx([Wife],IWife).
Husband = person(john, cohen, date(17, may, 1990), unemployed),
Wife = person(lily, cohen, date(9, may, 1990), unemployed),
Children = [],
IChildren = IHusband, IHusband = IWife, IWife = 0 ;

Husband = person(john, armstrong, date(7, may, 1988), unemployed),
Wife = person(lily, armstrong, date(29, may, 1961), unemployed),
Children = [],
IChildren = IHusband, IHusband = IWife, IWife = 0 
...